diff --git a/.github/actions/module-rspec/action.yml b/.github/actions/module-rspec/action.yml index e08e9895..ca8946fa 100644 --- a/.github/actions/module-rspec/action.yml +++ b/.github/actions/module-rspec/action.yml @@ -21,7 +21,7 @@ runs: shell: "bash" - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18.17.1 - name: Get npm cache directory path id: npm-cache-dir-path run: echo "dir=$(npm get cache)-${{ inputs.name }}" >> $GITHUB_OUTPUT diff --git a/.rubocop.yml b/.rubocop.yml index 870c0b9f..c8a24046 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,3 +1,6 @@ inherit_from: - .rubocop_ruby.yml - .rubocop_rails.yml + +AllCops: + TargetRubyVersion: 3.2 diff --git a/.rubocop_ruby.yml b/.rubocop_ruby.yml index 6af95162..88c8e7e6 100644 --- a/.rubocop_ruby.yml +++ b/.rubocop_ruby.yml @@ -260,7 +260,7 @@ Style/BlockDelimiters: - let! - subject - watch - IgnoredMethods: + AllowedMethods: # Methods that can be either procedural or functional and cannot be # categorised from their usage alone, e.g. # @@ -981,7 +981,7 @@ Style/SymbolArray: Style/SymbolProc: # A list of method names to be ignored by the check. # The names should be fairly unique, otherwise you'll end up ignoring lots of code. - IgnoredMethods: + AllowedMethods: - respond_to - define_method @@ -1237,6 +1237,8 @@ RSpec/DescribeClass: - "**/*/spec/**/*_badge_spec.rb" - decidim-core/spec/lib/global_engines_spec.rb - "**/tasks/**/*" + - decidim-budgets_booth/spec/system/** + - decidim-budgets_booth/spec/i18n_spec.rb RSpec/EmptyExampleGroup: Exclude: diff --git a/.ruby-version b/.ruby-version index b0f2dcb3..be94e6f5 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.0.4 +3.2.2 diff --git a/Gemfile b/Gemfile index a8812407..81a40010 100644 --- a/Gemfile +++ b/Gemfile @@ -17,9 +17,9 @@ gem "decidim-ptp", path: "." gem "bootsnap", "~> 1.4" -gem "puma", ">= 5.6.2" - -gem "faker", "~> 2.14" +gem "faker", "~> 3.2" +gem "puma", ">= 6.3.1" +gem "uri", "~> 1.0.2" group :development, :test do gem "byebug", "~> 11.0", platform: :mri @@ -27,19 +27,19 @@ group :development, :test do gem "decidim-dev", DECIDIM_VERSION gem "decidim-initiatives", DECIDIM_VERSION - gem "brakeman", "~> 5.2" + gem "brakeman", "~> 6.1" # Ruby 3.0 -> (Decidim 0.27.x ->) # gem "net-imap", "~> 0.2.3" # gem "net-pop", "~> 0.1.1" # gem "net-smtp", "~> 0.3.1" - gem "parallel_tests", "~> 3.7" + gem "parallel_tests", "~> 4.2" gem "rubocop-faker" end group :development do gem "letter_opener_web", "~> 2.0" gem "listen", "~> 3.1" - gem "spring", "~> 2.0" - gem "spring-watcher-listen", "~> 2.0" + gem "spring" + # gem "spring-watcher-listen", "~> 2.0" gem "web-console", "~> 4.2" end diff --git a/Gemfile.lock b/Gemfile.lock index 1edd5e73..44740842 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,61 +1,68 @@ PATH remote: . specs: - decidim-budgets_booth (0.27.0) - decidim-budgets (~> 0.27.0) - decidim-core (~> 0.27.0) - decidim-l10n (0.27.0) - decidim-core (~> 0.27.0) - decidim-ptp (0.27.0) - decidim-budgets_booth (= 0.27.0) - decidim-core (~> 0.27.0) - decidim-l10n (= 0.27.0) - decidim-sms-twilio (= 0.27.0) - decidim-smsauth (= 0.27.0) - decidim-sms-twilio (0.27.0) - decidim-core (~> 0.27.0) + decidim-budgets_booth (0.29.0) + decidim-budgets (~> 0.29.0) + decidim-core (~> 0.29.0) + decidim-l10n (0.29.0) + decidim-core (~> 0.29.0) + decidim-ptp (0.29.0) + decidim-budgets_booth (= 0.29.0) + decidim-core (~> 0.29.0) + decidim-l10n (= 0.29.0) + decidim-sms-twilio (= 0.29.0) + decidim-smsauth (= 0.29.0) + decidim-sms-twilio (0.29.0) + decidim-core (~> 0.29.0) twilio-ruby (~> 5.72.0) - decidim-smsauth (0.27.0) + decidim-smsauth (0.29.0) countries (~> 5.1, >= 5.1.2) - decidim-core (~> 0.27.0) + decidim-core (~> 0.29.0) GEM remote: https://rubygems.org/ specs: - actioncable (6.1.7) - actionpack (= 6.1.7) - activesupport (= 6.1.7) + actioncable (7.0.8.5) + actionpack (= 7.0.8.5) + activesupport (= 7.0.8.5) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.7) - actionpack (= 6.1.7) - activejob (= 6.1.7) - activerecord (= 6.1.7) - activestorage (= 6.1.7) - activesupport (= 6.1.7) + actionmailbox (7.0.8.5) + actionpack (= 7.0.8.5) + activejob (= 7.0.8.5) + activerecord (= 7.0.8.5) + activestorage (= 7.0.8.5) + activesupport (= 7.0.8.5) mail (>= 2.7.1) - actionmailer (6.1.7) - actionpack (= 6.1.7) - actionview (= 6.1.7) - activejob (= 6.1.7) - activesupport (= 6.1.7) + net-imap + net-pop + net-smtp + actionmailer (7.0.8.5) + actionpack (= 7.0.8.5) + actionview (= 7.0.8.5) + activejob (= 7.0.8.5) + activesupport (= 7.0.8.5) mail (~> 2.5, >= 2.5.4) + net-imap + net-pop + net-smtp rails-dom-testing (~> 2.0) - actionpack (6.1.7) - actionview (= 6.1.7) - activesupport (= 6.1.7) - rack (~> 2.0, >= 2.0.9) + actionpack (7.0.8.5) + actionview (= 7.0.8.5) + activesupport (= 7.0.8.5) + rack (~> 2.0, >= 2.2.4) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.7) - actionpack (= 6.1.7) - activerecord (= 6.1.7) - activestorage (= 6.1.7) - activesupport (= 6.1.7) + actiontext (7.0.8.5) + actionpack (= 7.0.8.5) + activerecord (= 7.0.8.5) + activestorage (= 7.0.8.5) + activesupport (= 7.0.8.5) + globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (6.1.7) - activesupport (= 6.1.7) + actionview (7.0.8.5) + activesupport (= 7.0.8.5) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) @@ -63,77 +70,63 @@ GEM active_link_to (1.0.5) actionpack addressable - activejob (6.1.7) - activesupport (= 6.1.7) + activejob (7.0.8.5) + activesupport (= 7.0.8.5) globalid (>= 0.3.6) - activemodel (6.1.7) - activesupport (= 6.1.7) - activerecord (6.1.7) - activemodel (= 6.1.7) - activesupport (= 6.1.7) - activestorage (6.1.7) - actionpack (= 6.1.7) - activejob (= 6.1.7) - activerecord (= 6.1.7) - activesupport (= 6.1.7) + activemodel (7.0.8.5) + activesupport (= 7.0.8.5) + activerecord (7.0.8.5) + activemodel (= 7.0.8.5) + activesupport (= 7.0.8.5) + activestorage (7.0.8.5) + actionpack (= 7.0.8.5) + activejob (= 7.0.8.5) + activerecord (= 7.0.8.5) + activesupport (= 7.0.8.5) marcel (~> 1.0) mini_mime (>= 1.1.0) - activesupport (6.1.7) + activesupport (7.0.8.5) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - zeitwerk (~> 2.3) - acts_as_list (0.9.19) - activerecord (>= 3.0) - addressable (2.8.1) - public_suffix (>= 2.0.2, < 6.0) + acts_as_list (1.2.3) + activerecord (>= 6.1) + activesupport (>= 6.1) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) ast (2.4.2) - axe-core-api (4.5.1) - dumb_delegator - virtus - axe-core-rspec (4.1.0) - axe-core-api - dumb_delegator - virtus - axiom-types (0.1.1) - descendants_tracker (~> 0.0.4) - ice_nine (~> 0.11.0) - thread_safe (~> 0.3, >= 0.3.1) + base64 (0.2.0) batch-loader (1.5.0) - bcrypt (3.1.18) - better_html (1.0.16) - actionview (>= 4.0) - activesupport (>= 4.0) + bcrypt (3.1.20) + better_html (2.1.1) + actionview (>= 6.0) + activesupport (>= 6.0) ast (~> 2.0) erubi (~> 1.4) - html_tokenizer (~> 0.0.6) parser (>= 2.4) smart_properties + bigdecimal (3.1.8) bindex (0.8.1) - bootsnap (1.15.0) + bootsnap (1.18.4) msgpack (~> 1.2) - brakeman (5.4.0) + brakeman (6.2.1) + racc browser (2.7.1) - builder (3.2.4) + builder (3.3.0) + bullet (7.1.6) + activesupport (>= 3.0.0) + uniform_notifier (~> 1.11) byebug (11.1.3) - capybara (3.38.0) + capybara (3.40.0) addressable matrix mini_mime (>= 0.1.3) - nokogiri (~> 1.8) + nokogiri (~> 1.11) rack (>= 1.6.0) rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - carrierwave (2.2.3) - activemodel (>= 5.0.0) - activesupport (>= 5.0.0) - addressable (~> 2.6) - image_processing (~> 1.1) - marcel (~> 1.0.0) - mini_mime (>= 0.1.3) - ssrf_filter (~> 1.0) cells (4.1.7) declarative-builder (< 0.2.0) declarative-option (< 0.2.0) @@ -145,271 +138,260 @@ GEM cells-rails (0.1.5) actionpack (>= 5.0) cells (>= 4.1.6, < 5.0.0) - charlock_holmes (0.7.7) - chef-utils (18.0.185) - concurrent-ruby - childprocess (4.1.0) - coercible (1.0.0) - descendants_tracker (~> 0.0.1) - coffee-rails (5.0.0) - coffee-script (>= 2.2.0) - railties (>= 5.2.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.12.2) - colorize (0.8.1) - commonmarker (0.23.6) - concurrent-ruby (1.1.10) - countries (5.2.0) + charlock_holmes (0.7.9) + childprocess (5.1.0) + logger (~> 1.5) + cmdparse (3.0.7) + commonmarker (0.23.10) + concurrent-ruby (1.3.4) + countries (5.7.2) unaccent (~> 0.3) - crack (0.4.5) + crack (1.0.0) + bigdecimal rexml crass (1.0.6) - css_parser (1.12.0) + css_parser (1.19.1) addressable - date (3.3.3) + csv (3.3.0) + dartsass (1.49.8) + date (3.3.4) date_validator (0.12.0) activemodel (>= 3) activesupport (>= 3) - db-query-matchers (0.10.0) - activesupport (>= 4.0, < 7) - rspec (~> 3.0) - decidim (0.27.1) - decidim-accountability (= 0.27.1) - decidim-admin (= 0.27.1) - decidim-api (= 0.27.1) - decidim-assemblies (= 0.27.1) - decidim-blogs (= 0.27.1) - decidim-budgets (= 0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-debates (= 0.27.1) - decidim-forms (= 0.27.1) - decidim-generators (= 0.27.1) - decidim-meetings (= 0.27.1) - decidim-pages (= 0.27.1) - decidim-participatory_processes (= 0.27.1) - decidim-proposals (= 0.27.1) - decidim-sortitions (= 0.27.1) - decidim-surveys (= 0.27.1) - decidim-system (= 0.27.1) - decidim-templates (= 0.27.1) - decidim-verifications (= 0.27.1) - decidim-accountability (0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-admin (0.27.1) + decidim (0.29.1) + decidim-accountability (= 0.29.1) + decidim-admin (= 0.29.1) + decidim-api (= 0.29.1) + decidim-assemblies (= 0.29.1) + decidim-blogs (= 0.29.1) + decidim-budgets (= 0.29.1) + decidim-comments (= 0.29.1) + decidim-core (= 0.29.1) + decidim-debates (= 0.29.1) + decidim-forms (= 0.29.1) + decidim-generators (= 0.29.1) + decidim-meetings (= 0.29.1) + decidim-pages (= 0.29.1) + decidim-participatory_processes (= 0.29.1) + decidim-proposals (= 0.29.1) + decidim-sortitions (= 0.29.1) + decidim-surveys (= 0.29.1) + decidim-system (= 0.29.1) + decidim-verifications (= 0.29.1) + decidim-accountability (0.29.1) + decidim-comments (= 0.29.1) + decidim-core (= 0.29.1) + decidim-admin (0.29.1) active_link_to (~> 1.0) - decidim-core (= 0.27.1) + decidim-core (= 0.29.1) devise (~> 4.7) devise-i18n (~> 1.2) - devise_invitable (~> 2.0) - decidim-api (0.27.1) - graphql (~> 1.12, < 1.13) - graphql-docs (~> 2.1.0) + devise_invitable (~> 2.0, >= 2.0.9) + decidim-api (0.29.1) + decidim-core (= 0.29.1) + graphql (~> 2.2.6) + graphql-docs (~> 4.0) rack-cors (~> 1.0) - decidim-assemblies (0.27.1) - decidim-core (= 0.27.1) - decidim-blogs (0.27.1) - decidim-admin (= 0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-budgets (0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-comments (0.27.1) - decidim-core (= 0.27.1) + decidim-assemblies (0.29.1) + decidim-core (= 0.29.1) + decidim-blogs (0.29.1) + decidim-admin (= 0.29.1) + decidim-comments (= 0.29.1) + decidim-core (= 0.29.1) + decidim-budgets (0.29.1) + decidim-comments (= 0.29.1) + decidim-core (= 0.29.1) + decidim-comments (0.29.1) + decidim-core (= 0.29.1) redcarpet (~> 3.5, >= 3.5.1) - decidim-core (0.27.1) + decidim-core (0.29.1) active_link_to (~> 1.0) - acts_as_list (~> 0.9) + acts_as_list (~> 1.0) batch-loader (~> 1.2) browser (~> 2.7) - carrierwave (~> 2.2.1) cells-erb (~> 0.1.0) cells-rails (~> 0.1.3) charlock_holmes (~> 0.7) date_validator (~> 0.12.0) - decidim-api (= 0.27.1) devise (~> 4.7) - devise-i18n (~> 1.2) + devise-i18n (~> 1.2, < 1.11.1) diffy (~> 3.3) - doorkeeper (~> 5.1) + doorkeeper (~> 5.6, >= 5.6.6) doorkeeper-i18n (~> 4.0) file_validators (~> 3.0) fog-local (~> 0.6) foundation_rails_helper (~> 4.0) geocoder (~> 1.8) hashdiff (>= 0.4.0, < 2.0.0) + image_processing (~> 1.2) invisible_captcha (~> 0.12) kaminari (~> 1.2, >= 1.2.1) - loofah (~> 2.3.1) + loofah (~> 2.19, >= 2.19.1) mime-types (>= 1.16, < 4.0) mini_magick (~> 4.9) - mustache (~> 1.1.0) + net-smtp (~> 0.3.1) + nokogiri (~> 1.16, >= 1.16.2) omniauth (~> 2.0) omniauth-facebook (~> 5.0) omniauth-google-oauth2 (~> 1.0) omniauth-rails_csrf_protection (~> 1.0) omniauth-twitter (~> 1.4) paper_trail (~> 12.0) - pg (~> 1.1.4, < 2) + pg (~> 1.4.0, < 2) pg_search (~> 2.2) premailer-rails (~> 1.10) - rack (~> 2.2, >= 2.2.3) + psych (~> 4.0) + rack (~> 2.2, >= 2.2.8.1) rack-attack (~> 6.0) - rails (~> 6.1.0) - rails-i18n (~> 6.0) - ransack (~> 2.4.1) + rails (~> 7.0.8) + rails-i18n (~> 7.0) + ransack (~> 3.2.1) redis (~> 4.1) request_store (~> 1.5.0) rubyXL (~> 3.4) rubyzip (~> 2.0) - seven_zip_ruby (~> 1.3) - social-share-button (~> 1.2, >= 1.2.1) - valid_email2 (~> 2.1) - webpacker (= 6.0.0.rc.5) - webpush (~> 1.1) + shakapacker (~> 7.1.0) + valid_email2 (~> 4.0) + web-push (~> 3.0) wisper (~> 2.0) - decidim-debates (0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-dev (0.27.1) - axe-core-rspec (~> 4.1.0) + decidim-debates (0.29.1) + decidim-comments (= 0.29.1) + decidim-core (= 0.29.1) + decidim-dev (0.29.1) + bullet (~> 7.1.6) byebug (~> 11.0) - capybara (~> 3.24) - db-query-matchers (~> 0.10.0) - decidim (= 0.27.1) - erb_lint (~> 0.0.35) - factory_bot_rails (~> 4.8) - i18n-tasks (~> 0.9.18) - mdl (~> 0.5) - nokogiri (~> 1.13) - parallel_tests (~> 3.7) - puma (~> 5.0) + capybara (~> 3.39) + decidim (= 0.29.1) + erb_lint (~> 0.4.0) + factory_bot_rails (~> 6.2) + faker (~> 3.2) + i18n-tasks (~> 1.0) + nokogiri (~> 1.16, >= 1.16.2) + parallel_tests (~> 4.2) + puma (~> 6.2, >= 6.3.1) rails-controller-testing (~> 1.0) + rspec (~> 3.12) rspec-cells (~> 0.3.7) - rspec-html-matchers (~> 0.9.1) - rspec-rails (~> 4.0) + rspec-html-matchers (~> 0.10) + rspec-rails (~> 6.0) rspec-retry (~> 0.6.2) - rspec_junit_formatter (~> 0.3.0) - rubocop (~> 1.28.0) - rubocop-rails (~> 2.14) - rubocop-rspec (~> 2.10) - selenium-webdriver (~> 4.1.0) - simplecov (~> 0.21.0) + rspec_junit_formatter (~> 0.6.0) + rubocop (~> 1.65.0) + rubocop-capybara (~> 2.21) + rubocop-factory_bot (~> 2.26) + rubocop-faker (~> 1.1) + rubocop-performance (~> 1.21) + rubocop-rails (~> 2.25) + rubocop-rspec (~> 3.0) + rubocop-rspec_rails (~> 2.30) + rubocop-rubycw (~> 0.1) + selenium-webdriver (~> 4.9) + simplecov (~> 0.22.0) simplecov-cobertura (~> 2.1.0) + spring (~> 4.0) + spring-watcher-listen (~> 2.0) w3c_rspec_validators (~> 0.3.0) - webmock (~> 3.6) + webmock (~> 3.18) wisper-rspec (~> 1.0) - decidim-forms (0.27.1) - decidim-core (= 0.27.1) + decidim-forms (0.29.1) + decidim-core (= 0.29.1) wicked_pdf (~> 2.1) - wkhtmltopdf-binary (~> 0.12) - decidim-generators (0.27.1) - decidim-core (= 0.27.1) - decidim-initiatives (0.27.1) - decidim-admin (= 0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-verifications (= 0.27.1) - origami (~> 2.1) - rexml (~> 3.2.5) - wicked (~> 1.3) + wkhtmltopdf-binary (= 0.12.6.6) + decidim-generators (0.29.1) + decidim-core (= 0.29.1) + decidim-initiatives (0.29.1) + decidim-admin (= 0.29.1) + decidim-comments (= 0.29.1) + decidim-core (= 0.29.1) + decidim-verifications (= 0.29.1) + hexapdf (~> 0.32.0) wicked_pdf (~> 2.1) - wkhtmltopdf-binary (~> 0.12) - decidim-meetings (0.27.1) - decidim-core (= 0.27.1) - decidim-forms (= 0.27.1) + wkhtmltopdf-binary (= 0.12.6.6) + decidim-meetings (0.29.1) + decidim-core (= 0.29.1) + decidim-forms (= 0.29.1) icalendar (~> 2.5) - decidim-pages (0.27.1) - decidim-core (= 0.27.1) - decidim-participatory_processes (0.27.1) - decidim-core (= 0.27.1) - decidim-proposals (0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - doc2text (~> 0.4.5) + decidim-pages (0.29.1) + decidim-core (= 0.29.1) + decidim-participatory_processes (0.29.1) + decidim-core (= 0.29.1) + decidim-proposals (0.29.1) + decidim-comments (= 0.29.1) + decidim-core (= 0.29.1) + doc2text (~> 0.4.7) redcarpet (~> 3.5, >= 3.5.1) - decidim-sortitions (0.27.1) - decidim-admin (= 0.27.1) - decidim-comments (= 0.27.1) - decidim-core (= 0.27.1) - decidim-proposals (= 0.27.1) - decidim-surveys (0.27.1) - decidim-core (= 0.27.1) - decidim-forms (= 0.27.1) - decidim-templates (= 0.27.1) - decidim-system (0.27.1) + decidim-sortitions (0.29.1) + decidim-admin (= 0.29.1) + decidim-comments (= 0.29.1) + decidim-core (= 0.29.1) + decidim-proposals (= 0.29.1) + decidim-surveys (0.29.1) + decidim-core (= 0.29.1) + decidim-forms (= 0.29.1) + decidim-system (0.29.1) active_link_to (~> 1.0) - decidim-core (= 0.27.1) + decidim-core (= 0.29.1) devise (~> 4.7) devise-i18n (~> 1.2) - devise_invitable (~> 2.0) - decidim-templates (0.27.1) - decidim-core (= 0.27.1) - decidim-forms (= 0.27.1) - decidim-verifications (0.27.1) - decidim-core (= 0.27.1) + devise_invitable (~> 2.0, >= 2.0.9) + decidim-verifications (0.29.1) + decidim-core (= 0.29.1) declarative-builder (0.1.0) declarative-option (< 0.2.0) declarative-option (0.1.0) - descendants_tracker (0.0.4) - thread_safe (~> 0.3, >= 0.3.1) - devise (4.8.1) + devise (4.9.4) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) responders warden (~> 1.2.3) - devise-i18n (1.10.2) - devise (>= 4.8.0) - devise_invitable (2.0.6) + devise-i18n (1.11.0) + devise (>= 4.9.0) + devise_invitable (2.0.9) actionmailer (>= 5.0) devise (>= 4.6) - diff-lcs (1.5.0) + diff-lcs (1.5.1) diffy (3.4.2) - doc2text (0.4.5) - nokogiri (>= 1.13.2, < 1.14.0) + doc2text (0.4.7) + nokogiri (>= 1.13.2, < 1.17.0) rubyzip (~> 2.3.0) - docile (1.4.0) - doorkeeper (5.6.2) + docile (1.4.1) + doorkeeper (5.7.1) railties (>= 5) doorkeeper-i18n (4.0.1) - dumb_delegator (1.0.0) - erb_lint (0.0.37) + erb_lint (0.4.0) activesupport - better_html (~> 1.0.7) - html_tokenizer + better_html (>= 2.0.1) parser (>= 2.7.1.4) rainbow rubocop smart_properties erbse (0.1.4) temple - erubi (1.11.0) + erubi (1.13.0) escape_utils (1.3.0) - excon (0.95.0) - execjs (2.8.1) + excon (0.112.0) extended-markdown-filter (0.7.0) html-pipeline (~> 2.9) - factory_bot (4.11.1) - activesupport (>= 3.0.0) - factory_bot_rails (4.11.1) - factory_bot (~> 4.11.1) - railties (>= 3.0.0) - faker (2.23.0) + factory_bot (6.5.0) + activesupport (>= 5.0.0) + factory_bot_rails (6.4.3) + factory_bot (~> 6.4) + railties (>= 5.0.0) + faker (3.4.2) i18n (>= 1.8.11, < 2) - faraday (2.7.2) - faraday-net_http (>= 2.0, < 3.1) - ruby2_keywords (>= 0.0.4) - faraday-net_http (3.0.2) - ffi (1.15.5) + faraday (2.12.0) + faraday-net_http (>= 2.0, < 3.4) + json + logger + faraday-net_http (3.3.0) + net-http + ffi (1.17.0-x86_64-darwin) + ffi (1.17.0-x86_64-linux-gnu) file_validators (3.0.0) activemodel (>= 3.2) mime-types (>= 1.0) - fog-core (2.3.0) + fog-core (2.5.0) builder excon (~> 0.71) formatador (>= 0.2, < 2.0) @@ -423,49 +405,57 @@ GEM activesupport (>= 4.1, < 7.1) railties (>= 4.1, < 7.1) gemoji (3.0.1) - geocoder (1.8.1) - globalid (1.0.0) - activesupport (>= 5.0) - graphql (1.12.24) - graphql-docs (2.1.0) - commonmarker (~> 0.16) + geocoder (1.8.3) + base64 (>= 0.1.0) + csv (>= 3.0.0) + geom2d (0.4.1) + globalid (1.2.1) + activesupport (>= 6.1) + graphql (2.2.16) + base64 + graphql-docs (4.0.0) + commonmarker (~> 0.23, >= 0.23.6) + dartsass (~> 1.49) escape_utils (~> 1.2) extended-markdown-filter (~> 0.4) gemoji (~> 3.0) - graphql (~> 1.12) - html-pipeline (~> 2.9) - sass (~> 3.4) - hashdiff (1.0.1) + graphql (~> 2.0) + html-pipeline (~> 2.14, >= 2.14.3) + hashdiff (1.1.1) hashie (5.0.0) - highline (2.0.3) - hkdf (0.3.0) + hexapdf (0.32.2) + cmdparse (~> 3.0, >= 3.0.3) + geom2d (~> 0.3) + openssl (>= 2.2.1) + highline (3.1.1) + reline html-pipeline (2.14.3) activesupport (>= 2) nokogiri (>= 1.4) - html_tokenizer (0.0.7) htmlentities (4.3.4) - i18n (1.12.0) + i18n (1.14.6) concurrent-ruby (~> 1.0) - i18n-tasks (0.9.37) + i18n-tasks (1.0.14) activesupport (>= 4.0.2) ast (>= 2.1.0) erubi highline (>= 2.0.0) i18n - parser (>= 2.2.3.0) + parser (>= 3.2.2.1) rails-i18n rainbow (>= 2.2.2, < 4.0) terminal-table (>= 1.5.1) - icalendar (2.8.0) + icalendar (2.10.3) ice_cube (~> 0.16) - ice_cube (0.16.4) - ice_nine (0.11.2) - image_processing (1.12.2) + ostruct + ice_cube (0.17.0) + image_processing (1.13.0) mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) invisible_captcha (0.13.0) rails (>= 3.2.0) - json (2.6.3) + io-console (0.7.2) + json (2.7.2) jwt (2.5.0) kaminari (1.2.2) activesupport (>= 4.1.0) @@ -479,66 +469,57 @@ GEM activerecord kaminari-core (= 1.2.2) kaminari-core (1.2.2) - kramdown (2.4.0) - rexml - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - launchy (2.5.0) - addressable (~> 2.7) - letter_opener (1.8.1) - launchy (>= 2.2, < 3) + language_server-protocol (3.17.0.3) + launchy (3.0.1) + addressable (~> 2.8) + childprocess (~> 5.0) + letter_opener (1.10.0) + launchy (>= 2.2, < 4) letter_opener_web (2.0.0) actionmailer (>= 5.2) letter_opener (~> 1.7) railties (>= 5.2) rexml - listen (3.7.1) + listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.3.1) + logger (1.6.1) + loofah (2.22.0) crass (~> 1.0.2) - nokogiri (>= 1.5.9) - mail (2.8.0) + nokogiri (>= 1.12.0) + mail (2.8.1) mini_mime (>= 0.1.1) net-imap net-pop net-smtp - marcel (1.0.2) + marcel (1.0.4) matrix (0.4.2) - mdl (0.12.0) - kramdown (~> 2.3) - kramdown-parser-gfm (~> 1.1) - mixlib-cli (~> 2.1, >= 2.1.1) - mixlib-config (>= 2.2.1, < 4) - mixlib-shellout - method_source (1.0.0) - mime-types (3.4.1) + method_source (1.1.0) + mime-types (3.6.0) + logger mime-types-data (~> 3.2015) - mime-types-data (3.2022.0105) - mini_magick (4.12.0) - mini_mime (1.1.2) - mini_portile2 (2.8.0) - minitest (5.16.3) - mixlib-cli (2.1.8) - mixlib-config (3.0.27) - tomlrb - mixlib-shellout (3.2.7) - chef-utils - msgpack (1.6.0) - multi_xml (0.6.0) - mustache (1.1.1) - net-imap (0.3.3) + mime-types-data (3.2024.1001) + mini_magick (4.13.2) + mini_mime (1.1.5) + minitest (5.25.1) + msgpack (1.7.3) + multi_xml (0.7.1) + bigdecimal (~> 3.1) + net-http (0.4.1) + uri + net-imap (0.4.17) date net-protocol net-pop (0.1.2) net-protocol - net-protocol (0.2.1) + net-protocol (0.2.2) timeout - net-smtp (0.3.3) + net-smtp (0.3.4) net-protocol - nio4r (2.5.8) - nokogiri (1.13.10) - mini_portile2 (~> 2.8.0) + nio4r (2.7.3) + nokogiri (1.16.7-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) oauth (1.1.0) oauth-tty (~> 1.0, >= 1.0.1) @@ -553,240 +534,252 @@ GEM rack (>= 1.2, < 4) snaky_hash (~> 2.0) version_gem (~> 1.1) - omniauth (2.1.0) + omniauth (2.1.2) hashie (>= 3.4.6) rack (>= 2.2.3) rack-protection omniauth-facebook (5.0.0) omniauth-oauth2 (~> 1.2) - omniauth-google-oauth2 (1.1.1) + omniauth-google-oauth2 (1.1.3) jwt (>= 2.0) - oauth2 (~> 2.0.6) + oauth2 (~> 2.0) omniauth (~> 2.0) - omniauth-oauth2 (~> 1.8.0) - omniauth-oauth (1.2.0) + omniauth-oauth2 (~> 1.8) + omniauth-oauth (1.2.1) oauth omniauth (>= 1.0, < 3) + rack (>= 1.6.2, < 4) omniauth-oauth2 (1.8.0) oauth2 (>= 1.4, < 3) omniauth (~> 2.0) - omniauth-rails_csrf_protection (1.0.1) + omniauth-rails_csrf_protection (1.0.2) actionpack (>= 4.2) omniauth (~> 2.0) omniauth-twitter (1.4.0) omniauth-oauth (~> 1.1) rack - origami (2.1.0) - colorize (~> 0.7) + openssl (3.2.0) orm_adapter (0.5.0) + ostruct (0.6.0) paper_trail (12.3.0) activerecord (>= 5.2) request_store (~> 1.1) - parallel (1.22.1) - parallel_tests (3.13.0) + parallel (1.26.3) + parallel_tests (4.7.2) parallel - parser (3.1.3.0) + parser (3.3.5.0) ast (~> 2.4.1) - pg (1.1.4) - pg_search (2.3.6) - activerecord (>= 5.2) - activesupport (>= 5.2) - premailer (1.18.0) + racc + pg (1.4.6) + pg_search (2.3.7) + activerecord (>= 6.1) + activesupport (>= 6.1) + premailer (1.27.0) addressable - css_parser (>= 1.12.0) + css_parser (>= 1.19.0) htmlentities (>= 4.0.0) premailer-rails (1.12.0) actionmailer (>= 3) net-smtp premailer (~> 1.7, >= 1.7.9) - public_suffix (5.0.1) - puma (5.6.5) + psych (4.0.6) + stringio + public_suffix (6.0.1) + puma (6.4.3) nio4r (~> 2.0) - racc (1.6.1) - rack (2.2.4) - rack-attack (6.6.1) - rack (>= 1.0, < 3) + racc (1.8.1) + rack (2.2.10) + rack-attack (6.7.0) + rack (>= 1.0, < 4) rack-cors (1.1.1) rack (>= 2.0.0) - rack-protection (3.0.5) + rack-protection (3.2.0) + base64 (>= 0.1.0) + rack (~> 2.2, >= 2.2.4) + rack-proxy (0.7.7) rack - rack-proxy (0.7.4) - rack - rack-test (2.0.2) + rack-test (2.1.0) rack (>= 1.3) - rails (6.1.7) - actioncable (= 6.1.7) - actionmailbox (= 6.1.7) - actionmailer (= 6.1.7) - actionpack (= 6.1.7) - actiontext (= 6.1.7) - actionview (= 6.1.7) - activejob (= 6.1.7) - activemodel (= 6.1.7) - activerecord (= 6.1.7) - activestorage (= 6.1.7) - activesupport (= 6.1.7) + rails (7.0.8.5) + actioncable (= 7.0.8.5) + actionmailbox (= 7.0.8.5) + actionmailer (= 7.0.8.5) + actionpack (= 7.0.8.5) + actiontext (= 7.0.8.5) + actionview (= 7.0.8.5) + activejob (= 7.0.8.5) + activemodel (= 7.0.8.5) + activerecord (= 7.0.8.5) + activestorage (= 7.0.8.5) + activesupport (= 7.0.8.5) bundler (>= 1.15.0) - railties (= 6.1.7) - sprockets-rails (>= 2.0.0) + railties (= 7.0.8.5) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) activesupport (>= 5.0.1.rc1) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) + rails-dom-testing (2.2.0) + activesupport (>= 5.0.0) + minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.4.3) - loofah (~> 2.3) - rails-i18n (6.0.0) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + rails-i18n (7.0.9) i18n (>= 0.7, < 2) - railties (>= 6.0.0, < 7) - railties (6.1.7) - actionpack (= 6.1.7) - activesupport (= 6.1.7) + railties (>= 6.0.0, < 8) + railties (7.0.8.5) + actionpack (= 7.0.8.5) + activesupport (= 7.0.8.5) method_source rake (>= 12.2) thor (~> 1.0) + zeitwerk (~> 2.5) rainbow (3.1.1) - rake (13.0.6) - ransack (2.4.2) - activerecord (>= 5.2.4) - activesupport (>= 5.2.4) + rake (13.2.1) + ransack (3.2.1) + activerecord (>= 6.1.5) + activesupport (>= 6.1.5) i18n rb-fsevent (0.11.2) - rb-inotify (0.10.1) + rb-inotify (0.11.1) ffi (~> 1.0) - redcarpet (3.5.1) - redis (4.8.0) - regexp_parser (2.6.1) + redcarpet (3.6.0) + redis (4.8.1) + regexp_parser (2.9.2) + reline (0.5.10) + io-console (~> 0.5) request_store (1.5.1) rack (>= 1.4) - responders (3.0.1) - actionpack (>= 5.0) - railties (>= 5.0) - rexml (3.2.5) - rspec (3.12.0) - rspec-core (~> 3.12.0) - rspec-expectations (~> 3.12.0) - rspec-mocks (~> 3.12.0) - rspec-cells (0.3.8) + responders (3.1.1) + actionpack (>= 5.2) + railties (>= 5.2) + rexml (3.3.8) + rspec (3.13.0) + rspec-core (~> 3.13.0) + rspec-expectations (~> 3.13.0) + rspec-mocks (~> 3.13.0) + rspec-cells (0.3.9) cells (>= 4.0.0, < 6.0.0) - rspec-rails (>= 3.0.0, < 6.1.0) - rspec-core (3.12.0) - rspec-support (~> 3.12.0) - rspec-expectations (3.12.1) + rspec-rails (>= 3.0.0, < 6.2.0) + rspec-core (3.13.1) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.3) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) - rspec-html-matchers (0.9.4) + rspec-support (~> 3.13.0) + rspec-html-matchers (0.10.0) nokogiri (~> 1) - rspec (>= 3.0.0.a, < 4) - rspec-mocks (3.12.1) + rspec (>= 3.0.0.a) + rspec-mocks (3.13.2) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) - rspec-rails (4.1.2) - actionpack (>= 4.2) - activesupport (>= 4.2) - railties (>= 4.2) - rspec-core (~> 3.10) - rspec-expectations (~> 3.10) - rspec-mocks (~> 3.10) - rspec-support (~> 3.10) + rspec-support (~> 3.13.0) + rspec-rails (6.1.5) + actionpack (>= 6.1) + activesupport (>= 6.1) + railties (>= 6.1) + rspec-core (~> 3.13) + rspec-expectations (~> 3.13) + rspec-mocks (~> 3.13) + rspec-support (~> 3.13) rspec-retry (0.6.2) rspec-core (> 3.3) - rspec-support (3.12.0) - rspec_junit_formatter (0.3.0) + rspec-support (3.13.1) + rspec_junit_formatter (0.6.0) rspec-core (>= 2, < 4, != 2.12.0) - rubocop (1.28.2) + rubocop (1.65.1) + json (~> 2.3) + language_server-protocol (>= 3.17.0) parallel (~> 1.10) - parser (>= 3.1.0.0) + parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) - rexml - rubocop-ast (>= 1.17.0, < 2.0) + regexp_parser (>= 2.4, < 3.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.24.0) - parser (>= 3.1.1.0) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.32.3) + parser (>= 3.3.1.0) + rubocop-capybara (2.21.0) + rubocop (~> 1.41) + rubocop-factory_bot (2.26.1) + rubocop (~> 1.61) rubocop-faker (1.1.0) faker (>= 2.12.0) rubocop (>= 0.82.0) - rubocop-rails (2.15.2) + rubocop-performance (1.22.1) + rubocop (>= 1.48.1, < 2.0) + rubocop-ast (>= 1.31.1, < 2.0) + rubocop-rails (2.26.2) activesupport (>= 4.2.0) rack (>= 1.1) - rubocop (>= 1.7.0, < 2.0) - rubocop-rspec (2.11.1) - rubocop (~> 1.19) - ruby-progressbar (1.11.0) - ruby-vips (2.1.4) + rubocop (>= 1.52.0, < 2.0) + rubocop-ast (>= 1.31.1, < 2.0) + rubocop-rspec (3.1.0) + rubocop (~> 1.61) + rubocop-rspec_rails (2.30.0) + rubocop (~> 1.61) + rubocop-rspec (~> 3, >= 3.0.1) + rubocop-rubycw (0.1.6) + rubocop (~> 1.0) + ruby-progressbar (1.13.0) + ruby-vips (2.2.2) ffi (~> 1.12) - ruby2_keywords (0.0.5) - rubyXL (3.4.25) + logger + rubyXL (3.4.27) nokogiri (>= 1.10.8) rubyzip (>= 1.3.0) rubyzip (2.3.2) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - selenium-webdriver (4.1.0) - childprocess (>= 0.5, < 5.0) + selenium-webdriver (4.25.0) + base64 (~> 0.2) + logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) - rubyzip (>= 1.2.2) + rubyzip (>= 1.2.2, < 3.0) + websocket (~> 1.0) semantic_range (3.0.0) - seven_zip_ruby (1.3.0) - simplecov (0.21.2) + shakapacker (7.1.0) + activesupport (>= 5.2) + rack-proxy (>= 0.6.1) + railties (>= 5.2) + semantic_range (>= 2.3.0) + simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) simplecov-cobertura (2.1.0) rexml simplecov (~> 0.19) - simplecov-html (0.12.3) + simplecov-html (0.13.1) simplecov_json_formatter (0.1.4) smart_properties (1.17.0) snaky_hash (2.0.1) hashie version_gem (~> 1.1, >= 1.1.1) - social-share-button (1.2.4) - coffee-rails - spring (2.1.1) - spring-watcher-listen (2.0.1) + spring (4.2.1) + spring-watcher-listen (2.1.0) listen (>= 2.7, < 4.0) - spring (>= 1.2, < 3.0) - sprockets (4.2.0) - concurrent-ruby (~> 1.0) - rack (>= 2.2.4, < 4) - sprockets-rails (3.4.2) - actionpack (>= 5.2) - activesupport (>= 5.2) - sprockets (>= 3.0.0) - ssrf_filter (1.1.1) - temple (0.9.1) + spring (>= 4) + stringio (3.1.1) + temple (0.10.3) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - thor (1.2.1) - thread_safe (0.3.6) - tilt (2.0.11) - timeout (0.3.1) - tomlrb (2.0.3) + thor (1.3.2) + tilt (2.4.0) + timeout (0.4.1) twilio-ruby (5.72.1) faraday (>= 0.9, < 3.0) jwt (>= 1.5, <= 2.5) nokogiri (>= 1.6, < 2.0) - tzinfo (2.0.5) + tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) unaccent (0.4.0) - unicode-display_width (2.3.0) - valid_email2 (2.3.1) + unicode-display_width (2.6.0) + uniform_notifier (1.16.0) + uri (1.0.2) + valid_email2 (4.0.6) activemodel (>= 3.2) mail (~> 2.5) - version_gem (1.1.1) - virtus (2.0.0) - axiom-types (~> 0.1) - coercible (~> 1.0) - descendants_tracker (~> 0.0, >= 0.0.3) + version_gem (1.1.4) w3c_rspec_validators (0.3.0) rails rspec @@ -797,60 +790,55 @@ GEM rexml (~> 3.2) warden (1.2.9) rack (>= 2.0.9) - web-console (4.2.0) + web-console (4.2.1) actionview (>= 6.0.0) activemodel (>= 6.0.0) bindex (>= 0.4.0) railties (>= 6.0.0) - webmock (3.18.1) + web-push (3.0.1) + jwt (~> 2.0) + openssl (~> 3.0) + webmock (3.24.0) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - webpacker (6.0.0.rc.5) - activesupport (>= 5.2) - rack-proxy (>= 0.6.1) - railties (>= 5.2) - semantic_range (>= 2.3.0) - webpush (1.1.0) - hkdf (~> 0.2) - jwt (~> 2.0) - websocket-driver (0.7.5) + websocket (1.2.11) + websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - wicked (1.4.0) - railties (>= 3.0.7) - wicked_pdf (2.6.3) + wicked_pdf (2.8.1) activesupport wisper (2.0.1) wisper-rspec (1.1.0) wkhtmltopdf-binary (0.12.6.6) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.6) + zeitwerk (2.7.0) PLATFORMS - ruby + x86_64-darwin-23 + x86_64-linux DEPENDENCIES bootsnap (~> 1.4) - brakeman (~> 5.2) + brakeman (~> 6.1) byebug (~> 11.0) - decidim (~> 0.27.0) - decidim-dev (~> 0.27.0) - decidim-initiatives (~> 0.27.0) + decidim (~> 0.29.0) + decidim-dev (~> 0.29.0) + decidim-initiatives (~> 0.29.0) decidim-ptp! - faker (~> 2.14) + faker (~> 3.2) letter_opener_web (~> 2.0) listen (~> 3.1) - parallel_tests (~> 3.7) - puma (>= 5.6.2) + parallel_tests (~> 4.2) + puma (>= 6.3.1) rubocop-faker - spring (~> 2.0) - spring-watcher-listen (~> 2.0) + spring + uri (~> 1.0.2) web-console (~> 4.2) RUBY VERSION - ruby 3.0.4p208 + ruby 3.2.2p53 BUNDLED WITH - 2.2.33 + 2.4.10 diff --git a/decidim-budgets_booth/README.md b/decidim-budgets_booth/README.md index f2e67afa..a058fe90 100644 --- a/decidim-budgets_booth/README.md +++ b/decidim-budgets_booth/README.md @@ -7,11 +7,9 @@ their vote has not been cast. The idea is to "lock" the user inside a voting booth during the voting process and make it extremely clear for them that if they exit the voting booth, they have not yet cast their vote. -The module also introduces a new budgeting workflow called "ZIP code". This -workflow allows limiting the budgets available for the user based on their ZIP -code, providing them only those budgets they are eligible to vote at. For more -information and how to set this up, please refer to the -[ZIP code voting documentation](docs/ZIP_CODE_VOTING.md). +This module also provides design improvements on the projects index view, like +the possibility in this view to switch between grid mode and list mode +(default is grid mode). ## Usage @@ -20,30 +18,15 @@ feature/capabilities to it. After installing this module, the normal budgeting component will automatically provide the voting booth capabilities meaning if you do not want these capabilities, you should uninstall this module. -For enabling the "ZIP code voting" feature, you have a new workflow available -for the budgets component named "ZIP code" which shows up at the configuration -page as follows: -![ZIP code workflow](docs/zip-code-workflow.png) +This module enables the following features to the budget voting experience: -This workflow enables the following features to the budget voting experience: - -- Capability for enabling/disabling "ZIP code" workflow from components - configuration. -- Capability for the user to provide their ZIP code when entering the voting - booth. - * Users may change their zip code only if they have not voted yet, or if they - have deleted all of their votes. - Defining cancel and after finishing voting redirection destinations. * Useful for asking for feedback, for example, after completing voting. - Introducing a new configuration for maximum number of budgets, in which users can vote. - Adding after voting and after completing voting message, configurable from admin panel. -- Capability of showing/hiding voting instruction, when the user starts to vote. -- Capability of showing images in the after voting popup. -- Capability of adding images to the budgets from back office, to be displayed - at the budgets listing page. ## Installation @@ -63,53 +46,21 @@ bundle ### Admin configuration -To configure this module correctly, you need to first configure the ZIP codes -correctly. Please refer to the -[ZIP code voting documentation](docs/ZIP_CODE_VOTING.md) for more information on -how to set it up. Next, you can configure the following options from your -budgets component configurations: - -- **Vote based on ZIP code**: allows participants to vote on budgets matching - their entered ZIP code. - * Selecting this option enables ZIP code workflow. - * Any other workflow will work as Decidim would normally work but with the - voting booth feature enabled. +You can configure the following options from your budgets component configurations: + - **Popup text after each vote**: the content of the popup which is being shown after each voting. - **Popup text after voting in all available budgets**: the content of the popup which is being shown after user voted in all available budgets. -- **Terms and conditions to be shown when user wants to enter their ZIP code**: - set of terms and conditions you ask the users to agree on when they are - entering their ZIP code. - * This message is shown in ZIP code entering view when using the ZIP code - voting. - * Otherwise, this message will show up when the user is about to confirm their - vote. - **URL to redirect user after voting on all available budgets**: Defines where user is redirected after completing their vote. * By default, the user is redirected back to the budgets list. - **URL to redirect user when canceling voting**: Defines where the user is redirected if they decide to cancel the voting process. * By default, the user is redirected to the root path. -- **Show full project descriptions on the listing page and disable the details - popup**: This option shows the complete project descriptions on the projects - listing page while voting. If this setting is disabled, the descriptions will - show up as "teasers" and the whole details are opened within a modal window. - -### Hard coded configuration +- **Maximum number of budgets that user can vote on**: Defines how many budgets a user can vote on. + * By default, the value is 0, which means user can vote on all available budgets. -You can set the number of digits for the ZIP codes which may differ in different -countries. The default is set to 5, which is the case for those countries -considered when this module was developed. If you need set this to a different -number, you can use the following code within an initializer to change this -setting: - -```ruby -Decidim::BudgetsBooth.configure do |config| - # Change this value to the number of characters in the ZIP codes within the country where this instances is used at. - config.zip_code_length = 5 -end -``` ## Testing diff --git a/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/budget_list_item_cell_extensions.rb b/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/budget_list_item_cell_extensions.rb deleted file mode 100644 index 28867f95..00000000 --- a/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/budget_list_item_cell_extensions.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module BudgetsBooth - module BudgetListItemCellExtensions - extend ActiveSupport::Concern - include VotingSupport - - included do - delegate :voting_open?, :voting_finished?, to: :controller - - def button_text - t(:vote, scope: i18n_scope) - end - - def mark_image_as_voted(budget) - return nil unless voted_this?(budget) - - return nil unless voting_open? - - " voted-budget" - end - - def link_to_budget(budget, **options) - link_options = options - - link_target = - if voting_open? && !voted_this?(budget) - budget_voting_index_path(budget) - elsif voting_open? && voted_this?(budget) - link_options[:remote] = true - decidim_budgets.budget_order_path(budget) - else - budget_projects_path(budget) - end - - link_to link_target, **link_options do - yield - end - end - - def generate_text_for(budget) - if voted_this?(budget) - t("decidim.budgets.budget_list_item.show_my_vote") - else - t("decidim.budgets.budget_list_item.more_info") - end - end - end - end - end -end diff --git a/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/budgets_header_cell_extensions.rb b/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/budgets_header_cell_extensions.rb deleted file mode 100644 index e81b1183..00000000 --- a/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/budgets_header_cell_extensions.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module BudgetsBooth - module BudgetsHeaderCellExtensions - extend ActiveSupport::Concern - include ::Decidim::BudgetsBooth::VotingSupport - - included do - delegate :voting_open?, :voting_finished?, :component_settings, :current_workflow, to: :controller - delegate :user_zip_code, to: :current_workflow - end - end - end -end diff --git a/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/project_list_item_extensions.rb b/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/project_list_item_extensions.rb deleted file mode 100644 index 15cf82ec..00000000 --- a/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/project_list_item_extensions.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module BudgetsBooth - # Customizes the project card cell - module ProjectListItemExtensions - extend ActiveSupport::Concern - delegate :current_workflow, to: :controller - - included do - def resource_text - return translated_attribute(model.description) if show_full_description? && voting_open? - - decidim_sanitize_editor html_truncate(translated_attribute(model.description), length: 65, separator: "...") - end - - def selected_budget - return unless can_have_order? && resource_added? - - "hollow" - end - - def voting_mode? - options[:voting_mode] - end - - private - - def show_full_description? - current_component.settings.show_full_description_on_listing_page == true - end - end - end - end -end diff --git a/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/project_voted_hint_cell_extensions.rb b/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/project_voted_hint_cell_extensions.rb deleted file mode 100644 index e2ae6511..00000000 --- a/decidim-budgets_booth/app/cells/concerns/decidim/budgets_booth/project_voted_hint_cell_extensions.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module BudgetsBooth - module ProjectVotedHintCellExtensions - extend ActiveSupport::Concern - - included do - def css_class - css = ["text-success"] - css << options[:class] if options[:class] - css << "text-sm" unless options[:class]&.include?("text-m") - css.join(" ") - end - end - end - end -end diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/budget_list_item/show.erb b/decidim-budgets_booth/app/cells/decidim/budgets/budget_list_item/show.erb index 06d3f70f..7b3133c1 100644 --- a/decidim-budgets_booth/app/cells/decidim/budgets/budget_list_item/show.erb +++ b/decidim-budgets_booth/app/cells/decidim/budgets/budget_list_item/show.erb @@ -1,88 +1,51 @@ -<% if voting_booth_forced? %> -
-
-
-
- <% if voting_open? && voted_this?(budget) %> -

- <%= translated_attribute(budget.title) %> -

- <% else %> - <%= link_to_budget budget, class: link_class do %> -

- <%= translated_attribute(budget.title) %> -

- <% end %> - <% end%> - -
- <%= decidim_sanitize_editor html_truncate(translated_attribute(budget.description), length: 65, separator: "...") %> -
- - <%= link_to_budget budget, class: "button small hollow show_votes" do %> - - <%= generate_text_for(budget)%> - - <% end %> -
+<% finished = voted_all_budgets? && !voted? %> +
+
+ <%= link_to finished ? "#" : resource_path, class: "p-4" do %> +

+ <%= decidim_escape_translated(title) %> +

+ <% if voted? %> + <%= icon "check-double-line", class: "inline-block align-middle fill-success ml-2 h-[1.5em] w-[1.5em]" %> + <% end %> +
+ <%= decidim_sanitize html_truncate(translated_attribute(description), length: 70) %>
-
-
- <% if voting_open? %> -
-
- - <% if !voted_this?(budget) %> - <%= link_to_budget budget, class: "button expanded button--sc" do %> - <%= t("take_part", scope: "decidim.budgets.budget_list_item") %> - - <%= t("current_phase", scope: "decidim.budgets.budget_list_item", phase: translated_attribute(current_phase)) %> - <% end %> - <% end %> -
-
- <% end %> + <% unless voted? %> +
+ <%= render :projects_count %> + <%= render :vote_action if voting_context? %>
+ <% end %> + <% end %> + <% if voted? %> +
+ <%= render :projects_count %> + <%= render :vote_action if voting_context? %>
-
+ <% end %>
-<% else %> -
-
- <%= link_to budget_path(budget), class: link_class do %> -

- <%= translated_attribute(title) %> -

- <% end %> - -
- + <% if voting_context? %> + <%= link_to finished ? "#" : resource_path, class: "budget__card__highlight-vote" do %> +
+ + <%= t("name", scope: "decidim.budgets.admin.models.budget") %> + + <%= budget_to_currency(total_budget) %> - +
- - <%= decidim_sanitize_editor translated_attribute(description) %> -
- - <% if !voting_finished? %> -
- <% if voted? %> - - <%= icon "check", class: "icon--small", role: "img", aria_label: t("decidim.budgets.budget_list_item.voting_finished") %> - - <% elsif progress? %> - - <%= icon "bookmark", class: "icon--small", role: "img", aria_label: t("decidim.budgets.budget_list_item.voting_started") %> - + <% if finished %> + + <% else %> + <%= button_tag class: "button button__sm #{button_class} #{voted? ? "button__transparent-secondary" : "button__secondary"} budget__card__highlight-vote__button" do %> + <%= button_text %> + <%= icon "arrow-right-line" %> <% end %> -
- <% end %> - -
- <%= link_to budget_path(budget), class: "button button--sc expanded #{button_class} mb-none" do %> - <%= button_text %> - <%= icon "chevron-right", class: "icon--small", role: "img" %> <% end %> -
-
-<% end %> + <% end %> + <% end %> +
diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/budgets_header/show.erb b/decidim-budgets_booth/app/cells/decidim/budgets/budgets_header/show.erb deleted file mode 100644 index bddd5b78..00000000 --- a/decidim-budgets_booth/app/cells/decidim/budgets/budgets_header/show.erb +++ /dev/null @@ -1,44 +0,0 @@ -<% if voting_open? && voting_booth_forced? %> - <% unless voted_all_budgets? %> -
-
- <%= button_to cancel_redirect_path, class: "link margin-bottom-3", method: :get, data: { - confirm: t("actions.cancel_voting", scope: "decidim.budgets.budgets") - } do %> - <%= icon "chevron-left", class: "icon--small", role: "img", "aria-hidden": true %> - <%= t("cancel_voting", scope: "decidim.budgets.budgets.index") %> - <% end %> -
-
- <% end %> -
-
-
-

- <%= t("title", scope: "decidim.budgets.budgets_header") %> -

-

- <%= t("based_on_zip_code", scope: "decidim.budgets.budgets_header", zip_code: user_zip_code)%> - <% if !voted_any? %> - <%= t("not_right_one", scope: "decidim.budgets.budgets_header", link: link_to(t("change_it_here", scope: "decidim.budgets.budgets_header"), new_zip_code_path)) %> - <% end %> -

-
-
-
- <% if !voted_any? && landing_page_content.present? %> -
- <%= decidim_sanitize_editor(landing_page_content) %> -
- <% end %> -
-
-<% else %> -
-
-
- <%= decidim_sanitize_editor(landing_page_content) %> -
-
-
-<% end %> diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/budgets_list/card_list.erb b/decidim-budgets_booth/app/cells/decidim/budgets/budgets_list/card_list.erb deleted file mode 100644 index 8563c5a2..00000000 --- a/decidim-budgets_booth/app/cells/decidim/budgets/budgets_list/card_list.erb +++ /dev/null @@ -1,39 +0,0 @@ -<% if voting_booth_forced? %> - <% if budgets.none? %> -
-
- <%= t("no_budgets_found", scope: "decidim.budgets.budgets_list") %> -
-
- <% end %> - -
- <% if budgets.any? %> - <% budgets.each do |budget| %> - <% next if hide_unvoted?(budget) %> -
- <%= cell("decidim/budgets/budget_list_item", budget) %> -
- <% end %> - <% end %> -
-<% else %> - <%# show highlighted budgets first %> - <% if highlighted.any? %> -
- <% highlighted.each do |budget| %> - <%= cell("decidim/budgets/budget_list_item", budget) %> - <% end %> -
- <% end %> - - <% non_highlighted = (budgets - highlighted - voted) %> - - <% if non_highlighted.any? %> -
- <% non_highlighted.each do |budget| %> - <%= cell("decidim/budgets/budget_list_item", budget) %> - <% end %> -
- <% end %> -<% end %> diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/budgets_list/show.erb b/decidim-budgets_booth/app/cells/decidim/budgets/budgets_list/show.erb deleted file mode 100644 index 5bf9ebac..00000000 --- a/decidim-budgets_booth/app/cells/decidim/budgets/budgets_list/show.erb +++ /dev/null @@ -1,58 +0,0 @@ -<% if voting_booth_forced? %> -
-
- <%= render :card_list %> -
-
- <% if voting_open? && voted? %> -
-
-

- <%= t(:if_change_opinion, scope: i18n_scope) %> - <%= link_to( - t("cancel_order.only_one", scope: i18n_scope), - budget_order_path(voted.first), - method: :delete, - data: { confirm: t("projects.budget_summary.are_you_sure", scope: "decidim.budgets") }) if voted.one? %> -

- <% if !voted.one? && voted.any? %> -
    - <% voted.each do |budget| %> -
  • - <%= link_to( - t("cancel_order.more_than_one", scope: i18n_scope, name: translated_attribute(budget.title)), - budget_order_path(budget), - method: :delete, - class: "cancel-order", - data: { - confirm: t("projects.budget_summary.are_you_sure", scope: "decidim.budgets") - } - ) %> -
  • - <% end %> -
- <% end %> -
-
- <% end %> -<% else %> -
-
- <% if !voting_finished? && (voted?) %> -
-

- <%= t(:my_budgets, scope: i18n_scope) %> -

- - <%= render :voted %> -
- <% end %> - -
-
- <%= render :card_list %> -
-
-
-
-<% end %> diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/budgets_list/voted.erb b/decidim-budgets_booth/app/cells/decidim/budgets/budgets_list/voted.erb new file mode 100644 index 00000000..b9895a08 --- /dev/null +++ b/decidim-budgets_booth/app/cells/decidim/budgets/budgets_list/voted.erb @@ -0,0 +1,16 @@ +<% if voted? %> + <% if voted_all_budgets? %> +

<%= t(:voted_on_all_allowed, scope: i18n_scope, links: budgets_link_list(voted)) %>

+ <% else %> +

<%= t(:voted_on, scope: i18n_scope, links: budgets_link_list(voted)) %>

+ <% end %> +
+ <% voted.each do |budget| %> + <%= cell("decidim/budgets/budget_list_item", budget) %> + <% end %> +
+ + <% if finished? %> +

<%= t(:finished_message, scope: i18n_scope) %>

+ <% end %> +<% end %> diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/project_cell.rb b/decidim-budgets_booth/app/cells/decidim/budgets/project_cell.rb new file mode 100644 index 00000000..e3a60819 --- /dev/null +++ b/decidim-budgets_booth/app/cells/decidim/budgets/project_cell.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module Decidim + module Budgets + # This cell renders the budget project card for an instance of a project + # the default size is the Medium Card (:m) + class ProjectCell < Decidim::ViewModel + include Cell::ViewModel::Partial + + def show + cell card_size, model, options + end + + private + + def card_size + case @options[:size] + when :s + "decidim/budgets/project_s" + when :g # added + "decidim/budgets/project_g" + else + "decidim/budgets/project_l" + end + end + end + end +end diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/project_g/show.erb b/decidim-budgets_booth/app/cells/decidim/budgets/project_g/show.erb new file mode 100644 index 00000000..d7032b12 --- /dev/null +++ b/decidim-budgets_booth/app/cells/decidim/budgets/project_g/show.erb @@ -0,0 +1,28 @@ +<% project_card = resource_added? ? "card__grid card-grid-selected" : classes[:default] %> +<%= link_to resource_path, class: project_card, id: resource_id do %> +
+ <% if has_image? %> + <%= image_tag resource_image_path, alt: alt_title %> + <% end %> +
+
+
+ <%= content_tag title_tag, title, class: title_class %> +
+ + <%= description.truncate_words(20) %> + + <% if metadata_cell.present? %> +
+ <%= cell metadata_cell, resource, links: false, skip_state: true, **options %> + <%= cell("decidim/budgets/project_voted_hint", project, class: "margin-left-1") if current_order_checked_out? && resource_added? %> +
+ <% end %> +
+ <%= cell("decidim/budgets/project_vote_button", project, show_only_added:, view_mode:) %> + + <%= budget_to_currency(project.budget_amount) %> + +
+
+<% end %> diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/project_g_cell.rb b/decidim-budgets_booth/app/cells/decidim/budgets/project_g_cell.rb new file mode 100644 index 00000000..5edbdfb0 --- /dev/null +++ b/decidim-budgets_booth/app/cells/decidim/budgets/project_g_cell.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +require "cell/partial" + +module Decidim + module Budgets + # This cell renders the Grid (:g) project card + # for an instance of a Project + class ProjectGCell < Decidim::CardGCell + include Decidim::Budgets::ProjectsHelper + include Decidim::Proposals::ApplicationHelper + include Decidim::LayoutHelper + + alias project model + + delegate :state_item, to: :metadata_cell_instance + + def show + render + end + + def title + decidim_escape_translated(model.title).html_safe + end + + def metadata_cell = "decidim/budgets/project_metadata" + + def metadata_cell_instance + @metadata_cell_instance ||= cell("decidim/budgets/project_metadata", model) + end + + def resource_image_path + project.photos.first&.url if project.attachments.present? + end + + private + + def resource_path + resource_locator([project.budget, project]).path + end + + def resource_added? + current_order && current_order.projects.include?(model) + end + + def current_order + @current_order ||= controller.try(:current_order) + end + + def show_only_added + options[:show_only_added] + end + + def view_mode + options[:view_mode] + end + + def classes + super.merge(metadata: "card__grid-metadata") + end + + def resource_id = "project-#{project.id}-item" + end + end +end diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/project_list_item/project_data.erb b/decidim-budgets_booth/app/cells/decidim/budgets/project_list_item/project_data.erb deleted file mode 100644 index 28b60f56..00000000 --- a/decidim-budgets_booth/app/cells/decidim/budgets/project_list_item/project_data.erb +++ /dev/null @@ -1,23 +0,0 @@ -
" data-category="<%= model&.category&.id %>" > - <% if voting_finished? %> -
- <%= cell("decidim/budgets/project_votes_count", model) %> - - <%= cell("decidim/budgets/project_voted_hint", model, class: "display-block margin-top-1") %> -
- <% else %> -
- <%= render :selected_button_tag if resource_added? && current_order_checked_out? %> -
-
- - <%= budget_to_currency(model.budget_amount) %> - - <%= cell("decidim/budgets/project_votes_count", model, layout: :one_line, class: "display-inline-block") %> - - <%= cell("decidim/budgets/project_voted_hint", model, class: "display-block margin-top-1") if current_order_checked_out? && resource_added? %> - -
- <%= cell("decidim/budgets/project_vote_button", model) if !current_order_checked_out? && voting_open? && voting_mode? %> - <% end %> -
diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/project_list_item/project_text.erb b/decidim-budgets_booth/app/cells/decidim/budgets/project_list_item/project_text.erb deleted file mode 100644 index e985e1d0..00000000 --- a/decidim-budgets_booth/app/cells/decidim/budgets/project_list_item/project_text.erb +++ /dev/null @@ -1,45 +0,0 @@ - -
-
- <% if voting_open? %> - <% if show_full_description? %> -

- <%= resource_title %> -

- <% else %> -

- <% if voting_mode? %> - - <% else %> - <%= link_to resource_title, resource_path, class: "link" %> - <% end %> -

- <% end %> - <% else %> - <%= link_to resource_path, class: "link" do %> -

- <%= cell("decidim/budgets/project_selected_status", model) %> - <%= resource_title %> -

- <% end %> - <% end %> - -
- <%= resource_text %> -
- <%= cell("decidim/budgets/project_tags", model, context: { extra_classes: [" tags--project"] } ) %> - - <% if !show_full_description? %> - <% if voting_mode? %> - - <% else %> - <%= link_to t("read_more", scope: "decidim.budgets.project_list_item"), resource_path, class: "link" %> - <% end %> - <% end %> - -
-
diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/project_list_item/selected_button_tag.erb b/decidim-budgets_booth/app/cells/decidim/budgets/project_list_item/selected_button_tag.erb deleted file mode 100644 index 2bf212f7..00000000 --- a/decidim-budgets_booth/app/cells/decidim/budgets/project_list_item/selected_button_tag.erb +++ /dev/null @@ -1 +0,0 @@ -<%= icon "actions", class: "card--list__icon card--list__check", role: "img", aria_label: I18n.t("ordered_item", scope: "decidim.budgets.project_list_item") %> diff --git a/decidim-budgets_booth/app/cells/decidim/budgets/project_vote_button/show.erb b/decidim-budgets_booth/app/cells/decidim/budgets/project_vote_button/show.erb index 6430b6d1..3a2adf09 100644 --- a/decidim-budgets_booth/app/cells/decidim/budgets/project_vote_button/show.erb +++ b/decidim-budgets_booth/app/cells/decidim/budgets/project_vote_button/show.erb @@ -1,20 +1,22 @@ -<%= action_authorized_button_to( +<% unless voting_finished? || current_settings.votes == "disabled" %> + <% button_type = resource_added? ? "button__transparent-secondary" : "button__secondary" %> + <%= action_authorized_button_to( "vote", - budget_order_line_item_path(model.budget, project_id: model), + budget_order_line_item_path(model.budget, project_id: model, show_only_added: options[:show_only_added], view_mode: options[:view_mode]), method: vote_button_method, remote: true, - class: "button #{scale_up} #{selected_budget} customized-budget display-block project-vote-button", + class: "button #{scale_up} budget-list__action project__vote-button #{button_type} customized-budget display-block project-#{project.id}-vote-button ", data: { add: !resource_added?, disable: true, budget: model.budget_amount, project_id: model.id, allocation: resource_allocation, - "redirect-url": budget_voting_index_path + "redirect-url": resource_path }, disabled: vote_button_disabled?, title: vote_button_label - ) do %> + ) do %> <%= resource_added? ? t("remove_from_vote", scope: "decidim.budgets.project_vote_button") :t("add_to_vote", scope: "decidim.budgets.project_vote_button") %> + <% end %> <% end %> - diff --git a/decidim-budgets_booth/app/cells/decidim/budgets_booth/vote_completed/show.erb b/decidim-budgets_booth/app/cells/decidim/budgets_booth/vote_completed/show.erb index 3c153a50..445575f8 100644 --- a/decidim-budgets_booth/app/cells/decidim/budgets_booth/vote_completed/show.erb +++ b/decidim-budgets_booth/app/cells/decidim/budgets_booth/vote_completed/show.erb @@ -1,21 +1,19 @@ +<%= decidim_modal id: "vote-completed" do %> +
+ <%= icon "delete-bin-line" %> +

<%= t("title", scope: "decidim.budgets.voting.vote_completed_modal") %>

-
-
-

<%= t("title", scope: "decidim.budgets.voting.vote_completed_modal") %>

- -
- -
- <%= vote_completed_content %> +
+ <%= vote_completed_content %> +
-
-
- -
+
+ +
-
+<% end %> diff --git a/decidim-budgets_booth/app/commands/concerns/decidim/budgets_booth/create_budget_extensions.rb b/decidim-budgets_booth/app/commands/concerns/decidim/budgets_booth/create_budget_extensions.rb deleted file mode 100644 index abf651ce..00000000 --- a/decidim-budgets_booth/app/commands/concerns/decidim/budgets_booth/create_budget_extensions.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module BudgetsBooth - module CreateBudgetExtensions - extend ActiveSupport::Concern - - included do - private - - def create_budget! - attributes = { - component: form.current_component, - scope: form.scope, - title: form.title, - weight: form.weight, - description: form.description, - total_budget: form.total_budget, - main_image: form.main_image - } - @budget = Decidim.traceability.create!( - ::Decidim::Budgets::Budget, - form.current_user, - attributes, - visibility: "all" - ) - end - end - end - end -end diff --git a/decidim-budgets_booth/app/commands/concerns/decidim/budgets_booth/update_budget_extensions.rb b/decidim-budgets_booth/app/commands/concerns/decidim/budgets_booth/update_budget_extensions.rb deleted file mode 100644 index ae4f2ab1..00000000 --- a/decidim-budgets_booth/app/commands/concerns/decidim/budgets_booth/update_budget_extensions.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module BudgetsBooth - module UpdateBudgetExtensions - extend ActiveSupport::Concern - include ::Decidim::AttachmentAttributesMethods - - included do - private - - def update_budget! - attributes = { - scope: form.scope, - title: form.title, - weight: form.weight, - description: form.description, - total_budget: form.total_budget - }.merge( - attachment_attributes(:main_image) - ) - - Decidim.traceability.update!( - budget, - form.current_user, - attributes, - visibility: "all" - ) - end - end - end - end -end diff --git a/decidim-budgets_booth/app/commands/decidim/budgets/create_user_data.rb b/decidim-budgets_booth/app/commands/decidim/budgets/create_user_data.rb deleted file mode 100644 index cff2538a..00000000 --- a/decidim-budgets_booth/app/commands/decidim/budgets/create_user_data.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Budgets - class CreateUserData < Decidim::Command - def initialize(form, zip_codes) - @zip_codes = zip_codes - @form = form - end - - def call - return broadcast(:invalid) if form.invalid? - - return broadcast(:invalid, zip_code_not_exit) unless zip_code_included? - - create_user_data! - - broadcast(:ok) - end - - private - - attr_reader :form, :budget, :zip_codes - - def create_user_data! - attributes = { - metadata: { zip_code: form.zip_code }, - affirm_statements_are_correct: form.affirm_statements_are_correct - } - @user_data = Decidim::Budgets::UserData.find_or_create_by!( - user: form.user, - component: form.component - ) - - Decidim.traceability.update!( - @user_data, - form.user, - attributes, - visibility: "all" - ) - end - - def zip_code_included? - zip_codes.include?(form.zip_code) - end - - def zip_code_not_exit - I18n.t("zip_code_included", scope: "decidim.budgets.user_data.error") - end - end - end -end diff --git a/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/budgets_controller_extensions.rb b/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/budgets_controller_extensions.rb index b5f8ffb5..e4385ef1 100644 --- a/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/budgets_controller_extensions.rb +++ b/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/budgets_controller_extensions.rb @@ -8,31 +8,16 @@ module BudgetsControllerExtensions included do layout :determine_layout - before_action :ensure_authenticated, if: :open_and_voting_booth_forced? - before_action :ensure_user_zip_code, if: :open_and_voting_booth_forced? - before_action :ensure_multiple_budgets, unless: :open_and_voting_booth_forced? + def index - # we need to redefine this action to avoid redirect in case of single budget + # if there is an announcement_body, render index + redirect_to budget_projects_path(current_workflow.single) if current_workflow.single? && announcement_body.nil? end private def determine_layout - return layout unless voting_booth_forced? - - return layout unless voting_enabled? - - return layout if voted_all_budgets? - - "decidim/budgets/voting_layout" - end - - def open_and_voting_booth_forced? - voting_booth_forced? && voting_open? - end - - def layout - current_participatory_space_manifest.context(current_participatory_space_context).layout + "layouts/decidim/application" end end end diff --git a/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/complete_voting_popup.rb b/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/complete_voting_popup.rb index 6db0122c..a0f276c7 100644 --- a/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/complete_voting_popup.rb +++ b/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/complete_voting_popup.rb @@ -26,7 +26,19 @@ def completed_vote_snippets HTML ) - snippets.add(:head, helpers.javascript_pack_tag("decidim_handle_voting_complete")) + snippets.add(:head, add_javascript_file) + end + + def add_javascript_file + if Rails.env.dev? + <<~HTML + + HTML + else + <<~HTML + + HTML + end end end end diff --git a/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/line_items_controller_extensions.rb b/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/line_items_controller_extensions.rb deleted file mode 100644 index f2db024d..00000000 --- a/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/line_items_controller_extensions.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -# Customizes the line items controller -module Decidim - module BudgetsBooth - module LineItemsControllerExtensions - extend ActiveSupport::Concern - - included do - before_action :set_help_modal - - helper Decidim::Budgets::VotingHelper - - private - - def set_help_modal - rule_enabled = current_component[:settings]["global"]["vote_rule_selected_projects_enabled"] - minimum_vote = current_component[:settings]["global"]["vote_selected_projects_minimum"] - line_items = order&.line_items - - @show_help_modal = - if current_workflow.try(:disable_voting_instructions?) - false - elsif rule_enabled - show_modal(order, minimum_vote, line_items) - else - order.blank? - # case of first click without rule_enabled => we want the modal - end - end - - def order - @order ||= Decidim::Budgets::Order.find_by(user: current_user, budget: budget) - end - - def show_modal(order, minimum_vote, line_items) - # when the user first click to add a project, the order is no yet created - if order.blank? - # case of the first click - # if minimum_vote is 1 => we want the modal - # if minimum_vote is not 1 => we don't want the modal - minimum_vote == 1 - elsif line_items && minimum_vote == line_items.size + 1 - # when user clicks to add a project, it has not yet been added in line items so we add + 1 to get the modal at the right time - # case of second/third... click => we want the modal when minimum_vote == line_items.size + 1 - true - end - end - end - end - end -end diff --git a/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/orders_controller_extensions.rb b/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/orders_controller_extensions.rb index ede5f6e4..f49af97b 100644 --- a/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/orders_controller_extensions.rb +++ b/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/orders_controller_extensions.rb @@ -11,7 +11,7 @@ module OrdersControllerExtensions helper_method :budget def checkout - enforce_permission_to :vote, :project, order: current_order, budget: budget, workflow: current_workflow + enforce_permission_to :vote, :project, order: current_order, budget:, workflow: current_workflow Decidim::Budgets::Checkout.call(current_order) do on(:ok) do reset_workflow diff --git a/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/projects_controller_extensions.rb b/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/projects_controller_extensions.rb index 7f9383c1..71f8b1a7 100644 --- a/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/projects_controller_extensions.rb +++ b/decidim-budgets_booth/app/controllers/concerns/decidim/budgets_booth/projects_controller_extensions.rb @@ -7,25 +7,34 @@ module ProjectsControllerExtensions include VotingSupport included do + # rubocop:disable Rails/LexicallyScopedActionFilter + before_action :set_view_mode, only: :index + # rubocop:enable Rails/LexicallyScopedActionFilter + layout :determine_layout + def index raise ActionController::RoutingError, "Not Found" unless budget - - raise ActionController::RoutingError, "Not Found" unless allow_access? end def show raise ActionController::RoutingError, "Not Found" unless budget raise ActionController::RoutingError, "Not Found" unless project - raise ActionController::RoutingError, "Not Found" unless allow_access? end end private - def allow_access? - return false if voting_booth_forced? && voting_enabled? && !voted_this?(budget) + def determine_layout + "decidim/budgets/voting_layout" + end + + def set_view_mode + @view_mode ||= params[:view_mode] || session[:view_mode] || default_view_mode + session[:view_mode] = @view_mode + end - true + def default_view_mode + @default_view_mode = "grid" end end end diff --git a/decidim-budgets_booth/app/controllers/decidim/budgets/user_data_controller.rb b/decidim-budgets_booth/app/controllers/decidim/budgets/user_data_controller.rb deleted file mode 100644 index f50d5e0d..00000000 --- a/decidim-budgets_booth/app/controllers/decidim/budgets/user_data_controller.rb +++ /dev/null @@ -1,67 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Budgets - class UserDataController < ApplicationController - include FormFactory - include ::Decidim::BudgetsBooth::VotingSupport - - delegate :user_zip_code, to: :current_workflow - - layout "decidim/budgets/voting_layout" - before_action :ensure_voting_booth_forced - before_action :ensure_authenticated - before_action :ensure_voting_open - before_action :ensure_not_voted - - helper_method :user_zip_code - - def new - @form = form(UserDataForm).instance - @form.zip_code = user_zip_code - end - - def create - @invalid = false - @form = form(UserDataForm).from_params(params.merge(user: current_user, component: current_component)) - CreateUserData.call(@form, all_zip_codes) do - on(:ok) do - flash[:notice] = I18n.t("success", scope: "decidim.budgets.user_data") - redirect_to decidim_budgets.budgets_path - end - - on(:invalid) do |result| - invalidate_form if result.present? - flash.now[:alert] = I18n.t("unknown", scope: "decidim.budgets.user_data.error") - render action: "new" - end - end - end - - private - - def ensure_voting_open - return if voting_open? - - flash[:warning] = t("voting_ended", scope: "decidim.budgets.user_data.new") - redirect_to decidim.root_path - end - - def all_zip_codes - @all_zip_codes ||= scope_manager.zip_codes_for(current_component) - end - - def budgets - @budgets ||= Decidim::Budgets::Budget.where(component: current_component) - end - - def scope_manager - @scope_manager ||= ::Decidim::BudgetsBooth::ScopeManager.new(current_component) - end - - def invalidate_form - @invalid = true - end - end - end -end diff --git a/decidim-budgets_booth/app/controllers/decidim/budgets/voting_controller.rb b/decidim-budgets_booth/app/controllers/decidim/budgets/voting_controller.rb deleted file mode 100644 index 3d73fd7c..00000000 --- a/decidim-budgets_booth/app/controllers/decidim/budgets/voting_controller.rb +++ /dev/null @@ -1,60 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Budgets - class VotingController < ProjectsController - include Decidim::Budgets::NeedsCurrentOrder - include ::Decidim::BudgetsBooth::VotingSupport - - layout "decidim/budgets/voting_layout" - before_action :store_user_location!, if: :storable_location? - # The callback which stores the current location must be added before you authenticate the user - # as `authenticate_user!` (or whatever your resource is) will halt the filter chain and redirect - # before the location can be stored. - - before_action :ensure_voting_open! - before_action :ensure_authenticated - before_action :ensure_not_voted_this! - - def index - enforce_permission_to :vote, :project, project: budget.projects.first, budget: budget, workflow: current_workflow - end - - private - - delegate :voted?, to: :current_workflow - - # Its important that the location is NOT stored if: - # - The request method is not GET (non idempotent) - # - The request is handled by a Devise controller such as Devise::SessionsController as that could cause an - # infinite redirect loop. - # - The request is an Ajax request as this can lead to very unexpected behaviour. - def storable_location? - request.get? && is_navigational_format? && !devise_controller? && !request.xhr? - end - - def store_user_location! - # :user is the scope we are authenticating - store_location_for(:user, request.fullpath) - end - - def ensure_voting_open! - return if voting_open? - - flash[:warning] = I18n.t("not_open_warning", scope: "decidim.budgets.voting.general") - redirect_to decidim_budgets.budget_projects_path(budget) - end - - def ensure_not_voted_this! - return unless current_order.checked_out? - - flash[:warning] = I18n.t("not_allowed", scope: "decidim.budgets.budgets.index") - redirect_to decidim.root_path - end - - def decidim_budgets - @decidim_budgets ||= Decidim::EngineRouter.main_proxy(current_component) - end - end - end -end diff --git a/decidim-budgets_booth/app/forms/concerns/decidim/budgets_booth/budget_form_extensions.rb b/decidim-budgets_booth/app/forms/concerns/decidim/budgets_booth/budget_form_extensions.rb deleted file mode 100644 index 85a6bcad..00000000 --- a/decidim-budgets_booth/app/forms/concerns/decidim/budgets_booth/budget_form_extensions.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module BudgetsBooth - module BudgetFormExtensions - extend ActiveSupport::Concern - - included do - attribute :main_image - validates :main_image, passthru: { - to: ::Decidim::Budgets::Budget, - with: { - component: lambda do |form| - space = Decidim.participatory_space_manifests.first.model_class_name.constantize.new( - organization: form.current_organization - ) - - Decidim::Component.new(participatory_space: space) - end - } - } - end - end - end -end diff --git a/decidim-budgets_booth/app/forms/decidim/budgets/user_data_form.rb b/decidim-budgets_booth/app/forms/decidim/budgets/user_data_form.rb deleted file mode 100644 index e56617ee..00000000 --- a/decidim-budgets_booth/app/forms/decidim/budgets/user_data_form.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Budgets - class UserDataForm < Decidim::Form - attribute :zip_code, type: :string - attribute :affirm_statements_are_correct, type: :boolean - attribute :user, type: :string - attribute :component, type: :string - - validates :zip_code, presence: true - validates :affirm_statements_are_correct, acceptance: true - validates :user, presence: true - validates :component, presence: true - end - end -end diff --git a/decidim-budgets_booth/app/helpers/concerns/decidim/budgets_booth/projects_helper_extensions.rb b/decidim-budgets_booth/app/helpers/concerns/decidim/budgets_booth/projects_helper_extensions.rb index 0fa5a49e..6c80dee7 100644 --- a/decidim-budgets_booth/app/helpers/concerns/decidim/budgets_booth/projects_helper_extensions.rb +++ b/decidim-budgets_booth/app/helpers/concerns/decidim/budgets_booth/projects_helper_extensions.rb @@ -6,11 +6,7 @@ module BudgetsBooth module ProjectsHelperExtensions include VotingSupport - delegate :progress?, :budgets, :user_zip_code, to: :current_workflow - - def voting_mode? - false - end + delegate :progress?, :budgets, to: :current_workflow def thanks_popup? session[:booth_thanks_message] == true @@ -32,41 +28,34 @@ def i18n_scope "decidim.budgets.projects.pre_voting_budget_summary.pre_vote" end - def vote_text - key = if current_workflow.vote_allowed?(budget) && progress?(budget) - :finish_voting - else - :start_voting - end - - t(key, scope: i18n_scope) + def budgets_count + Decidim::Budgets::Budget.where(component: current_component).count end - def description_text - key = if current_workflow.vote_allowed?(budget) && progress?(budget) - :finish_description - else - :start_description - end - t(key, scope: i18n_scope) + def voting_booth_forced? + current_workflow.try(:voting_booth_forced?) end - def budgets_count - Decidim::Budgets::Budget.where(component: current_component).count + def toggle_view_mode_link(current_mode, target_mode, title, params) + path = budget_projects_path(params.permit(:order, filter: {}).merge({ view_mode: target_mode })) + icon_name = target_mode == "grid" ? "layout-grid-fill" : "list-check" + icon_class = "view-icon--disabled" unless current_mode == target_mode + + link_to(path, remote: true, title:) do + icon(icon_name, class: icon_class, role: "img", "aria-hidden": true) + end end - def current_phase - process = Decidim::ParticipatoryProcesses::OrganizationParticipatoryProcesses - .new(current_organization).query.find_by(slug: params[:participatory_process_slug]) - process&.active_step&.title + def projects_container_class(view_mode) + view_mode == "grid" ? "card__grid-grid" : "card__list-list" end - def voting_booth_forced? - current_workflow.try(:voting_booth_forced?) + def card_size_for_view_mode(view_mode) + view_mode == "grid" ? :g : :l end - def voting_terms - translated_attribute(component_settings.try(:voting_terms)).presence + def budget_title + decidim_escape_translated(budget.title).html_safe end end end diff --git a/decidim-budgets_booth/app/helpers/decidim/budgets/line_items_helper.rb b/decidim-budgets_booth/app/helpers/decidim/budgets/line_items_helper.rb deleted file mode 100644 index ae7f05d7..00000000 --- a/decidim-budgets_booth/app/helpers/decidim/budgets/line_items_helper.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Budgets - module LineItemsHelper - def voting_mode? - true - end - end - end -end diff --git a/decidim-budgets_booth/app/helpers/decidim/budgets/user_data_helper.rb b/decidim-budgets_booth/app/helpers/decidim/budgets/user_data_helper.rb deleted file mode 100644 index 620c5e47..00000000 --- a/decidim-budgets_booth/app/helpers/decidim/budgets/user_data_helper.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Budgets - module UserDataHelper - def voting_terms - translated_attribute(component_settings.try(:voting_terms)).presence - end - - def zip_code_length - ::Decidim::BudgetsBooth.zip_code_length.to_i - end - - # we need to redirect user to the root path if they - # want to candel the user_data entering, and they don't have a zip code. otherwise we - # get into infinit redirect loop, since the budgets index path redirects users - # to this view if they dont have a zip code. - def cancel_redirect_path - if user_zip_code - decidim_budgets.budgets_path - else - decidim.root_path - end - end - end - end -end diff --git a/decidim-budgets_booth/app/helpers/decidim/budgets/voting_helper.rb b/decidim-budgets_booth/app/helpers/decidim/budgets/voting_helper.rb deleted file mode 100644 index c7d21770..00000000 --- a/decidim-budgets_booth/app/helpers/decidim/budgets/voting_helper.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Budgets - module VotingHelper - def voting_mode? - true - end - end - end -end diff --git a/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/budget_extensions.rb b/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/budget_extensions.rb deleted file mode 100644 index 33725570..00000000 --- a/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/budget_extensions.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -require "active_support/concern" - -module Decidim - module BudgetsBooth - module BudgetExtensions - extend ActiveSupport::Concern - include Decidim::HasUploadValidations - - included do - has_one_attached :main_image - validates_upload :main_image, uploader: Decidim::BudgetsBooth::MainImageUploader - end - end - end -end diff --git a/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/component_extensions.rb b/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/component_extensions.rb deleted file mode 100644 index dadfb303..00000000 --- a/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/component_extensions.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -require "active_support/concern" - -module Decidim - module BudgetsBooth - module ComponentExtensions - extend ActiveSupport::Concern - - included do - has_many :budgets_user_data, foreign_key: "decidim_component_id", class_name: "Decidim::Budgets::UserData", dependent: :destroy - end - end - end -end diff --git a/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/scope_extensions.rb b/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/scope_extensions.rb deleted file mode 100644 index 6d9627e0..00000000 --- a/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/scope_extensions.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -require "active_support/concern" - -module Decidim - module BudgetsBooth - module ScopeExtensions - extend ActiveSupport::Concern - - included do - after_save :clear_budgets_booth_cache - after_destroy :clear_budgets_booth_cache - end - - private - - def clear_budgets_booth_cache - Decidim::BudgetsBooth::ScopeManager.clear_cache! - end - end - end -end diff --git a/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/user_extensions.rb b/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/user_extensions.rb deleted file mode 100644 index bfd55d55..00000000 --- a/decidim-budgets_booth/app/models/concerns/decidim/budgets_booth/user_extensions.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -require "active_support/concern" - -module Decidim - module BudgetsBooth - module UserExtensions - extend ActiveSupport::Concern - - included do - has_many :budgets_user_data, foreign_key: "decidim_user_id", class_name: "Decidim::Budgets::UserData", dependent: :destroy - end - end - end -end diff --git a/decidim-budgets_booth/app/models/decidim/budgets/user_data.rb b/decidim-budgets_booth/app/models/decidim/budgets/user_data.rb deleted file mode 100644 index 4df2645b..00000000 --- a/decidim-budgets_booth/app/models/decidim/budgets/user_data.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module Budgets - class UserData < ApplicationRecord - include Decidim::RecordEncryptor - - encrypt_attribute :metadata, type: :hash - belongs_to :component, foreign_key: "decidim_component_id", class_name: "Decidim::Component" - belongs_to :user, foreign_key: "decidim_user_id", class_name: "Decidim::User" - end - end -end diff --git a/decidim-budgets_booth/app/packs/entrypoints/decidim_budgets_booth_budgets.js b/decidim-budgets_booth/app/packs/entrypoints/decidim_budgets_booth_budgets.js index 22144b64..db8970de 100644 --- a/decidim-budgets_booth/app/packs/entrypoints/decidim_budgets_booth_budgets.js +++ b/decidim-budgets_booth/app/packs/entrypoints/decidim_budgets_booth_budgets.js @@ -1 +1,2 @@ import "src/decidim/budgets_booth/handle_thanks_session" + diff --git a/decidim-budgets_booth/app/packs/entrypoints/decidim_budgets_booth_voting.js b/decidim-budgets_booth/app/packs/entrypoints/decidim_budgets_booth_voting.js deleted file mode 100644 index 46125ca0..00000000 --- a/decidim-budgets_booth/app/packs/entrypoints/decidim_budgets_booth_voting.js +++ /dev/null @@ -1,8 +0,0 @@ -import initializeProjects from "src/decidim/budgets_booth/projects" -import "src/decidim/budgets_booth/progressFixed" -import "src/decidim/budgets_booth/exit_handler" -import "src/decidim/budgets_booth/popup_selected_project" - -$(() => { - initializeProjects(); -}); diff --git a/decidim-budgets_booth/app/packs/entrypoints/decidim_budgets_booth_zip_code.js b/decidim-budgets_booth/app/packs/entrypoints/decidim_budgets_booth_zip_code.js deleted file mode 100644 index 8f8849a1..00000000 --- a/decidim-budgets_booth/app/packs/entrypoints/decidim_budgets_booth_zip_code.js +++ /dev/null @@ -1 +0,0 @@ -import "src/decidim/budgets_booth/zip_coder" diff --git a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/exit_handler.js b/decidim-budgets_booth/app/packs/src/decidim/budgets/exit_handler.js similarity index 74% rename from decidim-budgets_booth/app/packs/src/decidim/budgets_booth/exit_handler.js rename to decidim-budgets_booth/app/packs/src/decidim/budgets/exit_handler.js index b0c20aa2..da9f7383 100644 --- a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/exit_handler.js +++ b/decidim-budgets_booth/app/packs/src/decidim/budgets/exit_handler.js @@ -9,7 +9,7 @@ const isSafeUrl = (exitUrl) => { } const safeUrls = [ - $(".budget-summary").attr("data-safe-url").split("?")[0], + $(".budget-summary").attr("data-safe-url").replace(location.origin, ""), `${location.pathname}#`, `${location.href}#`, "#" @@ -18,7 +18,7 @@ const isSafeUrl = (exitUrl) => { let safe = false; safeUrls.forEach((url) => { if (exitUrl.startsWith(url)) { - safe = true + safe = true } }); @@ -36,10 +36,12 @@ const allowExitFrom = ($el) => { return true; } else if ($el.attr("id") === "exit-notification-link") { return true; - } else if ($el.parents(".voting-wrapper").length > 0) { + } else if ($el.parents("main").length > 0) { return true; } else if (isSafeUrl($el.attr("href"))) { return true + } else if (document.querySelector(".panel-container") && document.querySelector(".panel-container").contains($el[0])) { + return true } return false; @@ -50,6 +52,7 @@ $(() => { const $exitLink = $("#exit-notification-link"); const defaultExitUrl = $exitLink.attr("href"); const defaultExitLinkText = $exitLink.text(); + const signOutPath = window.Decidim.config.get("sign_out_path"); let exitLinkText = defaultExitLinkText; if ($exitNotification.length < 1) { @@ -63,26 +66,25 @@ $(() => { } else { $exitLink.removeAttr("data-method"); } - $exitLink.attr("href", url); - $exitLink.html(exitLinkText); - $exitNotification.foundation("open"); + $exitLink.text(exitLinkText); + window.Decidim.currentDialogs["exit-notification"].open(); }; $(document).on("click", "a", (event) => { exitLinkText = defaultExitLinkText; - const $link = $(event.currentTarget); - if (!allowExitFrom($link)) { + // if the clicked link is Back to projects, we don't open the exit-notification modal + if (!allowExitFrom($link) && !$link.text().includes("Retour aux projets", "Back to projects")) { event.preventDefault(); openExitNotification($link.attr("href"), $link.data("method")); } }); - // Custom handling for the header sign out so that it won't trigger the + // Custom handling for the header sign out so that it will not trigger the // logout form submit and so that it changes the exit link text. This does // not trigger the document link click listener because it has the // data-method attribute to trigger a form submit event. - $(".header a.sign-out-link").on("click", (event) => { + $(`[href='${signOutPath}']`).on("click", (event) => { event.preventDefault(); event.stopPropagation(); @@ -93,7 +95,7 @@ $(() => { // Custom handling for the exit link which needs to change the exit link // text to the default text as this is not handled by the document click // listener. - $("a[data-open='exit-notification']").on("click", () => { + $("a[data-dialog-open='exit-notification']").on("click", () => { exitLinkText = defaultExitLinkText; openExitNotification(defaultExitUrl); }); diff --git a/decidim-budgets_booth/app/packs/src/decidim/budgets/progressFixed.js b/decidim-budgets_booth/app/packs/src/decidim/budgets/progressFixed.js deleted file mode 100644 index 39239abd..00000000 --- a/decidim-budgets_booth/app/packs/src/decidim/budgets/progressFixed.js +++ /dev/null @@ -1,3 +0,0 @@ -// We are customizing this functionality at decidim/budgets_booth/projects.js -// which is why we have disabled the default functionality by overriding this -// file. diff --git a/decidim-budgets_booth/app/packs/src/decidim/budgets/projects.js b/decidim-budgets_booth/app/packs/src/decidim/budgets/projects.js deleted file mode 100644 index 39239abd..00000000 --- a/decidim-budgets_booth/app/packs/src/decidim/budgets/projects.js +++ /dev/null @@ -1,3 +0,0 @@ -// We are customizing this functionality at decidim/budgets_booth/projects.js -// which is why we have disabled the default functionality by overriding this -// file. diff --git a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/handle_thanks_session.js b/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/handle_thanks_session.js index 51594f16..050f57da 100644 --- a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/handle_thanks_session.js +++ b/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/handle_thanks_session.js @@ -1,7 +1,20 @@ $(() => { const $modal = $("#thanks-message"); + const $buttonConfirm = $("[data-confirm-ok]", $modal); + const $buttonCancel = $("[data-confirm-cancel]", $modal); + const $buttonClose = $("[data-dialog-closable]", $modal); if (Boolean($modal) && $modal.attr("data-session") === "true") { - $modal.foundation("open"); + $modal.attr("aria-hidden", false) } + $buttonConfirm.on("click", () => { + $modal.attr("aria-hidden", true) + }) + $buttonCancel.on("click", () => { + $modal.attr("aria-hidden", true) + }) + $buttonClose.on("click", () => { + $modal.attr("aria-hidden", true) + }) }); + diff --git a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/handle_voting_completion.js b/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/handle_voting_completion.js index 2913064c..d4893e1f 100644 --- a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/handle_voting_completion.js +++ b/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/handle_voting_completion.js @@ -9,12 +9,24 @@ const initVoteCompleteElement = () => { const reveal = wrapper.querySelector("div"); document.body.append(reveal); - - // With foundation we still have to use jQuery. - // The purpose is to open the reveal after Foundation has initialized the - // reveal element which happens with the Decidim's default JS. This code is - // run before that. - $(reveal).on("init.zf.reveal", () => $(reveal).foundation("open")); } initVoteCompleteElement(); +$(() => { + const $modal = $("#vote-completed"); + const $buttonConfirm = $("[data-confirm-ok]", $modal); + const $buttonCancel = $("[data-confirm-cancel]", $modal); + const $buttonClose = $("[data-dialog-closable]", $modal); + + $modal.attr("aria-hidden", false); + + $buttonConfirm.on("click", () => { + $modal.attr("aria-hidden", true) + }) + $buttonCancel.on("click", () => { + $modal.attr("aria-hidden", true) + }) + $buttonClose.on("click", () => { + $modal.attr("aria-hidden", true) + }) +}); diff --git a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/popup_selected_project.js b/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/popup_selected_project.js deleted file mode 100644 index 583ddc31..00000000 --- a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/popup_selected_project.js +++ /dev/null @@ -1,8 +0,0 @@ -$(() => { - const queryString = window.location.search; - const urlParams = new URLSearchParams(queryString); - const selectedProject = $(`#project-modal-${urlParams.get("select_project")}`); - if (selectedProject.length === 1) { - selectedProject.foundation("open"); - } -}); diff --git a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/progressFixed.js b/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/progressFixed.js deleted file mode 100644 index 5b0f05d9..00000000 --- a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/progressFixed.js +++ /dev/null @@ -1,23 +0,0 @@ -$(() => { - const checkProgressPosition = () => { - let progressFix = document.querySelector("[data-progressbox-fixed]"), - progressRef = document.querySelector("[data-progress-reference]"), - progressVisibleClass = "is-progressbox-visible"; - - if (!progressRef || !progressFix) { - return; - } - - let progressPosition = progressRef.getBoundingClientRect().bottom; - if (progressPosition > 0) { - progressFix.classList.remove(progressVisibleClass); - } else { - progressFix.classList.add(progressVisibleClass); - } - } - - window.addEventListener("scroll", checkProgressPosition); - - window.DecidimBudgets = window.DecidimBudgets || {}; - window.DecidimBudgets.checkProgressPosition = checkProgressPosition; -}); diff --git a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/projects.js b/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/projects.js deleted file mode 100644 index 28049f80..00000000 --- a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/projects.js +++ /dev/null @@ -1,53 +0,0 @@ -const initializeProjects = () => { - const $projects = $("#projects, #project, .reveal.large"); - const $budgetSummaryTotal = $(".budget-summary__total"); - const $budgetExceedModal = $("#budget-excess"); - const $budgetSummary = $(".budget-summary__progressbox"); - const $voteButton = $(".budget-vote-button"); - const totalAllocation = parseInt($budgetSummaryTotal.attr("data-total-allocation"), 10); - - const cancelEvent = (event) => { - $(event.currentTarget).removeClass("loading-spinner"); - event.stopPropagation(); - event.preventDefault(); - }; - - $voteButton.on("click", "span", () => { - $(".budget-list__action").click(); - }); - - $projects.on("click", ".customized-budget", (event) => { - const currentAllocation = parseInt($budgetSummary.attr("data-current-allocation"), 10); - const $currentTarget = $(event.currentTarget); - const projectAllocation = parseInt($currentTarget.attr("data-allocation"), 10); - - - let $targetCategory = null; - const $targetCategoryId = $currentTarget.parents(".budget-list__data").first().data("categoryId"); - if ($targetCategoryId !== undefined) { - $targetCategory = $(`.vote_by_category[data-category-id=${$targetCategoryId}]`).first(); - } - - let quotaExceeded = ((currentAllocation + projectAllocation) > totalAllocation); - let categoryQuotaExceeded = false; - - if ($targetCategory && $targetCategory.length > 0) { - const currentCategoryAllocation = parseInt($targetCategory.attr("data-current-allocation"), 10); - const totalCategoryAllocation = parseInt($targetCategory.attr("data-allocation"), 10); - categoryQuotaExceeded = ((currentCategoryAllocation + projectAllocation) > totalCategoryAllocation || quotaExceeded); - } - - if ($currentTarget.attr("disabled")) { - cancelEvent(event); - } else if (($currentTarget.attr("data-add") === "true") && categoryQuotaExceeded === true) { - $(`#budget-excess-${$targetCategoryId}`).foundation("toggle"); - cancelEvent(event); - } else if (($currentTarget.attr("data-add") === "true") && quotaExceeded === true) { - $budgetExceedModal.foundation("toggle"); - cancelEvent(event); - } - }); -}; - - -export default initializeProjects; diff --git a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/zip_coder.js b/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/zip_coder.js deleted file mode 100644 index 75f2061e..00000000 --- a/decidim-budgets_booth/app/packs/src/decidim/budgets_booth/zip_coder.js +++ /dev/null @@ -1,149 +0,0 @@ -$(() => { - const zipcodeInputs = document.querySelectorAll('#zip-code input[type="text"]'); - const zipCodeNotValid = document.querySelector("#zip-code-not-valid"); - const zipCodeError = document.querySelector("#zip-code-error"); - const onlyLettersAllowed = document.querySelector("#only-letters-allowed"); - const submitBotton = document.querySelector("button[name='commit']"); - - const removeAllErrorMessages = () => { - document.querySelectorAll(".form-error").forEach((element) => { - if (element.classList.contains("is-visible")) { - element.classList.remove("is-visible") - element.classList.add("is-invisible") - } - }) - } - - const showErrorMessage = (element) => { - removeAllErrorMessages() - if (element.classList.contains("is-invisible")) { - element.classList.remove("is-invisible") - element.classList.add("is-visible") - } - } - const invalidField = (element) => { - zipcodeInputs.forEach((item) => { - if (!item.classList.contains("is-invalid-input")) { - item.classList.add("is-invalid-input") - } - }) - showErrorMessage(element) - } - - const resetField = () => { - zipcodeInputs.forEach((item) => { - if (item.classList.contains("is-invalid-input")) { - item.classList.remove("is-invalid-input") - } - }) - } - - const validUserInput = (val) => (/^[a-zA-Z0-9]+$/).test(val) - - // check if the hidden zip code input field has a value - const hiddenZipCodeField = document.querySelector('input[name="user_data[zip_code]"]'); - if (hiddenZipCodeField.value.trim() !== "") { - const zipCodeValue = hiddenZipCodeField.value.trim().split(""); - zipcodeInputs.forEach((input, index) => { - input.value = zipCodeValue[index] || ""; - }); - } - - if (zipCodeNotValid.dataset.invalid) { - zipcodeInputs.forEach((input) => { - input.classList.add("is-invalid-input") - }); - invalidField(zipCodeNotValid) - } - zipcodeInputs.forEach((input, ind) => { - input.setAttribute("maxlength", "1"); - input.addEventListener("click", () => { - resetField(); - input.select(); - }) - - input.addEventListener("paste", (event) => { - const clipboardData = event.clipboardData || window.clipboardData; - const pastedData = clipboardData.getData("text").trim(); - if (!validUserInput(pastedData)) { - invalidField(onlyLettersAllowed) - input.blur(); - input.classList.add("is-invalid-input"); - return - } - - // find the first empty input field and paste the data there - let jj = 0; - for (let ii = ind; ii < zipcodeInputs.length; ii += 1) { - if (jj > pastedData.length) { - return; - } - if (pastedData.substr(jj, 1)) { - zipcodeInputs[ii].value = pastedData.substr(jj, 1); - zipcodeInputs[ii].focus(); - jj += 1 - } - } - event.preventDefault(); - }); - input.addEventListener("keydown", function(event) { - const previousInput = zipcodeInputs[ind - 1]; - if (event.key === "Backspace") { - if (previousInput) { - previousInput.select(); - event.preventDefault(); - input.value = "" - } - } - }); - - input.addEventListener("input", () => { - const val = input.value - - if (!validUserInput(val)) { - input.value = "" - return - } - const nextInput = zipcodeInputs[ind + 1]; - if (nextInput) { - nextInput.select(); - } else { - let checkbox = document.querySelector("#user_data_affirm_statements_are_correct") - if (checkbox.checked) { - submitBotton.focus(); - } else { - checkbox.focus() - } - } - }) - }); - const fieldsvalid = () => { - let allFieldsFilled = true; - zipcodeInputs.forEach((input) => { - if (input.value.trim() === "") { - allFieldsFilled = false; - } - }); - return allFieldsFilled - }; - - const setZipcodeField = () => { - let combinedValue = ""; - zipcodeInputs.forEach((input) => { - combinedValue += input.value.trim(); - }); - document.querySelector('input[name="user_data[zip_code]"]').value = combinedValue - }; - - const form = document.querySelector(".new_user_data"); - $(form).on("submit", (ev) => { - removeAllErrorMessages() - setZipcodeField(); - if (fieldsvalid()) { - return; - } - - ev.preventDefault(); - invalidField(zipCodeError); - }); -}) diff --git a/decidim-budgets_booth/app/packs/stylesheets/decidim/budgets_booth/budgets_booth.scss b/decidim-budgets_booth/app/packs/stylesheets/decidim/budgets_booth/budgets_booth.scss index 81cfda71..1168f63b 100644 --- a/decidim-budgets_booth/app/packs/stylesheets/decidim/budgets_booth/budgets_booth.scss +++ b/decidim-budgets_booth/app/packs/stylesheets/decidim/budgets_booth/budgets_booth.scss @@ -1,193 +1,202 @@ /* css for decidim_budgets_booth */ -$passive-item-color: #919191; -$active-item-color: $black; - -#voting-help, -#thanks-message{ - .reveal__header{ - border: hidden; - - .subtitle{ - font-size: 1.2rem; - } - } - - .voting-help-item{ - @include breakpoint(medium down){ - margin: 1rem 0; - } - - .circle{ - &.active{ - fill: $active-item-color; - border: 4px solid $active-item-color; - - svg{ - fill: $active-item-color; - } - } - - display: block; - position: relative; - border: 2px solid $passive-item-color; - border-radius: 50%; - width: 150px; - height: 150px; - left: 10px; - - @include breakpoint(medium down){ - left: 20%; - } - - svg{ - display: block; - position: relative; - fill: $passive-item-color; - top: 23px; - left: 22px; - width: 100px; - height: 100px; - } - } - - .help-description{ - margin-top: .5rem; - font-size: 1.2rem; - - span{ - &.strong{ - font-weight: 800; - } - } - - &.active{ - color: $active-item-color; - } - - color: $passive-item-color; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - } - } - - .card{ - &.card--secondary{ - .filters__section:first-child{ - display: none; - - @include breakpoint(medium){ - display: block; - } - } - } - } -} - -.card--list__icon{ - margin-right: 0; +.layout-container .projects-content-index { + min-height: calc(100vh - 3.5rem); } - -.budget-summary__progressbox--fixed{ - padding: .5rem 2rem 1rem; - - @include breakpoint(mediumlarge){ - padding: 1rem 4rem; - } +.projects-content-index .layout-2col__main { + min-height: calc(100vh - 3.5rem); } - -.spaced-bottom{ - margin-bottom: .3rem; +.budget__card__grid-project { + display: flex; + flex-direction: row; + align-items: center; + gap: 1rem; } -.budget-list{ - &__item{ - @include breakpoint(medium down){ - margin-bottom: 2rem; - display: block; - } - } - - &__data{ - justify-content: center; +@media (min-width: 769px) and (max-width: 1040px) { + .budget__card__grid-project { + flex-direction: column-reverse; } } -.flex-column{ +.card__list > .budget__card__list-project{ + display:flex; flex-direction: column; - - @include breakpoint(medium down){ - flex-direction: column; - } + place-items: center; } - -.card{ - &.budget-summary{ - display: flex; - flex-direction: column; - - a{ - margin: 1rem 0 0; - } - } +.card__list-metadata .text-success { + color: #07790d; } - -.customized-budget{ - margin: auto; +.budget__card__grid-project__amount { + margin-bottom: 0.5rem; + display: inline-block; + text-align: center; + font-size: 20px; + line-height: 25px; + font-weight: 600; + --tw-text-opacity: 1; + color: rgb(62 76 92 / 1); } - -.font-customizer{ - h2, - h3{ - font-size: 1.1rem; +.project__vote-button { + padding: 0.75rem; + font-size: 18px; + line-height: 23px; + font-weight: 600; +} +.budget-summary__new-container { + position:sticky; + bottom:0; + z-index: 20; +} +#project-item{ + &.project-show .budget-summary__content { + max-width: 100vw; } } - -.voted-budget{ - filter: grayscale(100%); +.projects-index { + display:flex; + flex-direction:column; + margin-top:2rem; + height: 100vh; +} +.projects-index__container { + width:90%; + margin:auto; +} +.projects-index__container__header { + margin-bottom:3rem; +} +.project-show { + display:flex; + flex-direction:column; +} +#menu-bar-custom { + justify-content: flex-start; + padding-left: 2rem; + color: white; + height: 3.5rem; +} +.menu-bar__exit-link { + display:flex; + justify-content:space-between; + align-items:center; +} +.menu-bar__span { + margin:0 1%; +} +.menu-bar__title { + font-weight:bold; +} +.custom-filters > .filter-container+.filter-container { + margin-top: 0; +} +#budget-booth-body > [data-dialog] >* { + --tw-translate-x: -50%; +} +.budget-progress > .budget-summary__progressbar--meter { + background-color: green; +} +.menu-bar__exit-link > svg { + flex: none; + fill: white; + display: block; + vertical-align: middle; + box-sizing: border-box; + border-width: 0; + border-style: solid; + border-color: white; + font-weight: 600; + font-size: 18px; + line-height: 23px; + --tw-bg-opacity: 1; + --tw-text-opacity: 1; + cursor: pointer; + margin-right: 0.5em; +} +//.reveal-overlay { +// display: none; +// position: absolute; +// top: 50%; +// left: 50%; +// transform: translate(-50%, -50%); +// z-index: 30; +// background-color: lightgrey; +// height: -moz-fit-content; +// height: fit-content; +// max-height: 95vh; +// width: 90%; +//} +.reveal-overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1005; + display: none; + background-color: rgba(26, 24, 29, 0.45); + overflow-y: auto; + -webkit-overflow-scrolling: touch; +} +.reveal { + z-index: 1006; + backface-visibility: hidden; + display: none; + padding: 1rem; + border: 1px solid #e8e8e8; + border-radius: 4px; + background-color: #fafafa; + position: relative; + top: 100px; + margin-right: auto; + margin-left: auto; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + width: 600px; + max-width: 75rem; + right: auto; + left: auto; + margin: 0 auto; } -.flex-digits{ +#thanks-message, #vote-completed { display: flex; - justify-content: space-between; - - .flex-digits-input{ - display: flex; - flex: 0 0 auto; - - input{ - margin: 0 auto; - height: 2.5rem; - width: 2.5rem; - text-align: center; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 20px 0; + font-size: 18px; - @include breakpoint(smallmedium up){ - height: 3rem; - width: 3rem; - } - } + button { + padding: 10px; } -} - -.zip-code-errors{ - .form-error{ - margin-top: $global-margin; + .text-content { + margin: 10px 0; } } +.reveal__header{ + display: flex; + align-items: center; + justify-content: center; -.booth-zipcode{ - &.thumbnail{ - padding-right: 4px !important; - padding-left: 4px !important; - } - - &.maximum-width{ - max-width: 430px; + h4 { + font-weight: bold; } } - -#affirm-checkbox{ - margin-top: $global-margin; - font-weight: bold; +.card__project-placeholder-g{ + width: 100%; + height: 100%; +} +.card__grid-img { + background-color: #F3F4F6; +} +#budget-booth-body .view-layout__links { + display: flex; + align-items: center; + gap: 1rem; +} +.card-grid-selected { + --tw-ring-color: var(--tertiary); +} +.budget__list--header { + align-items: center; } diff --git a/decidim-budgets_booth/app/uploaders/decidim/budgets_booth/main_image_uploader.rb b/decidim-budgets_booth/app/uploaders/decidim/budgets_booth/main_image_uploader.rb deleted file mode 100644 index b729f456..00000000 --- a/decidim-budgets_booth/app/uploaders/decidim/budgets_booth/main_image_uploader.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module BudgetsBooth - # This class deals with uploading hero images to budgets. - class MainImageUploader < RecordImageUploader - set_variants do - { default: { resize_to_fit: [700, 300] } } - end - end - end -end diff --git a/decidim-budgets_booth/app/views/decidim/budgets/admin/budgets/_form.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/admin/budgets/_form.html.erb deleted file mode 100644 index 7e9ba7c7..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/admin/budgets/_form.html.erb +++ /dev/null @@ -1,30 +0,0 @@ -
-
-

<%= title %>

-
- -
-
- <%= form.translated :text_field, :title, autofocus: true %> - - <%= form.number_field :weight %> - - <%= form.translated :editor, :description %> - - <%= form.number_field :total_budget %> - <% if current_component.has_subscopes? %> -
- <%= scopes_picker_field form, :decidim_scope_id, root: current_component.scope %> -
- <% end %> -
-
-
-

<%= t("images", scope: "decidim.budgets.admin.budgets.edit") %>

-
-
-
- <%= form.upload :main_image %> -
-
-
diff --git a/decidim-budgets_booth/app/views/decidim/budgets/budgets/index.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/budgets/index.html.erb index ab86daf2..71afa170 100644 --- a/decidim-budgets_booth/app/views/decidim/budgets/budgets/index.html.erb +++ b/decidim-budgets_booth/app/views/decidim/budgets/budgets/index.html.erb @@ -1,9 +1,26 @@ -<%= render partial: "decidim/shared/component_announcement" %> +<% add_decidim_page_title component_name %> +<%= append_javascript_pack_tag "decidim_budgets" %> +<%= append_stylesheet_pack_tag "decidim_budgets", media: "all" %> -<%= cell("decidim/budgets/budgets_header", current_workflow) %> +<% content_for :aside do %> +

<%= component_name %>

+<% end %> -<%= cell("decidim/budgets/budgets_list", current_workflow) %> +<%= render layout: "layouts/decidim/shared/layout_two_col" do %> + <%= render partial: "decidim/shared/component_announcement" %> + <% if current_workflow.budgets.empty? %> + <%= cell("decidim/announcement", t("empty", scope: "decidim.budgets.budgets_list")) %> + <% end %> + +
+ <%= cell("decidim/budgets/budgets_header", current_workflow) %> +
+ +
+ <%= cell("decidim/budgets/budgets_list", current_workflow) %> +
+<% end %> <%= render partial: "decidim/budgets/voting/thanks_message_modal" if vote_success_content.present? && !voted_all_budgets? %> <% handle_thanks_popup %> -<%= javascript_pack_tag("decidim_budgets_booth_budgets") %> +<%= append_javascript_pack_tag "decidim_budgets_booth_budgets" %> diff --git a/decidim-budgets_booth/app/views/decidim/budgets/budgets/index.js.erb b/decidim-budgets_booth/app/views/decidim/budgets/budgets/index.js.erb new file mode 100644 index 00000000..16edd657 --- /dev/null +++ b/decidim-budgets_booth/app/views/decidim/budgets/budgets/index.js.erb @@ -0,0 +1,6 @@ +var $budgets = $('#budgets'); + +if ($budgets.length > 0) { + $budgets.html('<%= j(cell("decidim/budgets/budgets_list", current_workflow).main_list).strip.html_safe %>'); + document.dispatchEvent(new CustomEvent("ajax:loaded", { detail: $budgets[0] })); +} diff --git a/decidim-budgets_booth/app/views/decidim/budgets/line_items/update_budget.js.erb b/decidim-budgets_booth/app/views/decidim/budgets/line_items/update_budget.js.erb index 8756750b..8bb6bcc0 100644 --- a/decidim-budgets_booth/app/views/decidim/budgets/line_items/update_budget.js.erb +++ b/decidim-budgets_booth/app/views/decidim/budgets/line_items/update_budget.js.erb @@ -1,39 +1,38 @@ -var $orderTotalBudget = $('#order-total-budget'); -var $orderSelectedProjects = $('#order-selected-projects'); -var $orderProgress = $('#order-progress'); +var $orderSelectedProjectsCount = $('#order-selected-projects-count'); +var $orderProgress = document.querySelectorAll('[id^=order-progress] .budget-summary__content'); var $projectItem = $('#project-<%= project.id %>-item'); +var $projectVoteButton = $('.project-<%= project.id %>-vote-button'); var $budgetConfirm = $('#budget-confirm'); -var $projectModal = $('#project-modal-<%= project.id %>'); +var $orderProgressText = $('.order_progress_text'); -morphdom($orderTotalBudget[0], '<%= j(render partial: "decidim/budgets/projects/order_total_budget").strip.html_safe %>'); -morphdom($orderSelectedProjects[0], '<%= j(render partial: "decidim/budgets/projects/order_selected_projects").strip.html_safe %>'); -morphdom($orderProgress[0], '<%= j(render partial: "decidim/budgets/projects/order_progress").strip.html_safe %>'); -morphdom($budgetConfirm[0], '<%= j(render partial: "decidim/budgets/projects/budget_confirm").strip.html_safe %>') - -$("#order-progress").foundation(); -$(".budget-summary__selected").foundation(); -if ($projectItem.length > 0) { - morphdom($projectItem[0], '<%= j(render partial: "decidim/budgets/projects/project", locals: { project: project }).strip.html_safe %>'); -} +$orderProgress.forEach((orderProgress) => { + var $orderTotalBudget = $(orderProgress).find("[id^=order-total-budget]"); + $orderTotalBudget.html('<%= j(render partial: "decidim/budgets/projects/order_total_budget").strip.html_safe %>'); + $orderProgressText.html('<%= j(render partial: "decidim/budgets/projects/order_progress_text").strip.html_safe %>'); -if ($projectModal.length > 0) { - $projectModal.foundation("close"); // Close the modal when button has been clicked - var $projectModalButtonForm = $(".project-vote-button", $projectModal).parent(); - morphdom($projectModalButtonForm[0], '<%= j(cell("decidim/budgets/project_vote_button", project, scale_up: true)).strip.html_safe %>'); + if(orderProgress.dataset.orderProgressResponsive) { + morphdom(orderProgress, '<%= j(render partial: "decidim/budgets/projects/order_progress_summary_content", locals: { include_heading: true, responsive: true }).strip.html_safe %>'); + } else { + morphdom(orderProgress, '<%= j(render partial: "decidim/budgets/projects/order_progress_summary_content", locals: { include_heading: true, responsive: false }).strip.html_safe %>'); + } +}) +morphdom($budgetConfirm[0], '<%= j(render partial: "decidim/budgets/projects/budget_confirm").strip.html_safe %>') +if ($orderSelectedProjectsCount.length > 0) { + morphdom($orderSelectedProjectsCount[0], '<%= j(render partial: "decidim/budgets/projects/projects_count", locals: { count: current_order.projects.size }).strip.html_safe %>') } -if ($projectModal.length > 0 && $projectModal.attr("aria-hidden") === "false") { - $(".project-vote-button", $projectModal).focus(); -} else { - $(".project-vote-button", $projectItem).focus(); +if ($projectItem.length > 0) { + <% if params[:action] == "destroy" && params[:show_only_added] == "true" %> + $projectItem[0].remove(); + <% elsif params[:view_mode] == "grid" %> + morphdom($projectItem[0], '<%= j(render partial: "decidim/budgets/projects/project", locals: { project: , view_mode: "grid" }).strip.html_safe %>'); + <% else %> + morphdom($projectItem[0], '<%= j(render partial: "decidim/budgets/projects/project", locals: { project: , view_mode: "list"}).strip.html_safe %>'); + <% end %> } -var $dataOpen = $('.off-canvas-wrapper') -if($dataOpen.data("open-modal") === false){ - <% if @show_help_modal %> - $("#voting-help").foundation("open"); - $dataOpen.data("open-modal", "true") - <% end %> +if ($projectVoteButton.length > 0) { + morphdom($projectVoteButton[0], '<%= j(cell("decidim/budgets/project_vote_button", project, scale_up: true)).strip.html_safe %>'); } window.DecidimBudgets.checkProgressPosition(); diff --git a/decidim-budgets_booth/app/views/decidim/budgets/partials/_voting_help_modal.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/partials/_voting_help_modal.html.erb deleted file mode 100644 index 99cc9f08..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/partials/_voting_help_modal.html.erb +++ /dev/null @@ -1,31 +0,0 @@ - diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_budget_confirm.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_budget_confirm.html.erb deleted file mode 100644 index a7a86856..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/_budget_confirm.html.erb +++ /dev/null @@ -1,42 +0,0 @@ -
- <% if current_order.present? %> -
-

<%= t(".title") %>

- -
-

<%= t(".description") %>

-
-
    - <% current_order.projects.each do |project| %> -
  • - <%= translated_attribute(project.title) %> - - <%= budget_to_currency project.budget_amount %> - -
  • - <% end %> -
-
-

<%= t(".are_you_sure") %>

- - <% if !voting_booth_forced? && voting_terms.present? %> -

<%= t(".is_this_correct") %>

-
-
- <%== voting_terms %> -
-
- <% end %> - -
-
- <%= button_to t(".confirm"), checkout_budget_order_path(budget), class: "button expanded", data: { disable: true } %> -
-
-
- -
- <% end %> -
diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_budget_excess.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_budget_excess.html.erb deleted file mode 100644 index 62072d3d..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/_budget_excess.html.erb +++ /dev/null @@ -1,14 +0,0 @@ -
-
-

<%= current_order.projects_rule? ? t(".projects_excess.title") : t(".budget_excess.title") %>

- -
-

<%= current_order.projects_rule? ? t(".projects_excess.description") : t(".budget_excess.description") %>

-
-
- -
-
-
diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_budget_summary.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_budget_summary.html.erb deleted file mode 100644 index 47b16665..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/_budget_summary.html.erb +++ /dev/null @@ -1,69 +0,0 @@ -
- <% if voting_mode? %> -
-
- -
-
- <% elsif budgets.count > 1 %> -
-
- <%= button_to(decidim_budgets.budgets_path, class: "link m-bottom", method: :get) do %> - <%= icon "chevron-left", class: "icon--small", role: "img", "aria-hidden": true %> - <%= t(".back_to_budgets") %> - <% end %> -
-
- <% end %> -
-<% if voting_mode? %> -
-
-

- <%= t(".choose_budget", budget_title: translated_attribute(budget.title)) %> -

-

- <%= t(".choose_description") %> -

- - <% if current_order.projects_rule? %> -
- <%= t(".total_projects") %> - - <%= current_order.maximum_projects %> - - -
- <% else %> -
- <%= t(".total_budget") %> - - <%= budget_to_currency(budget.total_budget) %> - - -
- <% end %> - - <%= render partial: "order_progress" %> - -
- - <%= t(".assigned") %> - <%= render partial: "order_total_budget" %> - -
-
- - <%= render partial: "order_selected_projects" %> -
-<% else %> - <% if current_order_checked_out? %> - <%= render partial: "pre_voting_budget_summary" %> - <% else %> - <%= render partial: "pre_voting_budget_summary" %> - <% end %> -<% end %> -<%= render partial: "budget_confirm" %> diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_cancel_voting_modal.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_cancel_voting_modal.html.erb deleted file mode 100644 index f3b4dcbf..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/_cancel_voting_modal.html.erb +++ /dev/null @@ -1,19 +0,0 @@ - diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_exit_modal.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_exit_modal.html.erb new file mode 100644 index 00000000..bb2275e6 --- /dev/null +++ b/decidim-budgets_booth/app/views/decidim/budgets/projects/_exit_modal.html.erb @@ -0,0 +1,19 @@ +<% if current_user && current_component.current_settings.votes == "enabled" && !current_workflow.voted?(budget) %> + <%= decidim_modal id: "exit-notification" do %> +
+ <%= icon "information-line" %> +

+ <%= t("title", scope: "decidim.budgets.projects.exit_modal") %> +

+

+ <%= t("message", scope: "decidim.budgets.projects.exit_modal") %> +

+
+
+ + <%= link_to t("exit", scope: "decidim.budgets.projects.exit_modal"), cancel_redirect_path, id: "exit-notification-link", class: "button button__sm md:button__lg button__secondary" %> +
+ <% end %> +<% end %> diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_map.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_map.html.erb deleted file mode 100644 index c6fcd355..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/_map.html.erb +++ /dev/null @@ -1,24 +0,0 @@ -<% page_geocoded_projects = Decidim::Budgets::Project.where(id: projects.map(&:id)).geocoded %> -<%= dynamic_map_for projects_data_for_map(page_geocoded_projects) do %> - -<% end %> diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_order_progress_summary_content.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_order_progress_summary_content.html.erb new file mode 100644 index 00000000..01cabb22 --- /dev/null +++ b/decidim-budgets_booth/app/views/decidim/budgets/projects/_order_progress_summary_content.html.erb @@ -0,0 +1,122 @@ +
+
+ <% if include_heading && controller.action_name == "show" %> + <% if current_order_checked_out? %> + <%= t("title", scope: "decidim.budgets.projects.budget_summary.checked_out") %> +
+ + <%= t("name", scope: "decidim.components.budgets") %> + + / + <%= translated_attribute(budget.title) %> +

+ <%= t("description", scope: "decidim.budgets.projects.budget_summary.checked_out") %> +

+
+ <% else %> +

+ <%= current_rule_description %> +

+ <% end %> + <% end %> +
+
" aria-valuenow="<%= current_order_budget_percent %>" aria-valuetext="<%= current_order_budget_percent %> %" aria-valuemin="0" aria-valuemax="100"> +
+
+
+
+
+ + " class="budget-summary__progressbar-legend-strong"> + <%= render partial: "decidim/budgets/projects/order_total_budget" %> + + <%= t("assigned", scope: "decidim.budgets.projects.order_progress") %> + + <% if current_order.minimum_budget > 0 %> + + + <%= budget_to_currency(current_order.minimum_budget) %> + + <%= t("minimum", scope: "decidim.budgets.projects.order_progress") %> + + <% end %> + <%= render partial: "decidim/budgets/projects/order_progress_progressbar_marks_right" %> +
+
+
+
+ <% if !current_order_checked_out? && voting_open? %> + + <% end %> + <% if include_heading && current_order_checked_out? %> + <%= link_to budget_order_path(return_to: "budget"), method: :delete, class: "button button__lg button__secondary cancel-order w-full", data: { confirm: t("are_you_sure", scope: "decidim.budgets.projects.budget_confirm") } do %> + <%= t("cancel_order", scope: "decidim.budgets.projects.budget_summary") %> + <%= icon "delete-bin-line" %> + <% end %> + <% end %> +
+
+ +
+
+
+
+
+
+
+
+
+
+
+ + <%= t("assigned", scope: "decidim.budgets.projects.order_progress") %> + " class="budget-summary__progressbar-legend-strong"> + <%= render partial: "decidim/budgets/projects/order_total_budget" %> + + + <% if current_order.minimum_budget > 0 %> + + <%= t("minimum", scope: "decidim.budgets.projects.order_progress") %> + + <%= budget_to_currency(current_order.minimum_budget) %> + + + <% end %> + <%= render partial: "decidim/budgets/projects/order_progress_progressbar_marks_right" %> +
+
+ +
+
+
+ +
+ + +
diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_order_progress_text.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_order_progress_text.html.erb new file mode 100644 index 00000000..eaa7cd1f --- /dev/null +++ b/decidim-budgets_booth/app/views/decidim/budgets/projects/_order_progress_text.html.erb @@ -0,0 +1,21 @@ +<% if current_order_checked_out? %> + <%= t("title", scope: "decidim.budgets.projects.budget_summary.checked_out") %> +
+ + <%= t("name", scope: "decidim.components.budgets") %> + + / + <%= translated_attribute(budget.title) %> +

+ <%= t("description", scope: "decidim.budgets.projects.budget_summary.checked_out") %> +

+
+<% else %> +

+ <% if current_settings.votes == "disabled" %> + <%= t('.vote_disabled') %> + <% else %> + <%= current_rule_description %> + <% end %> +

+<% end %> diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_pre_voting_budget_summary.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_pre_voting_budget_summary.html.erb deleted file mode 100644 index 5b0cdc43..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/_pre_voting_budget_summary.html.erb +++ /dev/null @@ -1,24 +0,0 @@ -
-
- <% if current_order_checked_out? %> -

- <%= t(".pre_vote.casted_title") %> -

-

- <%= raw t(".pre_vote.casted_description", cancel_link: link_to(t(".cancel_order"), budget_order_path(return_to: "budget"), method: :delete, class: "cancel-order", data: { confirm: t(".are_you_sure") })) %> -

-
- <%= link_to(t(".pre_vote.result_voted"), decidim_budgets.budget_order_path(budget), class: "button hollow button--sc pull-right", remote: true) %> -
- <% else %> -

- <%= t(".pre_vote.title") %> -

-

- <%= description_text %> - <%= button_to vote_text, budget_voting_index_path, class: "button hollow button--sc pull-right", method: :get, disabled: !voting_open? %> -

- <% end %> -
-
-<%= render partial: "decidim/budgets/voting/voted_summary_modal" if current_order_checked_out? %> diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_project.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_project.html.erb index a4743652..529dfb99 100644 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/_project.html.erb +++ b/decidim-budgets_booth/app/views/decidim/budgets/projects/_project.html.erb @@ -1 +1,3 @@ -<%= cell "decidim/budgets/project_list_item", project, voting_mode: voting_mode? %> +<% show_only_added ||= params.dig(:filter, :addition_type) == "added" %> +<% @view_mode = view_mode if @view_mode.nil? %> +<%= card_for project, from: project, size: card_size_for_view_mode(@view_mode), show_only_added:, view_mode: @view_mode, render_extra_data: true %> diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_project_budget_button.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_project_budget_button.html.erb index 63434801..8a3ceb42 100644 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/_project_budget_button.html.erb +++ b/decidim-budgets_booth/app/views/decidim/budgets/projects/_project_budget_button.html.erb @@ -1,11 +1,11 @@ <% if current_user.blank? %>
-
<% elsif can_have_order? && !current_order_checked_out? %> - <%= cell("decidim/budgets/project_vote_button", project, scale_up: true) %> + <%= cell("decidim/budgets/project_vote_button", project, scale_up: true, project_item: true) %> <% end %> diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_project_modal.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_project_modal.html.erb deleted file mode 100644 index 22d95959..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/_project_modal.html.erb +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_projects.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_projects.html.erb index 3246fd97..d83ae4e2 100644 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/_projects.html.erb +++ b/decidim-budgets_booth/app/views/decidim/budgets/projects/_projects.html.erb @@ -1,15 +1,15 @@ -
-
- <%= order_selector available_orders, i18n_scope: "decidim.budgets.projects.orders" %> +
+
+ <%= render partial: "addition_selector" %>
-
+
+ <%= render partial: "order" %> +
+
- <% projects.each do |project| %> - <%= render partial: "project", locals: { project: project } %> - <%= render partial: "project_modal", locals: { project: project } %> - <% end %> - <%= render partial: "project_modal", locals: { project: @select_project } if @select_project.present? %> + <%= render partial: "projects_list", locals: { project: } %>
-<%= render partial: "budget_excess" %> + <%= decidim_paginate projects %> + diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/_projects_list.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/_projects_list.html.erb new file mode 100644 index 00000000..38d19846 --- /dev/null +++ b/decidim-budgets_booth/app/views/decidim/budgets/projects/_projects_list.html.erb @@ -0,0 +1,5 @@ +
+ <% projects.each do |project| %> + <%= render partial: "project", locals: { project:, card_size: card_size_for_view_mode(@view_mode) } %> + <% end %> +
diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/index.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/index.html.erb index 10c25247..5b68790b 100644 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/index.html.erb +++ b/decidim-budgets_booth/app/views/decidim/budgets/projects/index.html.erb @@ -1,41 +1,50 @@ -<%= render partial: "decidim/shared/component_announcement" %> +<% add_decidim_meta_tags( + description: translated_attribute(budget.description), + title: t("decidim.budgets.projects.projects_for", name: budget_title), + url: budget_url(budget), + resource: budget) %> -<% cell("decidim/budgets/limit_announcement", budget) %> +<%= append_javascript_pack_tag "decidim_budgets" %> +<%= append_stylesheet_pack_tag "decidim_budgets" %> -
"> -
- <% if component_settings.geocoding_enabled? %> -
- <%= render partial: "map" %> -
- <% end %> - <% if voting_finished? %> -

- <%= t("decidim.budgets.projects.projects_for", name: translated_attribute(budget.title)) %> -

- <% else %> - <%= render partial: "budget_summary" %> - <%= render partial: "cancel_voting_modal" %> - <% end %> -
+<%= render partial: "budget_summary", locals: { include_heading: true, project_item: false, responsive: true } %> +<%= cell("decidim/budgets/budget_information_modal", budget) %> -
-

- <%= render partial: "count" %> -

+<% content_for :aside do %> +

<%= t("decidim.budgets.projects.projects_for", name: budget_title) %>

+
+ <%= render partial: "order_progress_text" %>
+ <%= render layout: "decidim/shared/filters", locals: { filter_sections: , search_variable: :search_text_cont, skip_to_id: "projects" } do %> + <%= hidden_field_tag :order, order, id: nil, class: "order_filter" %> + <% end %> +<% end %> + +<%= render layout: "layouts/decidim/shared/layout_two_col" do %> + <% if projects.any? %> + <%= render partial: "exit_modal" %> + <%= render partial: "budget_excess" %> + <%= render partial: "budget_confirm" %> -
-
- <%= render partial: "filters_small_view" %> -
- <%= render partial: "filters" %> + <%= cell("decidim/budgets/limit_announcement", budget) %> +
+
+

<%= t '.title' %>

+
-
+
<%= render partial: "projects" %> -
+ + <% else %> + <%= cell("decidim/announcement", t("empty", scope: "decidim.budgets.projects")) %> + <% end %> +<% end %> +<% unless voting_finished? %> +
+ <%= render partial: "budget_summary", locals: { include_heading: true, project_item: false, responsive: false } %>
-
- -<%= javascript_pack_tag("decidim_budgets_booth_voting") %> +<% end %> diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/index.js.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/index.js.erb index dbc08819..0066e238 100644 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/index.js.erb +++ b/decidim-budgets_booth/app/views/decidim/budgets/projects/index.js.erb @@ -1,41 +1,16 @@ -var $projects = $('#projects'); +var $projects = $('#projects .budget-list'); +var $order = $('.budget__list--header [data-collection-sort-controls]'); var $projectsCount = $('#projects-count'); var $orderFilterInput = $('.order_filter'); -<% if component_settings.geocoding_enabled? %> - var $map = $('#map-container'); - $map.html(' '); - $map.html('<%= j(render partial: "map").strip.html_safe %>'); - // from map.js - var $mapElements = $("[data-decidim-map]"); - $mapElements.each((_i, el) => { - const $map = $(el); - let mapId = $map.attr("id"); - if (!mapId) { - mapId = `map-${Math.random().toString(36).substr(2, 9)}`; - $map.attr("id", mapId); - } - const mapConfig = $map.data("decidim-map"); - const ctrl = window.Decidim.createMapController(mapId, mapConfig); - const map = ctrl.load(); - map.setMaxZoom(14); - // from default.js - const tilesConfig = mapConfig.tileLayer; - L.tileLayer(tilesConfig.url, tilesConfig.options).addTo(map); - $map.data("map", map); - $map.data("map-controller", ctrl); +$projects.html('<%= j(render partial: "projects_list").strip.html_safe %>'); +$order.html('<%= j(render partial: "order").strip.html_safe %>'); +$projectsCount.html('<%= j(render partial: "count").strip.html_safe %>'); +$orderFilterInput.val('<%= order %>'); + +document.dispatchEvent(new CustomEvent("ajax:loaded", { detail: $projects[0] })); + - $map.trigger("configure.decidim", [map, mapConfig]); - ctrl.start(); - $map.trigger("ready.decidim", [map, mapConfig]); - }); -<% end %> -$projects.html('<%= j(render partial: "projects").strip.html_safe %>'); -$projectsCount.html('<%= j(render partial: "count").strip.html_safe %>'); -$orderFilterInput.val('<%= order %>'); -var $dropdownMenu = $('.dropdown.menu', $projects); -$dropdownMenu.foundation(); -$projects.foundation(); diff --git a/decidim-budgets_booth/app/views/decidim/budgets/projects/show.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/projects/show.html.erb index 1966a7e2..66d36830 100644 --- a/decidim-budgets_booth/app/views/decidim/budgets/projects/show.html.erb +++ b/decidim-budgets_booth/app/views/decidim/budgets/projects/show.html.erb @@ -1,77 +1,100 @@ <% add_decidim_meta_tags( - title: translated_attribute(project.title), - description: translated_attribute(project.description) -) %> + title: translated_attribute(project.title), + description: translated_attribute(project.description) + ) %> <% -edit_link( - resource_locator([project.budget, project]).edit, - :update, - :project, - project: project -) + edit_link( + resource_locator([project.budget, project]).edit, + :update, + :project, + project: + ) %> -<%= cell("decidim/budgets/limit_announcement", budget) %> -
-
- <% if voting_mode? %> - <%= render partial: "budget_summary", locals: { include_heading: true } %> - <% else %> - <%= render partial: "pre_voting_budget_summary", locals: { include_heading: true } %> - <% end %> +<%= append_javascript_pack_tag "decidim_budgets" %> +<%= append_stylesheet_pack_tag "decidim_budgets" %> -
- <%= link_to budget_projects_path(budget), class: "link js-back-to-list" do %> - <%= icon "chevron-left", class: "icon--small", role: "img", "aria-hidden": true %> - <%= t(".view_all_projects") %> - <% end %> -

<%= translated_attribute project.title %>

-
-
+<%= render partial: "exit_modal" %> -
-
-
-
-
- <%= t(".budget") %> - <%= budget_to_currency project.budget_amount %> -
+
+ <%= render partial: "budget_summary", locals: { include_heading: true, project_item: true, responsive: true } %> + <% content_for :item_header do %> + <% unless voting_finished? %> +
+ <%= render partial: "budget_summary", locals: { include_heading: true, project_item: true, responsive: false } %> +
+ <%= render partial: "budget_excess" %> + <%= render partial: "budget_confirm" %> + <% end %> + <% end %> + <%= render layout: "layouts/decidim/shared/layout_item", locals: { back_path: budget_projects_path(budget) } do %> +
+ <%= cell("decidim/budgets/budget_information_modal", budget) %> + <%= cell("decidim/budgets/limit_announcement", budget) %> - <%= cell("decidim/budgets/project_votes_count", project, layout: :one_line, class: "display-block") %> + <%= cell("decidim/budgets/project_selected_status", project, as_label: true) %> +

+ <%= decidim_sanitize translated_attribute project.title %> +

+
+
+
+ <%= decidim_sanitize_editor_admin translated_attribute project.description %> +
+
+
+ <% if tabs.any? %> +
+
    + <% tabs.each_with_index do |tab, i| %> +
  • + +
  • + <% end %> +
- <% if voting_finished? %> - <%= cell("decidim/budgets/project_voted_hint", project, class: "display-block") %> - <% elsif voting_open? && !current_order_checked_out? %> - <%= t(".pre_vote.introduction") %> - <%= link_to budget_voting_index_path(select_project: project.id), class: "button expanded hollow display-block" do %> - <%= progress?(budget) ? t(".pre_vote.continue_voting") : t(".pre_vote.start_voting") %> + <% panels.each do |panel| %> +
+ <%= send(panel[:method], *panel[:args]) %> +
<% end %> - <% else %> - <%= cell("decidim/budgets/project_voted_hint", project, text_medium: true, class: "success text-m display-block margin-top-1") if current_order_checked_out? && voted_for?(project) %> - <% end %> - - <%= render partial: "decidim/shared/follow_button", locals: { followable: project, large: false } %> +
+ <% end %> +
+
+ <%= cell "decidim/comments_button", nil %> +
+ <%= cell "decidim/budgets/project_tags", project %>
-
- <%= resource_reference(project) %> - <%= render partial: "decidim/shared/share_modal" %> -
-
-
- <%= cell("decidim/budgets/project_selected_status", project, as_label: true) %> - <%= decidim_sanitize_editor translated_attribute project.description %> - <%= cell "decidim/budgets/project_tags", project, context: { extra_classes: ["tags--project"] } %> -
- <%= attachments_for project %> - <%= linked_resources_for project, :proposals, "included_proposals" %> - <%= linked_resources_for project, :results, "included_projects" %> -
-
-
+ -<%= comments_for project, polymorphic: [project.budget] %> - -<%= javascript_pack_tag("decidim_budgets") %> + <% content_for :aside do %> +
+ <% if voting_open? %> + <%= cell("decidim/budgets/project_vote_button", project) %> + <% end %> +
+
+ + <%= t("budget", scope: "decidim.budgets.projects.show") %> + +
+ <%= budget_to_currency project.budget_amount %> +
+
+
+ <%= render partial: "decidim/shared/follow_button", class: "text-center", locals: { followable: project, large: false } %> + <%= cell "decidim/share_button", nil %> +
+ <% end %> + <% content_for :item_footer do %> + <%= comments_for project, polymorphic: [project.budget] %> + + <% end %> + <% end %> +
diff --git a/decidim-budgets_booth/app/views/decidim/budgets/user_data/new.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/user_data/new.html.erb deleted file mode 100644 index eb2b82f3..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/user_data/new.html.erb +++ /dev/null @@ -1,66 +0,0 @@ -
-
-

<%= t(".welcome", organization: current_organization.name).html_safe %>

-
-
- -
-
- - <%= button_to cancel_redirect_path, class: "link margin-bottom-1", method: :get, data: { - confirm: t("actions.cancel_zip_code", scope: "decidim.budgets.budgets") - } do %> - <%= icon "chevron-left", class: "icon--small", role: "img", "aria-hidden": true %> - <%= t("cancel", scope:"decidim.budgets.user_data.new") %> - <% end %> -
-
-
-
-

<%= t(".title") %>

-

<%= t(".description") %>

- <%= decidim_form_for(@form, url: zip_code_index_path, method: :post) do |form| %> -
-
-
-
- <% zip_code_length.times do |ind| %> -
- " autocomplete="off" aria-label="<%= t(".inputs", count: ind + 1) %>"> -
- <% end %> -
-
- - - -
- <%= form.hidden_field :zip_code, vlaue: @form.zip_code %> -
-
-
- <% if voting_terms.present? %> -
-
-
- <%= raw(voting_terms) %> -
-
-
- <% end %> - -
- <%= form.check_box :affirm_statements_are_correct, label: t(".affirm_statements"), required: true %> - <%= t(".must_be_accepted") %> -
-
-
- <%= form.submit t(".submit"), class:"button expanded" %> -
-
- <% end %> -
-
-
-
-<%= javascript_pack_tag "decidim_budgets_booth_zip_code" %> diff --git a/decidim-budgets_booth/app/views/decidim/budgets/voting/_confirm_voting_modal.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/voting/_confirm_voting_modal.html.erb deleted file mode 100644 index b8be1334..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/voting/_confirm_voting_modal.html.erb +++ /dev/null @@ -1,96 +0,0 @@ -
-
-

<%= t(".title") %>

- -
- - <% if vote_success_content.present? %> -
- <%== vote_success_content %> -
- <% end %> -
-
- -
-
-
- -<% if current_order.present? %> -
-
-
- <% if current_order_checked_out? %> - <%= link_to budget_projects_path(budget), class: "link" do %> - <%= icon "chevron-left", class: "icon--small", role: "img", "aria-hidden": true %> - <%= t(".back") %> - <% end %> - <% else %> - <%= link_to budget_voting_index_path, class: "link" do %> - <%= icon "chevron-left", class: "icon--small", role: "img", "aria-hidden": true %> - <%= t(".return_voting") %> - <% end %> - <% end %> -
-
-

<%= current_order_checked_out? ? t(".casted_title") : t(".title") %>

-
- <%= t(".total_budget") %> - - <%= budget_to_currency(budget.total_budget) %> - - -
- <%= render partial: "decidim/budgets/projects/order_progress", locals: { checkout?: true } %> -
- - <%= t(".assigned") %> - <%= render partial: "decidim/budgets/projects/order_total_budget" %> - -
-
-

- <%= current_order_checked_out? ? t(".casted_list_description"): t(".list_description") %> -

-
    - <% current_order.projects.each do |project| %> -
  • - <%= "#{translated_attribute(project.title)} #{budget_to_currency(project.budget_amount)}" %> -
  • - <% end %> -
-
- <% if current_order_checked_out? %> -
-

<%= t(".changed_your_mind_html", cancel_link: link_to(t(".cancel_order"), budget_order_path(return_to: "budget"), method: :delete, class: "cancel-order", data: { confirm: t("decidim.budgets.projects.budget_summary.are_you_sure") })) %>

-
- <% end %> - <% unless current_order_checked_out? %> -
-
-

<%= t(".confirm") %>

-
-
-
- <%= button_to checkout_budget_order_path(budget), class: "button expanded" do %> - <%= t(".cast_vote") %> - <%= icon "chevron-right", class: "icon--small", role: "img", "aria-hidden": true %> - <% end %> -
- -
- <%= link_to budget_voting_index_path, class: "button hollow expanded" do %> - <%= t(".return_voting") %> - <% end %> -
-
-
- <% end %> -
-
-
-<% end %> diff --git a/decidim-budgets_booth/app/views/decidim/budgets/voting/_thanks_message_modal.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/voting/_thanks_message_modal.html.erb index c6cb3e8b..1bd7a92a 100644 --- a/decidim-budgets_booth/app/views/decidim/budgets/voting/_thanks_message_modal.html.erb +++ b/decidim-budgets_booth/app/views/decidim/budgets/voting/_thanks_message_modal.html.erb @@ -1,27 +1,21 @@ -
-
-

<%= t(".title") %>

- -
- <% unless current_workflow.try(:hide_image_in_popup?) %> -
-
-
- <%= render partial: "decidim/budgets/partials/svgs/icon-ballot-box", formats: [:svg] %> -
-
+<%= decidim_modal id: "thanks-message", data: { session: thanks_popup? } do %> +
+ <%= icon "delete-bin-line" %> +

<%= t(".title") %>

+ +
+ <%= vote_success_content %>
- <% end %> -
- <%= vote_success_content %>
-
-
- -
+ +
+ +
-
+<% end %> + + diff --git a/decidim-budgets_booth/app/views/decidim/budgets/voting/_voted_summary_modal.html.erb b/decidim-budgets_booth/app/views/decidim/budgets/voting/_voted_summary_modal.html.erb deleted file mode 100644 index a8de0939..00000000 --- a/decidim-budgets_booth/app/views/decidim/budgets/voting/_voted_summary_modal.html.erb +++ /dev/null @@ -1,25 +0,0 @@ - diff --git a/decidim-budgets_booth/app/views/decidim/shared/_filters.html.erb b/decidim-budgets_booth/app/views/decidim/shared/_filters.html.erb new file mode 100644 index 00000000..381e03c7 --- /dev/null +++ b/decidim-budgets_booth/app/views/decidim/shared/_filters.html.erb @@ -0,0 +1,44 @@ +<% filter_sections = [] unless local_assigns.has_key?(:filter_sections) %> +<% search_label = t("decidim.searches.filters.search") unless local_assigns.has_key?(:search_label) %> + +<% if filter_sections.present? || local_assigns.has_key?(:search_variable) %> + <%= filter_form_for filter, url_for, class: "new_filter self-stretch", data: { filters: "", component: "accordion" } do |form| %> + + + + + + <% end %> +<% end %> diff --git a/decidim-budgets_booth/app/views/layouts/decidim/budgets/_voting_application.html.erb b/decidim-budgets_booth/app/views/layouts/decidim/budgets/_voting_application.html.erb index c334e5ea..ce034530 100644 --- a/decidim-budgets_booth/app/views/layouts/decidim/budgets/_voting_application.html.erb +++ b/decidim-budgets_booth/app/views/layouts/decidim/budgets/_voting_application.html.erb @@ -6,21 +6,26 @@ <%= render partial: "layouts/decidim/head" %> - - - <%= cell("decidim/data_consent", current_organization) %> - <%= render partial: "layouts/decidim/impersonation_warning" %> - <%= render partial: "layouts/decidim/timeout_modal" %> - <%= render partial: "layouts/decidim/offline_banner" %> - - - <%= render partial: "layouts/decidim/budgets/voting_notification" %> + + + <%= link_to t("skip_button", scope: "decidim.accessibility"), "#content", class: "layout-container__skip" %> + <%= cell("decidim/data_consent", current_organization) %> + +
+
+ <%= render partial: "layouts/decidim/budgets/voting_menubar" %> +
<%= render "layouts/decidim/budgets/voting_wrapper" do %> <%= yield %> <% end %> + <%= render partial: "layouts/decidim/timeout_modal" %> <%= render partial: "decidim/shared/confirm_modal" %> + <%= render partial: "decidim/shared/login_modal" unless current_user %> + <%= render partial: "decidim/shared/authorization_modal" %> + <%= render partial: "decidim/shared/share_modal" %> <%= render partial: "layouts/decidim/decidim_javascript" %> <%= render partial: "layouts/decidim/data_consent_warning" %> +
diff --git a/decidim-budgets_booth/app/views/layouts/decidim/budgets/_voting_menubar.html.erb b/decidim-budgets_booth/app/views/layouts/decidim/budgets/_voting_menubar.html.erb new file mode 100644 index 00000000..8c79a570 --- /dev/null +++ b/decidim-budgets_booth/app/views/layouts/decidim/budgets/_voting_menubar.html.erb @@ -0,0 +1,26 @@ + + + diff --git a/decidim-budgets_booth/app/views/layouts/decidim/budgets/_voting_wrapper.html.erb b/decidim-budgets_booth/app/views/layouts/decidim/budgets/_voting_wrapper.html.erb index 8651b3af..92e1890c 100644 --- a/decidim-budgets_booth/app/views/layouts/decidim/budgets/_voting_wrapper.html.erb +++ b/decidim-budgets_booth/app/views/layouts/decidim/budgets/_voting_wrapper.html.erb @@ -10,15 +10,7 @@ if respond_to?(:current_component) && current_component && can_be_managed?(curre end %> -
-
-
- -
-
+
+ <%= display_flash_messages %> + <%= yield %>
diff --git a/decidim-budgets_booth/app/views/layouts/decidim/shared/_layout_item.html.erb b/decidim-budgets_booth/app/views/layouts/decidim/shared/_layout_item.html.erb new file mode 100644 index 00000000..4e301859 --- /dev/null +++ b/decidim-budgets_booth/app/views/layouts/decidim/shared/_layout_item.html.erb @@ -0,0 +1,21 @@ +
+ <%= yield :item_header %> +
+
+
+ <% if params[:included_in] %> + <%= render partial: "layouts/decidim/shared/linked_resource" %> + <% end %> + + <%= yield %> +
+ + <%# this aside is for moving comments and versions at the bottom of the page only in responsive. %> + <% if content_for?(:item_footer) %> + + <% end %> +
diff --git a/decidim-budgets_booth/config/assets.rb b/decidim-budgets_booth/config/assets.rb index 6513d41f..78bde688 100644 --- a/decidim-budgets_booth/config/assets.rb +++ b/decidim-budgets_booth/config/assets.rb @@ -4,8 +4,6 @@ Decidim::Webpacker.register_path("#{base_path}/app/packs", prepend: true) Decidim::Webpacker.register_entrypoints( - decidim_budgets_booth_voting: "#{base_path}/app/packs/entrypoints/decidim_budgets_booth_voting.js", - decidim_budgets_booth_zip_code: "#{base_path}/app/packs/entrypoints/decidim_budgets_booth_zip_code.js", decidim_budgets_booth_budgets: "#{base_path}/app/packs/entrypoints/decidim_budgets_booth_budgets.js", decidim_handle_voting_complete: "#{base_path}/app/packs/entrypoints/decidim_handle_voting_complete.js" ) diff --git a/decidim-budgets_booth/config/i18n-tasks.yml b/decidim-budgets_booth/config/i18n-tasks.yml index f3a0baf9..a7d93864 100644 --- a/decidim-budgets_booth/config/i18n-tasks.yml +++ b/decidim-budgets_booth/config/i18n-tasks.yml @@ -1,10 +1,44 @@ --- base_locale: en -locales: [en] +locales: [en, fr] ignore_unused: - "decidim.components.ptp-budgets.name" + - "layouts.decidim.shared.layout_two_col.title" + - "decidim.components.budgets.settings.global.vote_success_url" + - "decidim.components.budgets.settings.global.vote_success_content" + - "decidim.components.budgets.settings.global.vote_completed_content" + - "decidim.components.budgets.settings.global.vote_cancel_url" + - "decidim.components.budgets.settings.global.maximum_budgets_to_vote_on" + - "decidim.budgets.budgets_list.voted_on_all_allowed" + - "decidim.budgets.projects.index.projects_for" + - "decidim.budgets.voting.index.sign_in_first" ignore_missing: - decidim.participatory_processes.scopes.global + - decidim.accessibility.skip_button + - decidim.budgets.admin.models.budget.name + - decidim.budgets.budgets_list.empty + - decidim.budgets.orders.checkout.error + - decidim.budgets.projects.empty + - decidim.budgets.projects.exit_modal.cancel + - decidim.budgets.projects.exit_modal.exit + - decidim.budgets.projects.exit_modal.message + - decidim.budgets.projects.exit_modal.title + - decidim.budgets.projects.index.title + - decidim.budgets.projects.project_budget_button.add + - decidim.budgets.projects.project_budget_button.added_descriptive + - decidim.budgets.projects.projects_for + - decidim.budgets.budget_information_modal.more_information + - decidim.budgets.projects.budget_confirm.are_you_sure + - decidim.budgets.projects.budget_summary.* + - decidim.budgets.projects.order_progress.assigned + - decidim.budgets.projects.order_progress.budget + - decidim.budgets.projects.order_progress.minimum + - decidim.searches.filters.search + - decidim.searches.filters_small_view.filter + - decidim.searches.filters_small_view.filter_and_search + - decidim.shared.confirm_modal.cancel + - decidim.shared.filter_form_help.* + - decidim.components.budgets.name diff --git a/decidim-budgets_booth/config/locales/en.yml b/decidim-budgets_booth/config/locales/en.yml index 880aea4b..81a08018 100644 --- a/decidim-budgets_booth/config/locales/en.yml +++ b/decidim-budgets_booth/config/locales/en.yml @@ -2,32 +2,9 @@ en: decidim: budgets: - admin: - budgets: - edit: - images: Images - budget_list_item: - current_phase: 'Current phase: %{phase}' - more_info: More info - show_my_vote: Show my vote - take_part: Take part - budgets: - actions: - cancel_voting: Are you sure you want to exit the voting booth? - cancel_zip_code: Are you sure you want to exit? - index: - cancel_voting: Cancel voting - login_before_access: You need to login first. - not_allowed: You are not allowed to perform this action. - budgets_header: - based_on_zip_code: Based on your ZIP code - %{zip_code}. - change_it_here: Change it here - not_right_one: Not the right one? %{link} - title: 'Ballots available to you' budgets_list: - no_budgets_found: No budgets were found based on your ZIP code. You can change - your ZIP code if it's not correct, or you can search again later. - vote: Show + voted_on_all_allowed: You have voted on %{links}. You have voted on the maximum + budgets allowed. orders: modal: assigned: 'Assigned: ' @@ -36,141 +13,63 @@ en: ok: OK title: Your vote in %{budget_title} total_budget: 'Total budget: ' - partials: - voting_help_modal: - confirm: I understand how to vote - step1: Pick the project - step2: Confirm your vote - step3: Cast your vote - subtitle: You need to cast your vote for it to be counted in the final result. - title: Your vote has not been cast. - project_list_item: - ordered_item: This item is added to the your vote. - read_more: Read more project_vote_button: add_to_vote: Add to your vote - remove_from_vote: Remove from vote + remove_from_vote: Added to vote projects: - budget_confirm: - is_this_correct: Is this correct? - budget_summary: - back_to_budgets: Show all budgets - cancel_voting: Cancel voting - choose_budget: You decide the %{budget_title} budget - choose_description: Choose the projects you like and cast your vote at the - end. - cancel_voting_modal: - continue: Continue voting - description: If you cancel your vote, it will not be count for the final - result. In order to get your vote heard, please go back to cast your vote. - exit: I don't want to vote right now - label: Exit voting - title: Are you sure you don't want to cast your vote? index: - back_to_budgets: Back to budgets - map: - view_project: View project + projects_for: Projects for order_progress: ready: I am ready total_budget: 'Total budget: ' vote: Vote - pre_voting_budget_summary: - are_you_sure: Are you sure you want to delete your vote? - cancel_order: Cancel your vote - pre_vote: - casted_description: You have previously voted in this budget. If you want - to see what you voted, click "Review your vote" button. You can also - %{cancel_link} and start again. - casted_title: Thank you for your voting - finish_description: You have already started voting in this budget. Would - you like to finish your vote? - finish_voting: Finish voting - result_voted: Review your vote - start_description: You can browse to the projects to get yourself familiar - with them. In order to start voting, click the "Start voting" button. - start_voting: Start voting - title: Welcome to the vote! - ready: I am ready - project: - you_voted: You voted for this - project_modal: - budget_amount: 'Budget: ' - cancel: Cancel - category: 'Category: ' - close_project: Close - scope: 'Scope: ' + order_progress_text: + vote_disabled: Vote disabled. + order_selected_projects: + remove: Remove + selected_projects: + one: selected project + other: selected projects + view: See show: - pre_vote: - continue_voting: Continue voting - introduction: Want to vote this project? - start_voting: Start voting - user_data: - error: - only_letters: Only letters and digits are allowed. - unknown: There was an error. Please try again. - zip_code_empty: ZIP code format is not correct. - zip_code_included: The ZIP code you provided is not part of the areas that - are eligible for voting. Make sure you have entered the correct ZIP code - and try again. - new: - affirm_statements: By checking this box, I affirm that these stamenets are - true, and that I meet the voting eligibility requirements. - cancel: Cancel - change_zip_code_after_vote: You can not change your ZIP code after started - voting. Delete all of your votes first. - description: Please provide your ZIP code to find your Participatory Budgeting - ballots. - inputs: - one: First digit - other: digit %{count} - must_be_accepted: must be accepted - submit: Find my ballots - title: ZIP code - voting_ended: You can not set your ZIP code when the voting is not open. - welcome: Welcome to the
%{organization} Participatory Budgeting! - success: You have successfully registered your ZIP code. + budget: Budget voting: - general: - not_open_warning: Voting is not allowed. index: - sign_in_first: You need to sign in to start voting. + sign_in_first: You must connect before continue thanks_message_modal: - close: Close continue: Continue + default_text: Thank you for your participation title: Thank you for voting! vote_completed_modal: - close: Close continue: Continue title: You successfully completed your votes - voted_summary_modal: - continue: Continue - label: Close - list_description: These are the projects you picked. - title: Your vote voting_notification_event: notification_casted: Your vote has been casted - notification_title: You have successfully cast your vote for the budget %{budget_name} + notification_title: You have successfully cast your vote for the budget + %{budget_name} components: budgets: settings: global: maximum_budgets_to_vote_on: Maximum number of budgets that user can vote on (default is 0, which means user can vote on all available budgets) - show_full_description_on_listing_page: Show full project descriptions - on the listing page and disable the details popup - vote_cancel_url: URL to redirect user when canceling voting (defaullt - to the root path) + vote_cancel_url: URL to redirect user when canceling voting (default to + the root path) vote_completed_content: Popup text after voting in all available budgets vote_success_content: Popup text after each vote vote_success_url: URL to redirect user after voting on all available budgets (default is budgets list) - voting_terms: Terms and conditions to be shown when user wants to enter - their ZIP code - workflow_choices: - zip_code: 'Vote based on ZIP code: allows participants to vote on budgets - matching their entered ZIP code.' + orders: + checkout: + error: There was a problem processing your vote. layouts: decidim: budgets: + voting_menubar: + back_to_projects: Back to projects + cancel_voting: Exit voting booth voting_notification: notification: You are now in the voting booth. + shared: + layout_two_col: + title: Projects for vote diff --git a/decidim-budgets_booth/config/locales/fi.yml b/decidim-budgets_booth/config/locales/fi.yml deleted file mode 100644 index b48c3827..00000000 --- a/decidim-budgets_booth/config/locales/fi.yml +++ /dev/null @@ -1,156 +0,0 @@ ---- -fi: - decidim: - budgets: - admin: - budgets: - edit: - images: Kuvat - budget_list_item: - current_phase: 'Käynnissä oleva vaihe: %{phase}' - more_info: Lisätietoja - show_my_vote: Näytä oma ääneni - take_part: Osallistu - budgets: - actions: - cancel_voting: Haluatko varmasti poistua äänestyskopista? - cancel_zip_code: Haluatko varmasti poistua? - index: - cancel_voting: Poistu äänestyksestä - login_before_access: Sinun täytyy kirjautua sisään ensin. - not_allowed: Tiliäsi ei ole vahvistettu tämän toiminnon suorittamiseen. - budgets_header: - based_on_zip_code: Perustuen postinumeroosi - %{zip_code}. - change_it_here: Muuta sitä tästä - not_right_one: Onko postinumero väärin? %{link} - title: 'Sinulle saatavilla olevat äänestykset' - budgets_list: - no_budgets_found: Äänestettäviä budjetteja ei löytynyt postinumerollasi. Voit vaihtaa postinumeroasi, jos se on väärin tai voit yrittää myöhemmin uudestaan. - vote: Näytä - orders: - modal: - assigned: 'Käytetty: ' - close: Sulje ikkuna - description: Olet valinnut nämä hankkeet osaksi budjettia. - ok: OK - title: Äänesi alueella %{budget_title} - total_budget: 'Kokonaisbudjetti: ' - partials: - voting_help_modal: - confirm: Ymmärrän, kuinka äänestän - step1: Valitse hanke - step2: Vahvista äänesi - step3: Anna äänesi - subtitle: Sinun on annettava äänesi, jotta se lasketaan lopullisiin tuloksiin. - title: Et ole vielä antanut ääntäsi. - project_list_item: - ordered_item: Tämä hanke on lisätty ääneesi. - read_more: Lue lisää - project_vote_button: - add_to_vote: Lisää ääneesi - remove_from_vote: Poista äänestäsi - projects: - budget_confirm: - is_this_correct: Onko tämä oikein? - budget_summary: - back_to_budgets: Näytä kaikki budjetit - cancel_voting: Poistu äänestyksestä - choose_budget: Voit päättää budjetista alueella %{budget_title} - choose_description: Valitse sellaiset hankkeet, joista pidät ja anna äänesi sen jälkeen. - cancel_voting_modal: - continue: Jatka äänestystä - description: Jos poistut äänestyksestä, ääntäsi ei lasketa lopulliseen tulokseen. Jos haluat äänesi vaikuttavan lopputulokseen, palaa takaisin äänestämään. - exit: En halua äänestää juuri nyt - label: Poistu äänestyksestä - title: Haluatko varmasti lopettaa äänestyksen? - index: - back_to_budgets: Takaisin kaikkiin budjetteihin - order_progress: - ready: Olen valmis - total_budget: 'Kokonaisbudjetti: ' - vote: Äänestä - pre_voting_budget_summary: - are_you_sure: Haluatko varmasti poistaa äänesi? - cancel_order: poistaa äänesi - pre_vote: - casted_description: Olet aikaisemmin äänestänyt tästä budjetista. Jos haluat nähdä, kuinka äänestit, paina "Tarkasta äänesi" -painiketta. Voit myös %{cancel_link} ja aloittaa alusta. - casted_title: Kiitos äänestäsi - finish_description: Olet jo aloittanut tämän budjetin äänestyksen. Haluaisitko viimeistellä äänesi? - finish_voting: Viimeistele äänestys - result_voted: Tarkasta äänesi - start_description: Voit selata hankkeita tutustuaksesi niihin. Aloittaaksesi äänestyksen, paina "Aloita äänestys" -painiketta. - start_voting: Aloita äänestys - title: Tervetuloa äänestämään! - ready: Olen valmis - project: - you_voted: Äänestit tätä - project_modal: - budget_amount: 'Budjetti: ' - cancel: Peruuta - category: 'Aihepiiri: ' - close_project: Sulje - scope: 'Teema: ' - show: - pre_vote: - continue_voting: Jatka äänestystä - introduction: Haluatko äänestää tätä hanketta? - start_voting: Aloita äänestys - user_data: - error: - only_letters: Vain kirjaimet ja numerot ovat sallittuja. - unknown: Jotain meni pieleen. Yritä uudestaan. - zip_code_empty: Postinumeron muoto ei ole oikein. - zip_code_included: Postinumerollasi ei löytynyt yhtään aluetta, jossa voisit äänestää. Tarkasta, että olet syöttänyt postinumerosi oikein ja yritä uudestaan. - new: - affirm_statements: Vahvistan, että esitetyt ehdot ovat oikein ja täytän äänestämisen vaatimukset. - cancel: Peruuta - change_zip_code_after_vote: Et voi muuttaa postinumeroasi sen jälkeen, kun olet aloittanut äänestyksen. Poista kaikki äänesi ennen postinumeron muuttamista. - description: Syötä postinumerosi löytääksesi sinulle saatavilla olevat äänestykset. - inputs: - one: Ensimmäinen merkki - other: merkki %{count} - must_be_accepted: täytyy olla hyväksytty - submit: Etsi äänestykset - title: Postinumero - voting_ended: Et voi asettaa postinumeroa, kun äänestys ei ole käynnissä. - welcome: Tervetuloa
osallistuvaan budjetointiin %{organization} -alustalla - success: Olet syöttänyt postinumerosi. - voting: - general: - not_open_warning: Äänestäminen ei ole sallittua. - index: - sign_in_first: Sinun täytyy kirjautua sisään äänestääksesi. - thanks_message_modal: - close: Sulje - continue: Jatka - title: Kiitos äänestäsi! - vote_completed_modal: - close: Sulje - continue: Jatka - title: Olet suorittanut äänestyksen - voted_summary_modal: - continue: Jatka - label: Sulje - list_description: Valitsit nämä hankkeet. - title: Äänesi - voting_notification_event: - notification_casted: Äänestys on suoritettu - notification_title: Olet onnistuneesti äänestänyt budjetista %{budget_name} - components: - budgets: - settings: - global: - maximum_budgets_to_vote_on: Budjettien maksimimäärä, joissa käyttäjät voivat äänestää (oletusarvo on 0, mikä tarkoittaa, että käyttäjä voi äänestää kaikissa budjeteissa) - show_full_description_on_listing_page: Näytä hankkeiden kuvaukset kokonaan listaussivulla ja poista lisätietoikkuna käytöstä - vote_cancel_url: URL-osoite, johon käyttäjät ohjataan poistuessa äänestyskopista kesken äänestyksen (oletuksena palvelun etusivu) - vote_completed_content: Ponnahdusikkunan teksti käyttäjän äänestettyä kaikissa budjeteissa - vote_success_content: Ponnahdusikkunan teksti jokaisen äänen jälkeen - vote_success_url: URL-osoite, johon käyttäjä ohjataan äänestettyään kaikissa budjeteissa (oletuksena budjettien listaussivu) - voting_terms: Postinumeron syöttämissivulla näytettävät ehdot - workflow_choices: - zip_code: 'Äänestä postinumeron perusteella: mahdollistaa äänestyksen budjeteissa, jotka täsmäävät käyttäjän postinumeron kanssa.' - layouts: - decidim: - budgets: - voting_notification: - notification: Olet nyt äänestyskopissa. diff --git a/decidim-budgets_booth/config/locales/fr.yml b/decidim-budgets_booth/config/locales/fr.yml index 4aed89f1..ef3d8acb 100644 --- a/decidim-budgets_booth/config/locales/fr.yml +++ b/decidim-budgets_booth/config/locales/fr.yml @@ -2,31 +2,9 @@ fr: decidim: budgets: - admin: - budgets: - edit: - images: Images - budget_list_item: - current_phase: 'Phase actuelle: %{phase}' - more_info: Plus d'informations - show_my_vote: Montrer mon vote - take_part: Participer - budgets: - actions: - cancel_voting: Êtes-vous certain de vouloir quitter l'isoloir? - cancel_zip_code: Êtes-vous sur? - index: - cancel_voting: Abandonner le vote - login_before_access: Vous devez vous connecter d'abord. - not_allowed: Vous n'êtes pas autorisé à effectuer cette action. - budgets_header: - based_on_zip_code: Votre code postal - %{zip_code}. - change_it_here: Modifier ici - not_right_one: Pas le bon ? %{link} - title: 'Bulletins de vote disponibles' budgets_list: - no_budgets_found: Aucun budget n'a été trouvé en fonction de votre code postal. Vous pouvez modifier votre code postal si il est incorrect. - vote: Afficher + voted_on_all_allowed: Vous avez voté sur %{links}. Vous avez voté pour le + maximum de budgets autorisé. orders: modal: assigned: 'Attribuer: ' @@ -35,106 +13,36 @@ fr: ok: OK title: Votre vote dans %{budget_title} total_budget: 'Budget total : ' - partials: - voting_help_modal: - confirm: C'est compris! - step1: Choisir le projet - step2: Confirmez votre vote - step3: Voter - subtitle: Vous devez confirmer votre vote pour qu'il soit compté dans le résultat final. - title: Le vote n'a pas été confirmé. - project_list_item: - ordered_item: Ce projet est ajouté à votre vote. - read_more: En savoir plus project_vote_button: add_to_vote: Ajouter au vote - remove_from_vote: Supprimer du vote + remove_from_vote: Ajouté au vote projects: - budget_confirm: - is_this_correct: Est-ce correct ? - budget_summary: - back_to_budgets: Montrer tous les budgets - cancel_voting: Annuler le vote - choose_budget: Vous décidez du budget - choose_description: Choisissez les projets que vous aimez et votez à la fin. - cancel_voting_modal: - continue: Continuer le vote - description: Si vous annulez votre vote, cela ne sera pas pris en compte pour le résultat final. Afin de faire compter votre vote, veuillez revenir en arrière pour le finaliser et le confirmer. - exit: Je ne veux pas voter pour le moment - label: Quitter le vote - title: Êtes-vous certain de vouloir annuler votre vote ? index: - back_to_budgets: Retour aux budgets - map: - view_project: Voir le projet + projects_for: Projets pour order_progress: ready: Je suis prêt total_budget: 'Budget total: ' vote: Voter - pre_voting_budget_summary: - are_you_sure: Êtes-vous sûr de vouloir annuler votre vote ? - cancel_order: Annuler le vote - pre_vote: - casted_description: Vous avez précédemment voté dans ce budget. Si vous voulez revoir ce que vous avez voté, cliquez sur le bouton "Revoir votre vote". Vous pouvez aussi %{cancel_link} et recommencer. - casted_title: Merci pour votre vote - finish_description: Vous avez déjà commencé à voter dans ce budget. Voulez-vous terminer votre vote ? - finish_voting: Terminer le vote - result_voted: Revoir votre vote - start_description: Vous pouvez naviguer les projets pour vous familiariser avec eux. Pour commencer à voter, cliquez sur le bouton "Commencer à voter". - start_voting: Commencer à voter - title: Bienvenue au vote! - ready: Je suis prêt - project: - you_voted: Vous avez voté pour - project_modal: - budget_amount: 'Budget : ' - cancel: Annuler - category: 'Catégorie : ' - close_project: Fermer - scope: 'Portée : ' + order_progress_text: + vote_disabled: Vote désactivé. + order_selected_projects: + remove: Supprimer + selected_projects: + one: projet sélectionné + other: projets sélectionnés + view: Voir show: - pre_vote: - continue_voting: Continuer le vote - introduction: Vous voulez voter pour ce projet ? - start_voting: Commencer à voter - user_data: - error: - only_letters: Seules les lettres et les chiffres sont autorisés. - unknown: Il y a eu une erreur. Veuillez réessayer. - zip_code_empty: Le format du code postal n'est pas correct. - zip_code_included: Le code postal que vous avez fourni ne fait pas partie des zones éligibles pour le vote. Assurez-vous d'avoir entré le bon code postal et réessayez. - new: - affirm_statements: En cochant cette case, j'affirme que ces déclarations sont vraies et que je remplis les conditions d'éligibilité au vote. - cancel: Annuler - change_zip_code_after_vote: Vous ne pouvez pas changer votre code postal après avoir commencé à voter. Supprimez d'abord tous vos votes. - description: Veuillez fournir votre code postal pour trouver vos bulletins de budget participatif. - inputs: - one: Premier chiffre - other: chiffre %{count} - must_be_accepted: doit être accepté - submit: Trouver mes bulletins de vote - title: Code postal - voting_ended: Vous ne pouvez pas définir votre code postal lorsque le vote n'est pas ouvert. - welcome: Bienvenue au budget participatif - success: Vous avez enregistré votre code postal avec succès. + budget: Budget voting: - general: - not_open_warning: Le vote n'est pas autorisé. index: - sign_in_first: Vous devez vous connecter pour commencer à voter. + sign_in_first: Vous devez vous connecter avant de continuer thanks_message_modal: - close: Fermer continue: Continuer + default_text: Merci pour votre participation title: Merci pour votre vote! vote_completed_modal: - close: Fermer continue: Continuer title: Vous avez complété vos votes avec succès - voted_summary_modal: - continue: Continuer - label: Fermer - list_description: Voici les projets que vous avez sélectionnés. - title: Votre vote voting_notification_event: notification_casted: Votre vote a été enregistré notification_title: Vous avez voté avec succès pour le budget %{budget_name} @@ -142,17 +50,27 @@ fr: budgets: settings: global: - maximum_budgets_to_vote_on: Nombre maximum de budgets sur lesquels l'utilisateur peut voter (par défaut à 0, ce qui signifie que l'utilisateur peut voter sur tous les budgets disponibles) - show_full_description_on_listing_page: Afficher les descriptions complètes des projets sur la page de liste et désactiver la fenêtre contextuelle des détails - vote_cancel_url: URL de redirection de l'utilisateur lors de l'annulation du vote (par défaut vers la racine) - vote_completed_content: Texte de la modale après avoir voté pour tous les budgets disponibles + maximum_budgets_to_vote_on: Nombre maximum de budgets sur lesquels l'utilisateur + peut voter (par défaut à 0, ce qui signifie que l'utilisateur peut voter + sur tous les budgets disponibles) + vote_cancel_url: URL de redirection de l'utilisateur lors de l'annulation + du vote (par défaut vers la racine) + vote_completed_content: Texte de la modale après avoir voté pour tous + les budgets disponibles vote_success_content: Modale après chaque vote - vote_success_url: URL de redirection de l'utilisateur après avoir voté pour tous les budgets disponibles (par défaut vers la liste des budgets) - voting_terms: Termes et conditions à afficher lorsque l'utilisateur veut entrer son code postal - workflow_choices: - zip_code: 'Vote basé sur le code postal : permet aux participants de voter sur les budgets correspondant à leur code postal saisi.' + vote_success_url: URL de redirection de l'utilisateur après avoir voté + pour tous les budgets disponibles (par défaut vers la liste des budgets) + orders: + checkout: + error: Une erreur s'est produite lors du traitement de votre vote. layouts: decidim: budgets: + voting_menubar: + back_to_projects: Retour aux projets + cancel_voting: Sortir de la cabine de vote voting_notification: notification: Vous êtes dans la cabine de vote. + shared: + layout_two_col: + title: Projets à voter diff --git a/decidim-budgets_booth/db/migrate/20241127162648_delete_main_image_from_decidim_budgets_budgets.rb b/decidim-budgets_booth/db/migrate/20241127162648_delete_main_image_from_decidim_budgets_budgets.rb new file mode 100644 index 00000000..00d561e4 --- /dev/null +++ b/decidim-budgets_booth/db/migrate/20241127162648_delete_main_image_from_decidim_budgets_budgets.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class DeleteMainImageFromDecidimBudgetsBudgets < ActiveRecord::Migration[7.0] + def up + remove_column :decidim_budgets_budgets, :main_image + end + + def down + add_column :decidim_budgets_budgets, :main_image, :string + end +end diff --git a/decidim-budgets_booth/decidim-budgets_booth.gemspec b/decidim-budgets_booth/decidim-budgets_booth.gemspec index 21d3577b..4ef330a7 100644 --- a/decidim-budgets_booth/decidim-budgets_booth.gemspec +++ b/decidim-budgets_booth/decidim-budgets_booth.gemspec @@ -10,7 +10,7 @@ Gem::Specification.new do |s| s.email = ["sina.eftekhar@mainiotech.fi"] s.license = "AGPL-3.0" s.homepage = "https://github.com/mainio/decidim-module-ptp" - s.required_ruby_version = ">= 3.0" + s.required_ruby_version = ">= 3.2" s.name = "decidim-budgets_booth" s.summary = "A Decidim budgets module extension to implement a voting booth" diff --git a/decidim-budgets_booth/docs/ZIP_CODE_VOTING.md b/decidim-budgets_booth/docs/ZIP_CODE_VOTING.md deleted file mode 100644 index 9df9a5bc..00000000 --- a/decidim-budgets_booth/docs/ZIP_CODE_VOTING.md +++ /dev/null @@ -1,72 +0,0 @@ -# ZIP code voting - -The ZIP code voting feature provides a custom workflow for budgeting for creating scopes to represent ZIP code areas. In order to use the feature, the administrator must add the proper scopes and scope types, and configure the budgets component to use these scopes. - -## Enabling ZIP code voting - -After installing this module, you should be able to enable/disable this feature from the admin panel. To enable ZIP code workflow, you need to select the "scopes enabled" from your budget's component settings for which you want to enable this feature. Also, you need to select the custom workflow "Vote based on ZIP code: allows participants to vote on budgets matching their entered ZIP code." that is designed for this feature. - -## Adding scope types - -The administrator needs to create the following scope types: - -- Area -- Area - Borough -- Area - Neighborhood -- Area - Postal - -## Adding scopes - -To create scopes, you need to follow the following procedure: - -1. Create the parent scope which wraps up all other scopes. The parent scope should have the scope type of "Area" and the code equal to "Area". - -| **name** | **code** | **scope_type** | -| :---: | :---: | :---: | -| New York City | NY | Area | - - -2. Inside the parent scope (Area), create the boroughs that exist in the area. Each borough should have the scope type of "Area - Borough". For example, to create the Bronx sub-scope inside the parent scope, we will create the following scope: - -| **name** | **code** | **scope type** | -| -------- | ----------- | ----------------- | -| Bronx | NY_BRONX | Area - Borough | - -3. Inside each borough, add all existing neighborhoods. Each neighborhood should have the scope type of "Area - Neighborhood". For example, to create the West Bronx sub-scope inside the Bronx scope, we will create the following scope: - -| **name** | **code** | **scope type** | -| -------- | --------------- | ---------------------- | -| West Bronx | NY_BRONX_WEST | Area - Neighborhood | - -4. Finally, inside each neighborhood, add the ZIP codes that the particular area has. Each ZIP code should have the scope type of "Area - Postal". For example, to create the 10465 sub-scope inside the West Bronx scope, we will create the following scope: - -| **name** | **code** | **scope type** | -| -------- | --------------------- | ---------------- | -| 10465 | NY_BRONX_WEST_10465 | Area - Postal | - -Note that each scope should have a unique code, which can be used to reference the scope in other parts of the system. If you need to duplicate the same ZIP code under multiple neighborhoods, you can do that by using unique code for each of ZIP codes within the neighborhoods. - -Note that the ZIP codes need to be always defined at the deepest level of this structure. With the example structure you cannot, for example, add ZIP codes directly under the boroughs because you have one more hierarchy level of under that. Maximum depth for the scopes is three as in the example given above (Borough -> Neighborhood -> Postal) but you may also define less levels as long as the ZIP codes are always found at the deepest level within the hierarchy. - -If you need to add ZIP codes that do not belong to any neighborhood in the given example, you can create a neighborhood named "!General" where you add such ZIP codes. This needs to be done in order to maintain the correct levels in the hierarchy. The logic is expecting to find the ZIP codes always at the deepest level, so if you would add them directly under the boroughs, they would not be considered ZIP codes. - -### Example usage - -Here is a visualization example of how to use the zip-code module to create scopes for New York City: - -```yaml -- name: New York City - code: NY - scope_type: Area - - name: Bronx - code: NY_BRONX - scope_type: Area - Borough - - name: West Bronx - code: NY_BRONX_WEST - scope_type: Area - Neighborhood - - name: 10465 - code: NY_BRONX_WEST_10465 - scope_type: Area - Postal - ``` - -In the example above, we created a scope for New York City with the code NY. Inside the NY scope, we created a scope for the Bronx borough with the code NY_BRONX. Inside the NY_BRONX scope, we created a scope for the West Bronx neighborhood with the code NY_BRONX_WEST. Finally, inside the NY_BRONX_WEST scope, we created a scope for the ZIP code 10465 with the code NY_BRONX_WEST_10465. diff --git a/decidim-budgets_booth/docs/zip-code-workflow.png b/decidim-budgets_booth/docs/zip-code-workflow.png deleted file mode 100644 index c7615371..00000000 Binary files a/decidim-budgets_booth/docs/zip-code-workflow.png and /dev/null differ diff --git a/decidim-budgets_booth/lib/decidim/budgets_booth.rb b/decidim-budgets_booth/lib/decidim/budgets_booth.rb index f01ed2da..72ea59cc 100644 --- a/decidim-budgets_booth/lib/decidim/budgets_booth.rb +++ b/decidim-budgets_booth/lib/decidim/budgets_booth.rb @@ -1,18 +1,13 @@ # frozen_string_literal: true require "decidim/budgets_booth/engine" -require "decidim/budgets_booth/workflows" +# require "decidim/budgets_booth/workflows" module Decidim # This namespace holds the logic of the `BudgetsBooth` component. This component # allows users to create budgets_booth in a participatory space. module BudgetsBooth autoload :VotingSupport, "decidim/budgets_booth/voting_support" - autoload :ScopeManager, "decidim/budgets_booth/scope_manager" include ActiveSupport::Configurable - # Default configuration digits to generate the zip code. - config_accessor :zip_code_length do - 5 - end end end diff --git a/decidim-budgets_booth/lib/decidim/budgets_booth/engine.rb b/decidim-budgets_booth/lib/decidim/budgets_booth/engine.rb index b22966a0..afc9ccfd 100644 --- a/decidim-budgets_booth/lib/decidim/budgets_booth/engine.rb +++ b/decidim-budgets_booth/lib/decidim/budgets_booth/engine.rb @@ -16,16 +16,8 @@ class Engine < ::Rails::Engine # "sms" authentication. Decidim::Budgets::Engine.routes.prepend do resources :budgets do - resources :voting, only: [:index] - - namespace :voting do - resources :projects, only: [:show] - end + resources :projects, only: [:show, :index] resource :order, only: [:show] - - collection do - resources :zip_code, only: [:new, :create], controller: "user_data", path: "user/zip_code" - end end end end @@ -39,6 +31,10 @@ class Engine < ::Rails::Engine Cell::ViewModel.view_paths << File.expand_path("#{Decidim::BudgetsBooth::Engine.root}/app/views") # for partials end + initializer "decidim_budgets_booth.register_icon" do + Decidim.icons.register(name: "envelope-closed", icon: "envelope-closed", category: "system", description: "", engine: :core) + end + initializer "decidim_budgets_booth.add_customizations", after: "decidim.action_controller" do config.to_prepare do # Helper extensions @@ -47,24 +43,10 @@ class Engine < ::Rails::Engine ) # Cells extensions - Decidim::Budgets::ProjectVotedHintCell.include( - Decidim::BudgetsBooth::ProjectVotedHintCellExtensions - ) Decidim::Budgets::ProjectVoteButtonCell.include( Decidim::BudgetsBooth::ProjectVoteButtonCellExtensions ) - Decidim::Budgets::ProjectListItemCell.include( - Decidim::BudgetsBooth::ProjectListItemExtensions - ) - - Decidim::Budgets::BudgetListItemCell.include( - Decidim::BudgetsBooth::BudgetListItemCellExtensions - ) - - Decidim::Budgets::BudgetsHeaderCell.include( - Decidim::BudgetsBooth::BudgetsHeaderCellExtensions - ) Decidim::Budgets::BudgetsListCell.include( Decidim::BudgetsBooth::VotingSupport ) @@ -91,38 +73,6 @@ class Engine < ::Rails::Engine Decidim::Budgets::ProjectsController.include( Decidim::BudgetsBooth::ProjectsControllerExtensions ) - - Decidim::Budgets::LineItemsController.include( - Decidim::BudgetsBooth::LineItemsControllerExtensions - ) - - # Commands extensions - Decidim::Budgets::Admin::CreateBudget.include( - Decidim::BudgetsBooth::CreateBudgetExtensions - ) - - Decidim::Budgets::Admin::UpdateBudget.include( - Decidim::BudgetsBooth::UpdateBudgetExtensions - ) - - # Models extensions - Decidim::Budgets::Budget.include( - Decidim::BudgetsBooth::BudgetExtensions - ) - Decidim::User.include( - Decidim::BudgetsBooth::UserExtensions - ) - Decidim::Component.include( - Decidim::BudgetsBooth::ComponentExtensions - ) - Decidim::Scope.include( - Decidim::BudgetsBooth::ScopeExtensions - ) - - # Forms extensions - Decidim::Budgets::Admin::BudgetForm.include( - Decidim::BudgetsBooth::BudgetFormExtensions - ) end end @@ -133,16 +83,10 @@ class Engine < ::Rails::Engine settings.attribute :maximum_budgets_to_vote_on, type: :integer, default: 0 settings.attribute :vote_success_content, type: :text, translated: true, editor: true settings.attribute :vote_completed_content, type: :text, translated: true, editor: true - settings.attribute :voting_terms, type: :text, translated: true, editor: true settings.attribute :vote_success_url, type: :string settings.attribute :vote_cancel_url, type: :string - settings.attribute :show_full_description_on_listing_page, type: :boolean, default: false end end - - initializer "decidim_budgets.add_zip_code_workflow" do - Decidim::Budgets.workflows[:zip_code] = Decidim::BudgetsBooth::Workflows::ZipCode - end end end end diff --git a/decidim-budgets_booth/lib/decidim/budgets_booth/scope_manager.rb b/decidim-budgets_booth/lib/decidim/budgets_booth/scope_manager.rb deleted file mode 100644 index 64770435..00000000 --- a/decidim-budgets_booth/lib/decidim/budgets_booth/scope_manager.rb +++ /dev/null @@ -1,156 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module BudgetsBooth - class ScopeManager - attr_reader :component, :top_scope - - class << self - # This method allows storing the scopes mappings locally so that they do - # not have to be re-fetched for the multiple instances of the - # ScopeManager class. - def scopes_mapping_for(scope) - scopes_mapping_cache[scope.id] ||= Rails.cache.fetch( - cache_key(scope.cache_key_with_version), - expires_in: 1.hour - ) { generate_scopes_mapping_for(scope) } - end - - # Allow clearing the cache, useful for the specs. - def clear_cache! - scopes_mapping_cache.keys.each do |id| - scope = Decidim::Scope.find(id) - Rails.cache.delete(cache_key(scope.cache_key_with_version)) - rescue ActiveRecord::RecordNotFound - # If the record was not found, cache key cannot be regenerated, so - # deleting the old cache record can be omitted. - end - @scopes_mapping_cache = {} - end - - private - - def cache_key_prefix - "decidim/budgets_booth/scopes_mapping" - end - - def cache_key(key) - "#{cache_key_prefix}/#{key}" - end - - # Stores the local cache of the scopes mappings. - def scopes_mapping_cache - @scopes_mapping_cache ||= {} - end - - # Generates the scopes mapping for the given top-level scope. - def generate_scopes_mapping_for(scope) - locale = scope.organization.default_locale - table = Decidim::Scope.table_name - connection = ActiveRecord::Base.connection - columns = "id, parent_id, code, name->>#{connection.quote(locale)} AS name" - topquery = "SELECT %columns% FROM #{table} WHERE parent_id = #{connection.quote(scope.id)}" - queries = [] - - # Maximum of 3 levels below the top scope: - # Boroughs -> Neighborhoods -> Postal codes - # - # The postal codes are defined at the deepest level regardless of the - # amount of levels. - subquery = topquery - 3.times do |i| - queries << subquery.sub("%columns%", "#{columns}, #{i} AS depth") - subquery = "SELECT %columns% FROM #{table} WHERE parent_id IN (#{subquery.sub("%columns%", "id")})" - end - - # Query all the levels and store the postal code mapping. Note that - # the order by depth is important for the further processing. The - # lowest depth needs to be processed first. - result = connection.select_all("#{queries.join(" UNION ALL ")} ORDER BY depth, name").to_a - - zip_codes_hash(scope, result) - end - - # Converts the multi-level query results into a flat hash which has the - # scope IDs as keys and their related ZIP codes as values. This approach - # allows quickly fetching the ZIP codes for each scope. - def zip_codes_hash(parent_scope, result) - max_depth = result.pluck("depth").max - parents = { parent_scope.id => [] } - - {}.tap do |mapping| - result.each do |item| - if item["depth"] == max_depth - # Postal code - mapping[item["parent_id"]] ||= [] - mapping[item["parent_id"]] << item["name"] - - each_item(parents, item["parent_id"]) do |parent_id| - mapping[parent_id] ||= [] - mapping[parent_id] << item["name"] - end - elsif item["depth"].positive? - parents[item["id"]] ||= [] - parents[item["id"]] << item["parent_id"] unless parents[item["id"]].include?(item["parent_id"]) - - each_item(parents, item["parent_id"]) do |parent_id| - parents[item["id"]] << parent_id unless parents[item["id"]].include?(parent_id) - end - end - end - end - end - - # This is a helper method to reduce the cyclomatic complexity of the - # `zip_codes_hash` method. - def each_item(parents, id) - return unless parents[id] - - parents[id].each { |parent_id| yield parent_id } - end - end - - def initialize(component) - @component = component - @top_scope = component.scope - end - - def zip_codes_for(resource) - return [] unless top_scope - - scope = scope_for(resource) - return [] if scope.blank? - return scopes_mapping.values.flatten.uniq if scope == top_scope - - scopes_mapping[scope.id]&.uniq || [] - end - - def user_zip_code(user) - return nil if user.blank? - - user_data_for(user)["zip_code"] - end - - private - - # Loads the metadata for a specific user from the user data records. If - # the cache clear method has been called after the user data was loaded - # (e.g. the data was deleted or updated at the same process), this will - # reload the data accordingly. - def user_data_for(user) - user_data = user.budgets_user_data.find_by(component: component) - user_data&.metadata || {} - end - - def scope_for(resource) - return resource if resource.is_a?(Decidim::Scope) - - resource.scope - end - - def scopes_mapping - self.class.scopes_mapping_for(top_scope) - end - end - end -end diff --git a/decidim-budgets_booth/lib/decidim/budgets_booth/version.rb b/decidim-budgets_booth/lib/decidim/budgets_booth/version.rb index 7907af88..9523d40c 100644 --- a/decidim-budgets_booth/lib/decidim/budgets_booth/version.rb +++ b/decidim-budgets_booth/lib/decidim/budgets_booth/version.rb @@ -4,11 +4,11 @@ module Decidim # This holds the decidim-meetings version. module BudgetsBooth def self.decidim_version - "~> 0.27.0" + "~> 0.29.0" end def self.version - "0.27.0" + "0.29.0" end end end diff --git a/decidim-budgets_booth/lib/decidim/budgets_booth/voting_support.rb b/decidim-budgets_booth/lib/decidim/budgets_booth/voting_support.rb index 2831c12d..c58ffe4e 100644 --- a/decidim-budgets_booth/lib/decidim/budgets_booth/voting_support.rb +++ b/decidim-budgets_booth/lib/decidim/budgets_booth/voting_support.rb @@ -9,64 +9,21 @@ def voting_booth_forced? current_workflow.try(:voting_booth_forced?) end - def voting_enabled? - current_component.current_settings.votes == "enabled" - end - - def ensure_authenticated - return true if current_user - - flash[:warning] = t("login_before_access", scope: "decidim.budgets.budgets.index") - redirect_to decidim.new_user_session_path - end - - def ensure_user_zip_code - return true if current_user.try(:budgets_user_data).present? - - redirect_to decidim_budgets.new_zip_code_path - end - - def ensure_multiple_budgets - budget = budgets.first - return true if budgets.count > 1 || budgets.count.zero? - - return redirect_to decidim_budgets.budget_voting_index_path(budget) if voting_booth_forced? - - redirect_to decidim_budgets.budget_projects_path(budget) - end - def decidim_budgets @decidim_budgets ||= Decidim::EngineRouter.main_proxy(current_component) end - def voted_any? - current_user && voted.any? - end - def status(budget) @status ||= current_workflow.status(budget) end - def ensure_voting_booth_forced - return true if voting_booth_forced? - - flash[:warning] = t("not_allowed", scope: "decidim.budgets.budgets.index") - redirect_to decidim.root_path - end - - def ensure_not_voted - return true unless voted_any? - - flash[:warning] = t("change_zip_code_after_vote", scope: "decidim.budgets.user_data.new") - redirect_to decidim.root_path - end - # maximum_budgets_to_vote_on is being set by the admin. the default is zero, which means users can - # vote in all available budgets. to check that user has voted to all available budgets, we should - # consider this settings as well. + # vote in all available budgets. To check that user has voted to all available budgets, we should + # consider this settings as well. If budget component workflow is random or one, available budgets + # will be equal to 1 def voted_all_budgets? default_limit = current_component.settings.maximum_budgets_to_vote_on || 0 - available_budgets = budgets.count + available_budgets = %w(random one).include?(current_component.settings.workflow) ? 1 : budgets.count vote_limit = if default_limit.zero? available_budgets else @@ -76,30 +33,20 @@ def voted_all_budgets? voted.count >= vote_limit end - # This configuration option can be set in component settings, the dfault url when the user has voted on all budgets + # This configuration option can be set in component settings, the default url when the user has voted on all budgets # is budgets path def success_redirect_path - component_settings.try(:vote_success_url).presence || decidim_budgets.budgets_path + if budgets.count == 1 && component_settings.try(:vote_success_url).blank? + decidim_participatory_processes.participatory_process_path(current_component.participatory_space) + else + component_settings.try(:vote_success_url).presence || decidim_budgets.budgets_path + end end - # This configuration option can be set in component settings, the dfault url when the user cancels voting is the root path. + # This configuration option can be set in component settings, the default url when the user cancels voting is the root path. def cancel_redirect_path component_settings.try(:vote_cancel_url).presence || decidim.root_path end - - def hide_unvoted?(budget) - return false unless voting_open? - - return false if voted_this?(budget) - - return false unless voted_all_budgets? - - true - end - - def voted_this?(budget) - current_workflow.status(budget) == :voted - end end end end diff --git a/decidim-budgets_booth/lib/decidim/budgets_booth/workflows.rb b/decidim-budgets_booth/lib/decidim/budgets_booth/workflows.rb deleted file mode 100644 index 004d1a75..00000000 --- a/decidim-budgets_booth/lib/decidim/budgets_booth/workflows.rb +++ /dev/null @@ -1,3 +0,0 @@ -# frozen_string_literal: true - -require_relative "workflows/zip_code" diff --git a/decidim-budgets_booth/lib/decidim/budgets_booth/workflows/zip_code.rb b/decidim-budgets_booth/lib/decidim/budgets_booth/workflows/zip_code.rb deleted file mode 100644 index 8ef18c3f..00000000 --- a/decidim-budgets_booth/lib/decidim/budgets_booth/workflows/zip_code.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module BudgetsBooth - module Workflows - # This is the zip_code Workflow class. - class ZipCode < ::Decidim::Budgets::Workflows::Base - # No budget is highlighted for this workflow - def highlighted?(_resource) - false - end - - def disable_voting_instructions? - true - end - - def hide_image_in_popup? - true - end - - # User can vote in the resource inside their area where they live. This is being determined - # by their zip code. - def vote_allowed?(resource, consider_progress: true) # rubocop:disable Lint/UnusedMethodArgument - return false if user_zip_code.blank? - - scope_manager.zip_codes_for(resource).include?(user_zip_code) - end - - def budgets - super.select { |item| vote_allowed?(item) } - end - - def voting_booth_forced? - true - end - - def user_zip_code - @user_zip_code ||= scope_manager.user_zip_code(user) - end - - private - - def scope_manager - @scope_manager ||= ::Decidim::BudgetsBooth::ScopeManager.new(budgets_component) - end - - def projects(budget) - Decidim::Budgets::Project.where(budget: budget) - end - end - end - end -end diff --git a/decidim-budgets_booth/spec/cells/decidim/budgets/project_g_cell_spec.rb b/decidim-budgets_booth/spec/cells/decidim/budgets/project_g_cell_spec.rb new file mode 100644 index 00000000..51a16f72 --- /dev/null +++ b/decidim-budgets_booth/spec/cells/decidim/budgets/project_g_cell_spec.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require "spec_helper" + +module Decidim::Budgets + describe ProjectGCell, type: :cell do + controller Decidim::Budgets::ProjectsController + + subject(:cell_html) { my_cell.call } + + let(:my_cell) { cell("decidim/budgets/project_g", project, card_size: :g) } + let!(:organization) { create(:organization) } + let!(:budgets_component) { create(:budgets_component, organization:) } + let(:budget) { create(:budget, component: budgets_component) } + let(:slug) { budgets_component.participatory_space.slug } + let(:process_id) { budgets_component.participatory_space.id } + let!(:project) { create(:project, budget:, component: budgets_component) } + + before do + allow(controller).to receive(:current_component).and_return(budgets_component) + # avoid rendering project_vote_button that we don't test here + allow(my_cell).to receive(:cell).and_return("") + end + + describe "show" do + it "renders the project item with appropriate id" do + expect(subject).to have_css("#project-#{project.id}-item") + end + + it "renders the project title" do + expect(subject.text).to include(translated_attribute(project.title)) + end + + context "when the project has an image" do + let!(:attachment) { create(:attachment, attached_to: project) } + + it "renders the project with an image" do + expect(subject).to have_css("img[src*='city']") + end + end + + context "when the project has no image" do + before { allow(project).to receive(:attachments).and_return([]) } + + it "renders the project without image" do + expect(subject).not_to have_css("img") + end + end + end + end +end diff --git a/decidim-budgets_booth/spec/cells/decidim/budgets_booth/project_voted_hint_cell_extensions_spec.rb b/decidim-budgets_booth/spec/cells/decidim/budgets_booth/project_voted_hint_cell_extensions_spec.rb deleted file mode 100644 index bfab40d2..00000000 --- a/decidim-budgets_booth/spec/cells/decidim/budgets_booth/project_voted_hint_cell_extensions_spec.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::BudgetsBooth::ProjectVotedHintCellExtensions do - let(:klass) do - Class.new do - include Decidim::BudgetsBooth::ProjectVotedHintCellExtensions - end - end - - before do - allow_any_instance_of(klass).to receive(:options).and_return(options) # rubocop:disable RSpec/AnyInstance - end - - describe "#css_class" do - context "when options[:class] is not present" do - let(:options) do - { class: nil } - end - - it "returns a string containing 'text-success'" do - expect(klass.new.css_class).to eq("text-success text-sm") - end - end - - context "when options[:class] is present" do - let(:options) do - { class: "my-class" } - end - - it "returns a string containing 'text-success'" do - expect(klass.new.css_class).to eq("text-success my-class text-sm") - end - end - - context "when options[:class] includes 'text-m'" do - let(:options) do - { class: "text-m" } - end - - it "does not add 'text-sm' to the returned string" do - expect(klass.new.css_class).to eq("text-success text-m") - end - end - end -end diff --git a/decidim-budgets_booth/spec/commands/decidim/budgets/admin/create_budget_spec.rb b/decidim-budgets_booth/spec/commands/decidim/budgets/admin/create_budget_spec.rb deleted file mode 100644 index d80d2e2a..00000000 --- a/decidim-budgets_booth/spec/commands/decidim/budgets/admin/create_budget_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::Budgets::Admin::CreateBudget do - include ::Decidim::BudgetsBooth::CreateBudgetExtensions - subject { described_class.new(form) } - - let(:organization) { create :organization, available_locales: [:en, :ca, :es], default_locale: :en } - let(:participatory_process) { create :participatory_process, organization: organization } - let!(:current_component) { create :component, participatory_space: participatory_process, manifest_name: "budgets" } - let(:user) { create :user, :admin, :confirmed, organization: organization } - let(:scope) { create :scope, organization: organization } - let(:main_image) do - ActiveStorage::Blob.create_and_upload!( - io: File.open(Decidim::Dev.asset("city.jpeg")), - filename: "city.jpeg", - content_type: "image/jpeg" - ) - end - - let(:form) do - double( - invalid?: invalid, - weight: 0, - title: { en: "title" }, - description: { en: "description" }, - total_budget: 100_000_000, - scope: scope, - current_user: user, - main_image: main_image, - current_component: current_component, - current_organization: organization - ) - end - - let(:invalid) { false } - - let(:budget) { Decidim::Budgets::Budget.last } - - context "when image is attached" do - it "adds main image to the budget" do - subject.call - expect(budget.main_image.blob).to be_a(ActiveStorage::Blob) - end - end - - context "when image is not attached" do - let(:main_image) { nil } - - it "does not add main image to the budget" do - subject.call - expect(budget.main_image.blob).to be_nil - end - end -end diff --git a/decidim-budgets_booth/spec/commands/decidim/budgets/admin/update_budget_spec.rb b/decidim-budgets_booth/spec/commands/decidim/budgets/admin/update_budget_spec.rb deleted file mode 100644 index f900088a..00000000 --- a/decidim-budgets_booth/spec/commands/decidim/budgets/admin/update_budget_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::Budgets::Admin::UpdateBudget do - include ::Decidim::BudgetsBooth::UpdateBudgetExtensions - subject { described_class.new(form, budget) } - - let(:budget) { create :budget } - let(:scope) { create :scope, organization: budget.organization } - let(:user) { create :user, :admin, :confirmed, organization: budget.organization } - let(:main_image) do - ActiveStorage::Blob.create_and_upload!( - io: File.open(Decidim::Dev.asset("city.jpeg")), - filename: "city.jpeg", - content_type: "image/jpeg" - ) - end - - let(:form) do - double( - invalid?: invalid, - weight: 0, - title: { en: "title" }, - description: { en: "description" }, - total_budget: 100_000_000, - scope: scope, - current_user: user, - main_image: main_image, - current_component: budget.component, - current_organization: budget.organization - ) - end - - let(:invalid) { false } - - context "when image is attached" do - it "adds main image to the budget" do - expect(budget.main_image.blob).to be_nil - subject.call - expect(budget.main_image.blob).to be_a(ActiveStorage::Blob) - end - end - - context "when image is not attached" do - let(:main_image) { nil } - - it "does not add main image to the budget" do - subject.call - expect(budget.main_image.blob).to be_nil - end - end -end diff --git a/decidim-budgets_booth/spec/commands/decidim/budgets/create_user_data_spec.rb b/decidim-budgets_booth/spec/commands/decidim/budgets/create_user_data_spec.rb deleted file mode 100644 index 55c8352b..00000000 --- a/decidim-budgets_booth/spec/commands/decidim/budgets/create_user_data_spec.rb +++ /dev/null @@ -1,70 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Budgets - describe CreateUserData do - subject { described_class.new(form, zip_codes) } - - let(:user) { create(:user, :confirmed, organization: component.organization) } - let(:affirm_statements_are_correct) { true } - let(:zip_codes) { %w(foo bar baz) } - let(:zip_code) { "" } - let(:component) do - create( - :budgets_component, - settings: { workflow: "zip_code" } - ) - end - - let(:form) do - double( - invalid?: invalid?, - user: user, - zip_code: zip_code, - affirm_statements_are_correct: affirm_statements_are_correct, - component: component - ) - end - - context "when invalid" do - let(:invalid?) { true } - - it { is_expected.to broadcast(:invalid) } - end - - context "when form is valid" do - let(:invalid?) { false } - - context "when zip code is not included" do - let(:zip_code) { "quox" } - - it { is_expected.to broadcast(:invalid) } - end - - context "when zip code included" do - let(:zip_code) { "baz" } - - context "when user does not exist" do - it "creates the user and broadcasts ok" do - expect { subject.call }.to change(Decidim::Budgets::UserData, :count).by(1) - end - end - - context "when user data exists" do - let!(:user_data) { create(:user_data, component: component, user: user, metadata: { zip_code: "quox" }) } - let(:zip_code) { "foo" } - - it "updates the user data" do - subject.call - user_data = Decidim::Budgets::UserData.last - expect(Decidim::Budgets::UserData.count).to eq(1) - expect(user_data.metadata["zip_code"]).to eq("foo") - end - end - end - end - end - end -end diff --git a/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/budgets_controller_extensions_spec.rb b/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/budgets_controller_extensions_spec.rb index 646319f4..35b92bab 100644 --- a/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/budgets_controller_extensions_spec.rb +++ b/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/budgets_controller_extensions_spec.rb @@ -12,27 +12,10 @@ module BudgetsBooth describe "#index" do routes { Decidim::Budgets::Engine.routes } - let(:user) { create(:user, :confirmed, organization: organization) } let(:organization) { create(:organization) } - let(:component) { create(:budgets_component, settings: component_settings, organization: organization) } - let(:component_settings_base) { { scopes_enabled: true, scope_id: parent_scope.id } } - let(:component_settings) { component_settings_base.merge(workflow: "zip_code", votes: "enabled") } - let(:parent_scope) { create(:scope, organization: organization) } - let!(:subscopes) do - [].tap do |scopes| - scopes << create(:scope, name: { en: "123456" }, parent: parent_scope, organization: organization) - scopes << create(:scope, name: { en: "789012" }, parent: parent_scope, organization: organization) - scopes << create(:scope, name: { en: "345678" }, parent: parent_scope, organization: organization) - end - end - let!(:budgets) do - [].tap do |list| - list << create(:budget, component: component, scope: subscopes[0]) - list << create(:budget, component: component, scope: subscopes[1]) - list << create(:budget, component: component, scope: subscopes[2]) - end - end + let(:component) { create(:budgets_component, organization:, settings: component_settings) } let(:decidim_budgets) { Decidim::EngineRouter.main_proxy(component) } + let(:component_settings) { { votes: "enabled" } } before do request.env["decidim.current_organization"] = organization @@ -40,60 +23,54 @@ module BudgetsBooth request.env["decidim.current_component"] = component end - context "when zip_code workflow" do - context "when voting enabled" do - context "when not logged in" do - it "redirects to the login page" do - get :index - expect(response).to redirect_to("/users/sign_in") - end - end + context "when there is one budget and voting is enabled " do + let(:budget) { create(:budget, component:)} + let!(:projects) { create_list(:project, 2, budget:)} - context "when user data is not set" do - before do - sign_in user, scope: :user - end + context "when voting enabled and budget component has annoucement" do + let(:component_settings) { { votes: "enabled", announcement: { en: "annoucement" } } } - it "redirects to the zip code" do - get :index - expect(response).to redirect_to(decidim_budgets.new_zip_code_path) - end + it "renders index with budgets_booth application layout" do + get :index + expect(response).to render_template(:index, layout: "decidim/budgets/application") end + end - context "when user data is set" do - let!(:user_data) { create(:user_data, component: component, user: user, metadata: { zip_code: "123456" }) } - - before do - sign_in user, scope: :user - end + context "when voting enabled and budget component has no annoucement" do + let(:component_settings) { { votes: "enabled" } } - it "renders index with booth layout" do - get :index - expect(response).to render_template(:index, layout: "decidim/budgets/voting_layout") - end + it "redirects to projects index" do + get :index + expect(response).to redirect_to(budget_projects_path(budget)) end end + end - context "when voting is not enabled" do - before do - component.update(settings: component_settings_base.merge(votes: "finished")) + context "when there are multiple budgets" do + let!(:budgets) do + [].tap do |list| + list << create(:budget, component:) + list << create(:budget, component:) + list << create(:budget, component:) end + end - it "does not render the layout" do + context "when voting enabled" do + it "renders index with budgets_booth application layout" do get :index - expect(response).to render_template(:index, layout: "layouts/decidim/participatory_process") + expect(response).to render_template(:index, layout: "layouts/decidim/application") end end - end - context "when not zip_code workflow" do - before do - component.update(settings: component_settings_base.merge(workflow: "one")) - end + context "when voting is not enabled" do + before do + component.update(settings: component_settings.merge(votes: "finished")) + end - it "renders the index" do - get :index - expect(response).to render_template(:index, layout: "layouts/decidim/participatory_process") + it "renders index with budgets_booth voting_layout" do + get :index + expect(response).to render_template(:index, layout: "decidim/budgets/voting_layout") + end end end end diff --git a/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/orders_controller_extensions_spec.rb b/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/orders_controller_extensions_spec.rb index 0839674c..e0715eb7 100644 --- a/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/orders_controller_extensions_spec.rb +++ b/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/orders_controller_extensions_spec.rb @@ -9,74 +9,126 @@ routes { Decidim::Budgets::Engine.routes } - include_context "with scoped budgets" - - let(:user) { create(:user, :confirmed, organization: organization) } - let(:component) { create(:budgets_component, settings: component_settings.merge(workflow: "zip_code"), organization: organization) } + let(:user) { create(:user, :confirmed, organization:) } + let(:component) { create(:budgets_component, organization:) } let(:projects_count) { 5 } - let!(:budgets) { create_list(:budget, 3, component: component, total_budget: 100_000_000) } - let(:decidim_budgets) { Decidim::EngineRouter.main_proxy(component) } - let(:projects) { create_list(:project, 3, budget: budgets.first, budget_amount: 75_000_000) } - let!(:user_data) { create(:user_data, component: component, user: user, metadata: { zip_code: "10004" }) } - let!(:order) { create(:order, user: user, budget: budgets.first) } - - before do - request.env["decidim.current_organization"] = organization - request.env["decidim.current_user"] = user - request.env["decidim.current_participatory_space"] = component.participatory_space - request.env["decidim.current_component"] = component - order.projects << projects.first - order.save! - allow(controller).to receive(:budget).and_return(budgets.first) - allow(controller).to receive(:current_user).and_return(user) - end - describe "#checkout" do - context "when command call returns ok" do - it "sets thanks session and redirects the user" do - post :checkout, params: { budget_id: budgets.first.id, component_id: component.id, participatory_process_slug: component.participatory_space.slug } - expect(response).to redirect_to(decidim_budgets.budgets_path) - expect(session[:booth_thanks_message]).to be(true) + describe "when there are multiple budgets" do + include_context "with scoped budgets" + + let!(:budgets) { create_list(:budget, 3, component:, total_budget: 100_000_000) } + let(:decidim_budgets) { Decidim::EngineRouter.main_proxy(component) } + let(:projects) { create_list(:project, 3, budget: budgets.first, budget_amount: 75_000_000) } + let!(:order) { create(:order, user:, budget: budgets.first) } + + before do + request.env["decidim.current_organization"] = organization + request.env["decidim.current_user"] = user + request.env["decidim.current_participatory_space"] = component.participatory_space + request.env["decidim.current_component"] = component + order.projects << projects.first + order.save! + allow(controller).to receive_messages(budget: budgets.first, current_user: user) + end + + describe "#checkout" do + context "when command call returns ok" do + before do + component.update!(settings: { workflow: "all" }) + end + + context "and there are several budgets" do + it "sets thanks session and redirects the user to budgets_path" do + post :checkout, params: { budget_id: budgets.first.id, component_id: component.id, participatory_process_slug: component.participatory_space.slug } + expect(session[:booth_thanks_message]).to be(true) + expect(response).to redirect_to(decidim_budgets.budgets_path) + end + + it "enqueues job" do + expect do + post :checkout, params: { budget_id: budgets.first.id, component_id: component.id, participatory_process_slug: component.participatory_space.slug } + end.to have_enqueued_job(Decidim::EventPublisherJob) + end + end end - it "enqueues job" do - expect do + context "when invalid" do + before do + # make order invalid + projects.first.update!(budget_amount: 25_000_000) + end + + it "redirects the user with flash message" do post :checkout, params: { budget_id: budgets.first.id, component_id: component.id, participatory_process_slug: component.participatory_space.slug } - end.to have_enqueued_job(Decidim::EventPublisherJob) + expect(response).to redirect_to(decidim_budgets.budgets_path) + expect(flash[:alert]).to have_content("There was a problem processing your vote") + end end end - context "when invalid" do - before do - # make order invalid - projects.first.update!(budget_amount: 25_000_000) + describe "#show" do + context "when order does not exist" do + it "renders error" do + expect do + get :show, params: { budget_id: budgets.first.id, component_id: component.id, participatory_process_slug: component.participatory_space.slug } + end.to raise_error(ActionController::RoutingError) + end end - it "redirects the user with flash message" do - post :checkout, params: { budget_id: budgets.first.id, component_id: component.id, participatory_process_slug: component.participatory_space.slug } - expect(response).to redirect_to(decidim_budgets.budgets_path) - expect(flash[:alert]).to have_content("There was a problem processing your vote") - end - end - end + context "when order exists" do + before do + order.update!(checked_out_at: Time.current) + end - describe "#show" do - context "when order does not exist" do - it "renders error" do - expect do + it "redirects the html requests" do get :show, params: { budget_id: budgets.first.id, component_id: component.id, participatory_process_slug: component.participatory_space.slug } - end.to raise_error(ActionController::RoutingError) + expect(response).to redirect_to(decidim_budgets.budgets_path) + end end end + end - context "when order exists" do - before do - order.update!(checked_out_at: Time.current) - end + describe "when there is one budget" do + include_context "with single scoped budget" + + describe "#checkout" do + context "and there is one budget" do + let(:decidim_participatory_processes) { Decidim::EngineRouter.main_proxy(component.participatory_space) } + let!(:order) { create(:order, user:, budget:) } + + before do + request.env["decidim.current_organization"] = organization + request.env["decidim.current_user"] = user + request.env["decidim.current_participatory_space"] = component.participatory_space + request.env["decidim.current_component"] = component + projects_set.first.update!(budget_amount: 70_000) + order.projects << projects_set.first + order.save! + allow(controller).to receive_messages(budget:, current_user: user) + end + + it "enqueues job" do + expect do + post :checkout, params: { budget_id: budget.id, component_id: component.id, participatory_process_slug: component.participatory_space.slug } + end.to have_enqueued_job(Decidim::EventPublisherJob) + end + + context "and vote_success_url is not defined" do + it "sets thanks session and redirects the user to process_path" do + post :checkout, params: { budget_id: budget.id, component_id: component.id, participatory_process_slug: component.participatory_space.slug } + expect(session[:booth_vote_completed]).to be(true) + expect(response).to redirect_to(decidim_participatory_processes.participatory_process_path(component.participatory_space)) + end + end - it "redirects the html requests" do - get :show, params: { budget_id: budgets.first.id, component_id: component.id, participatory_process_slug: component.participatory_space.slug } - expect(response).to redirect_to(decidim_budgets.budgets_path) + context "and vote_success_url is defined" do + it "sets thanks session and redirects the user to vote_success_url" do + component.update!(settings: { vote_success_url: "/processes" }) + post :checkout, params: { budget_id: budget.id, component_id: component.id, participatory_process_slug: component.participatory_space.slug } + expect(session[:booth_vote_completed]).to be(true) + expect(response).to redirect_to(decidim_participatory_processes.participatory_processes_path) + end + end end end end diff --git a/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/projects_controller_extensions_spec.rb b/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/projects_controller_extensions_spec.rb index d96ad4d9..167eecae 100644 --- a/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/projects_controller_extensions_spec.rb +++ b/decidim-budgets_booth/spec/controllers/concerns/decidim/budgets_booth/projects_controller_extensions_spec.rb @@ -12,23 +12,20 @@ module BudgetsBooth end let(:organization) { create(:organization) } - let(:participatory_space) { create(:participatory_process, :with_steps, organization: organization) } - let(:user) { create(:user, :confirmed, organization: organization) } + let(:participatory_space) { create(:participatory_process, :with_steps, organization:) } + let(:user) { create(:user, :confirmed, organization:) } let(:component) do create( :budgets_component, - settings: component_settings, - step_settings: step_settings, - participatory_space: participatory_space, - organization: organization + step_settings:, + participatory_space:, + organization: ) end - let(:parent_scope) { create(:scope, organization: organization) } - let(:component_settings_base) { { scopes_enabled: true, scope_id: parent_scope.id } } - let(:component_settings) { component_settings_base } - let(:step_settings) { { active_step_id => { votes: votes } } } + let(:parent_scope) { create(:scope, organization:) } + let(:step_settings) { { active_step_id => { votes: } } } let(:active_step_id) { participatory_space.active_step.id } - let!(:budgets) { create_list(:budget, 3, component: component) } + let!(:budgets) { create_list(:budget, 3, component:) } let(:project) { create(:project, budget: budgets.last) } let(:votes) { "enabled" } let(:decidim_budgets) { Decidim::EngineRouter.main_proxy(component) } @@ -40,99 +37,43 @@ module BudgetsBooth end describe "#index" do - context "when zip_code workflow" do - let(:component_settings) { component_settings_base.merge(workflow: "zip_code") } - - context "when voting enabled" do - context "when not voted all budgets" do - before do - allow(controller).to receive(:voted_this?).and_return(false) - end - - it "raises error" do - expect do - get :index, params: { budget_id: budgets.last.id } - end.to raise_error(ActionController::RoutingError, "Not Found") - end - end - - context "when voted that budget" do - before do - allow(controller).to receive(:voted_this?).and_return(true) - end - - it "does not raise error" do - get :index, params: { budget_id: budgets.last.id } - expect(response).to render_template(:index) - end - end - end - - context "when voting is disabled" do - let(:votes) { "disabled" } - - it "renders projects index" do - get :index, params: { budget_id: budgets.last.id } - expect(response).to render_template(:index) - end + context "when budget" do + it "renders index" do + get :index, params: { budget_id: budgets.last.id } + expect(response).to render_template(:index) end end - context "when not zip code workflow" do - let(:component_settings) { component_settings_base.merge(workflow: "one") } - - it "renders the index template" do - get :index, params: { budget_id: budgets.last.id } - expect(response).to render_template(:index) + context "when no budget" do + it "raises error" do + expect do + get :index, params: { budget_id: nil } + end.to raise_error(ActionController::RoutingError, "Not Found") end end end describe "#show" do - context "when zip_code workflow" do - let(:component_settings) { component_settings_base.merge(workflow: "zip_code") } - - context "when voting enabled" do - context "when not voted that budget" do - before do - allow(controller).to receive(:voted_this?).and_return(false) - end - - it "raises error" do - expect do - get :show, params: { id: project.id, budget_id: budgets.last.id } - end.to raise_error(ActionController::RoutingError, "Not Found") - end - end - - context "when voted that budget" do - before do - allow(controller).to receive(:voted_this?).and_return(true) - end - - it "does not raise error" do - get :show, params: { id: project.id, budget_id: budgets.last.id } - expect(response).to render_template(:show) - end - end + context "when budget and project" do + it "renders show" do + get :show, params: { id: project.id, budget_id: budgets.last.id } + expect(response).to render_template(:show) end + end - context "when voting is disabled" do - let!(:votes) { "disabled" } - - it "renders projects index" do - get :show, params: { id: project.id, budget_id: budgets.last.id } - expect(response).to render_template(:show) - end + context "when budget and no project" do + it "raises error" do + expect do + get :show, params: { id: 1_000_000, budget_id: budgets.last.id } + end.to raise_error(ActionController::RoutingError, "Not Found") end end - context "when not zip code workflow" do - let(:component_settings) { component_settings_base.merge(workflow: "one") } - - it "renders the index template" do - get :show, params: { id: project.id, budget_id: budgets.last.id } - expect(response).to render_template(:show) + context "when no budget and project" do + it "raises error" do + expect do + get :show, params: { id: project.id, budget_id: nil } + end.to raise_error(ActionController::RoutingError, "Not Found") end end end diff --git a/decidim-budgets_booth/spec/controllers/decidim/budgets/user_data_controller_spec.rb b/decidim-budgets_booth/spec/controllers/decidim/budgets/user_data_controller_spec.rb deleted file mode 100644 index 38c1a832..00000000 --- a/decidim-budgets_booth/spec/controllers/decidim/budgets/user_data_controller_spec.rb +++ /dev/null @@ -1,88 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Budgets - describe UserDataController, type: :controller do - routes { Decidim::Budgets::Engine.routes } - - include_context "with scoped budgets" - - let(:projects_count) { 5 } - let(:user) { create(:user, :confirmed, organization: organization) } - let(:decidim_budgets) { Decidim::EngineRouter.main_proxy(component) } - let(:votes) { "enabled" } - - before do - request.env["decidim.current_organization"] = organization - request.env["decidim.current_participatory_space"] = component.participatory_space - request.env["decidim.current_component"] = component - end - - context "when not zip_code workflow" do - it "redirects the user with error message" do - get :new - expect(response).to redirect_to("/") - expect(flash[:warning]).to have_content("You are not allowed to perform this action.") - end - end - - context "when zip code workflow" do - let(:active_step_id) { component.participatory_space.active_step.id } - - before do - component.update!(settings: component_settings.merge(workflow: "zip_code"), step_settings: { active_step_id => { votes: votes } }) - end - - context "when not authenticated" do - it "redirects to the login page" do - get :new - expect(response).to redirect_to("/users/sign_in") - end - end - - context "when voted" do - let!(:order) { create(:order, :with_projects, user: user, budget: budgets.first) } - let!(:user_data) { create(:user_data, component: component, user: user, metadata: { zip_code: "10004" }) } - - before do - order.update!(checked_out_at: Time.current) - sign_in user, scope: :user - end - - it "redirects to the root path" do - get :new - expect(response).to redirect_to("/") - expect(flash[:warning]).to have_content("You can not change your ZIP code after started voting. Delete all of your votes first.") - end - end - - context "when voting not open" do - let(:votes) { "finished" } - - before do - sign_in user, scope: :user - end - - it "redirects to the root path with warning" do - get :new - expect(response).to redirect_to("/") - expect(flash[:warning]).to have_content("You can not set your ZIP code when the voting is not open.") - end - end - - context "when zip code workflow, voting open, not voted, and login" do - before do - sign_in user, scope: :user - end - - it "renders new page with voting layout" do - get :new - expect(response).to render_template(:new, layout: "decidim/budgets/voting_layout") - end - end - end - end - end -end diff --git a/decidim-budgets_booth/spec/controllers/decidim/budgets/voting_controller_spec.rb b/decidim-budgets_booth/spec/controllers/decidim/budgets/voting_controller_spec.rb deleted file mode 100644 index aee92c0d..00000000 --- a/decidim-budgets_booth/spec/controllers/decidim/budgets/voting_controller_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Budgets - describe VotingController, type: :controller do - routes { Decidim::Budgets::Engine.routes } - - let(:user) { create(:user, :confirmed, organization: component.organization) } - let(:component) do - create( - :budgets_component, - settings: { workflow: "zip_code" } - ) - end - let(:vote) { "enabled" } - let(:current_settings) { double(:current_settings, votes: vote) } - let!(:budgets) { create_list(:budget, 3, component: component, total_budget: 100_000_000) } - let(:decidim_budgets) { Decidim::EngineRouter.main_proxy(component) } - let(:projects) { create_list(:project, 3, budget: budgets.first, budget_amount: 45_000_000) } - let(:current_workflow) { double(:current_workflow, voting_booth_forced?: zip_code?) } - let(:zip_code?) { true } - - before do - request.env["decidim.current_organization"] = component.organization - request.env["decidim.current_participatory_space"] = component.participatory_space - request.env["decidim.current_component"] = component - allow(controller).to receive(:current_settings).and_return(current_settings) - allow(controller).to receive(:current_workflow).and_return(current_workflow) - end - - describe "#index" do - context "when voting is not open" do - let!(:vote) { "foo" } - - it "redirects the user with proper message" do - get :index, params: { budget_id: budgets.last.id } - expect(response).to redirect_to(decidim_budgets.budget_projects_path(budgets.last)) - expect(flash[:warning]).to have_content("Voting is not allowed.") - end - end - - context "when not singed in" do - it "redirects to the sign in page" do - get :index, params: { budget_id: budgets.last.id } - expect(response).to redirect_to("/users/sign_in") - end - end - - context "when voted that budget" do - let!(:order) { create(:order, :with_projects, user: user, budget: budgets.last) } - - before do - order.update!(checked_out_at: Time.current) - sign_in user, scope: :user - end - - it "redirects the user" do - get :index, params: { budget_id: budgets.last.id } - expect(response).to redirect_to("/") - expect(flash[:warning]).to have_content("You are not allowed to perform this action.") - end - end - - context "when all before actions checked" do - before do - allow(controller).to receive(:enforce_permission_to).and_return(true) - sign_in user, scope: :user - end - - it "renders the voting booth" do - get :index, params: { budget_id: budgets.last.id } - expect(response).to render_template(:index, layout: "decidim/budgets/voting_layout") - end - end - end - end - end -end diff --git a/decidim-budgets_booth/spec/factories.rb b/decidim-budgets_booth/spec/factories.rb index 50648265..b347689f 100644 --- a/decidim-budgets_booth/spec/factories.rb +++ b/decidim-budgets_booth/spec/factories.rb @@ -3,4 +3,5 @@ require "decidim/core/test/factories" require "decidim/budgets/test/factories" require "decidim/surveys/test/factories" +require "decidim/proposals/test/factories" require "decidim/budgets_booth/test/factories" diff --git a/decidim-budgets_booth/spec/forms/decidim/budgets/user_data_form_spec.rb b/decidim-budgets_booth/spec/forms/decidim/budgets/user_data_form_spec.rb deleted file mode 100644 index 1a2f23a6..00000000 --- a/decidim-budgets_booth/spec/forms/decidim/budgets/user_data_form_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module Budgets - describe UserDataForm do - subject(:form) { described_class.from_params(attributes) } - - let(:zip_code) { "dummy metadata" } - let(:organization) { create(:organization) } - let(:affirm_statements_are_correct) { true } - let(:user) { create(:user, :confirmed, organization: organization) } - let(:component) { create(:budgets_component) } - - let(:attributes) do - { - zip_code: zip_code, - affirm_statements_are_correct: affirm_statements_are_correct, - user: user, - component: component - } - end - - it { is_expected.to be_valid } - - context "when no user" do - let!(:user) { nil } - - it { is_expected.not_to be_valid } - end - - context "when no component" do - let!(:component) { nil } - - it { is_expected.not_to be_valid } - end - - context "when statement is not affirmed" do - let!(:affirm_statements_are_correct) { false } - - it { is_expected.not_to be_valid } - end - - context "when no metadata" do - let!(:zip_code) { nil } - - it { is_expected.not_to be_valid } - end - end - end -end diff --git a/decidim-budgets_booth/spec/helpers/decidim/budgets_booth/projects_helper_extensions_spec.rb b/decidim-budgets_booth/spec/helpers/decidim/budgets_booth/projects_helper_extensions_spec.rb index 8244fc0e..a4b4dce2 100644 --- a/decidim-budgets_booth/spec/helpers/decidim/budgets_booth/projects_helper_extensions_spec.rb +++ b/decidim-budgets_booth/spec/helpers/decidim/budgets_booth/projects_helper_extensions_spec.rb @@ -3,50 +3,57 @@ require "spec_helper" describe Decidim::BudgetsBooth::ProjectsHelperExtensions, type: :helper do - describe "#current_phase" do - let(:organization) { create(:organization) } - let(:participatory_process) { create(:participatory_process, organization: organization) } - let!(:step1) do - create(:participatory_process_step, - active: true, - end_date: Time.zone.now.to_date, - participatory_process: participatory_process) - end - let!(:step2) do - create(:participatory_process_step, - active: false, - end_date: 1.month.from_now.to_date, - participatory_process: participatory_process) - end + let(:organization) { create(:organization) } + let(:participatory_process) { create(:participatory_process, organization:) } + let!(:step_one) do + create(:participatory_process_step, + active: true, + end_date: Time.zone.now.to_date, + participatory_process:) + end + let!(:step_two) do + create(:participatory_process_step, + active: false, + end_date: 1.month.from_now.to_date, + participatory_process:) + end - before do - allow(helper).to receive(:current_organization).and_return(organization) - allow(helper).to receive(:params).and_return({ participatory_process_slug: participatory_process.slug }) - end + before do + allow(helper).to receive_messages(current_organization: organization, params: { participatory_process_slug: participatory_process.slug }) + end - it "returns the title of the active step in the current participatory process" do - expect(helper.current_phase).to eq(step1.title) - end + describe "#projects_container_class" do + context "when view mode is grid" do + let(:view_mode) { "grid" } - context "when there is no active step in the current participatory process" do - before do - step1.update(active: false) + it "returns the grid class" do + expect(helper.projects_container_class(view_mode)).to eq("card__grid-grid") end + end + + context "when view mode is list" do + let(:view_mode) { "list" } - it "returns nil" do - expect(helper.current_phase).to be_nil + it "returns the list class" do + expect(helper.projects_container_class(view_mode)).to eq("card__list-list") end end + end - context "when the current participatory process cannot be found" do - before do - # rubocop:disable RSpec/AnyInstance - allow_any_instance_of(Decidim::ParticipatoryProcessStep).to receive(:title).and_return(nil) - # rubocop:enable RSpec/AnyInstance + describe "#card_size_for_view_mode" do + context "when view mode is grid" do + let(:view_mode) { "grid" } + + it "returns the grid symbol" do + expect(helper.card_size_for_view_mode(view_mode)).to eq(:g) end + end + + context "when view mode is list" do + let(:view_mode) { "list" } - it "returns nil" do - expect(helper.current_phase).to be_nil + it "returns the list symbol" do + expect(helper.card_size_for_view_mode(view_mode)).to eq(:l) end end end diff --git a/decidim-budgets_booth/spec/i18n_spec.rb b/decidim-budgets_booth/spec/i18n_spec.rb new file mode 100644 index 00000000..2d0fc3a6 --- /dev/null +++ b/decidim-budgets_booth/spec/i18n_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require "i18n/tasks" + +describe "I18n sanity" do + let(:locales) do + ENV["ENFORCED_LOCALES"].presence || "en,fr" + end + + let(:i18n) { I18n::Tasks::BaseTask.new(locales: locales.split(",")) } + let(:missing_keys) { i18n.missing_keys } + let(:unused_keys) { i18n.unused_keys } + let(:non_normalized_paths) { i18n.non_normalized_paths } + let(:inconsistent_interpolations) { i18n.inconsistent_interpolations } + + it "does not have missing keys" do + expect(missing_keys).to be_empty, + "Missing #{missing_keys.leaves.count} i18n keys, please run `ENFORCED_LOCALES=#{locales} bundle exec i18n-tasks missing --locales #{locales}' to show them" + end + + it "does not have unused keys" do + expect(unused_keys).to be_empty, + "#{unused_keys.leaves.count} unused i18n keys, please run `bundle exec i18n-tasks unused --locales #{locales}' to show them" + end + + unless ENV["SKIP_NORMALIZATION"] + it "is normalized" do + error_message = "The following files need to be normalized:\n" \ + "#{non_normalized_paths.map { |path| " #{path}" }.join("\n")}\n" \ + "Please run `bundle exec i18n-tasks normalize --locales #{locales}` to fix them" + + expect(non_normalized_paths).to be_empty, error_message + end + end + + it "does not have inconsistent interpolations" do + error_message = "#{inconsistent_interpolations.leaves.count} i18n keys have inconsistent interpolations.\n" \ + "Please run `bundle exec i18n-tasks check-consistent-interpolations --locales #{locales}` to show them" + expect(inconsistent_interpolations).to be_empty, error_message + end +end diff --git a/decidim-budgets_booth/spec/lib/decidim/budgets_booth/scope_manager_spec.rb b/decidim-budgets_booth/spec/lib/decidim/budgets_booth/scope_manager_spec.rb deleted file mode 100644 index e3c0aa37..00000000 --- a/decidim-budgets_booth/spec/lib/decidim/budgets_booth/scope_manager_spec.rb +++ /dev/null @@ -1,159 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::BudgetsBooth::ScopeManager do - subject { described_class.new(component) } - - let(:organization) { create(:organization) } - let(:component) { create(:budgets_component, settings: component_settings, organization: organization) } - let(:component_settings) { { scopes_enabled: true, scope_id: parent_scope.id } } - - describe "#zip_codes_for" do - include_context "with scopes" - - let!(:first_budget) { create(:budget, component: component, scope: parent_scope) } - let!(:second_budget) { create(:budget, component: component, scope: subscopes.first) } - - it "returns correct zip_codes" do - expect(subject.zip_codes_for(first_budget)).to match_array( - [(10_000..10_004).to_a, (10_010..10_016).to_a, (10_020..10_027).to_a].flatten.map(&:to_s) - ) - expect(subject.zip_codes_for(second_budget)).to match_array((10_000..10_004).to_a.map(&:to_s)) - end - - describe "performance" do - # Disable transactional tests to optimize the query performance and ensure - # consistent results. With transactional queries, there may be fluctuation - # in the query performance. - self.use_transactional_tests = false - - let(:parent_scope) { city } - let!(:city) { create(:scope, organization: organization) } - let!(:boroughs) { create_list(:scope, 10, parent: city, organization: organization) } - let!(:neighborhoods) do - [].tap do |list| - boroughs.each do |parent| - 5.times do - list << create(:scope, parent: parent, organization: organization) - end - end - end - end - - before do - # Create the postal codes for all neighborhoods - neighborhoods.each_with_index do |neighborhood, i| - 20.times do |j| - postal = "#{(i + 1).to_s.rjust(2, "0")}#{j.to_s.rjust(3, "0")}" - create(:scope, code: "#{i}_#{postal}", name: { en: postal }, parent: neighborhood) - end - end - end - - after do - # Because the transactional tests are disabled, we need to manually - # clear the tables after the test. - connection = ActiveRecord::Base.connection - connection.disable_referential_integrity do - connection.tables.each do |table_name| - next if connection.select_value("SELECT COUNT(*) FROM #{table_name}").zero? - - connection.execute("TRUNCATE #{table_name} CASCADE") - end - end - end - - it "performs fairly" do - time_start = Time.zone.now - expect(subject.zip_codes_for(city).count).to eq(1000) - expect(Time.zone.now - time_start).to be < 0.1 - end - end - end - - describe "#user_zip_code" do - let(:parent_scope) { create(:scope, organization: organization) } - - context "when user does not exist" do - it "returns flase" do - expect(subject.user_zip_code(nil)).to be_falsey - end - end - - context "when user exist" do - include_context "with user data" - - let!(:user) { create(:user, organization: organization) } - let!(:another_component) { create(:budgets_component, organization: organization) } - - before do - user_data.update(metadata: { zip_code: "dummy metadata" }) - end - - it "returns the user_data" do - expect(subject.user_zip_code(user)).to eq("dummy metadata") - end - - it "does not return user data for another component" do - expect(described_class.new(another_component).user_zip_code(user)).to be_nil - end - end - - context "with multiple processes or threads", :caching do - # File cache store needed to persist the cache over multiple processes. - let(:file_store) { ActiveSupport::Cache.lookup_store(:file_store, cache_location) } - let(:cache_location) { Rails.root.join("tmp/test-file-cache-store") } - - let(:user) { create(:user, organization: organization) } - let!(:user_data) { create(:user_data, component: component, user: user, metadata: { zip_code: "12345" }) } - - # Disable transactional tests to persist the data over multiple - # processes. - self.use_transactional_tests = false - - before do - # Has to be set in order to use the actual memory store because the - # runtime configuration has been already loaded with the :null_store - # configuration at the testing environment. - allow(Rails).to receive(:cache).and_return(file_store) - Rails.cache.clear - end - - after do - FileUtils.rm_rf(cache_location) - - # Because the transactional tests are disabled, we need to manually - # clear the tables after the test. - connection = ActiveRecord::Base.connection - connection.disable_referential_integrity do - connection.tables.each do |table_name| - next if connection.select_value("SELECT COUNT(*) FROM #{table_name}").zero? - - connection.execute("TRUNCATE #{table_name} CASCADE") - end - end - end - - it "does not persist the state in other processes" do - expect(subject.user_zip_code(user)).to eq("12345") - - pid = Process.fork do - subcomp = Decidim::Component.find(component.id) - subsm = Decidim::BudgetsBooth::ScopeManager.new(subcomp) - expect(subsm.user_zip_code(user)).to eq("12345") - sleep 5 - expect(subsm.user_zip_code(user)).to eq("67890") - end - - # Give enough time for the other process to do the first expectation - sleep(2) - user_data.destroy! - create(:user_data, component: component, user: user, metadata: { zip_code: "67890" }) - - Process.wait(pid) - expect($CHILD_STATUS.exitstatus).to eq(0) - end - end - end -end diff --git a/decidim-budgets_booth/spec/lib/decidim/budgets_booth/voting_support_spec.rb b/decidim-budgets_booth/spec/lib/decidim/budgets_booth/voting_support_spec.rb index 369efb52..26d8349c 100644 --- a/decidim-budgets_booth/spec/lib/decidim/budgets_booth/voting_support_spec.rb +++ b/decidim-budgets_booth/spec/lib/decidim/budgets_booth/voting_support_spec.rb @@ -27,7 +27,7 @@ def current_component end def current_workflow - Decidim::BudgetsBooth::Workflows::ZipCode.new(current_component, current_user) + Decidim::Budgets::Workflows::All.new(current_component, current_user) end def voting_open? @@ -39,56 +39,29 @@ def voting_open? let(:component) do create( :budgets_component, - settings: component_settings.merge(workflow: "zip_code"), - step_settings: step_settings, - organization: organization + settings: component_settings.merge(workflow: "all"), + step_settings:, + organization: ) end - let(:step_settings) { { active_step_id => { votes: votes } } } + let(:step_settings) { { active_step_id => { votes: } } } let(:votes) { "enabled" } let(:active_step_id) { component.participatory_space.active_step.id } - let!(:user) { create(:user, :confirmed, organization: organization) } + let!(:user) { create(:user, :confirmed, organization:) } let(:decidim_budgets) { Decidim::EngineRouter.main_proxy(component) } let(:projects_count) { 5 } let(:projects) { create_list(:project, 3, budget: budgets.first, budget_amount: 75_000) } let(:second_projects) { create_list(:project, 3, budget: budgets.second, budget_amount: 75_000) } - let!(:user_data) { create(:user_data, component: component, user: user, metadata: { zip_code: "10004" }) } - let!(:order) { create(:order, user: user, budget: budgets.first) } - let!(:second_order) { create(:order, user: user, budget: budgets.second) } + let(:third_projects) { create_list(:project, 3, budget: budgets.third, budget_amount: 75_000) } + let!(:order) { create(:order, user:, budget: budgets.first) } + let!(:second_order) { create(:order, user:, budget: budgets.second) } + let!(:third_order) { create(:order, user:, budget: budgets.third) } include_context "with scoped budgets" before do - allow(dummy).to receive(:component).and_return(component) - allow(dummy).to receive(:user).and_return(user) - allow(dummy).to receive(:organization).and_return(organization) - allow(dummy).to receive(:current_settings).and_return(component.current_settings) - end - - describe "#voting_enabled?" do - it "is enabled by default" do - expect(subject).to be_voting_enabled - end - end - - describe "#voted_any?" do - context "when user exist but not voted" do - it "returns flase" do - expect(subject).not_to be_voted_any - end - end - - context "when voted" do - before do - order.projects << projects.first - order.checked_out_at = Time.current - order.save! - end - - it "returns true" do - expect(subject.voted_any?).to be(true) - end - end + component.update!(settings: component_settings.merge(workflow: "all")) + allow(dummy).to receive_messages(component:, user:, organization:, current_settings: component.current_settings) end describe "#voted_all_budgets?" do @@ -103,10 +76,11 @@ def voting_open? end end - context "when voted all of the busgets" do + context "when voted all of the budgets" do before do vote_this(order, projects.first) vote_this(second_order, second_projects.first) + vote_this(third_order, third_projects.first) end it "returns true" do @@ -118,7 +92,7 @@ def voting_open? context "when maximum_budgets_to_vote_on is set" do context "when voted the limit" do before do - component.update!(settings: component_settings.merge(workflow: "zip_code", maximum_budgets_to_vote_on: 1)) + component.update!(settings: component_settings.merge(maximum_budgets_to_vote_on: 1)) vote_this(order, projects.first) end @@ -129,46 +103,50 @@ def voting_open? end end - describe "#hide_unvoted?" do - context "when maximum_budgets_to_vote_on is not set" do + describe "#success_redirect_path" do + context "when vote_succes_url is defined" do before do - vote_this(order, projects.first) + component.update!(settings: component_settings.merge(vote_success_url: "http://budget.org")) + allow(dummy).to receive(:component_settings).and_return(component.settings) end - it "does not hide any budgets" do - expect(subject.hide_unvoted?(budgets.first)).to be(false) - expect(subject.hide_unvoted?(budgets.second)).to be(false) + it "returns vote_success_url" do + expect(subject.success_redirect_path).to eq(component.settings.vote_success_url) end end - context "when maximum_budgets_to_vote_on is set" do + context "when vote_succes_url is not defined" do before do - component.update(settings: component_settings.merge(workflow: "zip_code", maximum_budgets_to_vote_on: 1)) - vote_this(order, projects.first) + component.update!(settings: component_settings.merge(vote_success_url: nil)) + allow(dummy).to receive(:component_settings).and_return(component.settings) end - it "does not hide voted budgets" do - expect(subject.hide_unvoted?(budgets.first)).to be(false) + it "returns budgets_path" do + expect(subject.success_redirect_path).to eq(Decidim::EngineRouter.main_proxy(component).budgets_path) end + end + end - it "hides unvoted budgets" do - expect(subject.hide_unvoted?(budgets.second)).to be(true) + describe "#cancel_redirect_path" do + context "when vote_cancel_url is defined" do + before do + component.update!(settings: component_settings.merge(vote_cancel_url: "http://budget.org")) + allow(dummy).to receive(:component_settings).and_return(component.settings) end - end - context "when voting is not open" do - let(:votes) { "disabled" } + it "returns vote_cancel_url" do + expect(subject.cancel_redirect_path).to eq(component.settings.vote_cancel_url) + end + end + context "when vote_cancel_url is not defined" do before do - component.update!(settings: component_settings.merge(workflow: "zip_code", maximum_budgets_to_vote_on: 1), step_settings: step_settings) - vote_this(order, projects.first) - - allow(dummy).to receive(:current_settings).and_return(component.current_settings) + component.update!(settings: component_settings.merge(vote_cancel_url: nil)) + allow(dummy).to receive_messages(component_settings: component.settings, decidim: Decidim::EngineRouter.main_proxy(component)) end - it "does not hide unvoted budgets, even when the maximum is reached" do - expect(subject.hide_unvoted?(budgets.first)).to be(false) - expect(subject.hide_unvoted?(budgets.second)).to be(false) + it "returns budgets_path" do + expect(subject.cancel_redirect_path).to eq(Decidim::EngineRouter.main_proxy(component).root_path) end end end diff --git a/decidim-budgets_booth/spec/lib/decidim/budgets_booth/workflows/zip_code_spec.rb b/decidim-budgets_booth/spec/lib/decidim/budgets_booth/workflows/zip_code_spec.rb deleted file mode 100644 index fe73fe4c..00000000 --- a/decidim-budgets_booth/spec/lib/decidim/budgets_booth/workflows/zip_code_spec.rb +++ /dev/null @@ -1,91 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::BudgetsBooth::Workflows::ZipCode do - subject { described_class.new(component, user) } - - let(:organization) { create(:organization) } - let(:component) { create(:budgets_component, settings: component_settings, organization: organization) } - let(:component_settings) { { scopes_enabled: true, scope_id: parent_scope.id } } - let!(:user) { create(:user, organization: organization) } - - describe "#vote_allowed?" do - let!(:allowed_budget) { create(:budget, component: component, scope: subscopes.first) } - let!(:not_allowed_budget) { create(:budget, component: component, scope: subscopes.second) } - - include_context "with scopes" - include_context "with user data" - - context "when user zip code is blank" do - before do - user_data.update(metadata: { zip_code: "" }) - end - - it "returns false" do - expect(subject).not_to be_vote_allowed(not_allowed_budget, consider_progress: true) - end - end - - context "when user zip code presents" do - before do - user_data.update(metadata: { zip_code: "10004" }) - end - - it "returns false for not_allowed_budget" do - expect(subject).not_to be_vote_allowed(not_allowed_budget, consider_progress: true) - end - - it "returns true for allowed_budget" do - expect(subject).to be_vote_allowed(allowed_budget, consider_progress: true) - end - end - end - - describe "#budgets" do - let(:parent_scope) { create(:scope, organization: organization) } - let!(:budgets) { create_list(:budget, 3, component: component) } - - let(:scope_manager) { instance_double(Decidim::BudgetsBooth::ScopeManager) } - - before do - allow(::Decidim::BudgetsBooth::ScopeManager).to receive(:new).with(component).and_return(scope_manager) - allow(scope_manager).to receive(:user_zip_code).with(user).and_return("dummy zip_code") - allow(scope_manager).to receive(:zip_codes_for).with(budgets.first).and_return(["dummy zip_code"]) - allow(scope_manager).to receive(:zip_codes_for).with(budgets.second).and_return(["dummy zip_code"]) - allow(scope_manager).to receive(:zip_codes_for).with(budgets.last).and_return(["another code"]) - end - - it "returns the correct budgets list" do - expect(subject.budgets).to include(budgets.first) - expect(subject.budgets).to include(budgets.second) - expect(subject.budgets).not_to include(budgets.last) - end - end - - describe "#highlighted?" do - let(:parent_scope) { create(:scope, organization: organization) } - let!(:budgets) { create_list(:budget, 3, component: component) } - - it "returs false" do - result = subject.highlighted?(budgets.first) - expect(result).to be_falsey - end - end - - describe "#disable_voting_instructions?" do - let(:parent_scope) { create(:scope, organization: organization) } - - it "is disabled by default" do - expect(subject).to be_disable_voting_instructions - end - end - - describe "hide_image_in_popup?" do - let(:parent_scope) { create(:scope, organization: organization) } - - it "is disabled by default" do - expect(subject).to be_hide_image_in_popup - end - end -end diff --git a/decidim-budgets_booth/spec/models/decidim/budgets/user_data_spec.rb b/decidim-budgets_booth/spec/models/decidim/budgets/user_data_spec.rb deleted file mode 100644 index e4500791..00000000 --- a/decidim-budgets_booth/spec/models/decidim/budgets/user_data_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::Budgets::UserData do - let(:organization) { create(:organization) } - let(:component) { create(:budgets_component, organization: organization) } - let(:user) { create(:user, organization: organization) } - let!(:user_data) { create(:user_data, component: component, user: user, metadata: { zip_code: "12345" }) } - - shared_examples "fetched through the scope manager" do - let(:scope_manager) { Decidim::BudgetsBooth::ScopeManager.new(component) } - - describe "#create" do - it "clears the cache" do - expect(scope_manager.user_zip_code(user)).to eq("12345") - - user_data.destroy! - create(:user_data, component: component, user: user, metadata: { zip_code: "67890" }) - expect(scope_manager.user_zip_code(user)).to eq("67890") - end - end - - describe "#update" do - it "clears the cache" do - expect(scope_manager.user_zip_code(user)).to eq("12345") - - user_data.update!(metadata: { zip_code: "67890" }) - expect(scope_manager.user_zip_code(user)).to eq("67890") - end - end - - describe "#destroy" do - it "clears the cache" do - expect(scope_manager.user_zip_code(user)).to eq("12345") - - user_data.destroy! - expect(scope_manager.user_zip_code(user)).to be_nil - end - end - end - - it_behaves_like "fetched through the scope manager" - - context "when using the memory cache store", :caching do - let(:memory_store) { ActiveSupport::Cache.lookup_store(:memory_store) } - - before do - # Has to be set in order to use the actual memory store because the - # runtime configuration has been already loaded with the :null_store - # configuration at the testing environment. - allow(Rails).to receive(:cache).and_return(memory_store) - Rails.cache.clear - end - - it_behaves_like "fetched through the scope manager" - end -end diff --git a/decidim-budgets_booth/spec/models/decidim/scope_spec.rb b/decidim-budgets_booth/spec/models/decidim/scope_spec.rb deleted file mode 100644 index fffa76e2..00000000 --- a/decidim-budgets_booth/spec/models/decidim/scope_spec.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Decidim::Scope do - let(:organization) { create(:organization) } - let(:component) { create(:budgets_component, organization: organization, settings: component_settings) } - let(:component_settings) { { scopes_enabled: true, scope_id: parent_scope.id } } - - let(:parent_scope) { create(:scope, organization: organization) } - let!(:postal_scopes) do - [].tap do |scopes| - (10_000..10_005).each do |code| - scopes << create(:scope, parent: parent_scope, name: { en: code.to_s }, code: "POSTAL_#{code}") - end - end - end - let(:scope_manager) { Decidim::BudgetsBooth::ScopeManager.new(component) } - - describe "#create" do - it "clears the cache" do - expect(scope_manager.zip_codes_for(parent_scope)).to match_array(%w(10000 10001 10002 10003 10004 10005)) - - postal_scopes.last.destroy! - create(:scope, parent: parent_scope, name: { en: "10006" }, code: "POSTAL_10006") - expect(scope_manager.zip_codes_for(parent_scope)).to match_array(%w(10000 10001 10002 10003 10004 10006)) - end - end - - describe "#update" do - it "clears the cache" do - expect(scope_manager.zip_codes_for(parent_scope)).to match_array(%w(10000 10001 10002 10003 10004 10005)) - - postal_scopes.last.update!(name: { en: "10006" }, code: "POSTAL_10006") - expect(scope_manager.zip_codes_for(parent_scope)).to match_array(%w(10000 10001 10002 10003 10004 10006)) - end - end - - describe "#destroy" do - it "clears the cache" do - expect(scope_manager.zip_codes_for(parent_scope)).to match_array(%w(10000 10001 10002 10003 10004 10005)) - - postal_scopes.last.destroy! - expect(scope_manager.zip_codes_for(parent_scope)).to match_array(%w(10000 10001 10002 10003 10004)) - end - end -end diff --git a/decidim-budgets_booth/spec/shared/cancel_voting_examples.rb b/decidim-budgets_booth/spec/shared/cancel_voting_examples.rb deleted file mode 100644 index 785e766a..00000000 --- a/decidim-budgets_booth/spec/shared/cancel_voting_examples.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -shared_examples "cancel voting" do - before do - visit current_path - end - - it "redirects the user to root" do - click_button "Cancel voting" - within ".reveal" do - expect(page).to have_content "Are you sure you don't want to cast your vote?" - expect(page).to have_css("button.button.expanded", text: "Continue voting") - expect(page).to have_css("a.button.hollow.expanded", text: "I don't want to vote right now") - click_button "Continue voting" - end - click_button "Cancel voting" - within ".reveal" do - click_link "I don't want to vote right now" - end - expect(page).to have_current_path("/") - end - - context "when vote_cancel_url is set to a specific location" do - before do - component.update!(settings: component_settings.merge(workflow: "zip_code", vote_cancel_url: decidim_budgets.budgets_path)) - visit current_path - end - - it "redirects to the correct location" do - click_button "Cancel voting" - within ".reveal" do - expect(page).to have_content "Are you sure you don't want to cast your vote?" - expect(page).to have_css("button.button.expanded", text: "Continue voting") - expect(page).to have_css("a.button.hollow.expanded", text: "I don't want to vote right now") - click_button "Continue voting" - end - click_button "Cancel voting" - within ".reveal" do - click_link "I don't want to vote right now" - end - expect(page).to have_current_path(decidim_budgets.budgets_path) - end - end -end diff --git a/decidim-budgets_booth/spec/shared/ensure_user_data_examples.rb b/decidim-budgets_booth/spec/shared/ensure_user_data_examples.rb deleted file mode 100644 index 711e328e..00000000 --- a/decidim-budgets_booth/spec/shared/ensure_user_data_examples.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -shared_examples "ensure user data" do - it "redirects the user" do - expect(page).to have_current_path("/") - within_flash_messages do - expect(page).to have_content "You are not authorized to perform this action" - end - end -end diff --git a/decidim-budgets_booth/spec/shared/ensure_user_sign_in_examples.rb b/decidim-budgets_booth/spec/shared/ensure_user_sign_in_examples.rb deleted file mode 100644 index 57871cd0..00000000 --- a/decidim-budgets_booth/spec/shared/ensure_user_sign_in_examples.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -shared_examples "ensure user sign in" do - it "redirects user to the login page" do - expect(page).to have_current_path(decidim.new_user_session_path) - within_flash_messages do - expect(page).to have_content "You need to login first." - end - end -end diff --git a/decidim-budgets_booth/spec/shared/ensure_zip_code_workflow_examples.rb b/decidim-budgets_booth/spec/shared/ensure_zip_code_workflow_examples.rb deleted file mode 100644 index 4a0c7f62..00000000 --- a/decidim-budgets_booth/spec/shared/ensure_zip_code_workflow_examples.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -shared_examples "ensure zip code workflow" do - it "redirects user to root path" do - expect(page).to have_current_path "/" - within_flash_messages do - expect(page).to have_content "You are not allowed to perform this action." - end - end -end diff --git a/decidim-budgets_booth/spec/shared/filtering_projects_examples.rb b/decidim-budgets_booth/spec/shared/filtering_projects_examples.rb deleted file mode 100644 index b2f631a8..00000000 --- a/decidim-budgets_booth/spec/shared/filtering_projects_examples.rb +++ /dev/null @@ -1,91 +0,0 @@ -# frozen_string_literal: true - -shared_examples "filtering projects" do - let!(:project) { projects.first } - let!(:categories) { create_list(:category, 3, participatory_space: current_component.participatory_space) } - context "when filtering" do - it "allows searching by text" do - within ".filters__search" do - fill_in "filter[search_text_cont]", with: translated(project.title) - - find(".button").click - end - - within "#projects" do - expect(page).to have_css(".budget-list__item", count: 1) - expect(page).to have_content(translated(project.title)) - end - end - - it "allows filtering by scope" do - scope = create(:scope, organization: current_component.organization) - project.scope = scope - project.save - - visit_budget - - within ".filters__section.with_any_scope_check_boxes_tree_filter" do - uncheck "All" - check translated(scope.name) - end - - within "#projects" do - expect(page).to have_css(".budget-list__item", count: 1) - expect(page).to have_content(translated(project.title)) - end - end - - it "allows filtering by category" do - category = categories.first - project.category = category - project.save - - visit_budget - within ".filters__section.with_any_category_check_boxes_tree_filter" do - uncheck "All" - check translated(category.name) - end - - within "#projects" do - expect(page).to have_css(".budget-list__item", count: 1) - expect(page).to have_content(translated(project.title)) - end - end - - it "works with 'back to list' link" do - category = categories.first - project.category = category - project.save - - visit_budget - - within ".filters__section.with_any_category_check_boxes_tree_filter" do - uncheck "All" - check translated(category.name) - end - - within "#projects" do - expect(page).to have_css(".budget-list__item", count: 1) - expect(page).to have_content(translated(project.title)) - end - - find("a", text: "Read more", match: :first).click - click_link "View all projects" - - within "#projects" do - expect(page).to have_css(".budget-list__item", count: 1) - expect(page).to have_content(translated(project.title)) - end - end - end - - private - - def decidim_budgets - Decidim::EngineRouter.main_proxy(component) - end - - def visit_budget - page.visit decidim_budgets.budget_projects_path(budget) - end -end diff --git a/decidim-budgets_booth/spec/shared/non_voting_views_examples.rb b/decidim-budgets_booth/spec/shared/non_voting_views_examples.rb deleted file mode 100644 index 6155fc7d..00000000 --- a/decidim-budgets_booth/spec/shared/non_voting_views_examples.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -shared_examples "non-voting view" do - let(:projects_title) { projects.map { |p| p.title["en"] } } - let(:projects_budgets) { ["€25,000", "€50,000"] } - - it "changes the views in the index page" do - expect(page).to have_content "Welcome to the vote!" - expect(page).to have_content "START VOTING" - within ".budget-list__text.card__text", match: :first do - link_text = page.find("a", match: :first).text - expect(projects_title).to include(link_text) - end - within ".budget-list__data", match: :first do - project_budget = page.find("span.budget-list__data__number").text - expect(projects_budgets).to include(project_budget) - end - expect(page).to have_no_content("Add to your vote") - within ".budget-list__text.card__text", match: :first do - click_link "Read more" - end - expect(page).to have_content("Want to vote this project?") - expect(page).to have_content("Start voting") - expect(projects_budgets).to include(find(".definition-data__number").text) - expect(page).to have_content("View all projects") - click_link "View all projects" - expect(page).to have_css(".budget-list__item", count: projects.count) - end -end diff --git a/decidim-budgets_booth/spec/shared/not_allowable_voting_examples.rb b/decidim-budgets_booth/spec/shared/not_allowable_voting_examples.rb deleted file mode 100644 index 3830de77..00000000 --- a/decidim-budgets_booth/spec/shared/not_allowable_voting_examples.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -shared_examples "not allowable voting" do - it "redirects the user" do - expect(page).to have_current_path("/") - within_flash_messages do - expect(page).to have_content "You are not authorized to perform this action" - end - end -end diff --git a/decidim-budgets_booth/spec/shared/render_new_zip_code_page_examples.rb b/decidim-budgets_booth/spec/shared/render_new_zip_code_page_examples.rb deleted file mode 100644 index bdce6235..00000000 --- a/decidim-budgets_booth/spec/shared/render_new_zip_code_page_examples.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -shared_examples "rendering new zip code page" do |zip_code_length| - it "renders new zip code page correctly" do - expect(page).to have_current_path(decidim_budgets.new_zip_code_path) - expect(page).to have_no_selector(".flash") - expect(page).to have_content("Welcome to the") - expect(page).to have_content("Please provide your ZIP code to find your Participatory Budgeting ballots.") - expect(page).to have_css('input[type="text"]', count: zip_code_length) - end -end diff --git a/decidim-budgets_booth/spec/shared/shared_context.rb b/decidim-budgets_booth/spec/shared/shared_context.rb index e4ab64a8..460555d0 100644 --- a/decidim-budgets_booth/spec/shared/shared_context.rb +++ b/decidim-budgets_booth/spec/shared/shared_context.rb @@ -1,100 +1,48 @@ # frozen_string_literal: true shared_context "with scopes" do - let(:parent_scope) { create(:scope, organization: organization) } - let!(:subscopes) { create_list(:scope, 3, parent: parent_scope, organization: organization) } - let!(:first_postals) do - [].tap do |postals| - 5.times do |i| - code = (10_000 + i).to_s - postals << create(:scope, name: { en: code }, code: "FIRST_#{code}", parent: subscopes[0], organization: organization) - end - end - end - let!(:second_postals) do - [].tap do |postals| - 7.times do |i| - code = (10_010 + i).to_s - postals << create(:scope, name: { en: code }, code: "SECOND_#{code}", parent: subscopes[1], organization: organization) - end - end - end - let!(:third_postals) do - [].tap do |postals| - 8.times do |i| - code = (10_020 + i).to_s - postals << create(:scope, name: { en: code }, code: "THIRD_#{code}", parent: subscopes[2], organization: organization) - end - end - end -end - -shared_context "with user data" do - let!(:user_data) { create(:user_data, component: component, user: user) } + let(:parent_scope) { create(:scope, organization:) } + let!(:subscopes) { create_list(:scope, 3, parent: parent_scope, organization:) } end shared_context "with scoped budgets" do include_context "with scopes" let(:organization) { create(:organization) } - let(:component) { create(:budgets_component, settings: component_settings, organization: organization) } + let(:component) { create(:budgets_component, settings: component_settings, organization:) } let(:component_settings) { { scopes_enabled: true, scope_id: parent_scope.id } } - let(:budgets) { create_list(:budget, 3, component: component, total_budget: 100_000) } + let(:budgets) { create_list(:budget, 3, component:, total_budget: 100_000) } let!(:first_projects_set) { create_list(:project, projects_count, budget: budgets[0], budget_amount: 25_000) } let!(:second_projects_set) { create_list(:project, projects_count, budget: budgets[1], budget_amount: 25_000) } let!(:last_projects_set) { create_list(:project, projects_count, budget: budgets[2], budget_amount: 25_000) } before do # We update the description to be less than the truncation limit. To test the truncation, we update those in tests. - attach_images(budgets) budgets[0].update!(scope: parent_scope, description: { en: "

Eius officiis expedita. 55

" }) budgets[1].update!(scope: subscopes[0], description: { en: "

Eius officiis expedita. 56

" }) budgets[2].update!(scope: subscopes[1]) end - - private - - def attach_images(budgets) - city_files = ["city.jpeg", "city2.jpeg", "city3.jpeg"] - budgets.each_with_index do |budget, ind| - budget.update(main_image: ActiveStorage::Blob.create_and_upload!( - io: File.open(Decidim::Dev.asset(city_files[ind])), - filename: city_files[ind], - content_type: "image/jpeg" - )) - end - end end shared_context "with single scoped budget" do include_context "with scopes" let(:organization) { create(:organization) } - let(:component) { create(:budgets_component, settings: component_settings, organization: organization) } + let(:component) { create(:budgets_component, settings: component_settings, organization:) } let(:component_settings) { { scopes_enabled: true, scope_id: parent_scope.id } } - let!(:budget) { create(:budget, component: component, total_budget: 100_000) } - let!(:projects_set) { create_list(:project, 3, budget: budget, budget_amount: 25_000) } + let!(:budget) { create(:budget, component:, total_budget: 100_000) } + let!(:projects_set) { create_list(:project, 3, budget:, budget_amount: 25_000) } before do budget.update!(scope: subscopes[0], description: { en: "

Eius officiis expedita. 55

" }) end end -shared_context "with zip_code workflow" do - let!(:component) do - create( - :budgets_component, - settings: component_settings.merge(workflow: "zip_code"), - organization: organization - ) - end -end - shared_context "with a survey" do let!(:participatory_space) { component.participatory_space } - let!(:surveys_component) { create(:surveys_component, :published, participatory_space: participatory_space) } + let!(:surveys_component) { create(:surveys_component, :published, participatory_space:) } let!(:survey) { create(:survey, component: surveys_component) } let!(:questionnaire) { create(:questionnaire, questionnaire_for: survey) } end diff --git a/decidim-budgets_booth/spec/system/budgets_view_spec.rb b/decidim-budgets_booth/spec/system/budgets_view_spec.rb deleted file mode 100644 index e2e5a470..00000000 --- a/decidim-budgets_booth/spec/system/budgets_view_spec.rb +++ /dev/null @@ -1,246 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "Budgets view", type: :system do - let(:projects_count) { 1 } - let(:decidim_budgets) { Decidim::EngineRouter.main_proxy(component) } - let(:user) { create(:user, :confirmed, organization: organization) } - - before do - switch_to_host(organization.host) - end - - context "with multiple budgets" do - include_context "with scoped budgets" - - context "when not signed in" do - before { visit decidim_budgets.budgets_path } - - it "shows the normal layout" do - expect(page).to have_link(translated(budgets.first.title), href: decidim_budgets.budget_path(budgets.first)) - expect(page).to have_selector("a", text: /show/i, count: 3) - expect(page).to have_content("€100,000") - end - end - - context "when workflow" do - include_context "with zip_code workflow" - - context "when not signed in" do - before { visit decidim_budgets.budgets_path } - - it_behaves_like "ensure user sign in" - end - - context "when signed in" do - before { sign_in user, scope: :user } - - context "when no zip code" do - before { visit decidim_budgets.budgets_path } - - it "redirects user to zipcode entering path" do - expect(page).to have_current_path(decidim_budgets.new_zip_code_path) - end - end - - context "with user zip_code exist" do - let!(:user_data) { create(:user_data, component: component, user: user, metadata: { zip_code: "dummy_1234" }) } - - context "when no budgets to vote" do - before { visit decidim_budgets.budgets_path } - - it "renders budgets page" do - expect(page).to have_current_path(decidim_budgets.budgets_path) - expect(page).to have_content "No budgets were found based on your ZIP code. You can change your ZIP code if it's not correct, or you can search again later." - end - end - - context "when budgets to vote" do - let(:first_budget) { budgets.first } - let(:second_budget) { budgets.second } - let(:landing_page_content) { Decidim::Faker::Localized.sentence(word_count: 5) } - - before do - user_data.update!(metadata: { zip_code: "10004" }) - visit decidim_budgets.budgets_path - end - - it "renders the budgets page and budgets" do - expect(page).to have_current_path(decidim_budgets.budgets_path) - expect(page).to have_content "You are now in the voting booth." - within "#budgets" do - expect(page).to have_css(".card.card--list.budget-list", count: 2) - expect(page).to have_selector("a", text: "More info", count: 2) - expect(page).to have_link(text: /TAKE PART/, href: decidim_budgets.budget_voting_index_path(first_budget)) - expect(page).to have_link(text: /TAKE PART/, href: decidim_budgets.budget_voting_index_path(second_budget)) - expect(page).to have_link(translated(first_budget.title), href: decidim_budgets.budget_voting_index_path(budgets.first)) - expect(page).to have_link(translated(second_budget.title), href: decidim_budgets.budget_voting_index_path(second_budget)) - expect(page).to have_content("Eius officiis expedita. 55") - expect(page).to have_content("Eius officiis expedita. 56") - end - expect(page).to have_no_css(".callout.warning.font-customizer") - expect(page).to have_button("Cancel voting") - click_button "Cancel voting" - within ".small.reveal.confirm-reveal" do - expect(page).to have_content("Are you sure you want to exit the voting booth?") - click_link "OK" - end - expect(page).to have_link(href: "/") - end - - context "when description is long" do - before do - first_budget.update!(description: { en: "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fus. ultricies lacus vel dui vestibulum, eu aliquam libero convallis. Donec vitae ligula velitFooba ligul dolor sit amet, consectetur adipiscing elit. Fus. ultricies lacus vel dui vestibulum, eu aliquam libero convallis. Donec vitae ligula velitSome dummy text

" })) - vote_for_this(budget) - end - - it "sets the text message with svg image by default" do - expect(page).to have_current_path(decidim_budgets.budgets_path) - expect(page).to have_css("div#thanks-message", count: 1) - - within "#thanks-message" do - expect(page).to have_content("Thank you for voting!") - expect(page).to have_css("svg", count: 1) - expect(page).to have_button("Continue") - end - end - end - - context "when vote_success_content is nil" do - before do - vote_for_this(budget) - end - - it "does not show popup" do - expect(page).to have_current_path(decidim_budgets.budgets_path) - expect(page).to have_no_css("div#thanks-message") - end - end - - context "when the current_workflow sets not to show thanks message image" do - before do - allow_any_instance_of(Decidim::Budgets::Workflows::All).to receive(:hide_image_in_popup?).and_return(true) # rubocop:disable RSpec/AnyInstance - component.update!(settings: component_settings.merge(vote_success_content: { en: "

Some dummy text

" })) - vote_for_this(budget) - end - - it "sets the text message without svg image" do - expect(page).to have_current_path(decidim_budgets.budgets_path) - within "#thanks-message" do - expect(page).to have_content("Thank you for voting!") - expect(page).to have_no_css("svg") - expect(page).to have_button("Continue") - end - end - end - end - - describe "complete all votes popup" do - context "when maximum_budgets_to_vote_on is set to zero" do - let!(:order) { create(:order, user: user, budget: second_budget) } - - before do - order.projects << second_budgets_project - order.checked_out_at = Time.current - order.save - end - - it "does not show the popup when vote_completed_content is nil" do - vote_for_this(budget) - expect(page).to have_no_css("div#vote-completed") - end - - it "shows the popup with the text when the popup text is set" do - component.update!(settings: component_settings.merge(vote_completed_content: { en: "

Some dummy text

" })) - vote_for_this(budget) - expect(page).to have_current_path(decidim_budgets.budgets_path) - expect(page).to have_css("div#vote-completed", count: 1) - within "div#vote-completed" do - expect(page).to have_content("You successfully completed your votes") - expect(page).to have_content("Some dummy text") - end - end - end - - context "when maximum_budgets_to_vote_on is set" do - before do - component.update!(settings: component_settings.merge(vote_completed_content: { en: "

Some dummy text

" }, maximum_budgets_to_vote_on: 1)) - vote_for_this(budget) - end - - it "shows the completed message" do - expect(page).to have_current_path(decidim_budgets.budgets_path) - expect(page).to have_css("div#vote-completed", count: 1) - within "div#vote-completed" do - expect(page).to have_content("You successfully completed your votes") - expect(page).to have_content("Some dummy text") - end - end - end - end - end - end - end - end - - context "when one budget" do - before do - switch_to_host(organization.host) - end - - context "when visiting the budgets list" do - before do - sign_in user - visit decidim_budgets.budgets_path - end - - it "redirects the user to projects list" do - expect(page).to have_current_path(decidim_budgets.budget_projects_path(budget)) - expect(page).to have_no_content("Back to budgets") - expect(page).to have_no_content("Show all budgets") - click_button "Start voting" - expect(page).to have_current_path(decidim_budgets.budget_voting_index_path(budget)) - expect(page).to have_no_content("Back to budgets") - expect(page).to have_no_content("Show all budgets") - end - end - end - - private - - def vote_for_this(budget) - visit decidim_budgets.budget_voting_index_path(budget) - click_button("Add to your vote", match: :first) - click_button("Add to your vote", match: :first) - click_button("I am ready") - click_button("Confirm") - end -end diff --git a/decidim-budgets_booth/spec/system/orders_spec.rb b/decidim-budgets_booth/spec/system/orders_spec.rb new file mode 100644 index 00000000..2db6440b --- /dev/null +++ b/decidim-budgets_booth/spec/system/orders_spec.rb @@ -0,0 +1,814 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe "Orders" do + include_context "with a component" + let(:manifest_name) { "budgets" } + + let(:organization) { create(:organization, available_authorizations: %w(dummy_authorization_handler)) } + let!(:user) { create(:user, :confirmed, organization:) } + let(:project) { projects.first } + + let!(:component) do + create(:budgets_component, + :with_vote_threshold_percent, + manifest:, + participatory_space: participatory_process) + end + let(:budget) { create(:budget, component:) } + + context "when the user is not logged in" do + let!(:projects) { create_list(:project, 1, budget:, budget_amount: 25_000_000) } + + it "is given the option to sign in" do + visit_budget + + within "#project-#{project.id}-item" do + page.find(".budget-list__action").click + end + + expect(page).to have_css("#loginModal", visible: :visible) + end + end + + context "when the user is logged in" do + let!(:projects) { create_list(:project, 3, budget:, budget_amount: 25_000_000) } + + before do + login_as user, scope: :user + end + + context "when visiting budget" do + before do + visit_budget + end + + it "shows a filter to select added projects" do + within(".budget__list--header") do + expect(page).to have_text("Added") + end + end + + context "when voting by percentage threshold" do + it "displays description messages" do + within ".layout-2col__aside", match: :first do + expect(page).to have_content("Start adding projects. Assign at least €70,000,000 to the projects you want and vote according to your preferences to define the budget.") + end + end + end + + context "when voting by minimum projects number" do + let!(:component) do + create(:budgets_component, + :with_minimum_budget_projects, + manifest:, + participatory_space: participatory_process) + end + + it "displays description messages" do + # text has been moved above filters in project index page + within ".layout-2col__aside", match: :first do + expect(page).to have_content("Start adding projects. Select at least 3 projects you want and vote according to your preferences to define the budget.") + end + end + end + + context "when voting by maximum projects number" do + let!(:component) do + create(:budgets_component, + :with_budget_projects_range, + vote_minimum_budget_projects_number: 0, + manifest:, + participatory_space: participatory_process) + end + + it "displays description messages" do + within ".layout-2col__aside", match: :first do + expect(page).to have_content("Start adding projects. Select up to 6 projects you want and vote according to your preferences to define the budget.") + end + end + end + + context "when voting by minimum and maximum projects number" do + let!(:component) do + create(:budgets_component, + :with_budget_projects_range, + manifest:, + participatory_space: participatory_process) + end + + it "displays description messages" do + within ".layout-2col__aside", match: :first do + expect(page).to have_content("Start adding projects. Select at least 3 and up to 6 projects you want and vote according to your preferences to define the budget.") + end + end + end + + context "when the total budget is zero" do + let(:budget) { create(:budget, total_budget: 0, component:) } + + it "displays total budget" do + within ".budget-summary", match: :first do + expect(page).to have_content("€0\nAssigned") + end + end + end + end + + context "and has not a pending order" do + before do + visit_budget + end + + context "when voting by percentage threshold" do + it "adds a project to the current order" do + within "#project-#{project.id}-item" do + page.find(".budget-list__action").click + end + + expect(page).to have_text "Added to vote", count: 1 + + within ".budget-summary__progressbar-marks", match: :first do + expect(page).to have_content(/€25,000,000\sAssigned/) + end + within ".budget__list--header" do + expect(page).to have_content(/Added\s1/) + end + + within "#order-progress .budget-summary__content", match: :first do + expect(page).to have_css ".budget-summary__progressbar--meter", style: "width: 25%" + expect(page).to have_button(disabled: true, text: "Vote budget") + end + end + + it "displays total budget" do + expect(page).to have_css(".budget-summary__progressbar-marks_right", text: "€100,000,000") + end + end + + context "when voting by minimum projects number" do + let!(:component) do + create(:budgets_component, + :with_minimum_budget_projects, + manifest:, + participatory_space: participatory_process) + end + + it "adds a project to the current order" do + within "#project-#{project.id}-item" do + page.find(".budget-list__action").click + end + + expect(page).to have_text "Added to vote", count: 1 + + within ".budget-summary__progressbar-marks", match: :first do + expect(page).to have_content(/€25,000,000\sAssigned/) + end + within ".budget__list--header" do + expect(page).to have_content(/Added\s1/) + end + + within "#order-progress .budget-summary__content", match: :first do + expect(page).to have_css ".budget-summary__progressbar--meter", style: "width: 25%" + expect(page).to have_button(disabled: true, text: "Vote budget") + end + end + + it "displays total budget" do + expect(page).to have_css(".budget-summary__progressbar-marks_right", text: "€100,000,000") + end + end + + context "when voting by maximum projects number" do + let!(:component) do + create(:budgets_component, + :with_budget_projects_range, + vote_minimum_budget_projects_number: 0, + manifest:, + participatory_space: participatory_process) + end + + it "adds a project to the current order" do + within "#project-#{project.id}-item" do + page.find(".budget-list__action").click + end + + expect(page).to have_text "Added to vote", count: 1 + + within ".budget-summary__progressbar-marks", match: :first do + expect(page).to have_content "1 / 6" + end + within ".budget__list--header" do + expect(page).to have_content(/Added\s1/) + end + + within "#order-progress .budget-summary__content", match: :first do + expect(page).to have_css ".budget-summary__progressbar--meter", style: "width: 16%" + expect(page).to have_button(text: "Vote budget") + end + end + + it "displays total budget" do + expect(page).to have_css(".budget-summary__progressbar-marks_right", text: "6") + end + end + + context "when voting by minimum and maximum projects number" do + let!(:component) do + create(:budgets_component, + :with_budget_projects_range, + manifest:, + participatory_space: participatory_process) + end + + it "adds a project to the current order" do + within "#project-#{project.id}-item" do + page.find(".budget-list__action").click + end + + expect(page).to have_text "Added to vote", count: 1 + within ".budget-summary__progressbar-marks", match: :first do + expect(page).to have_content "1 / 6" + end + within ".budget__list--header" do + expect(page).to have_content(/Added\s1/) + end + + within "#order-progress .budget-summary__content", match: :first do + expect(page).to have_css ".budget-summary__progressbar--meter", style: "width: 16%" + expect(page).to have_button(disabled: true, text: "Vote budget") + end + end + + it "displays total budget" do + expect(page).to have_css(".budget-summary__progressbar-marks_right", text: "6") + end + end + end + + context "and is not authorized" do + before do + permissions = { + vote: { + authorization_handlers: { + "dummy_authorization_handler" => {} + } + } + } + + component.update!(permissions:) + end + + it "shows a modal dialog" do + visit_budget + + within "#project-#{project.id}-item" do + page.find(".budget-list__action").click + end + + expect(page).to have_content("Authorization required") + end + end + + context "and has pending order" do + let!(:order) { create(:order, user:, budget:) } + let!(:line_item) { create(:line_item, order:, project:) } + + it "removes a project from the current order" do + visit_budget + + within ".budget-summary__progressbar-marks", match: :first do + expect(page).to have_content(/€25,000,000\sAssigned/) + end + within ".budget__list--header" do + expect(page).to have_content(/Added\s1/) + end + + within "#project-#{project.id}-item" do + page.find(".budget-list__action").click + end + + within ".budget-summary__progressbar-marks", match: :first do + expect(page).to have_content(/€0\sAssigned/) + end + within ".budget__list--header" do + expect(page).to have_content(/Added\s0/) + end + expect(page).to have_css ".budget-summary__progressbar--meter", style: "width: 0%" + expect(page).to have_no_css ".budget-list__data--added" + end + + it "is alerted when trying to leave the component before completing" do + budget_projects_path = Decidim::EngineRouter.main_proxy(component).budget_projects_path(budget) + + visit_budget + + expect(page).to have_content "€25,000,000" + + page.find(".menu-bar__exit-link").click + + expect(page).to have_content "You have not yet voted" + + click_on "Return to voting" + + expect(page).to have_no_content("You have not yet voted") + expect(page).to have_current_path budget_projects_path + end + + # no logout in custom budget booth + + # it "is alerted but can sign out before completing" do + # visit_budget + + # within_user_menu do + # click_on("Log out") + # end + + # expect(page).to have_content "You have not yet voted" + + # page.find_by_id("exit-notification-link").click + # expect(page).to have_content("Logged out successfully") + # end + + context "and try to vote a project that exceed the total budget" do + let!(:expensive_project) { create(:project, budget:, budget_amount: 250_000_000) } + + it "cannot add the project" do + visit_budget + + within "#project-#{expensive_project.id}-item" do + page.find(".budget-list__action").click + end + + expect(page).to have_css("#budget-excess", visible: :visible) + end + end + + context "and in project show page cannot exceed the budget" do + let!(:expensive_project) { create(:project, budget:, budget_amount: 250_000_000) } + + it "cannot add the project" do + page.visit Decidim::EngineRouter.main_proxy(component).budget_project_path(budget, expensive_project) + + click_on "Add to your vote" + + expect(page).to have_css("#budget-excess", visible: :visible) + end + end + + context "and add another project exceeding vote threshold" do + let!(:other_project) { create(:project, budget:, budget_amount: 50_000_000) } + + it "can complete the checkout process" do + visit_budget + + within "#project-#{other_project.id}-item" do + page.find(".budget-list__action").click + end + + expect(page).to have_text "Added to vote", count: 2 + + within "#order-progress .budget-summary__content", match: :first do + page.find(".button", match: :first).click + end + + expect(page).to have_css("#budget-confirm", visible: :visible) + + within "#budget-confirm-content" do + page.find(".button", text: "Confirm").click + end + # there is only one budget, so we are redirected to process show page (cf success_redirect_path method) + expect(page).to have_css("a", text: translated_attribute(participatory_process.title).to_s) + #within "#order-progress .budget-summary__content", match: :first do + # expect(page).to have_css(".button", text: "delete your vote") + #end + end + end + + context "when the voting rule is set to threshold percent" do + before do + visit_budget + end + + it "shows the rule description" do + within ".layout-2col__aside", match: :first do + expect(page).to have_content("Assign at least €70,000,000 to the projects you want and vote") + end + end + + context "when the order total budget does not exceed the threshold" do + it "cannot vote" do + within "#order-progress", match: :first do + expect(page).to have_button("Vote", disabled: true) + end + end + end + + context "when the order total budget exceeds the threshold" do + let(:projects) { create_list(:project, 2, budget:, budget_amount: 36_000_000) } + let(:order_percent) { create(:order, user:, budget:) } + + before do + order.destroy! + order_percent.projects << projects + order_percent.save! + visit_budget + end + + it "can vote" do + within "#order-progress", match: :first do + expect(page).to have_button("Vote", disabled: false) + end + end + + context "when user has voted" do + let(:router) { Decidim::EngineRouter.main_proxy(component) } + let(:another_user) { create(:user, :confirmed, organization:) } + + before do + find("[data-dialog-open='budget-confirm']", match: :first).click + within "#budget-confirm-content" do + page.find(".button", text: "Confirm").click + end + end + + it "shows private-only activity log entry" do + sleep 1 + page.visit decidim.profile_activity_path(nickname: user.nickname) + expect(page).to have_content("New budgeting vote at #{translated(budget.title)}") + expect(page).to have_link(translated(budget.title), href: router.budget_path(budget)) + end + + it "does not show activity log entry to another user" do + relogin_as another_user, scope: :user + page.visit decidim.profile_activity_path(nickname: user.nickname) + expect(page).to have_content(user.name) + expect(page).to have_current_path "/profiles/#{user.nickname}/activity" + expect(page).to have_no_content("New budgeting vote at") + expect(page).to have_no_link(translated(budget.title)) + end + end + end + end + + context "when the voting rule is set to minimum projects" do + before do + order.destroy! + end + + let(:component) do + create(:budgets_component, + :with_minimum_budget_projects, + manifest:, + participatory_space: participatory_process) + end + + let!(:order_min) { create(:order, user:, budget:) } + + it "shows the rule description" do + visit_budget + + within ".layout-2col__aside", match: :first do + expect(page).to have_content("Select at least 3 projects you want and vote") + end + end + + context "when the order total budget does not reach the minimum" do + it "cannot vote" do + visit_budget + + within "#order-progress", match: :first do + expect(page).to have_button("Vote budget", disabled: true) + end + end + end + + context "when the order total budget exceeds the minimum" do + before do + order_min.projects = projects + order_min.save! + end + + it "can vote" do + visit_budget + + within "#order-progress", match: :first do + expect(page).to have_button("Vote", disabled: false) + end + end + end + end + + context "when maximum budget to vote on is set to 1 and vote_completed_content is set" do + let!(:component) do + create(:budgets_component, + manifest:, + participatory_space: participatory_process, + settings: { maximum_budgets_to_vote_on: 1, vote_completed_content: "You have completed your votes" }) + end + let!(:projects) { create_list(:project, 3, budget:, budget_amount: 70_000_000) } + let(:budget_two) { create(:budget, component:) } + let!(:projects_two) { create_list(:project, 3, budget: budget_two, budget_amount: 25_000_000) } + + it "can only vote for one budget and display the vote-conpleted modal" do + visit_budget + # confirm the pending order + within ".budget-summary__progressbox-buttons" do + page.find("button").click + end + expect(page).to have_css("#budget-confirm", visible: :visible) + + within "#budget-confirm" do + page.find(".button", text: "Confirm").click + end + + # after voting complete, redirected with vote-conpleted modal + expect(page).to have_content("You have completed your votes") + + within "#vote-completed" do + page.find(".button", text: "Continue").click + end + + expect(page).to have_content("You have voted on the maximum budgets allowed.") + + # can't access projects from second budget + within "#budgets" do + within ".budget__card__highlight-vote" do + expect(page).to have_button("See projects", disabled: true) + end + end + end + end + + context "and vote_success_url is defined" do + let!(:component) do + create(:budgets_component, + manifest:, + participatory_space: participatory_process, + settings: { vote_success_url: "/processes" }) + end + let!(:projects) { create_list(:project, 3, budget:, budget_amount: 70_000_000) } + + it "redirects to vote_success_url when order is confirmed" do + visit_budget + # confirm the pending order + within ".budget-summary__progressbox-buttons" do + page.find("button").click + end + expect(page).to have_css("#budget-confirm", visible: :visible) + + within "#budget-confirm" do + page.find(".button", text: "Confirm").click + end + # check we are in processes index + expect(page).to have_css("h1", text: "Processes") + end + end + + context "and vote_cancel_url is defined" do + let!(:component) do + create(:budgets_component, + manifest:, + participatory_space: participatory_process, + settings: { vote_cancel_url: "/processes" }) + end + + it "redirects to vote_cancel_url when order is cancelled" do + visit_budget + # exit voting booth with pending order + within "#menu-bar-custom" do + page.find(".menu-bar__exit-link").click + end + # click on exit button in modal + within "#exit-notification-content" do + page.find("#exit-notification-link").click + end + # check we are in processes index + expect(page).to have_css("h1", text: "Processes") + end + end + + context "and vote_success_content is defined" do + let!(:component) do + create(:budgets_component, + manifest:, + participatory_space: participatory_process, + settings: { workflow: "all", maximum_budgets_to_vote_on: 5, vote_success_content: "Thanks for voting to that great budget" }) + end + let!(:projects) { create_list(:project, 3, budget:, budget_amount: 70_000_000) } + let(:budget_two) { create(:budget, component:) } + let!(:projects_two) { create_list(:project, 3, budget: budget_two, budget_amount: 25_000_000) } + + it "displays a modal with vote_success_content text after voting for one budget" do + visit_budget + # confirm the pending order + within ".budget-summary__progressbox-buttons" do + page.find("button").click + end + expect(page).to have_css("#budget-confirm", visible: :visible) + + within "#budget-confirm" do + page.find(".button", text: "Confirm").click + end + + # check we have the modal with the message + expect(page).to have_css("#thanks-message") + expect(page).to have_content("Thanks for voting to that great budget") + end + end + end + + context "and has a finished order" do + let!(:order) do + order = create(:order, user:, budget:) + order.projects = projects + order.checked_out_at = Time.current + order.save! + order + end + + it "can cancel the order" do + visit_budget + + within ".budget-summary__content", match: :first do + accept_confirm { page.find(".cancel-order", match: :first).click } + end + + expect(page).to have_content("successfully") + + within "#order-progress .budget-summary__content", match: :first do + expect(page).to have_button(disabled: true) + end + + within ".budget-summary__content", match: :first do + expect(page).to have_no_css(".button", text: "delete your vote") + end + end + + it "is not alerted when trying to leave the component" do + visit_budget + + expect(page).to have_content("Budget vote completed") + + page.find(".menu-bar__exit-link").click + + expect(page).to have_current_path decidim.root_path + end + end + + context "and votes are disabled" do + let!(:component) do + create(:budgets_component, + :with_votes_disabled, + manifest:, + participatory_space: participatory_process) + end + + it "cannot create new orders" do + visit_budget + + expect(page).to have_no_button(class: "budget-list__action") + end + end + + # context "and show votes are enabled" do + # let!(:component) do + # create(:budgets_component, + # :with_show_votes_enabled, + # manifest:, + # participatory_space: participatory_process) + # end + + # let!(:order) do + # order = create(:order, user:, budget:) + # order.projects = projects + # order.checked_out_at = Time.current + # order.save! + # order + # end + + # it "displays the number of votes for a project" do + # visit_budget + + # within "#project-#{project.id}-item .card__grid" do + # expect(page).to have_css(".project-votes", text: "1 vote") + # end + # end + # end + + context "and votes are finished" do + let!(:component) do + create(:budgets_component, + :with_voting_finished, + manifest:, + participatory_space: participatory_process) + end + let!(:projects) { create_list(:project, 2, :selected, budget:, budget_amount: 25_000_000) } + + it "renders selected projects" do + visit_budget + + expect(page).to have_css(".card__grid-metadata", count: 2) + end + + it "does not show a filter to select added projects" do + visit_budget + + within(".budget__list--header") do + expect(page).to have_no_text("Added") + end + end + end + end + + describe "index" do + it "respects the projects_per_page setting when under total projects" do + component.update!(settings: { projects_per_page: 1 }) + + create_list(:project, 2, budget:) + + visit_budget + + expect(page).to have_css("a[id^=project-]", count: 1) + end + + it "respects the projects_per_page setting when it matches total projects" do + component.update!(settings: { projects_per_page: 2 }) + + create_list(:project, 2, budget:) + + visit_budget + + expect(page).to have_css("a[id^=project-]", count: 2) + end + + it "respects the projects_per_page setting when over total projects" do + component.update!(settings: { projects_per_page: 3 }) + + create_list(:project, 2, budget:) + + visit_budget + + expect(page).to have_css("a[id^=project-]", count: 2) + end + end + + describe "show" do + let!(:project) { create(:project, budget:, budget_amount: 25_000_000) } + + before do + visit resource_locator([budget, project]).path + end + + it_behaves_like "has attachments tabs" do + let(:attached_to) { project } + end + + it "shows the component" do + expect(page).to have_i18n_content(project.title, strip_tags: true) + expect(page).to have_i18n_content(project.description, strip_tags: true) + end + + context "with linked proposals" do + let(:proposal_component) do + create(:component, manifest_name: :proposals, participatory_space: project.component.participatory_space) + end + let(:proposals) { create_list(:proposal, 3, component: proposal_component) } + + before do + project.link_resources(proposals, "included_proposals") + end + + it "shows related proposals" do + visit_budget + find("a[id=project-#{project.id}-item]").click + + proposals.each do |proposal| + expect(page).to have_content(translated(proposal.title)) + expect(page).to have_content(proposal.creator_author.name) + expect(page).to have_content(proposal.endorsements.size) + end + end + + context "with votes enabled" do + let(:proposal_component) do + create(:proposal_component, :with_votes_enabled, participatory_space: project.component.participatory_space) + end + + let(:proposals) { create_list(:proposal, 1, :with_votes, component: proposal_component) } + + it "does not show the amount of votes" do + visit_budget + find("a[id=project-#{project.id}-item]").click + + expect(page).to have_no_css(".card__list-metadata", text: "5") + end + end + end + end + + def visit_budget + page.visit Decidim::EngineRouter.main_proxy(component).budget_projects_path(budget) + end +end diff --git a/decidim-budgets_booth/spec/system/sorting_projects_spec.rb b/decidim-budgets_booth/spec/system/sorting_projects_spec.rb new file mode 100644 index 00000000..af2b335b --- /dev/null +++ b/decidim-budgets_booth/spec/system/sorting_projects_spec.rb @@ -0,0 +1,124 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe "Sorting projects" do + include_context "with a component" + let(:manifest_name) { "budgets" } + + let(:organization) { create(:organization) } + let!(:user) { create(:user, :confirmed, organization:) } + let(:project) { projects.first } + + let!(:component) do + create(:budgets_component, + :with_vote_threshold_percent, + manifest:, + participatory_space: participatory_process) + end + + let(:budget) { create(:budget, component:) } + let!(:project_one) { create(:project, budget:, budget_amount: 25_000_000) } + let!(:project_two) { create(:project, budget:, budget_amount: 50_000_000) } + + before do + login_as user, scope: :user + visit_budget + end + + shared_examples "ordering projects by selected option" do |selected_option| + before do + visit_budget + within ".order-by" do + expect(page).to have_css("div.order-by a", text: "Random order") + page.find("a", text: "Random order").click + click_on(selected_option) + end + end + + it "lists the projects ordered by selected option" do + within "#projects div[data-collection-sort-controls]" do + expect(page).to have_no_css("a.underline.font-bold", text: "Random order") + expect(page).to have_css("a.underline.font-bold", text: selected_option) + end + + expect(page).to have_css("#projects .card__grid-grid .card__grid:first-child h3", text: translated(first_project.title)) + expect(page).to have_css("#projects .card__grid-grid .card__grid:last-child h3", text: translated(last_project.title)) + end + end + + context "when ordering by highest cost" do + it_behaves_like "ordering projects by selected option", "Highest cost" do + let(:first_project) { project_two } + let(:last_project) { project_one } + end + end + + context "when ordering by lowest cost" do + it_behaves_like "ordering projects by selected option", "Lowest cost" do + let(:first_project) { project_one } + let(:last_project) { project_two } + end + end + + describe "when the voting is finished" do + let!(:component) do + create( + :budgets_component, + :with_voting_finished, + manifest:, + participatory_space: participatory_process + ) + end + let!(:project_one) { create(:project, :selected, budget:, budget_amount: 25_000_000) } + let!(:project_two) { create(:project, :selected, budget:, budget_amount: 77_000_000) } + + context "when ordering by most votes" do + before do + order = build(:order, budget:) + create(:line_item, order:, project: project_two) + order = Decidim::Budgets::Order.last + order.checked_out_at = Time.zone.now + order.save + end + + it "automatically sorts by votes" do + visit_budget + + within "#projects div[data-collection-sort-controls]" do + expect(page).to have_css("a.underline.font-bold", text: "Most voted") + end + + expect(page).to have_css("#projects .card__grid-grid .card__grid:first-child h3", text: translated(project_two.title)) + expect(page).to have_css("#projects .card__grid-grid .card__grid:last-child h3", text: translated(project_one.title)) + end + + it "automatically sorts by votes and respect the pagination" do + component.update!(settings: { projects_per_page: 1 }) + + visit_budget + + within "#projects div.order-by" do + expect(page).to have_css("a.underline.font-bold", text: "Most voted") + end + + # project_two on first page + expect(page).to have_content(translated(project_two.title)) + expect(page).to have_no_content(translated(project_one.title)) + + within "#projects [data-pagination]" do + expect(page).to have_content("2") + page.find("a", text: "2").click + end + + # project_one on second page + expect(page).to have_no_content(translated(project_two.title)) + expect(page).to have_content(translated(project_one.title)) + end + end + end + + def visit_budget + page.visit Decidim::EngineRouter.main_proxy(component).budget_projects_path(budget) + end +end diff --git a/decidim-budgets_booth/spec/system/user_data_workflow_spec.rb b/decidim-budgets_booth/spec/system/user_data_workflow_spec.rb deleted file mode 100644 index af002ed3..00000000 --- a/decidim-budgets_booth/spec/system/user_data_workflow_spec.rb +++ /dev/null @@ -1,260 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "user data workflow", type: :system do - include_context "with scoped budgets" - - let(:projects_count) { 4 } - let(:decidim_budgets) { Decidim::EngineRouter.main_proxy(component) } - let(:user) { create(:user, :confirmed, organization: organization) } - let(:first_budget) { budgets.first } - - before do - switch_to_host(organization.host) - end - - context "when not zip_code workflow" do - before do - visit decidim_budgets.new_zip_code_path - end - - it_behaves_like "ensure zip code workflow" - end - - context "when not signed in" do - before do - component.update(settings: component_settings.merge(workflow: "zip_code")) - visit decidim_budgets.new_zip_code_path - end - - it_behaves_like "ensure user sign in" - end - - context "when voted" do - let!(:order) { create(:order, user: user, budget: first_budget) } - let!(:user_data) { create(:user_data, component: component, user: user, metadata: { zip_code: "10004" }) } - - before do - component.update(settings: component_settings.merge(workflow: "zip_code")) - order.projects << first_budget.projects.first - order.projects << first_budget.projects.second - order.projects << first_budget.projects.third - order.checked_out_at = Time.current - order.save! - sign_in user, scope: :user - visit decidim_budgets.new_zip_code_path - end - - it "does not let adding zip code" do - within_flash_messages do - expect(page).to have_content("You can not change your ZIP code after started voting. Delete all of your votes first.") - end - expect(page).to have_current_path("/") - end - end - - context "when voting is not open" do - let(:active_step_id) { component.participatory_space.active_step.id } - - before do - component.update!(settings: component_settings.merge(workflow: "zip_code"), step_settings: { active_step_id => { votes: :finished } }) - sign_in user, scope: :user - visit decidim_budgets.new_zip_code_path - end - - it "does not let the user to add their zip code" do - within_flash_messages do - expect(page).to have_content("You can not set your ZIP code when the voting is not open.") - end - expect(page).to have_current_path("/") - end - end - - context "when before_actions met" do - let(:non_existing_zip_code) { "12345" } - let(:existing_zip_code) { "10004" } - - before do - component.update!(settings: component_settings.merge(workflow: "zip_code")) - sign_in user, scope: :user - visit decidim_budgets.new_zip_code_path - end - - context "when default zip_code_length" do - it_behaves_like "rendering new zip code page", 5 - end - - context "when zip_code_length is set" do - before do - allow(Decidim::BudgetsBooth.config).to receive(:zip_code_length).and_return(6) - visit decidim_budgets.new_zip_code_path - end - - it_behaves_like "rendering new zip code page", 6 - end - - context "when submitting the form" do - context "when empty" do - before do - click_button "Find my ballots" - end - - it "renders errors" do - within ".zip-code-errors" do - expect(page).to have_content("ZIP code format is not correct.") - end - within "#affirm-checkbox" do - expect(page).to have_content("must be accepted") - end - check "By checking this box, I affirm that these stamenets are true, and that I meet the voting eligibility requirements." - click_button "Find my ballots" - - expect(page).to have_no_selector("#affirm-checkbox") - expect(page).to have_no_content("must be accepted") - - fill_in_code(non_existing_zip_code, "digit") - click_button "Find my ballots" - within "#zip-code-not-valid" do - expect(page).to have_content("The ZIP code you provided is not part of the areas that are eligible for voting.") - end - end - end - end - - describe "cancel button" do - context "when no user data" do - it "redirects to the root path" do - expect(page).to have_button("Cancel") - click_button "Cancel" - expect(page).to have_content("Are you sure you want to exit?") - click_link("OK") - expect(page).to have_current_path("/") - end - end - - context "when user data exists" do - let!(:user_data) { create(:user_data, component: component, user: user, metadata: { zip_code: "10004" }) } - - before do - visit decidim_budgets.new_zip_code_path - end - - it "redirects to the budgets path" do - expect(page).to have_button("Cancel") - click_button "Cancel" - expect(page).to have_content("Are you sure you want to exit?") - click_link("OK") - expect(page).to have_current_path(decidim_budgets.budgets_path) - end - end - end - - context "when submitting with correct data" do - before do - check "By checking this box, I affirm that these stamenets are true, and that I meet the voting eligibility requirements." - fill_in_code(existing_zip_code, "digit") - click_button "Find my ballots" - end - - context "when user data does not exist" do - it "creates user_data and redirects the user" do - within_flash_messages do - expect(page).to have_content("You have successfully registered your ZIP code.") - end - expect(page).to have_current_path(decidim_budgets.budgets_path) - expect(user.budgets_user_data.last.metadata).to eq({ "zip_code" => existing_zip_code }) - end - end - end - - context "when userdata exists" do - let!(:user_data) { create(:user_data, component: component, user: user, metadata: { zip_code: "quox" }) } - - before do - check "By checking this box, I affirm that these stamenets are true, and that I meet the voting eligibility requirements." - fill_in_code(existing_zip_code, "digit") - click_button "Find my ballots" - end - - it "updates existing metadata" do - within_flash_messages do - expect(page).to have_content("You have successfully registered your ZIP code.") - end - expect(page).to have_current_path(decidim_budgets.budgets_path) - data = Decidim::Budgets::UserData.last - expect(Decidim::Budgets::UserData.count).to eq(1) - expect(data.metadata).to eq({ "zip_code" => "10004" }) - end - end - end - - describe "input fields" do - context "when pasting" do - before do - component.update!(settings: { workflow: "zip_code" }) - sign_in user, scope: :user - visit decidim_budgets.new_zip_code_path - check "By checking this box, I affirm that these stamenets are true, and that I meet the voting eligibility requirements." - end - - context "when not valid clipboard" do - let(:clipboard_content_plain) { "a12_3" } - - it "renders error correctly" do - page.execute_script( - <<~JS - var dt = new DataTransfer(); - dt.setData("text/plain", #{clipboard_content_plain.to_json}); - var element = document.querySelector('input[name="digit1"]'); - element.dispatchEvent(new ClipboardEvent("paste", { clipboardData: dt })); - JS - ) - within ".zip-code-errors" do - expect(page).to have_content("Only letters and digits are allowed.") - end - expect(page).to have_selector(".is-invalid-input", count: 5) - end - end - - context "when valid clipboard" do - let(:clipboard_content_plain) { "abcd" } - - before do - fill_in_code("1234", "digit") - end - - it "pastes correctly" do - page.execute_script( - <<~JS - var dt = new DataTransfer(); - dt.setData("text/plain", #{clipboard_content_plain.to_json}); - var element = document.querySelector('input[name="digit3"]'); - element.dispatchEvent(new ClipboardEvent("paste", { clipboardData: dt })); - JS - ) - within ".zip-code-errors" do - expect(page).to have_no_content("Only letters and digits are allowed.") - end - expect(page).to have_no_selector(".is-invalid-input") - inputs = page.find_all('input[name^="digit"]') - expect(inputs[0].value).to eq("1") - expect(inputs[1].value).to eq("2") - expect(inputs[2].value).to have_content("a") - expect(inputs[3].value).to have_content("b") - expect(inputs[4].value).to have_content("c") - end - end - end - end - - private - - def fill_in_code(code, element) - code.length.times do |ind| - break if code[ind].blank? - - fill_in "#{element}#{ind + 1}", with: code[ind] - end - end -end diff --git a/decidim-budgets_booth/spec/system/voting_index_page_spec.rb b/decidim-budgets_booth/spec/system/voting_index_page_spec.rb deleted file mode 100644 index d66e6abe..00000000 --- a/decidim-budgets_booth/spec/system/voting_index_page_spec.rb +++ /dev/null @@ -1,483 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "Voting index page", type: :system do - include_context "with scoped budgets" - - let(:projects_count) { 10 } - let(:decidim_budgets) { Decidim::EngineRouter.main_proxy(component) } - let(:user) { create(:user, :confirmed, organization: organization) } - let(:first_budget) { budgets.first } - let(:second_budget) { budgets.second } - let(:active_step_id) { component.participatory_space.active_step.id } - - before do - switch_to_host(organization.host) - end - - context "when not signed in" do - before do - component.update(settings: component_settings.merge(workflow: "zip_code")) - visit_budget(first_budget) - end - - it_behaves_like "ensure user sign in" - end - - context "when no user_data" do - before do - component.update(settings: component_settings.merge(workflow: "zip_code")) - sign_in user, scope: :user - visit_budget(first_budget) - end - - it_behaves_like "ensure user data" - end - - context "when not allowed to vote that budget" do - let!(:user_data) { create(:user_data, component: component, user: user) } - - before do - component.update(settings: component_settings.merge(workflow: "zip_code")) - sign_in user, scope: :user - visit_budget(first_budget) - end - - it_behaves_like "not allowable voting" - end - - context "when voted to that budget" do - let!(:user_data) { create(:user_data, component: component, user: user) } - let!(:order) { create(:order, :with_projects, user: user, budget: first_budget) } - - before do - component.update(settings: component_settings.merge(workflow: "zip_code")) - order.update!(checked_out_at: Time.current) - user_data.update!(metadata: { zip_code: "10004" }) - sign_in user, scope: :user - visit_budget(first_budget) - end - - it "redirects the user" do - expect(page).to have_current_path("/") - within_flash_messages do - expect(page).to have_content "You are not allowed to perform this action." - end - end - end - - describe "voting" do - let!(:user_data) { create(:user_data, component: component, user: user) } - - before do - component.update(settings: component_settings.merge(workflow: "zip_code", projects_per_page: 5)) - user_data.update!(metadata: { zip_code: "10004" }) - sign_in user, scope: :user - visit_budget(first_budget) - end - - it_behaves_like "cancel voting" - - it "renders the page correctly" do - expect(page).to have_content("You are now in the voting booth.") - expect(page).to have_content("You decide the #{first_budget.title["en"]} budget") - expect(page).to have_button("Cancel voting") - expect(page).to have_content("TOTAL BUDGET €100,000") - expect(page).to have_content("10 PROJECTS") - expect(page).to have_selector("button", text: "Read more", count: 5) - expect(page).to have_selector("button", text: "Add to your vote", count: 5) - end - - describe "budget summary" do - before do - click_button "Add to your vote", match: :first - end - - it "updates budget summary" do - within ".budget-summary__total" do - expect(page).to have_content("TOTAL BUDGET €100,000") - end - expect(page).to have_content("ASSIGNED: €25,000") - within "#order-selected-projects" do - expect(page).to have_content "1 project selected" - end - within ".progress.budget-progress" do - expect(page).to have_css(".progress-meter-text.progress-meter-text--right", match: :first, text: "25%") - end - within page.all(".budget-list .budget-list__item")[1] do - click_button "Read more" - end - within ".reveal-overlay" do - click_button "Add to your vote" - end - page.find(".close-button").click - expect(page).to have_content("ASSIGNED: €50,000") - within "#order-selected-projects" do - expect(page).to have_content "2 projects selected" - end - within ".progress.budget-progress" do - expect(page).to have_css(".progress-meter-text.progress-meter-text--right", match: :first, text: "50%") - end - click_link "2" - click_button "Add to your vote", match: :first - expect(page).to have_content("ASSIGNED: €75,000") - within "#order-selected-projects" do - expect(page).to have_content "3 projects selected" - end - - within page.all(".budget-list .budget-list__item")[0] do - click_button "Read more" - end - within ".reveal-overlay" do - click_button "Remove from vote" - end - expect(page).to have_content("ASSIGNED: €50,000") - within "#order-selected-projects" do - expect(page).to have_content "2 projects selected" - end - end - end - - it "paginates the projects" do - expect(page).to have_css(".budget-list .budget-list__item", count: 5) - find("li.page", text: "2").click - expect(page).to have_css(".budget-list .budget-list__item", count: 5) - end - - it "adds and removes projects" do - expect(page).to have_button("Add to your vote", count: 5) - click_button("Add to your vote", match: :first) - expect(page).to have_button("Add to your vote", count: 4) - expect(page).to have_button("Remove from vote", count: 1) - - within page.all(".budget-list .budget-list__item")[0] do - header = page.all("button")[0].text - click_button "Read more" - expect(page).to have_content(header) - expect(page).to have_button("Remove from vote") - end - within ".reveal-overlay" do - click_button "Remove from vote" - end - expect(page).to have_button("Add to your vote", count: 5) - end - - describe "filtering projects" do - let!(:categories) { create_list(:category, 3, participatory_space: component.participatory_space) } - let(:current_projects) { first_budget.projects } - - it "allows searching by text" do - project = current_projects.first - within ".filters__search" do - fill_in "filter[search_text_cont]", with: translated(project.title) - - find(".button").click - end - - within "#projects" do - expect(page).to have_css(".budget-list__item", count: 1) - expect(page).to have_content(translated(project.title)) - end - end - - it "allows filtering by scope" do - project = current_projects.first - project.scope = first_budget.scope - project.save - visit current_path - - within ".filters__section.with_any_scope_check_boxes_tree_filter" do - uncheck "All" - check translated(first_budget.scope.name) - end - - within "#projects" do - expect(page).to have_css(".budget-list__item", count: 1) - expect(page).to have_content(translated(project.title)) - end - end - - it "allows filtering by category" do - project = current_projects.first - category = categories.first - project.category = category - project.save - - visit current_path - within ".filters__section.with_any_category_check_boxes_tree_filter" do - uncheck "All" - check translated(category.name) - end - - within "#projects" do - expect(page).to have_css(".budget-list__item", count: 1) - expect(page).to have_content(translated(project.title)) - end - end - end - - describe "#vote_success_content" do - before do - first_budget.update!(total_budget: 26_000) - end - - context "when vote_success_content is not set" do - before do - visit current_path - vote_budget! - end - - it "does not show the success message by default" do - expect(page).to have_no_selector("#thanks-message") - expect(page).to have_current_path(decidim_budgets.budgets_path) - end - end - - context "when vote success is set" do - before do - component.update!(settings: component_settings.merge(workflow: "zip_code", vote_success_content: { en: "

Some dummy text

" })) - visit current_path - vote_budget! - end - - it "shows the success message set" do - expect(page).to have_selector("#thanks-message") - within "#thanks-message" do - expect(page).to have_content("Thank you for voting!") - expect(page).to have_selector("p", text: "Some dummy text") - end - expect(page).to have_current_path(decidim_budgets.budgets_path) - end - end - end - - describe "vote_complete_content" do - let!(:order) { create(:order, user: user, budget: second_budget) } - - before do - first_budget.update!(total_budget: 26_000) - second_budget.update!(total_budget: 26_000) - order.checked_out_at = Time.current - order.projects << second_budget.projects.first - order.save! - end - - context "when not set" do - before do - visit current_path - vote_budget! - end - - it "does not show the modal" do - expect(page).to have_no_selector("#vote-completed") - expect(page).to have_current_path(decidim_budgets.budgets_path) - end - end - - context "when was set" do - before do - component.update!(settings: component_settings.merge(workflow: "zip_code", vote_completed_content: { en: "

Completed voting dummy text

" })) - visit current_path - vote_budget! - end - - it "shows the modal" do - expect(page).to have_selector("#vote-completed") - within "#vote-completed" do - expect(page).to have_content("You successfully completed your votes") - expect(page).to have_content("Completed voting dummy text") - end - expect(page).to have_current_path(decidim_budgets.budgets_path) - end - end - end - - describe "redirect after completing votes" do - let!(:order) { create(:order, user: user, budget: second_budget) } - - before do - first_budget.update!(total_budget: 26_000) - second_budget.update!(total_budget: 26_000) - order.checked_out_at = Time.current - order.projects << second_budget.projects.first - order.save! - end - - context "when vote success URL is not set" do - before do - visit current_path - vote_budget! - end - - it "redirects to the budgets path" do - expect(page).to have_current_path(decidim_budgets.budgets_path) - end - end - - context "when vote success URL is set" do - include_context "with a survey" - before do - component.update!(settings: component_settings.merge(workflow: "zip_code", vote_completed_content: { en: "

Completed voting dummy text

" }, vote_success_url: main_component_path(surveys_component))) - visit current_path - vote_budget! - end - - it "shows the modal" do - expect(page).to have_current_path(main_component_path(surveys_component)) - expect(page).to have_selector("#vote-completed") - within "#vote-completed" do - expect(page).to have_content("You successfully completed your votes") - expect(page).to have_content("Completed voting dummy text") - end - end - end - - context "when non-zipcode workflow" do - let!(:second_order) { create(:order, user: user, budget: budgets.last) } - let(:third_budget) { budgets.last } - - include_context "with a survey" - before do - third_budget.update!(total_budget: 26_000) - second_order.checked_out_at = Time.current - second_order.projects << third_budget.projects.first - second_order.save! - component.update!(settings: component_settings.merge(workflow: "all", vote_completed_content: { en: "

Completed voting dummy text

" }, vote_success_url: main_component_path(surveys_component))) - visit current_path - non_zipcode_vote_budget! - end - - it "shows the modal" do - expect(page).to have_current_path(main_component_path(surveys_component)) - expect(page).to have_selector("#vote-completed") - within "#vote-completed" do - expect(page).to have_content("You successfully completed your votes") - expect(page).to have_content("Completed voting dummy text") - end - end - end - end - - context "when maximum budget exceeds" do - before do - first_budget.update!(total_budget: 24_999) - visit current_path - end - - it "popups maximum error notice" do - click_button "Add to your vote", match: :first - expect(page).to have_content("Maximum budget exceeded") - click_button "OK" - within all(".budget-list .budget-list__item")[0] do - click_button "Read more" - end - within ".reveal-overlay" do - click_button "Add to your vote" - end - expect(page).to have_content("Maximum budget exceeded") - end - end - - context "when highest cost" do - before { first_budget.projects.second.update!(budget_amount: 30_000) } - - it_behaves_like "ordering projects by selected option", "Highest cost" do - let(:first_project) { first_budget.projects.second } - end - end - - context "when lowest cost" do - before { first_budget.projects.second.update!(budget_amount: 20_000) } - - it_behaves_like "ordering projects by selected option", "Lowest cost" do - let(:first_project) { first_budget.projects.second } - end - end - - context "when casting vote" do - before do - first_budget.update!(total_budget: 26_000) - visit current_path - click_button("Add to your vote", match: :first) - click_button "Vote" - end - - it "renders the info" do - within "#budget-confirm" do - expect(page).to have_content("These are the projects you have chosen to be part of the budget.") - expect(page).to have_selector("li", text: "€25,000", count: 1) - expect(page).to have_button("Confirm") - expect(page).to have_button("Cancel") - click_button("Cancel") - end - expect(page).to have_current_path(decidim_budgets.budget_voting_index_path(first_budget)) - end - end - - describe "#show_full_description_on_listing_page" do - let(:projects_count) { 1 } - let(:project) { first_budget.projects.first } - - before do - project.update!(description: Decidim::Faker::Localized.sentence(word_count: 20)) - end - - context "when not set" do - before do - visit current_path - end - - it "does not shows complete description by default" do - within("#project-#{project.id}-item") do - expect(page).to have_selector("button", text: translated(project.title)) - expect(page).to have_button("Read more") - expect(page).to have_content(/.*\.{3}$/) - end - end - end - - context "when set" do - before do - component.update!(settings: component_settings.merge(workflow: "zip_code", show_full_description_on_listing_page: true)) - visit current_path - end - - it "does not shows complete description by default" do - within("#project-#{project.id}-item") do - expect(page).to have_no_selector("button", text: translated(project.title)) - expect(page).to have_no_button("Read more") - expect(page).to have_no_content(/.*\.{3}$/) - expect(page).to have_content(translated(project.description)) - end - end - end - end - end - - private - - def decidim_budgets - Decidim::EngineRouter.main_proxy(component) - end - - def budget_path(budget) - decidim_budgets.budget_path(budget.id) - end - - def visit_budget(budget) - visit decidim_budgets.budget_voting_index_path(budget) - end - - def vote_budget! - click_button("Add to your vote", match: :first) - click_button "Vote" - click_button "Confirm" - end - - def non_zipcode_vote_budget! - click_button("Add to your vote", match: :first) - click_button "I am ready" - click_button "Confirm" - end -end diff --git a/decidim-l10n/app/packs/stylesheets/decidim/l10n/l10n.scss b/decidim-l10n/app/packs/stylesheets/decidim/l10n/l10n.scss index 7fcc2e4c..63369b00 100644 --- a/decidim-l10n/app/packs/stylesheets/decidim/l10n/l10n.scss +++ b/decidim-l10n/app/packs/stylesheets/decidim/l10n/l10n.scss @@ -1,5 +1,5 @@ @import "vendor/flatpickr/flatpickr.min"; input[readonly].flatpickr-input{ - background-color: $input-background; + background-color: gray; } diff --git a/decidim-l10n/lib/decidim/l10n/engine.rb b/decidim-l10n/lib/decidim/l10n/engine.rb index 08ee7484..5a526c5d 100644 --- a/decidim-l10n/lib/decidim/l10n/engine.rb +++ b/decidim-l10n/lib/decidim/l10n/engine.rb @@ -41,13 +41,13 @@ class Engine < ::Rails::Engine initializer "decidim_l10n.add_customizations", after: "decidim.action_controller" do config.to_prepare do # Cells extensions - Decidim::Meetings::MeetingMCell.include( - ::Decidim::L10n::MeetingMCellExtensions - ) + #Decidim::Meetings::MeetingMCell.include( + # ::Decidim::L10n::MeetingMCellExtensions + #) - Decidim::Debates::DebateMCell.include( - ::Decidim::L10n::DebateMCellExtensions - ) + #Decidim::Debates::DebateMCell.include( + # ::Decidim::L10n::DebateMCellExtensions + #) # Form builders Decidim::FormBuilder.include(::Decidim::L10n::FormBuilderExtensions) diff --git a/decidim-l10n/lib/decidim/l10n/version.rb b/decidim-l10n/lib/decidim/l10n/version.rb index e7094e86..129d4f61 100644 --- a/decidim-l10n/lib/decidim/l10n/version.rb +++ b/decidim-l10n/lib/decidim/l10n/version.rb @@ -4,11 +4,11 @@ module Decidim # This holds the decidim-meetings version. module L10n def self.decidim_version - "~> 0.27.0" + "~> 0.29.0" end def self.version - "0.27.0" + "0.29.0" end end end diff --git a/decidim-l10n/spec/cells/decidim/debates/debate_m_cell_spec.rb b/decidim-l10n/spec/cells/decidim/debates/debate_m_cell_spec.rb index 4027f0b3..c7ee7038 100644 --- a/decidim-l10n/spec/cells/decidim/debates/debate_m_cell_spec.rb +++ b/decidim-l10n/spec/cells/decidim/debates/debate_m_cell_spec.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true - +=begin require "spec_helper" describe Decidim::Debates::DebateMCell, type: :cell do @@ -21,3 +21,4 @@ end end end +=end diff --git a/decidim-l10n/spec/cells/decidim/meetings/meeting_m_cell_spec.rb b/decidim-l10n/spec/cells/decidim/meetings/meeting_m_cell_spec.rb index e0a3687d..1242053a 100644 --- a/decidim-l10n/spec/cells/decidim/meetings/meeting_m_cell_spec.rb +++ b/decidim-l10n/spec/cells/decidim/meetings/meeting_m_cell_spec.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true - +=begin require "spec_helper" describe Decidim::Meetings::MeetingMCell, type: :cell do @@ -20,3 +20,4 @@ end end end +=end diff --git a/decidim-sms-twilio/lib/decidim/sms/twilio/version.rb b/decidim-sms-twilio/lib/decidim/sms/twilio/version.rb index 9cce74ef..93724fd0 100644 --- a/decidim-sms-twilio/lib/decidim/sms/twilio/version.rb +++ b/decidim-sms-twilio/lib/decidim/sms/twilio/version.rb @@ -5,11 +5,11 @@ module Sms # This holds the decidim-sms-twilio version. module Twilio def self.decidim_version - "~> 0.27.0" + "~> 0.29.0" end def self.version - "0.27.0" + "0.29.0" end end end diff --git a/decidim-smsauth/app/packs/stylesheets/decidim/smsauth/smsauth.scss b/decidim-smsauth/app/packs/stylesheets/decidim/smsauth/smsauth.scss index 3d580353..a546f360 100644 --- a/decidim-smsauth/app/packs/stylesheets/decidim/smsauth/smsauth.scss +++ b/decidim-smsauth/app/packs/stylesheets/decidim/smsauth/smsauth.scss @@ -2,12 +2,12 @@ .ss-main.country-select{ .ss-single-selected{ - padding: $input-padding; - font-size: $input-font-size; - line-height: $input-line-height; + padding: 5px; + font-size: 18px; + line-height: normal; height: 2.4375rem; - border: $input-border; - box-shadow: $input-shadow; + border: 1px solid black; + box-shadow: none; } .ss-single-selected, diff --git a/decidim-smsauth/lib/decidim/smsauth/version.rb b/decidim-smsauth/lib/decidim/smsauth/version.rb index 2fc1b7f5..94860056 100644 --- a/decidim-smsauth/lib/decidim/smsauth/version.rb +++ b/decidim-smsauth/lib/decidim/smsauth/version.rb @@ -4,11 +4,11 @@ module Decidim # This holds the decidim-Smsauth version. module Smsauth def self.decidim_version - "~> 0.27.0" + "~> 0.29.0" end def self.version - "0.27.0" + "0.29.0" end end end diff --git a/lib/decidim/ptp/version.rb b/lib/decidim/ptp/version.rb index 76b5a577..10325db5 100644 --- a/lib/decidim/ptp/version.rb +++ b/lib/decidim/ptp/version.rb @@ -4,11 +4,11 @@ module Decidim # This holds the decidim-ptp version. module Ptp def self.decidim_version - "~> 0.27.0" + "~> 0.29.0" end def self.version - "0.27.0" + "0.29.0" end end end diff --git a/package-lock.json b/package-lock.json index 61826a94..614db44b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,9 @@ "packages": { "": { "dependencies": { - "@decidim/webpacker": "^0.27.2" + "@decidim/webpacker": "^0.27.2", + "esbuild": "^0.19.12", + "esbuild-loader": "^4.0.3" }, "devDependencies": { "@babel/eslint-parser": "^7.16.5", @@ -474,6 +476,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -489,6 +492,7 @@ "version": "7.21.10", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.10.tgz", "integrity": "sha512-3YybmT8FN4sZFXp0kTr9Gbu90wAIhC3feNung+qcRQ1wALGoSHgOz1c+fR3ZLGZ0LXqIpYmtE6Faua6tMDarUg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.21.0", @@ -506,6 +510,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -2098,6 +2103,351 @@ "node": ">=10.0.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -2166,6 +2516,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "deprecated": "Use @eslint/config-array instead", "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -2178,7 +2529,8 @@ "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "deprecated": "Use @eslint/object-schema instead" }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", @@ -2503,19 +2855,19 @@ "dev": true }, "node_modules/@types/mdast": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", - "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "peer": true, "dependencies": { - "@types/unist": "*" + "@types/unist": "^2" } }, "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true, "peer": true }, @@ -2525,9 +2877,9 @@ "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true, "peer": true }, @@ -2550,9 +2902,9 @@ "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" }, "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "dev": true, "peer": true }, @@ -3128,13 +3480,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "peer": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -4024,6 +4376,69 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/esbuild-loader": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.0.3.tgz", + "integrity": "sha512-YpaSRisj7TSg6maKKKG9OJGGm0BZ7EXeov8J8cXEYdugjlAJ0wL7aj2JactoQvPJ113v2Ar204pdJWrZsAQc8Q==", + "dependencies": { + "esbuild": "^0.19.0", + "get-tsconfig": "^4.7.0", + "loader-utils": "^2.0.4", + "webpack-sources": "^1.4.3" + }, + "funding": { + "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" + }, + "peerDependencies": { + "webpack": "^4.40.0 || ^5.0.0" + } + }, + "node_modules/esbuild-loader/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4044,6 +4459,7 @@ "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -4704,9 +5120,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "peer": true, "dependencies": { @@ -4739,9 +5155,9 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "peer": true, "dependencies": { @@ -4787,9 +5203,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "peer": true, "dependencies": { @@ -4986,10 +5402,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5106,9 +5534,9 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "peer": true, "engines": { @@ -5393,6 +5821,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6509,13 +6938,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "peer": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -6705,28 +7134,12 @@ "node": ">=10" } }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -6734,13 +7147,6 @@ "node": ">=10" } }, - "node_modules/normalize-package-data/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", @@ -7776,9 +8182,9 @@ } }, "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", "dev": true, "peer": true }, @@ -8086,9 +8492,9 @@ } }, "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "peer": true, "bin": { @@ -8341,6 +8747,14 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -8356,6 +8770,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dependencies": { "glob": "^7.1.3" }, @@ -8887,9 +9302,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, "peer": true }, @@ -8905,9 +9320,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true, "peer": true }, @@ -9275,9 +9690,9 @@ } }, "node_modules/stylelint/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "peer": true, "engines": { @@ -10444,6 +10859,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", "dependencies": { "workbox-background-sync": "6.6.0", "workbox-core": "6.6.0", @@ -11953,6 +12369,144 @@ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" }, + "@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "optional": true + }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -12268,19 +12822,19 @@ "dev": true }, "@types/mdast": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", - "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "peer": true, "requires": { - "@types/unist": "*" + "@types/unist": "^2" } }, "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true, "peer": true }, @@ -12290,9 +12844,9 @@ "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" }, "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true, "peer": true }, @@ -12315,9 +12869,9 @@ "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" }, "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "dev": true, "peer": true }, @@ -12763,13 +13317,13 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "peer": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browserslist": { @@ -13398,6 +13952,58 @@ "is-symbol": "^1.0.2" } }, + "esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "requires": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "esbuild-loader": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.0.3.tgz", + "integrity": "sha512-YpaSRisj7TSg6maKKKG9OJGGm0BZ7EXeov8J8cXEYdugjlAJ0wL7aj2JactoQvPJ113v2Ar204pdJWrZsAQc8Q==", + "requires": { + "esbuild": "^0.19.0", + "get-tsconfig": "^4.7.0", + "loader-utils": "^2.0.4", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -13900,9 +14506,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "peer": true, "requires": { @@ -13929,9 +14535,9 @@ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==" }, "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "peer": true, "requires": { @@ -13973,9 +14579,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "peer": true, "requires": { @@ -14113,6 +14719,14 @@ "get-intrinsic": "^1.1.1" } }, + "get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "requires": { + "resolve-pkg-maps": "^1.0.0" + } + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -14202,9 +14816,9 @@ }, "dependencies": { "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "peer": true } @@ -15197,13 +15811,13 @@ } }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "peer": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -15335,30 +15949,10 @@ "validate-npm-package-license": "^3.0.1" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "peer": true } @@ -15998,9 +16592,9 @@ "requires": {} }, "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", "dev": true, "peer": true }, @@ -16202,9 +16796,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "peer": true }, @@ -16412,6 +17006,11 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, + "resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -16764,9 +17363,9 @@ } }, "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, "peer": true }, @@ -16782,9 +17381,9 @@ } }, "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true, "peer": true }, @@ -17064,9 +17663,9 @@ "peer": true }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "peer": true }, diff --git a/package.json b/package.json index e0e36fe6..8e75c18a 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "stylelint": "stylelint decidim-*/app/packs/**/*.scss" }, "dependencies": { - "@decidim/webpacker": "^0.27.2" + "@decidim/webpacker": "^0.27.2", + "esbuild": "^0.19.12", + "esbuild-loader": "^4.0.3" }, "devDependencies": { "@babel/eslint-parser": "^7.16.5", diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..5e978808 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,6114 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.6" + resolved "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== + dependencies: + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz" + integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.1", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.15.0", "@babel/core@^7.15.5", "@babel/core@^7.17.9", "@babel/core@^7.4.0-0", "@babel/core@>=7.11.0": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.1.tgz" + integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.22.0" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helpers" "^7.22.0" + "@babel/parser" "^7.22.0" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/eslint-parser@^7.16.5": + version "7.21.8" + resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz" + integrity sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + +"@babel/generator@^7.22.0", "@babel/generator@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz" + integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== + dependencies: + "@babel/types" "^7.22.3" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz" + integrity sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg== + dependencies: + "@babel/types" "^7.22.3" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz" + integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== + dependencies: + "@babel/compat-data" "^7.22.0" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz" + integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.22.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.22.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" + semver "^6.3.0" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz" + integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.3.1" + semver "^6.3.0" + +"@babel/helper-define-polyfill-provider@^0.4.0": + version "0.4.0" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz" + integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz" + integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.22.0": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz" + integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== + dependencies: + "@babel/types" "^7.22.3" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== + dependencies: + "@babel/types" "^7.21.4" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz" + integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-simple-access" "^7.21.5" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.21.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz" + integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== + +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz" + integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-member-expression-to-functions" "^7.22.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" + +"@babel/helper-simple-access@^7.21.5": + version "7.21.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz" + integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== + dependencies: + "@babel/types" "^7.21.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz" + integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@babel/helpers@^7.22.0": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz" + integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== + dependencies: + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.3" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": + version "7.22.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz" + integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz" + integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-transform-optional-chaining" "^7.22.3" + +"@babel/plugin-proposal-class-properties@^7.14.5": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.21.0": + version "7.21.10" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.10.tgz" + integrity sha512-3YybmT8FN4sZFXp0kTr9Gbu90wAIhC3feNung+qcRQ1wALGoSHgOz1c+fR3ZLGZ0LXqIpYmtE6Faua6tMDarUg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-import-attributes@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz" + integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz" + integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz" + integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz" + integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-class-properties@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz" + integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-class-static-block@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz" + integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.16.7", "@babel/plugin-transform-classes@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.21.5": + version "7.21.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz" + integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/template" "^7.20.7" + +"@babel/plugin-transform-destructuring@^7.21.3": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz" + integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-dynamic-import@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz" + integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-export-namespace-from@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz" + integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.21.5": + version "7.21.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz" + integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-json-strings@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz" + integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz" + integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.20.11": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-modules-commonjs@^7.21.5": + version "7.21.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz" + integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== + dependencies: + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-simple-access" "^7.21.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz" + integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz" + integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-new-target@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz" + integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz" + integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz" + integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz" + integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== + dependencies: + "@babel/compat-data" "^7.22.3" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.3" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-optional-catch-binding@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz" + integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz" + integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz" + integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-private-methods@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz" + integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz" + integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + +"@babel/plugin-transform-react-jsx@^7.18.6", "@babel/plugin-transform-react-jsx@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz" + integrity sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-jsx" "^7.21.4" + "@babel/types" "^7.22.3" + +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-regenerator@^7.13.15", "@babel/plugin-transform-regenerator@^7.21.5": + version "7.21.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz" + integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-runtime@^7.15.0": + version "7.22.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz" + integrity sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA== + dependencies: + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-plugin-utils" "^7.21.5" + babel-plugin-polyfill-corejs2 "^0.4.3" + babel-plugin-polyfill-corejs3 "^0.8.1" + babel-plugin-polyfill-regenerator "^0.5.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-escapes@^7.21.5": + version "7.21.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz" + integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz" + integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz" + integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.15.0", "@babel/preset-env@^7.15.6", "@babel/preset-env@^7.21.5": + version "7.22.4" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.4.tgz" + integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== + dependencies: + "@babel/compat-data" "^7.22.3" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" + "@babel/plugin-proposal-private-property-in-object" "^7.21.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-attributes" "^7.22.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.21.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.3" + "@babel/plugin-transform-async-to-generator" "^7.20.7" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.21.0" + "@babel/plugin-transform-class-properties" "^7.22.3" + "@babel/plugin-transform-class-static-block" "^7.22.3" + "@babel/plugin-transform-classes" "^7.21.0" + "@babel/plugin-transform-computed-properties" "^7.21.5" + "@babel/plugin-transform-destructuring" "^7.21.3" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-dynamic-import" "^7.22.1" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-export-namespace-from" "^7.22.3" + "@babel/plugin-transform-for-of" "^7.21.5" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-json-strings" "^7.22.3" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.20.11" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.3" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" + "@babel/plugin-transform-new-target" "^7.22.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" + "@babel/plugin-transform-numeric-separator" "^7.22.3" + "@babel/plugin-transform-object-rest-spread" "^7.22.3" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-optional-catch-binding" "^7.22.3" + "@babel/plugin-transform-optional-chaining" "^7.22.3" + "@babel/plugin-transform-parameters" "^7.22.3" + "@babel/plugin-transform-private-methods" "^7.22.3" + "@babel/plugin-transform-private-property-in-object" "^7.22.3" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.21.5" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.20.7" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.21.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.3" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.22.4" + babel-plugin-polyfill-corejs2 "^0.4.3" + babel-plugin-polyfill-corejs3 "^0.8.1" + babel-plugin-polyfill-regenerator "^0.5.0" + core-js-compat "^3.30.2" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.12.13": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.3.tgz" + integrity sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.22.3" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.11.2", "@babel/runtime@^7.15.3", "@babel/runtime@^7.15.4", "@babel/runtime@^7.20.7", "@babel/runtime@^7.8.4": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz" + integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9": + version "7.21.9" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz" + integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/parser" "^7.21.9" + "@babel/types" "^7.21.5" + +"@babel/traverse@^7.20.5", "@babel/traverse@^7.22.1": + version "7.22.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz" + integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.22.3" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.22.4" + "@babel/types" "^7.22.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.4.4": + version "7.22.4" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz" + integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== + dependencies: + "@babel/helper-string-parser" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@bufbuild/protobuf@^1.0.0": + version "1.2.1" + resolved "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.2.1.tgz" + integrity sha512-cwwGvLGqvoaOZmoP5+i4v/rbW+rHkguvTehuZyM2p/xpmaNSdT2h3B7kHw33aiffv35t1XrYHIkdJSEkSEMJuA== + +"@csstools/postcss-cascade-layers@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz" + integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-color-function@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz" + integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-font-format-keywords@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz" + integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-hwb-function@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz" + integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz" + integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.7": + version "2.0.7" + resolved "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz" + integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz" + integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz" + integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz" + integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz" + integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz" + integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== + +"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": + version "2.2.0" + resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz" + integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== + +"@decidim/dev@^0.27.2": + version "0.27.3" + resolved "https://registry.npmjs.org/@decidim/dev/-/dev-0.27.3.tgz" + integrity sha512-8g1IrhycJ4Ldc8Fy1foKMMlGWn4SdM0z2Ij+N7a08ELJTY0LOzapIMyU3W4SUpqSPoKxhirXWgulEZocyISd5Q== + dependencies: + axe-core "^4.1.4" + +"@decidim/eslint-config@^0.27.2": + version "0.27.3" + resolved "https://registry.npmjs.org/@decidim/eslint-config/-/eslint-config-0.27.3.tgz" + integrity sha512-bHaTzjgBgJKhRRZoLj9voIQjVB5qOwFMjdngoG4/nkBapzyqBbqZKlzDTJhavrJusKJQuNUFQA+/Hr+0I9IXeA== + +"@decidim/stylelint-config@^0.27.2": + version "0.27.3" + resolved "https://registry.npmjs.org/@decidim/stylelint-config/-/stylelint-config-0.27.3.tgz" + integrity sha512-bhtpi/ysOfvN2Vl1n+sUaYFxz4QscSfqca7f415tHH12DQvm808DH59mQmTiqDBtsI33f5T1UVfuBlTKkf2hiQ== + +"@decidim/webpacker@^0.27.2": + version "0.27.3" + resolved "https://registry.npmjs.org/@decidim/webpacker/-/webpacker-0.27.3.tgz" + integrity sha512-YYGvj+MGJwADcxD/eQBRObKMMxAw8cVUYPBIlTdlDfH9eFOqrKN0PpLcH0YFNwKUGbn5v9BTgAcoVgUJvbjqAw== + dependencies: + "@babel/core" "^7.15.5" + "@babel/eslint-parser" "^7.16.5" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.13.15" + "@babel/plugin-transform-runtime" "^7.15.0" + "@babel/preset-env" "^7.15.6" + "@babel/preset-react" "^7.12.13" + "@babel/runtime" "^7.15.4" + "@rails/ujs" "^6.1.3" + "@rails/webpacker" "6.0.0-rc.5" + autoprefixer "^10.4.1" + babel-loader "^8.2.2" + compression-webpack-plugin "^9.0.0" + css-loader "^6.5.1" + expose-loader "^2.0.0" + glob "^7.2.0" + js-yaml "^4.1.0" + mini-css-extract-plugin "^2.4.5" + path-complete-extname "^1.0.0" + pnp-webpack-plugin "^1.7.0" + postcss "^8.4.5" + postcss-flexbugs-fixes "^5.0.2" + postcss-import "^14.0.2" + postcss-loader "^6.2.1" + postcss-preset-env "^7.1.0" + postcss-scss "^4.0.2" + sass-embedded "^1.49.9" + source-map-loader "^0.2.4" + style-loader "^3.0.0" + terser-webpack-plugin "^5.2.4" + webpack "^5.53.0" + webpack-assets-manifest "^5.0.6" + webpack-cli "^4.8.0" + webpack-merge "^5.8.0" + webpack-sources "^3.2.1" + workbox-recipes "^6.4.2" + workbox-webpack-plugin "^6.4.2" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz" + integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@rails/ujs@^6.1.3": + version "6.1.7" + resolved "https://registry.npmjs.org/@rails/ujs/-/ujs-6.1.7.tgz" + integrity sha512-0e7WQ4LE/+LEfW2zfAw9ppsB6A8RmxbdAUPAF++UT80epY+7emuQDkKXmaK0a9lp6An50RvzezI0cIQjp1A58w== + +"@rails/webpacker@6.0.0-rc.5": + version "6.0.0-rc.5" + resolved "https://registry.npmjs.org/@rails/webpacker/-/webpacker-6.0.0-rc.5.tgz" + integrity sha512-GOEhRs+mRRVZIiZbnLQ1WTxRCuu687rO4cvUVP7WMJ+z5uFr3EQkCaLq5VOtonWHzYbZIBEWH4rCWv0uZnrywQ== + dependencies: + "@babel/core" "^7.15.0" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-transform-runtime" "^7.15.0" + "@babel/preset-env" "^7.15.0" + "@babel/runtime" "^7.15.3" + babel-loader "^8.2.2" + compression-webpack-plugin "^8.0.1" + glob "^7.1.7" + js-yaml "^4.1.0" + path-complete-extname "^1.0.0" + pnp-webpack-plugin "^1.7.0" + terser-webpack-plugin "^5.1.4" + webpack "^5.51.1" + webpack-assets-manifest "^5.0.6" + webpack-cli "^4.8.0" + webpack-merge "^5.8.0" + webpack-sources "^3.2.0" + +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-replace@^2.4.1": + version "2.4.2" + resolved "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@stylelint/postcss-css-in-js@^0.37.2": + version "0.37.3" + resolved "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.3.tgz" + integrity sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg== + dependencies: + "@babel/core" "^7.17.9" + +"@stylelint/postcss-markdown@^0.36.2": + version "0.36.2" + resolved "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz" + integrity sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ== + dependencies: + remark "^13.0.0" + unist-util-find-all-after "^3.0.2" + +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.40.0" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz" + integrity sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mdast@^3.0.0": + version "3.0.15" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== + dependencies: + "@types/unist" "^2" + +"@types/minimist@^1.2.0": + version "1.2.5" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== + +"@types/node@*": + version "20.2.5" + resolved "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz" + integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== + +"@types/normalize-package-data@^2.4.0": + version "2.4.4" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/trusted-types@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz" + integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + +"@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.11" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== + +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8, acorn@^8.7.1: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +acorn@^8.8.2: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.6.0, ajv@>=8: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.8.2, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^2.5.0: + version "2.6.4" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.4.1, autoprefixer@^10.4.13: + version "10.4.14" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +autoprefixer@^9.8.6: + version "9.8.8" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + picocolors "^0.2.1" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.1.4, axe-core@^4.6.2: + version "4.7.2" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz" + integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== + +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" + +babel-loader@^8.2.2: + version "8.3.0" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-polyfill-corejs2@^0.4.3: + version "0.4.3" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz" + integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.4.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz" + integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.0" + core-js-compat "^3.30.1" + +babel-plugin-polyfill-regenerator@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz" + integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.0" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, "browserslist@>= 4.21.0": + version "4.21.7" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz" + integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== + dependencies: + caniuse-lite "^1.0.30001489" + electron-to-chromium "^1.4.411" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + +buffer-builder@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz" + integrity sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001489: + version "1.0.30001494" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001494.tgz" + integrity sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-regexp@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz" + integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== + dependencies: + is-regexp "^2.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colorette@^2.0.14: + version "2.0.20" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compression-webpack-plugin@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-8.0.1.tgz" + integrity sha512-VWDXcOgEafQDMFXEnoia0VBXJ+RMw81pmqe/EBiOIBnMfY8pG26eqwIS/ytGpzy1rozydltL0zL6KDH9XNWBxQ== + dependencies: + schema-utils "^3.0.0" + serialize-javascript "^6.0.0" + +compression-webpack-plugin@^9.0.0: + version "9.2.0" + resolved "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-9.2.0.tgz" + integrity sha512-R/Oi+2+UHotGfu72fJiRoVpuRifZT0tTC6UqFD/DUo+mv8dbOow9rVOuTvDv5nPPm3GZhHL/fKkwxwIHnJ8Nyw== + dependencies: + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +core-js-compat@^3.30.1, core-js-compat@^3.30.2: + version "3.30.2" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz" + integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== + dependencies: + browserslist "^4.21.5" + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== + dependencies: + postcss-selector-parser "^6.0.9" + +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== + dependencies: + postcss-selector-parser "^6.0.9" + +css-loader@^6.5.1: + version "6.8.1" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.21" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.3" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== + +cssdb@^7.1.0: + version "7.6.0" + resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.6.0.tgz" + integrity sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +deep-equal@^2.0.5: + version "2.2.1" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz" + integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.0" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.0, deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domelementtype@^1.3.1, domelementtype@1: + version "1.3.1" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +ejs@^3.1.6: + version "3.1.9" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.411: + version "1.4.419" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.419.tgz" + integrity sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +enhanced-resolve@^5.14.1: + version "5.14.1" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz" + integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-module-lexer@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz" + integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild-loader@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.0.3.tgz" + integrity sha512-YpaSRisj7TSg6maKKKG9OJGGm0BZ7EXeov8J8cXEYdugjlAJ0wL7aj2JactoQvPJ113v2Ar204pdJWrZsAQc8Q== + dependencies: + esbuild "^0.19.0" + get-tsconfig "^4.7.0" + loader-utils "^2.0.4" + webpack-sources "^1.4.3" + +esbuild@^0.19.0, esbuild@^0.19.12: + version "0.19.12" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.2.0: + version "8.8.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== + +eslint-config-standard@^11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz" + integrity sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw== + +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.22.0, eslint-plugin-import@>=2.8.0: + version "2.27.5" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jsx-a11y@^6.3.1: + version "6.7.1" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + +eslint-plugin-node@^11.1.0, eslint-plugin-node@>=5.2.1: + version "11.1.0" + resolved "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-promise@^3.8.0, eslint-plugin-promise@>=3.6.0: + version "3.8.0" + resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz" + integrity sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ== + +eslint-plugin-react@^7.20.6: + version "7.32.2" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + +eslint-plugin-standard@^3.1.0, eslint-plugin-standard@>=3.0.1: + version "3.1.0" + resolved "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz" + integrity sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w== + +eslint-scope@^5.1.1, eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", eslint@^7.25.0, "eslint@^7.5.0 || ^8.0.0", eslint@>=3.19.0, eslint@>=4.18.0, eslint@>=4.19.1, eslint@>=5.16.0, eslint@>=7.0.0: + version "7.32.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execall@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz" + integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== + dependencies: + clone-regexp "^2.1.0" + +expose-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/expose-loader/-/expose-loader-2.0.0.tgz" + integrity sha512-WBpSGlNkn7YwbU2us7O+h0XsoFrB43Y/VCNSpRV4OZFXXKgw8W800BgNxLV0S97N3+KGnFYSCAJi1AV86NO22w== + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.5, fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.0, file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-tsconfig@^4.7.0: + version "4.10.1" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz" + integrity sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3, glob@^7.1.6, glob@^7.1.7, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.6.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globals@^13.9.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.2: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz" + integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== + +gonzales-pe@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== + dependencies: + minimist "^1.2.5" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +html-tags@^3.1.0: + version "3.3.1" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +htmlparser2@^3.10.0: + version "3.10.1" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +ignore@^5.1.8: + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +ignore@^5.2.0: + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +immutable@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz" + integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.1, inherits@^2.0.3, inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + 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.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-regexp@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz" + integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpointer@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klona@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +known-css-properties@^0.21.0: + version "0.21.0" + resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz" + integrity sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw== + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^1.1.0: + version "1.4.2" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0, loader-utils@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lockfile@^1.0: + version "1.0.4" + resolved "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz" + integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== + dependencies: + signal-exit "^3.0.2" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.get@^4.0: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + +lodash.has@^4.0: + version "4.5.2" + resolved "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz" + integrity sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@^4.17.14, lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +longest-streak@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz" + integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-to-markdown@^0.6.0: + version "0.6.5" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz" + integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz" + integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize "^1.2.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromark@~2.11.0: + version "2.11.4" + resolved "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-css-extract-plugin@^2.4.5: + version "2.7.6" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== + dependencies: + schema-utils "^4.0.0" + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" + 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-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-selector@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz" + integrity sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw== + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" + integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-complete-extname@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/path-complete-extname/-/path-complete-extname-1.0.0.tgz" + integrity sha512-CVjiWcMRdGU8ubs08YQVzhutOR5DEfO97ipRIlOGMK5Bek5nQySknBpuxVAVJ36hseTNs+vdIcv57ZrWxH7zvg== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pnp-webpack-plugin@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz" + integrity sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg== + dependencies: + ts-pnp "^1.1.6" + +postcss-attribute-case-insensitive@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz" + integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^4.2.4: + version "4.2.4" + resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz" + integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-hex-alpha@^8.0.4: + version "8.0.4" + resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz" + integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz" + integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-media@^8.0.2: + version "8.0.2" + resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz" + integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-properties@^12.1.10: + version "12.1.11" + resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz" + integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz" + integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.5: + version "6.0.5" + resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz" + integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-double-position-gradients@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz" + integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== + +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== + +postcss-html@^0.36.0: + version "0.36.0" + resolved "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz" + integrity sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw== + dependencies: + htmlparser2 "^3.10.0" + +postcss-image-set-function@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz" + integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-import@^14.0.2: + version "14.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-lab-function@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz" + integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-less@^3.1.4: + version "3.1.4" + resolved "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz" + integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA== + dependencies: + postcss "^7.0.14" + +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-logical@^5.0.4: + version "5.0.4" + resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz" + integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nesting@^10.2.0: + version "10.2.0" + resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz" + integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +postcss-opacity-percentage@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== + +postcss-overflow-shorthand@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz" + integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^7.0.5: + version "7.0.5" + resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz" + integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^7.1.0: + version "7.8.3" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz" + integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== + dependencies: + "@csstools/postcss-cascade-layers" "^1.1.1" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.13" + browserslist "^4.21.4" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.1.0" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.10" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.2.0" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz" + integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-resolve-nested-selector@^0.1.1: + version "0.1.6" + resolved "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz" + integrity sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw== + +postcss-safe-parser@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz" + integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== + dependencies: + postcss "^7.0.26" + +postcss-sass@^0.4.4: + version "0.4.4" + resolved "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz" + integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg== + dependencies: + gonzales-pe "^4.3.0" + postcss "^7.0.21" + +postcss-scss@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz" + integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA== + dependencies: + postcss "^7.0.6" + +postcss-scss@^4.0.2: + version "4.0.6" + resolved "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz" + integrity sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ== + +postcss-selector-not@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz" + integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.9: + version "6.0.13" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-syntax@^0.36.2, postcss-syntax@>=0.36.0, postcss-syntax@>=0.36.2: + version "0.36.2" + resolved "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz" + integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w== + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1.0, postcss@^8.1.4, postcss@^8.2, postcss@^8.3, postcss@^8.4, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.5, postcss@^8.4.6, postcss@>=5.0.0, postcss@>=7.0.0: + version "8.4.24" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^7.0.14: + version "7.0.39" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^7.0.2: + version "7.0.39" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^7.0.21: + version "7.0.39" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^7.0.26: + version "7.0.39" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.6: + version "7.0.39" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: + version "5.6.0" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^3.1.1: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + +remark-stringify@^9.0.0: + version "9.0.1" + resolved "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz" + integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg== + dependencies: + mdast-util-to-markdown "^0.6.0" + +remark@^13.0.0: + version "13.0.0" + resolved "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz" + integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA== + dependencies: + remark-parse "^9.0.0" + remark-stringify "^9.0.0" + unified "^9.1.0" + +repeat-string@^1.0.0: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.9.0: + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^2.0.0, rollup@^2.43.1: + version "2.79.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.4.0: + version "7.8.1" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +sass-embedded-darwin-x64@1.62.0: + version "1.62.0" + resolved "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.62.0.tgz" + integrity sha512-2sBQ4uWjZbf8TKXF8Aq7N0p5V2tKUr4zX9gQAiKvm1NBYwsW22+m8D34heOWu50ikpIxebvt7i/z7hafH5kzKg== + +sass-embedded@^1.49.9: + version "1.62.0" + resolved "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.62.0.tgz" + integrity sha512-SwTIG6UmrMiT94/v8G+2pPf6i+XwY4hOQxm8HZl0ld0st2KdGDj/SBXDznFl7+sJ6tFq6hvVvrB9rW5Nj7EhuQ== + dependencies: + "@bufbuild/protobuf" "^1.0.0" + buffer-builder "^0.2.0" + immutable "^4.0.0" + rxjs "^7.4.0" + supports-color "^8.1.1" + optionalDependencies: + sass-embedded-darwin-arm64 "1.62.0" + sass-embedded-darwin-x64 "1.62.0" + sass-embedded-linux-arm "1.62.0" + sass-embedded-linux-arm64 "1.62.0" + sass-embedded-linux-ia32 "1.62.0" + sass-embedded-linux-x64 "1.62.0" + sass-embedded-win32-ia32 "1.62.0" + sass-embedded-win32-x64 "1.62.0" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0: + version "3.1.2" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.1.2" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz" + integrity sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1: + version "7.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.4: + version "7.6.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +semver@^7.3.5: + version "7.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.8: + version "7.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +"semver@2 || 3 || 4 || 5": + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@^0.2.4: + version "0.2.4" + resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz" + integrity sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ== + dependencies: + async "^2.5.0" + loader-utils "^1.1.0" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + 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.20" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + +specificity@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz" + integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@^3.0.0: + version "3.3.3" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz" + integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== + +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz" + integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== + +stylelint@13.11.0: + version "13.11.0" + resolved "https://registry.npmjs.org/stylelint/-/stylelint-13.11.0.tgz" + integrity sha512-DhrKSWDWGZkCiQMtU+VroXM6LWJVC8hSK24nrUngTSQvXGK75yZUq4yNpynqrxD3a/fzKMED09V+XxO4z4lTbw== + dependencies: + "@stylelint/postcss-css-in-js" "^0.37.2" + "@stylelint/postcss-markdown" "^0.36.2" + autoprefixer "^9.8.6" + balanced-match "^1.0.0" + chalk "^4.1.0" + cosmiconfig "^7.0.0" + debug "^4.3.1" + execall "^2.0.0" + fast-glob "^3.2.5" + fastest-levenshtein "^1.0.12" + file-entry-cache "^6.0.0" + get-stdin "^8.0.0" + global-modules "^2.0.0" + globby "^11.0.2" + globjoin "^0.1.4" + html-tags "^3.1.0" + ignore "^5.1.8" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + known-css-properties "^0.21.0" + lodash "^4.17.20" + log-symbols "^4.0.0" + mathml-tag-names "^2.1.3" + meow "^9.0.0" + micromatch "^4.0.2" + normalize-selector "^0.2.0" + postcss "^7.0.35" + postcss-html "^0.36.0" + postcss-less "^3.1.4" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^4.0.2" + postcss-sass "^0.4.4" + postcss-scss "^2.1.1" + postcss-selector-parser "^6.0.4" + postcss-syntax "^0.36.2" + postcss-value-parser "^4.1.0" + resolve-from "^5.0.0" + slash "^3.0.0" + specificity "^0.4.1" + string-width "^4.2.0" + strip-ansi "^6.0.0" + style-search "^0.1.0" + sugarss "^2.0.0" + svg-tags "^1.0.0" + table "^6.0.7" + v8-compile-cache "^2.2.0" + write-file-atomic "^3.0.3" + +sugarss@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz" + integrity sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ== + dependencies: + postcss "^7.0.2" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + +table@^6.0.7, table@^6.0.9: + version "6.8.1" + resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +tapable@^2.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== + dependencies: + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +terser-webpack-plugin@^5.1.4, terser-webpack-plugin@^5.2.4, terser-webpack-plugin@^5.3.7: + version "5.3.9" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.8" + +terser@^5.0.0, terser@^5.16.8: + version "5.17.7" + resolved "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz" + integrity sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.1.0: + version "2.5.3" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz" + integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unified@^9.1.0: + version "9.2.2" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-util-find-all-after@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz" + integrity sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ== + dependencies: + unist-util-is "^4.0.0" + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +upath@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-assets-manifest@^5.0.6: + version "5.1.0" + resolved "https://registry.npmjs.org/webpack-assets-manifest/-/webpack-assets-manifest-5.1.0.tgz" + integrity sha512-kPuTMEjBrqZQVJ5M6yXNBCEdFbQQn7p+loNXt8NOeDFaAbsNFWqqwR0YL1mfG5LbwhK5FLXWXpuK3GuIIZ46rg== + dependencies: + chalk "^4.0" + deepmerge "^4.0" + lockfile "^1.0" + lodash.get "^4.0" + lodash.has "^4.0" + schema-utils "^3.0" + tapable "^2.0" + +webpack-cli@^4.8.0, webpack-cli@4.x.x: + version "4.10.0" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-merge@^5.7.3, webpack-merge@^5.8.0: + version "5.9.0" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^3.2.0, webpack-sources@^3.2.1, webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +"webpack@^4.4.0 || ^5.9.0", "webpack@^4.40.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.2.0, webpack@^5.51.1, webpack@^5.53.0, webpack@>=2, "webpack@4.x.x || 5.x.x": + version "5.85.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.85.0.tgz" + integrity sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.14.1" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.2" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workbox-background-sync@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz" + integrity sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw== + dependencies: + idb "^7.0.1" + workbox-core "6.6.0" + +workbox-broadcast-update@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz" + integrity sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q== + dependencies: + workbox-core "6.6.0" + +workbox-build@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz" + integrity sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "6.6.0" + workbox-broadcast-update "6.6.0" + workbox-cacheable-response "6.6.0" + workbox-core "6.6.0" + workbox-expiration "6.6.0" + workbox-google-analytics "6.6.0" + workbox-navigation-preload "6.6.0" + workbox-precaching "6.6.0" + workbox-range-requests "6.6.0" + workbox-recipes "6.6.0" + workbox-routing "6.6.0" + workbox-strategies "6.6.0" + workbox-streams "6.6.0" + workbox-sw "6.6.0" + workbox-window "6.6.0" + +workbox-cacheable-response@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz" + integrity sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw== + dependencies: + workbox-core "6.6.0" + +workbox-core@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz" + integrity sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ== + +workbox-expiration@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz" + integrity sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw== + dependencies: + idb "^7.0.1" + workbox-core "6.6.0" + +workbox-google-analytics@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz" + integrity sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q== + dependencies: + workbox-background-sync "6.6.0" + workbox-core "6.6.0" + workbox-routing "6.6.0" + workbox-strategies "6.6.0" + +workbox-navigation-preload@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz" + integrity sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q== + dependencies: + workbox-core "6.6.0" + +workbox-precaching@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz" + integrity sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw== + dependencies: + workbox-core "6.6.0" + workbox-routing "6.6.0" + workbox-strategies "6.6.0" + +workbox-range-requests@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz" + integrity sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw== + dependencies: + workbox-core "6.6.0" + +workbox-recipes@^6.4.2, workbox-recipes@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz" + integrity sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A== + dependencies: + workbox-cacheable-response "6.6.0" + workbox-core "6.6.0" + workbox-expiration "6.6.0" + workbox-precaching "6.6.0" + workbox-routing "6.6.0" + workbox-strategies "6.6.0" + +workbox-routing@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz" + integrity sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw== + dependencies: + workbox-core "6.6.0" + +workbox-strategies@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz" + integrity sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ== + dependencies: + workbox-core "6.6.0" + +workbox-streams@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz" + integrity sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg== + dependencies: + workbox-core "6.6.0" + workbox-routing "6.6.0" + +workbox-sw@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz" + integrity sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ== + +workbox-webpack-plugin@^6.4.2: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz" + integrity sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A== + dependencies: + fast-json-stable-stringify "^2.1.0" + pretty-bytes "^5.4.1" + upath "^1.2.0" + webpack-sources "^1.4.3" + workbox-build "6.6.0" + +workbox-window@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz" + integrity sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw== + dependencies: + "@types/trusted-types" "^2.0.2" + workbox-core "6.6.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==