diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 09f040ac6..27f0d2396 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,8 +1,7 @@ name: CI on: - pull_request: - branches: [ master ] + push: jobs: rubocop: @@ -11,7 +10,7 @@ jobs: - uses: actions/checkout@v2 - uses: ruby/setup-ruby@v1 with: - ruby-version: 2.7.2 + ruby-version: 3.2.2 bundler-cache: true cache-version: 1 - name: Run rubocop @@ -41,6 +40,7 @@ jobs: RAILS_ENV: test DATABASE_URL: postgres://test:password@localhost:5432/zero_waste_test USE_STATIC_ASSETS: true + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} steps: - uses: actions/checkout@v2 @@ -48,7 +48,7 @@ jobs: - name: Set up Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: 2.7.2 + ruby-version: 3.2.2 bundler-cache: true - uses: actions/setup-node@v1 diff --git a/.gitignore b/.gitignore index 6e867a46b..58d3b79e6 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,10 @@ !/log/.keep !/tmp/.keep +# Ignore backups files +/db/backups/archive/* +!/db/backups/archive/.keep + # Ignore pidfiles, but keep the directory. /tmp/pids/* !/tmp/pids/ @@ -57,3 +61,10 @@ yarn-debug.log* # Ignore coverage folder generated by SimpleCov gem coverage + +# Ignore because it can cause conflicts and is not necessary to be tracked +package-lock.json + +# Ignore built assets generated by Tailwind CSS during compilation process +/app/assets/builds/* +!/app/assets/builds/.keep diff --git a/.ruby-version b/.ruby-version index 2eb2fe97a..9e79f6c4a 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -ruby-2.7.2 +ruby-3.2.2 diff --git a/Dockerfile b/Dockerfile index f387a6b97..050de41d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:2.7.2 +FROM ruby:3.2.2 ENV BUNDLER_VERSION=2.2.8 diff --git a/Gemfile b/Gemfile index 566af39eb..e1b737c6c 100644 --- a/Gemfile +++ b/Gemfile @@ -3,28 +3,37 @@ source "https://rubygems.org" git_source(:github) { |repo| "https://github.com/#{repo}.git" } -ruby "2.7.2" +ruby "3.2.2" +gem "mutex_m", "0.1.2" gem "cancancan", "~> 3.3" gem "jbuilder", "~> 2.7" +gem "kaminari" gem "pg", "~> 1.1" gem "puma", "~> 5.0" -gem "rails", "~> 6.1.3", ">= 6.1.3.1" +gem "rails", "~> 7.1", ">= 7.1.2" gem "redis", "~> 4.0" gem "sass-rails", ">= 6" -gem "turbolinks", "~> 5" -gem "webpacker", "~> 5.4" +gem "hotwire-rails" +gem "importmap-rails", "~> 1.1" +gem "bootstrap" +gem "jquery-rails" # Use Active Model has_secure_password # gem 'bcrypt', '~> 3.1.7' gem "acts_as_singleton" gem "friendly_id", "~> 5.4.0" +gem "babosa" gem "dentaku", "~> 3.1" gem "it" -gem "country_select", "~> 4.0" +gem "rugged", "1.6.3" -gem "bigdecimal", "1.3.5" +gem "net-smtp" + +gem "country_select" + +gem "bigdecimal", "3.0.2" gem "rails-i18n", "~> 7.0.0" # Use Active Storage variant @@ -32,18 +41,19 @@ gem "image_processing", "~> 1.2" # Reduces boot times through caching; required in config/boot.rb gem "bootsnap", ">= 1.4.4", require: false +gem "tailwindcss-rails", "~> 2.0" gem "active_storage_validations" -gem "font-awesome-rails" +gem "font-awesome-sass", "~> 6.4" gem "mini_magick", ">= 4.9.5" +gem "factory_bot_rails" # TODO: create ENV staging and use it for this group :development, :test do gem "annotate" gem "dotenv-rails", require: "dotenv/rails-now" - gem "factory_bot_rails" gem "pry-rails" gem "rails-controller-testing" - gem "rspec-rails", "~> 5.0.0" + gem "rspec-rails" end group :development, :test, :ci do @@ -63,6 +73,14 @@ group :development do gem "rack-mini-profiler", "~> 2.0" gem "spring" gem "web-console", ">= 4.1.0" + # deploy + gem "capistrano", "~> 3.11" + gem "capistrano-rails", "~> 1.4" + gem "capistrano-passenger", "~> 0.2.0" + gem "capistrano-rbenv", "~> 2.1", ">= 2.1.4" + gem "capistrano-yarn" + gem "capistrano-rails-tail-log" + gem "ed25519" end # group :ci do @@ -75,32 +93,29 @@ group :test do gem "database_cleaner-active_record" gem "selenium-webdriver" gem "simplecov", require: false - gem "shoulda-matchers", "~> 4.0" - gem "webdrivers" + gem "shoulda-matchers" + gem "webdrivers", "~> 5.3.1" gem "fuubar" end gem "active_model_serializers", "~> 0.10.0" gem "any_login" -gem "cocoon" gem "devise" gem "devise-async" gem "faker" gem "omniauth", "~> 1.9.1" gem "omniauth-facebook" gem "omniauth-google-oauth2" -gem "paper_trail" +gem "paper_trail", "~> 15.0" gem "sidekiq" gem "simple_form" gem "slim-rails" -gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] - -# deploy -gem "capistrano", "~> 3.11" -gem "capistrano-rails", "~> 1.4" -gem "capistrano-passenger", "~> 0.2.0" -gem "capistrano-rbenv", "~> 2.1", ">= 2.1.4" -gem "capistrano-yarn" -gem "capistrano-rails-tail-log" -gem "ed25519" gem "stimulus-rails" +gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] +gem "requestjs-rails" +gem "flipper" +gem "flipper-active_record" +gem "ransack" +gem "rails_db", "~> 2.4" +gem "meta-tags" +gem "inline_svg" diff --git a/Gemfile.lock b/Gemfile.lock index 1b3adeba0..600e65e32 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,47 +1,58 @@ GEM remote: https://rubygems.org/ specs: - actioncable (6.1.4.4) - actionpack (= 6.1.4.4) - activesupport (= 6.1.4.4) + actioncable (7.1.2) + actionpack (= 7.1.2) + activesupport (= 7.1.2) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.4.4) - actionpack (= 6.1.4.4) - activejob (= 6.1.4.4) - activerecord (= 6.1.4.4) - activestorage (= 6.1.4.4) - activesupport (= 6.1.4.4) + zeitwerk (~> 2.6) + actionmailbox (7.1.2) + actionpack (= 7.1.2) + activejob (= 7.1.2) + activerecord (= 7.1.2) + activestorage (= 7.1.2) + activesupport (= 7.1.2) mail (>= 2.7.1) - actionmailer (6.1.4.4) - actionpack (= 6.1.4.4) - actionview (= 6.1.4.4) - activejob (= 6.1.4.4) - activesupport (= 6.1.4.4) + net-imap + net-pop + net-smtp + actionmailer (7.1.2) + actionpack (= 7.1.2) + actionview (= 7.1.2) + activejob (= 7.1.2) + activesupport (= 7.1.2) mail (~> 2.5, >= 2.5.4) - rails-dom-testing (~> 2.0) - actionpack (6.1.4.4) - actionview (= 6.1.4.4) - activesupport (= 6.1.4.4) - rack (~> 2.0, >= 2.0.9) + net-imap + net-pop + net-smtp + rails-dom-testing (~> 2.2) + actionpack (7.1.2) + actionview (= 7.1.2) + activesupport (= 7.1.2) + nokogiri (>= 1.8.5) + racc + rack (>= 2.2.4) + rack-session (>= 1.0.1) rack-test (>= 0.6.3) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.4.4) - actionpack (= 6.1.4.4) - activerecord (= 6.1.4.4) - activestorage (= 6.1.4.4) - activesupport (= 6.1.4.4) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + actiontext (7.1.2) + actionpack (= 7.1.2) + activerecord (= 7.1.2) + activestorage (= 7.1.2) + activesupport (= 7.1.2) + globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (6.1.4.4) - activesupport (= 6.1.4.4) + actionview (7.1.2) + activesupport (= 7.1.2) builder (~> 3.1) - erubi (~> 1.4) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.1, >= 1.2.0) - active_model_serializers (0.10.12) - actionpack (>= 4.1, < 6.2) - activemodel (>= 4.1, < 6.2) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + active_model_serializers (0.10.14) + actionpack (>= 4.1) + activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) active_storage_validations (0.9.6) @@ -49,31 +60,35 @@ GEM activemodel (>= 5.2.0) activestorage (>= 5.2.0) activesupport (>= 5.2.0) - activejob (6.1.4.4) - activesupport (= 6.1.4.4) + activejob (7.1.2) + activesupport (= 7.1.2) globalid (>= 0.3.6) - activemodel (6.1.4.4) - activesupport (= 6.1.4.4) - activerecord (6.1.4.4) - activemodel (= 6.1.4.4) - activesupport (= 6.1.4.4) - activestorage (6.1.4.4) - actionpack (= 6.1.4.4) - activejob (= 6.1.4.4) - activerecord (= 6.1.4.4) - activesupport (= 6.1.4.4) - marcel (~> 1.0.0) - mini_mime (>= 1.1.0) - activesupport (6.1.4.4) + activemodel (7.1.2) + activesupport (= 7.1.2) + activerecord (7.1.2) + activemodel (= 7.1.2) + activesupport (= 7.1.2) + timeout (>= 0.4.0) + activestorage (7.1.2) + actionpack (= 7.1.2) + activejob (= 7.1.2) + activerecord (= 7.1.2) + activesupport (= 7.1.2) + marcel (~> 1.0) + activesupport (7.1.2) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) minitest (>= 5.1) + mutex_m tzinfo (~> 2.0) - zeitwerk (~> 2.3) acts_as_singleton (0.0.8) activerecord (>= 3.1.0) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.5) + public_suffix (>= 2.0.2, < 6.0) airbrussh (1.4.1) sshkit (>= 1.6.1, != 1.7.0) annotate (3.2.0) @@ -82,11 +97,19 @@ GEM any_login (1.5.2) rails (>= 6.0) ast (2.4.2) - bcrypt (3.1.16) - bigdecimal (1.3.5) + autoprefixer-rails (10.4.15.0) + execjs (~> 2) + babosa (2.0.0) + base64 (0.2.0) + bcrypt (3.1.20) + bigdecimal (3.0.2) bindex (0.8.1) bootsnap (1.9.3) msgpack (~> 1.0) + bootstrap (5.3.2) + autoprefixer-rails (>= 9.1.0) + popper_js (>= 2.11.8, < 3) + brow (0.4.1) builder (3.2.4) cancancan (3.3.0) capistrano (3.17.1) @@ -109,7 +132,7 @@ GEM sshkit (~> 1.3) capistrano-yarn (2.0.2) capistrano (~> 3.0) - capybara (3.36.0) + capybara (3.39.2) addressable matrix mini_mime (>= 0.1.3) @@ -120,28 +143,24 @@ GEM xpath (~> 3.2) case_transform (0.2) activesupport - childprocess (4.1.0) - cocoon (1.2.15) codecov (0.6.0) simplecov (>= 0.15, < 0.22) coderay (1.1.3) - concurrent-ruby (1.1.9) - connection_pool (2.2.5) - countries (3.1.0) - i18n_data (~> 0.11.0) - sixarm_ruby_unaccent (~> 1.1) - unicode_utils (~> 1.4) - country_select (4.0.0) - countries (~> 3.0) - sort_alphabetical (~> 1.0) + concurrent-ruby (1.2.2) + connection_pool (2.4.1) + countries (5.7.0) + unaccent (~> 0.3) + country_select (8.0.3) + countries (~> 5.0) crass (1.0.6) - database_cleaner-active_record (2.0.1) + database_cleaner-active_record (2.1.0) activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) + date (3.3.4) dentaku (3.4.2) concurrent-ruby - devise (4.8.1) + devise (4.9.3) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) @@ -156,8 +175,11 @@ GEM dotenv-rails (2.7.6) dotenv (= 2.7.6) railties (>= 3.2) + drb (2.2.0) + ruby2_keywords ed25519 (1.3.0) - erubi (1.10.0) + erubi (1.12.0) + execjs (2.9.1) factory_bot (6.2.0) activesupport (>= 5.0.0) factory_bot_rails (6.2.0) @@ -184,10 +206,16 @@ GEM faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) faraday-rack (1.0.0) - ffi (1.15.4) - ffi (1.15.4-x64-mingw32) - font-awesome-rails (4.7.0.8) - railties (>= 3.2, < 8.0) + ffi (1.16.3) + ffi (1.16.3-x64-mingw32) + flipper (1.0.0) + brow (~> 0.4.1) + concurrent-ruby (< 2) + flipper-active_record (1.0.0) + activerecord (>= 4.2, < 8) + flipper (~> 1.0.0) + font-awesome-sass (6.4.0) + sassc (~> 2.0) friendly_id (5.4.2) activerecord (>= 4.0.0) fuubar (2.5.1) @@ -196,26 +224,55 @@ GEM gitlab (4.17.0) httparty (~> 0.18) terminal-table (~> 1.5, >= 1.5.1) - globalid (1.0.0) - activesupport (>= 5.0) + globalid (1.2.1) + activesupport (>= 6.1) hashie (5.0.0) + hotwire-rails (0.1.3) + rails (>= 6.0.0) + stimulus-rails + turbo-rails httparty (0.20.0) mime-types (~> 3.0) multi_xml (>= 0.5.2) - i18n (1.8.11) + i18n (1.14.1) concurrent-ruby (~> 1.0) - i18n_data (0.11.0) image_processing (1.12.2) mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) + importmap-rails (1.1.6) + actionpack (>= 6.0.0) + railties (>= 6.0.0) + inline_svg (1.9.0) + activesupport (>= 3.0) + nokogiri (>= 1.6) + io-console (0.6.0) + irb (1.9.1) + rdoc + reline (>= 0.3.8) it (2.0.0) actionpack (>= 3.0.0) jbuilder (2.11.5) actionview (>= 5.0.0) activesupport (>= 5.0.0) + jquery-rails (4.6.0) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) json (2.6.3) jsonapi-renderer (0.2.2) jwt (2.3.0) + kaminari (1.2.2) + activesupport (>= 4.1.0) + kaminari-actionview (= 1.2.2) + kaminari-activerecord (= 1.2.2) + kaminari-core (= 1.2.2) + kaminari-actionview (1.2.2) + actionview + kaminari-core (= 1.2.2) + kaminari-activerecord (1.2.2) + activerecord + kaminari-core (= 1.2.2) + kaminari-core (1.2.2) language_server-protocol (3.17.0.2) launchy (2.5.0) addressable (~> 2.7) @@ -224,37 +281,46 @@ GEM listen (3.7.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.13.0) + loofah (2.22.0) crass (~> 1.0.2) - nokogiri (>= 1.5.9) - mail (2.7.1) + nokogiri (>= 1.12.0) + mail (2.8.1) mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp marcel (1.0.2) matrix (0.4.2) + meta-tags (2.20.0) + actionpack (>= 6.0.0, < 7.2) method_source (1.0.0) mime-types (3.4.1) mime-types-data (~> 3.2015) mime-types-data (3.2021.1115) mini_magick (4.11.0) - mini_mime (1.1.2) - mini_portile2 (2.6.1) - minitest (5.15.0) + mini_mime (1.1.5) + mini_portile2 (2.8.5) + minitest (5.20.0) msgpack (1.4.2) multi_json (1.15.0) multi_xml (0.6.0) multipart-post (2.1.1) + mutex_m (0.1.2) + net-imap (0.4.4) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout net-scp (4.0.0) net-ssh (>= 2.6.5, < 8.0.0) + net-smtp (0.4.0) + net-protocol net-ssh (7.0.1) - nio4r (2.5.8) - nokogiri (1.12.5) - mini_portile2 (~> 2.6.1) - racc (~> 1.4) - nokogiri (1.12.5-arm64-darwin) - racc (~> 1.4) - nokogiri (1.12.5-x64-mingw32) - racc (~> 1.4) - nokogiri (1.12.5-x86_64-linux) + nio4r (2.5.9) + nokogiri (1.15.5) + mini_portile2 (~> 2.8.2) racc (~> 1.4) oauth2 (1.4.7) faraday (>= 0.8, < 2.0) @@ -265,7 +331,7 @@ GEM octokit (4.21.0) faraday (>= 0.9) sawyer (~> 0.8.0, >= 0.5.3) - omniauth (1.9.1) + omniauth (1.9.2) hashie (>= 3.4.6) rack (>= 1.6.2, < 3) omniauth-facebook (9.0.0) @@ -279,101 +345,126 @@ GEM oauth2 (~> 1.4) omniauth (>= 1.9, < 3) orm_adapter (0.5.0) - paper_trail (12.2.0) - activerecord (>= 5.2) - request_store (~> 1.1) + paper_trail (15.1.0) + activerecord (>= 6.1) + request_store (~> 1.4) parallel (1.22.1) parser (3.1.3.0) ast (~> 2.4.1) - pg (1.2.3) - pg (1.2.3-x64-mingw32) - pronto (0.11.0) - gitlab (~> 4.4, >= 4.4.0) - httparty (>= 0.13.7) - octokit (~> 4.7, >= 4.7.0) + pg (1.5.4) + popper_js (2.11.8) + pronto (0.11.2) + gitlab (>= 4.4.0, < 5.0) + httparty (>= 0.13.7, < 1.0) + octokit (>= 4.7.0, < 8.0) rainbow (>= 2.2, < 4.0) - rexml (~> 3.2) - rugged (>= 0.23.0, < 1.1.0) + rexml (>= 3.2.5, < 4.0) + rugged (>= 0.23.0, < 2.0) thor (>= 0.20.3, < 2.0) pry (0.14.1) coderay (~> 1.1) method_source (~> 1.0) pry-rails (0.3.9) pry (>= 0.10.4) - public_suffix (4.0.6) + psych (5.1.1.1) + stringio + public_suffix (5.0.3) puma (5.5.2) nio4r (~> 2.0) - racc (1.6.0) - rack (2.2.3) + racc (1.7.3) + rack (2.2.8) rack-mini-profiler (2.3.3) rack (>= 1.2.0) - rack-proxy (0.7.0) - rack - rack-test (1.1.0) - rack (>= 1.0, < 3) - rails (6.1.4.4) - actioncable (= 6.1.4.4) - actionmailbox (= 6.1.4.4) - actionmailer (= 6.1.4.4) - actionpack (= 6.1.4.4) - actiontext (= 6.1.4.4) - actionview (= 6.1.4.4) - activejob (= 6.1.4.4) - activemodel (= 6.1.4.4) - activerecord (= 6.1.4.4) - activestorage (= 6.1.4.4) - activesupport (= 6.1.4.4) + rack-session (1.0.1) + rack (< 3) + rack-test (2.1.0) + rack (>= 1.3) + rackup (1.0.0) + rack (< 3) + webrick + rails (7.1.2) + actioncable (= 7.1.2) + actionmailbox (= 7.1.2) + actionmailer (= 7.1.2) + actionpack (= 7.1.2) + actiontext (= 7.1.2) + actionview (= 7.1.2) + activejob (= 7.1.2) + activemodel (= 7.1.2) + activerecord (= 7.1.2) + activestorage (= 7.1.2) + activesupport (= 7.1.2) bundler (>= 1.15.0) - railties (= 6.1.4.4) - sprockets-rails (>= 2.0.0) + railties (= 7.1.2) 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.2) - loofah (~> 2.3) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) rails-i18n (7.0.3) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - railties (6.1.4.4) - actionpack (= 6.1.4.4) - activesupport (= 6.1.4.4) - method_source - rake (>= 0.13) - thor (~> 1.0) + rails_db (2.4.2) + activerecord + kaminari + rails (>= 5.0.0) + ransack (>= 2.3.2) + simple_form (>= 5.0.1) + terminal-table + railties (7.1.2) + actionpack (= 7.1.2) + activesupport (= 7.1.2) + irb + rackup (>= 1.0.0) + rake (>= 12.2) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) rainbow (3.0.0) - rake (13.0.6) + rake (13.1.0) + ransack (4.1.1) + activerecord (>= 6.1.5) + activesupport (>= 6.1.5) + i18n rb-fsevent (0.11.0) rb-inotify (0.10.1) ffi (~> 1.0) + rdoc (6.6.0) + psych (>= 4.0.0) redis (4.5.1) - regexp_parser (2.2.0) + regexp_parser (2.8.1) + reline (0.4.0) + 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-core (3.10.1) - rspec-support (~> 3.10.0) - rspec-expectations (3.10.1) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.10.0) - rspec-mocks (3.10.2) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.10.0) - rspec-rails (5.0.2) + requestjs-rails (0.0.10) + rails (>= 6.0.0) + responders (3.1.1) actionpack (>= 5.2) - activesupport (>= 5.2) railties (>= 5.2) - rspec-core (~> 3.10) - rspec-expectations (~> 3.10) - rspec-mocks (~> 3.10) - rspec-support (~> 3.10) - rspec-support (3.10.3) + rexml (3.2.6) + rspec-core (3.12.2) + rspec-support (~> 3.12.0) + rspec-expectations (3.12.3) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.12.0) + rspec-mocks (3.12.6) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.12.0) + rspec-rails (6.0.3) + actionpack (>= 6.1) + activesupport (>= 6.1) + railties (>= 6.1) + rspec-core (~> 3.12) + rspec-expectations (~> 3.12) + rspec-mocks (~> 3.12) + rspec-support (~> 3.12) + rspec-support (3.12.1) rubocop (1.39.0) json (~> 2.3) parallel (~> 1.10) @@ -400,7 +491,7 @@ GEM ffi (~> 1.12) ruby2_keywords (0.0.5) rubyzip (2.3.2) - rugged (1.0.1) + rugged (1.6.3) sass-rails (6.0.0) sassc-rails (~> 2.1, >= 2.1.1) sassc (2.4.0) @@ -416,18 +507,17 @@ GEM sawyer (0.8.2) addressable (>= 2.3.5) faraday (> 0.8, < 2.0) - selenium-webdriver (4.1.0) - childprocess (>= 0.5, < 5.0) + selenium-webdriver (4.10.0) rexml (~> 3.2, >= 3.2.5) - rubyzip (>= 1.2.2) - semantic_range (3.0.0) - shoulda-matchers (4.5.1) - activesupport (>= 4.2.0) + rubyzip (>= 1.2.2, < 3.0) + websocket (~> 1.0) + shoulda-matchers (5.3.0) + activesupport (>= 5.2.0) sidekiq (6.3.1) connection_pool (>= 2.2.2) rack (~> 2.0) redis (>= 4.2.0) - simple_form (5.1.0) + simple_form (5.3.0) actionpack (>= 5.2) activemodel (>= 5.2) simplecov (0.21.2) @@ -436,7 +526,6 @@ GEM simplecov_json_formatter (~> 0.1) simplecov-html (0.12.3) simplecov_json_formatter (0.1.4) - sixarm_ruby_unaccent (1.2.0) slim (4.1.0) temple (>= 0.7.6, < 0.9) tilt (>= 2.0.6, < 2.1) @@ -444,12 +533,10 @@ GEM actionpack (>= 3.1) railties (>= 3.1) slim (>= 3.0, < 5.0) - sort_alphabetical (1.1.0) - unicode_utils (>= 1.2.2) spring (4.0.0) - sprockets (4.0.2) + sprockets (4.2.1) concurrent-ruby (~> 1.0) - rack (> 1, < 3) + rack (>= 2.2.4, < 4) sprockets-rails (3.4.2) actionpack (>= 5.2) activesupport (>= 5.2) @@ -463,19 +550,32 @@ GEM rubocop-performance (= 1.15.1) stimulus-rails (1.2.1) railties (>= 6.0.0) + stringio (3.0.9) + tailwindcss-rails (2.0.27) + railties (>= 6.0.0) + tailwindcss-rails (2.0.27-arm64-darwin) + railties (>= 6.0.0) + tailwindcss-rails (2.0.27-x64-mingw32) + railties (>= 6.0.0) + tailwindcss-rails (2.0.27-x86_64-darwin) + railties (>= 6.0.0) + tailwindcss-rails (2.0.27-x86_64-linux) + railties (>= 6.0.0) temple (0.8.2) terminal-table (1.6.0) - thor (1.1.0) - tilt (2.0.10) - turbolinks (5.2.1) - turbolinks-source (~> 5.2) - turbolinks-source (5.2.0) - tzinfo (2.0.4) + thor (1.3.0) + tilt (2.0.11) + timeout (0.4.1) + turbo-rails (1.4.0) + actionpack (>= 6.0.0) + activejob (>= 6.0.0) + railties (>= 6.0.0) + tzinfo (2.0.6) concurrent-ruby (~> 1.0) tzinfo-data (1.2022.1) tzinfo (>= 1.0.0) + unaccent (0.4.0) unicode-display_width (2.3.0) - unicode_utils (1.4.0) warden (1.2.9) rack (>= 2.0.9) web-console (4.2.0) @@ -483,26 +583,24 @@ GEM activemodel (>= 6.0.0) bindex (>= 0.4.0) railties (>= 6.0.0) - webdrivers (5.0.0) + webdrivers (5.3.1) nokogiri (~> 1.6) rubyzip (>= 1.3.0) - selenium-webdriver (~> 4.0) - webpacker (5.4.3) - activesupport (>= 5.2) - rack-proxy (>= 0.6.1) - railties (>= 5.2) - semantic_range (>= 2.3.0) - websocket-driver (0.7.5) + selenium-webdriver (~> 4.0, < 4.11) + webrick (1.8.1) + websocket (1.2.10) + websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.5.1) + zeitwerk (2.6.12) PLATFORMS arm64-darwin-21 ruby x64-mingw32 + x86_64-darwin x86_64-linux DEPENDENCIES @@ -511,8 +609,10 @@ DEPENDENCIES acts_as_singleton annotate any_login - bigdecimal (= 1.3.5) + babosa + bigdecimal (= 3.0.2) bootsnap (>= 1.4.4) + bootstrap cancancan (~> 3.3) capistrano (~> 3.11) capistrano-passenger (~> 0.2.0) @@ -521,9 +621,8 @@ DEPENDENCIES capistrano-rbenv (~> 2.1, >= 2.1.4) capistrano-yarn capybara (>= 3.26) - cocoon codecov - country_select (~> 4.0) + country_select database_cleaner-active_record dentaku (~> 3.1) devise @@ -532,36 +631,50 @@ DEPENDENCIES ed25519 factory_bot_rails faker - font-awesome-rails + flipper + flipper-active_record + font-awesome-sass (~> 6.4) friendly_id (~> 5.4.0) fuubar + hotwire-rails image_processing (~> 1.2) + importmap-rails (~> 1.1) + inline_svg it jbuilder (~> 2.7) + jquery-rails + kaminari letter_opener listen (~> 3.3) + meta-tags mini_magick (>= 4.9.5) + mutex_m (= 0.1.2) + net-smtp omniauth (~> 1.9.1) omniauth-facebook omniauth-google-oauth2 - paper_trail + paper_trail (~> 15.0) pg (~> 1.1) pronto pry-rails puma (~> 5.0) rack-mini-profiler (~> 2.0) - rails (~> 6.1.3, >= 6.1.3.1) + rails (~> 7.1, >= 7.1.2) rails-controller-testing rails-i18n (~> 7.0.0) + rails_db (~> 2.4) + ransack redis (~> 4.0) - rspec-rails (~> 5.0.0) + requestjs-rails + rspec-rails rubocop (~> 1.39) rubocop-performance rubocop-rails rubocop-rspec + rugged (= 1.6.3) sass-rails (>= 6) selenium-webdriver - shoulda-matchers (~> 4.0) + shoulda-matchers sidekiq simple_form simplecov @@ -569,14 +682,13 @@ DEPENDENCIES spring standard (~> 1.0) stimulus-rails - turbolinks (~> 5) + tailwindcss-rails (~> 2.0) tzinfo-data web-console (>= 4.1.0) - webdrivers - webpacker (~> 5.4) + webdrivers (~> 5.3.1) RUBY VERSION - ruby 2.7.2p137 + ruby 3.2.2p53 BUNDLED WITH - 2.3.26 + 2.4.18 diff --git a/Procfile.dev b/Procfile.dev new file mode 100644 index 000000000..023e98a01 --- /dev/null +++ b/Procfile.dev @@ -0,0 +1,2 @@ +web: bin/rails server -p 3000 +css: bin/rails tailwindcss:watch diff --git a/README.md b/README.md index 4063c099c..a23d1f3e9 100644 --- a/README.md +++ b/README.md @@ -20,14 +20,14 @@ In order to attract attention to financial and ecological consequences of dispos - [Git-hook pre-commit](#Git-hook-pre-commit) ## Deployed Apps and Environments -The latest version from the 'develop' branch is automatically deployed to stage environment in Heroku, [staging link](https://zerowaste-staging.herokuapp.com/). -The latest version from the release branch 'master' is automatically deployed to Production environment, [production link](https://zero-waste-project.herokuapp.com/). +The latest version from the 'develop' branch is automatically deployed to stage environment in Render, [staging link](https://zero-waste-staging.onrender.com/). +The latest version from the release branch 'master' is automatically deployed to Production environment, [production link](http://calc.zerowastelviv.org.ua/). ## Installation * Start the project locally # Required to install -- Ruby 2.7.2 -- Ruby on Rails 6.1.3 +- Ruby 3.2.2 +- Ruby on Rails 7.1.2 - PostgreSQL 12 - Puma as a web server - Yarn @@ -68,6 +68,7 @@ $ `sudo apt-get install libpq-dev` then $ `gem install pg` + Database configure For correct operation of the migration, you need to rename the migration file `20220123171144_create_versions.rb` so that it is processed first. diff --git a/app/javascript/images/.keep b/app/assets/builds/.keep similarity index 100% rename from app/javascript/images/.keep rename to app/assets/builds/.keep diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js index 591819335..f2246c0db 100644 --- a/app/assets/config/manifest.js +++ b/app/assets/config/manifest.js @@ -1,2 +1,5 @@ //= link_tree ../images //= link_directory ../stylesheets .css +//= require bootstrap +//= link_tree ../builds +//= link_tree ../../javascript .js diff --git a/app/javascript/fonts/Comfortaa-Regular.eot b/app/assets/fonts/Comfortaa-Regular.eot similarity index 100% rename from app/javascript/fonts/Comfortaa-Regular.eot rename to app/assets/fonts/Comfortaa-Regular.eot diff --git a/app/javascript/fonts/Comfortaa-Regular.ttf b/app/assets/fonts/Comfortaa-Regular.ttf similarity index 100% rename from app/javascript/fonts/Comfortaa-Regular.ttf rename to app/assets/fonts/Comfortaa-Regular.ttf diff --git a/app/javascript/fonts/Comfortaa-Regular.woff b/app/assets/fonts/Comfortaa-Regular.woff similarity index 100% rename from app/javascript/fonts/Comfortaa-Regular.woff rename to app/assets/fonts/Comfortaa-Regular.woff diff --git a/app/javascript/fonts/Comfortaa-Regular.woff2 b/app/assets/fonts/Comfortaa-Regular.woff2 similarity index 100% rename from app/javascript/fonts/Comfortaa-Regular.woff2 rename to app/assets/fonts/Comfortaa-Regular.woff2 diff --git a/app/javascript/images/calculator.png b/app/assets/images/calculator.png similarity index 100% rename from app/javascript/images/calculator.png rename to app/assets/images/calculator.png diff --git a/app/javascript/images/diapers.png b/app/assets/images/diapers.png similarity index 100% rename from app/javascript/images/diapers.png rename to app/assets/images/diapers.png diff --git a/app/javascript/images/diapers_bought.png b/app/assets/images/diapers_bought.png similarity index 100% rename from app/javascript/images/diapers_bought.png rename to app/assets/images/diapers_bought.png diff --git a/app/assets/images/diapers_bought_2.png b/app/assets/images/diapers_bought_2.png new file mode 100644 index 000000000..5c41b317c Binary files /dev/null and b/app/assets/images/diapers_bought_2.png differ diff --git a/app/javascript/images/diapers_to_buy.png b/app/assets/images/diapers_to_buy.png similarity index 100% rename from app/javascript/images/diapers_to_buy.png rename to app/assets/images/diapers_to_buy.png diff --git a/app/assets/images/diapers_to_buy_2.png b/app/assets/images/diapers_to_buy_2.png new file mode 100644 index 000000000..f2303f534 Binary files /dev/null and b/app/assets/images/diapers_to_buy_2.png differ diff --git a/app/assets/images/facebook_logo.svg b/app/assets/images/facebook_logo.svg new file mode 100644 index 000000000..64923c3d4 --- /dev/null +++ b/app/assets/images/facebook_logo.svg @@ -0,0 +1,2 @@ + + diff --git a/app/assets/images/icons/arrow-left.svg b/app/assets/images/icons/arrow-left.svg new file mode 100644 index 000000000..fbb3a963f --- /dev/null +++ b/app/assets/images/icons/arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/icons/burger-menu-cross.svg b/app/assets/images/icons/burger-menu-cross.svg new file mode 100644 index 000000000..9359fa593 --- /dev/null +++ b/app/assets/images/icons/burger-menu-cross.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/assets/images/icons/burger-menu-lines.svg b/app/assets/images/icons/burger-menu-lines.svg new file mode 100644 index 000000000..15835a3c1 --- /dev/null +++ b/app/assets/images/icons/burger-menu-lines.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/javascript/images/calc.svg b/app/assets/images/icons/calc.svg similarity index 100% rename from app/javascript/images/calc.svg rename to app/assets/images/icons/calc.svg diff --git a/app/assets/images/close.svg b/app/assets/images/icons/close.svg similarity index 100% rename from app/assets/images/close.svg rename to app/assets/images/icons/close.svg diff --git a/app/assets/images/icons/facebook.svg b/app/assets/images/icons/facebook.svg new file mode 100644 index 000000000..03d2f9113 --- /dev/null +++ b/app/assets/images/icons/facebook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/icons/favicon-48x48.png b/app/assets/images/icons/favicon-48x48.png new file mode 100644 index 000000000..d942c1832 Binary files /dev/null and b/app/assets/images/icons/favicon-48x48.png differ diff --git a/app/assets/images/icons/google.svg b/app/assets/images/icons/google.svg new file mode 100644 index 000000000..65cc9a1f3 --- /dev/null +++ b/app/assets/images/icons/google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/icons/select_arrow.png b/app/assets/images/icons/select_arrow.png new file mode 100644 index 000000000..821678284 Binary files /dev/null and b/app/assets/images/icons/select_arrow.png differ diff --git a/app/assets/images/icons/selector-arrow.svg b/app/assets/images/icons/selector-arrow.svg new file mode 100644 index 000000000..3ebb70aeb --- /dev/null +++ b/app/assets/images/icons/selector-arrow.svg @@ -0,0 +1 @@ + diff --git a/app/assets/images/icons/vector_2.png b/app/assets/images/icons/vector_2.png new file mode 100644 index 000000000..7aaf8a13b Binary files /dev/null and b/app/assets/images/icons/vector_2.png differ diff --git a/app/assets/images/icons/vector_5.png b/app/assets/images/icons/vector_5.png new file mode 100644 index 000000000..2083f68fd Binary files /dev/null and b/app/assets/images/icons/vector_5.png differ diff --git a/app/assets/images/instagram_logo.svg b/app/assets/images/instagram_logo.svg new file mode 100644 index 000000000..1fce09661 --- /dev/null +++ b/app/assets/images/instagram_logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/javascript/images/money.png b/app/assets/images/money.png similarity index 100% rename from app/javascript/images/money.png rename to app/assets/images/money.png diff --git a/app/javascript/images/money_spent.png b/app/assets/images/money_spent.png similarity index 100% rename from app/javascript/images/money_spent.png rename to app/assets/images/money_spent.png diff --git a/app/assets/images/money_spent_2.png b/app/assets/images/money_spent_2.png new file mode 100644 index 000000000..54b45c623 Binary files /dev/null and b/app/assets/images/money_spent_2.png differ diff --git a/app/javascript/images/money_to_spent.png b/app/assets/images/money_to_spent.png similarity index 100% rename from app/javascript/images/money_to_spent.png rename to app/assets/images/money_to_spent.png diff --git a/app/assets/images/money_to_spent_2.png b/app/assets/images/money_to_spent_2.png new file mode 100644 index 000000000..3227897f4 Binary files /dev/null and b/app/assets/images/money_to_spent_2.png differ diff --git a/app/javascript/images/mother.jpeg b/app/assets/images/mother.jpeg similarity index 100% rename from app/javascript/images/mother.jpeg rename to app/assets/images/mother.jpeg diff --git a/app/javascript/images/naphtha.png b/app/assets/images/naphtha.png similarity index 100% rename from app/javascript/images/naphtha.png rename to app/assets/images/naphtha.png diff --git a/app/javascript/images/plastic.png b/app/assets/images/plastic.png similarity index 100% rename from app/javascript/images/plastic.png rename to app/assets/images/plastic.png diff --git a/app/assets/images/scales-bigger.png b/app/assets/images/scales-bigger.png new file mode 100644 index 000000000..425aef553 Binary files /dev/null and b/app/assets/images/scales-bigger.png differ diff --git a/app/assets/images/scales.png b/app/assets/images/scales.png new file mode 100644 index 000000000..391ce2aeb Binary files /dev/null and b/app/assets/images/scales.png differ diff --git a/app/assets/images/softserve_academy_logo.png b/app/assets/images/softserve_academy_logo.png new file mode 100644 index 000000000..4cd7a7b80 Binary files /dev/null and b/app/assets/images/softserve_academy_logo.png differ diff --git a/app/assets/images/youtube_logo.svg b/app/assets/images/youtube_logo.svg new file mode 100644 index 000000000..5365ac778 --- /dev/null +++ b/app/assets/images/youtube_logo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index e69de29bb..bfbe18e2d 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -0,0 +1,22 @@ +@import "components/**/*"; + +@import "bootstrap"; + +@import "pages/**/*"; + +@import "font-awesome"; +*, +:after, +:before { + box-sizing: border-box; +} +html { + height: 100%; +} +.inline { + display: inline-block; +} + +.block { + display: block; +} diff --git a/app/assets/stylesheets/application.tailwind.css b/app/assets/stylesheets/application.tailwind.css new file mode 100644 index 000000000..294a57507 --- /dev/null +++ b/app/assets/stylesheets/application.tailwind.css @@ -0,0 +1,10 @@ +@import "tailwindcss/base"; +@import "tailwindcss/utilities"; +@import "tailwindcss/components"; +@import "/components/header"; +@import "/components/buttons"; +@import "/components/loader"; +@import "/components/admin-menu"; +@import "./components/form.css"; +@import "/components/account-footer"; +@import "/components/pagination"; diff --git a/app/assets/stylesheets/components/account-footer.css b/app/assets/stylesheets/components/account-footer.css new file mode 100644 index 000000000..cf5c250a3 --- /dev/null +++ b/app/assets/stylesheets/components/account-footer.css @@ -0,0 +1,9 @@ +@layer components { + .account-footer { + @apply bg-slate-50 p-6 mt-14 bottom-0 w-full sm:mb-0 sticky top-[100vh]; + } + + .account-footer_text { + @apply flex flex-col sm:flex-row justify-between items-center text-center; + } +} diff --git a/app/assets/stylesheets/components/admin-menu.css b/app/assets/stylesheets/components/admin-menu.css new file mode 100644 index 000000000..19c7a4ccd --- /dev/null +++ b/app/assets/stylesheets/components/admin-menu.css @@ -0,0 +1,18 @@ +@layer base { + .admin-menu-item { + @apply text-success hover:text-dark_green whitespace-nowrap + } + + .admin-menu-burger-button { + @apply xl:hidden flex items-center text-success pt-7 pr-4 ml-auto + } + + .locale-button { + @apply inline-block border border-success text-success hover:bg-success hover:text-dark_green text-sm px-2 py-1 rounded ml-auto mt-7 mr-6 + } + + .admin-menu-list { + @apply flex flex-col xl:flex-row mt-8 xl:mx-2 space-y-6 xl:space-y-0 + } +} + diff --git a/app/assets/stylesheets/components/breakpoints.scss b/app/assets/stylesheets/components/breakpoints.scss new file mode 100644 index 000000000..a5bc255fb --- /dev/null +++ b/app/assets/stylesheets/components/breakpoints.scss @@ -0,0 +1,3 @@ +$xs: 576px; +$sm: 768px; +$md: 1024px; diff --git a/app/assets/stylesheets/components/buttons.css b/app/assets/stylesheets/components/buttons.css new file mode 100644 index 000000000..9f4e6ff35 --- /dev/null +++ b/app/assets/stylesheets/components/buttons.css @@ -0,0 +1,33 @@ +@layer base { + .btn-cyan { + @apply text-white bg-gradient-to-r from-cyan-400 via-cyan-500 to-cyan-600 hover:bg-gradient-to-br focus:ring-4 focus:outline-none focus:ring-cyan-300 dark:focus:ring-cyan-800 font-medium rounded-lg text-sm px-5 py-2.5 text-center mr-2 mb-2; + } + + .btn-green { + @apply text-white rounded hover:text-white bg-success hover:bg-matte_lime_green; + } + + .btn-blue { + @apply text-white rounded hover:text-white bg-blue hover:bg-dark_blue; + } + + .btn-grey { + @apply text-white rounded hover:text-white bg-grey hover:bg-dark_gray; + } + + .main-btn { + @apply flex justify-around flex-wrap text-center tracking-widest uppercase text-xs text-white border border-solid rounded my-5 mx-auto py-3.5 px-9 max-w-md; + } + + .btn-outline-gray { + @apply text-white border-gray hover:text-success hover:border-success; + } + + .btn-outline-green { + @apply text-success border-success hover:text-white hover:bg-success; + } + + .btn-grey { + @apply text-white rounded hover:text-white bg-grey hover:bg-dark_gray; + } +} diff --git a/app/assets/stylesheets/components/colors.scss b/app/assets/stylesheets/components/colors.scss new file mode 100644 index 000000000..f3c7bca7c --- /dev/null +++ b/app/assets/stylesheets/components/colors.scss @@ -0,0 +1,10 @@ +$success: #8fba3b; +$color: #fff; +$error: #9e1503; +$matte_lime_green: #73952f; +$gray: #8d8d8d; +$light_gray: #ececec; +$grey: #999999; +$dark_gray: #515151; +$dark_green: #256d36; +$white: #ffffff; diff --git a/app/assets/stylesheets/components/common_sizes.scss b/app/assets/stylesheets/components/common_sizes.scss new file mode 100644 index 000000000..9f1d36ad1 --- /dev/null +++ b/app/assets/stylesheets/components/common_sizes.scss @@ -0,0 +1 @@ +$max_width_content: 1230px; diff --git a/app/assets/stylesheets/components/fonts.scss b/app/assets/stylesheets/components/fonts.scss new file mode 100644 index 000000000..770ddfed4 --- /dev/null +++ b/app/assets/stylesheets/components/fonts.scss @@ -0,0 +1,11 @@ +@font-face { + font-family: "Comfortaa"; + src: asset-url("Comfortaa-Regular.eot"); + src: asset-url("Comfortaa-Regular.eot?#iefix") format("embedded-opentype"), + asset-url("Comfortaa-Regular.woff2") format("woff2"), + asset-url("Comfortaa-Regular.woff") format("woff"), + asset-url("Comfortaa-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; + font-display: swap; +} diff --git a/app/assets/stylesheets/components/form.css b/app/assets/stylesheets/components/form.css new file mode 100644 index 000000000..5bff0c355 --- /dev/null +++ b/app/assets/stylesheets/components/form.css @@ -0,0 +1,39 @@ +@layer components { + + /* Password eye-icon */ + .password-wrapper, + .password-wrapper-login { + @apply relative; + } + + .toggle-password { + @apply absolute text-success top-0 right-0 flex items-center pr-2.5 pt-3 cursor-pointer bg-transparent; + } + + .input-group-addon.toggle-password i { + @apply bg-white text-success; + } + + .password-wrapper-login .toggle-password { + @apply pt-11; + } + + /* Site Settings Diapers Categories */ + + .group-wrapper { + @apply flex flex-wrap mb-6 -mx-3; + } + + .input-field-wrapper { + @apply w-full px-3 mb-6 md:w-1/2 md:mb-0; + } + + .input-field-wrapper.disabled { + pointer-events: none; + cursor: default; + } + + .auth-login-links { + @apply flex items-center justify-center gap-4 text-center border-t border-solid text-gray border-light_gray; + } +} diff --git a/app/assets/stylesheets/components/header.css b/app/assets/stylesheets/components/header.css new file mode 100644 index 000000000..709887732 --- /dev/null +++ b/app/assets/stylesheets/components/header.css @@ -0,0 +1,13 @@ +@layer components { + .page-header { + @apply w-full xl:max-w-fit h-auto mx-auto mb-2.5 flex border-b-2 border-gray justify-center; + } + + .tab { + @apply flex-row xl:flex whitespace-nowrap uppercase text-sm text-white border-b-2 border-transparent transition duration-500 ease-in-out hover:border-success py-6 px-4; + } + + .header-btns { + @apply inline w-auto ml-2 min-w-fit; + } +} diff --git a/app/assets/stylesheets/components/loader.css b/app/assets/stylesheets/components/loader.css new file mode 100644 index 000000000..aed7d199d --- /dev/null +++ b/app/assets/stylesheets/components/loader.css @@ -0,0 +1,13 @@ +@layer base { + .mask { + @apply bg-white opacity-0 flex fixed inset-0 w-full h-full justify-center items-center -z-10 transition-opacity + } + + .loader { + @apply m-auto border-8 border-success border-left-green rounded-full w-20 h-20 animate-spin + } +} + +.border-left-green { + border-left-color: theme("colors.dark_green"); +} diff --git a/app/assets/stylesheets/components/mixins.scss b/app/assets/stylesheets/components/mixins.scss new file mode 100644 index 000000000..20a4e7075 --- /dev/null +++ b/app/assets/stylesheets/components/mixins.scss @@ -0,0 +1,18 @@ +/*Mxn*/ +@mixin transform($transforms) { + -webkit-transform: $transforms; + -moz-transform: $transforms; + -o-transform: $transforms; + -ms-transform: $transforms; + transform: $transforms; +} +@mixin translate($x, $y) { + @include transform(translate($x, $y)); +} +@mixin transition($args) { + -webkit-transition: $args; + -moz-transition: $args; + -ms-transition: $args; + -o-transition: $args; + transition: $args; +} diff --git a/app/assets/stylesheets/components/pagination.css b/app/assets/stylesheets/components/pagination.css new file mode 100644 index 000000000..e43806b82 --- /dev/null +++ b/app/assets/stylesheets/components/pagination.css @@ -0,0 +1,21 @@ +@layer components { + .wrapper { + @apply flex justify-center space-x-3 mt-12; + } + + .page-nav { + @apply text-sm sm:text-base min-w-36 px-3 py-1 border border-slate-300 rounded shadow hover:text-white hover:bg-grey; + } + + .current { + @apply text-sm sm:text-base min-w-36 px-3 py-1 border border-success rounded bg-success text-white shadow; + } + + .gap-dots { + @apply place-self-end; + } + + .page-hidden { + @apply hidden sm:inline-block; + } +} diff --git a/app/assets/stylesheets/components/toastify.scss b/app/assets/stylesheets/components/toastify.scss new file mode 100644 index 000000000..aeb95f8ca --- /dev/null +++ b/app/assets/stylesheets/components/toastify.scss @@ -0,0 +1,77 @@ +.toastify { + padding: 12px 20px; + color: #ffffff; + display: inline-block; + box-shadow: 0 3px 6px -1px rgba(0, 0, 0, 0.12), 0 10px 36px -4px rgba(77, 96, 232, 0.3); + background: -webkit-linear-gradient(315deg, #73a5ff, #5477f5); + background: linear-gradient(135deg, #73a5ff, #5477f5); + position: fixed; + opacity: 0; + transition: all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1); + border-radius: 2px; + cursor: pointer; + text-decoration: none; + max-width: calc(50% - 20px); + z-index: 2147483647; +} + +.toastify.on { + opacity: 1; +} + +.toast-close { + background: transparent; + border: 0; + color: white; + cursor: pointer; + font-family: inherit; + font-size: 1em; + opacity: 0.4; + padding: 0 5px; +} + +.toastify-right { + right: 15px; +} + +.toastify-left { + left: 15px; +} + +.toastify-top { + top: -150px; +} + +.toastify-bottom { + bottom: -150px; +} + +.toastify-rounded { + border-radius: 25px; +} + +.toastify-avatar { + width: 1.5em; + height: 1.5em; + margin: -7px 5px; + border-radius: 2px; +} + +.toastify-center { + margin-left: auto; + margin-right: auto; + left: 0; + right: 0; + max-width: fit-content; + max-width: -moz-fit-content; +} + +@media only screen and (max-width: 360px) { + .toastify-right, .toastify-left { + margin-left: auto; + margin-right: auto; + left: 0; + right: 0; + max-width: fit-content; + } +} diff --git a/app/assets/stylesheets/pages/account.scss b/app/assets/stylesheets/pages/account.scss new file mode 100644 index 000000000..27f6d6be6 --- /dev/null +++ b/app/assets/stylesheets/pages/account.scss @@ -0,0 +1,94 @@ +$burger-size: 20px; + +@mixin lineTransform($position, $rotation) { + margin-top: $position; + transform: rotate($rotation); +} + +@mixin middleLineTransform($opacity: 0) { + opacity: $opacity/100; + filter: alpha(opacity=$opacity); +} + +.navbar { + flex-grow: 0; + margin-left: auto; + margin-right: 0; +} + +.nav-toggler { + margin-top: 6px; + width: $burger-size; + height: $burger-size; + position: relative; + transition: .5s ease-in-out; + + &, &:focus, &:active{ + outline: none; + box-shadow: none; + border: 0; + } + + .toggler-icon { + margin: 0; + padding: 0; + background: $success; + } + + .top-bar { + @include lineTransform(0px, 135deg); + } + + .middle-bar { + @include middleLineTransform; + } + + .bottom-bar { + @include lineTransform(0px, -135deg); + } + + // When collapsed + + &.collapsed { + .top-bar { + @include lineTransform(-20px, 0deg); + } + + .middle-bar { + @include middleLineTransform(100) + } + + .bottom-bar { + @include lineTransform(20px, 0deg); + } + } +} + +.toggler-icon { + display: block; + position: absolute; + margin-top: 10px; + height: 2px; + width: 100%; + border-radius: 1px; + opacity: 1; + left: 0; + transform: rotate(0deg); + transition: .25s; +} + +.button-group { + .btn { + min-width: 120px; + } + + .btn-danger { + border: none; + border-radius: 4px; + padding: 10px; + + &:hover { + color: white; + } + } +} diff --git a/app/javascript/css/browser_tab.css.scss b/app/assets/stylesheets/pages/browser_tab.scss similarity index 87% rename from app/javascript/css/browser_tab.css.scss rename to app/assets/stylesheets/pages/browser_tab.scss index a224c34e4..3c0c5a1f0 100644 --- a/app/javascript/css/browser_tab.css.scss +++ b/app/assets/stylesheets/pages/browser_tab.scss @@ -1,7 +1,7 @@ .tab { &-browser { background: white; - width: 213px; + width: 212px; margin-left: 0px; overflow: hidden; height: 100%; @@ -9,7 +9,6 @@ border-radius: 3px; box-shadow: 2px -2px 2px -2px black, -2px -2px 2px -2px black; padding-left: 8px; - display: block; } &-content { @@ -21,7 +20,7 @@ vertical-align: middle; width: 16px; height: 16px; - margin-right: 7px; + margin-right: 8px; } &-text { @@ -29,7 +28,7 @@ vertical-align: middle; font-family: "Segoe UI", "Roboto", sans-serif; font-size: 12px; - max-width: 170px; + max-width: 172px; overflow: hidden; } } diff --git a/app/assets/stylesheets/pages/calculator.scss b/app/assets/stylesheets/pages/calculator.scss new file mode 100644 index 000000000..62e897922 --- /dev/null +++ b/app/assets/stylesheets/pages/calculator.scss @@ -0,0 +1,408 @@ +.calculate-btn { + width: auto !important; + height: 56px; + margin-top: 40px; + color: #fff; + background-color: $success; + border: none; + border-radius: 4px; + padding-top: 2px; + font-size: 14px; + letter-spacing: 2px; + text-align: center; + text-transform: uppercase; + font-weight: 400; + font-family: "Nunito", sans-serif; + font-style: normal; + transition: transform 0.5s ease-in-out; + max-width: 300px; +} + +#calc { + padding-top: 2px; + margin-right: 10px; +} + +.form-a { + font-size: 20px; + line-height: 30px; + font-weight: 400; + color: #666666; + position: relative; + top: 17px; + left: 0px; + margin-bottom: 0px; +} + +.back-link { + font-size: small; + position: absolute; + top: -10px; +} + +.back-text { + color: black; + display: flex; + justify-content: flex-start; + align-items: center; + gap: 0.5rem; +} + +.calulator-arrow { + width: 20px; +} + +.form { + padding-left: 15px; +} + +.row-l { + margin-left: 0px; + margin-right: 0px; +} + +.flex-item { + display: flex; + flex-wrap: wrap; + max-width: 275px; + margin-left: auto; + margin-right: auto; + + .input_lable { + color: $dark_gray; + font-weight: 700; + } + + .form_fild { + min-height: 40px; + font-weight: 400; + margin-bottom: 24px; + max-width: 275px; + background-color: $light_gray; + } + + .age_wrapper { + align-items: center; + + .select-age { + appearance: none; + background-color: $light_gray; + background-image: none; + border: none; + color: $dark_gray; + width: 70px; + margin: 0 5px 0 25px; + padding: 1px 0 1px 15px; + text-align: left; + } + + .select-age-label { + margin-left: -40px; + pointer-events: none; + z-index: 1; + } + } + + .price_select { + text-align: center; + border: none; + outline: none; + color: $dark_gray; + } + + .result-btn { + margin-bottom: 32px; + } + + .check-label { + font-size: small; + margin-left: 16px; + margin-bottom: 0; + width: 200px; + } +} + +.scales_img { + align-self: center; + width: 50%; + max-width: 428px; +} + +.simple_form_calculator { + width: 40%; + margin-top: 32px; +} + +.form-input { + width: 160px; + padding-left: 20px; +} + +.last-year option:nth-child(1n + 9) { + display: none; +} + +.hidden { + display: none; +} + +#date { + width: 236px; + padding-left: 20px; + padding-right: 12px; + color: #999999; +} + +.result-btn { + font-size: 18px; + height: 40px; + text-align: center; + margin-top: 0; +} + +.result-btn #calc { + padding: 0; + margin: 0; +} + +.logo-zerowaste { + width: 11em; +} + +.logo-zerowaste img { + width: 100%; + border-radius: 5px; +} + +.description-btn { + margin: auto; + a { + color: $color; + background-color: transparent; + text-decoration: none; + } + &:hover { + background-color: $matte_lime_green; + transition: background-color 0.5s ease-in-out; + } +} + +.col-xl-8.result-card { + span { + text-align: left; + margin-left: 30px; + a { + color: $success; + background-color: transparent; + text-decoration: none; + } + a:hover { + color: $matte_lime_green; + background-color: transparent; + text-decoration: none; + } + } +} + +.old-btn { + width: 300px !important; +} + +.z-1 { + z-index: 1; +} + +.inline-input { + display: inline-flex; +} + +.calc-container { + width: 100% !important; +} + +.calc-item { + width: 300px +} + +select.custom-select { + background-image: url("icons/selector-arrow.svg"); + width: 100%; +} + +.back-link { + width: 120px; + position: absolute; + top: -10px; +} + +.back-link:hover { + text-decoration: none; +} + +@media screen and (max-width: 1199px) and (min-width: 400px) { + .description-btn { + margin: auto; + } +} + +@media screen and (max-width: $sm) { + .logo-zerowaste img { + width: 100%; + } + .logo-zerowaste { + width: 9em; + } + .form { + padding-left: 10px; + } + .form-p { + left: 10px; + } + .result-btn { + max-width: 400px; + } +} + +.result-container { + display: flex; + flex-flow: row wrap; + line-height: 1.0; + justify-content: center; + margin: 0; + div { + color: $success; + width: 350px; + margin: 20px 10px; + text-align: center; + font-size: 40px; + font-weight: bold; + p { + margin:0; + } + } + .vector-width { + width: 100px; + .vector { + padding-top: 85px; + } + .vector-mobile { + display: none; + } + } +} + +.result-item { + width: 40% !important; + padding-inline: 100px; +} + +.diapers-font { + font-size: 24px; + font-weight: bold; + } + +.diapers-font-text { + font-size: 16px; + font-weight: normal; + color:#515151; +} + +.img-margin { + margin-left: 40px; + margin-bottom: 10px; +} + +@media screen and (max-width: 991px) and (min-width: 880px) { + .jumbotron { + width: auto; + } + div.container { + padding: 0; + width: auto; + } + .result-container { + div { + width: 280px; + p { + width: 280px; + } + } + } +} + +@media screen and (max-width: 879px) { + div.jumbotron { + margin: 0; + padding: 0; + margin-bottom: 20px; + } + + .container { + padding: 0; + margin: 0; + max-width: 879px; + } + + .result-container { + div { + margin: 20px 50px; + } + } + + .main-result-container { + display: flex; + flex-flow: column wrap; + line-height: 1.0; + align-items: center; + max-width: 879px; + + .vector-width { + width: 350px; + .vector { + display: none; + padding-top: 25px; + } + .vector-mobile { + display: block; + margin: auto; + } + } + } +} + +@media screen and (max-width: $sm) { + .jumbotron { + width: auto; + } + .container { + width: auto; + } +} + +@media screen and (max-width: $xs) { + .jumbotron { + margin: 0; + } + .result-container { + div { + margin: 20px 0; + width: 300px; + } + p { + width: 300px; + } + .vector-width { + width: 300px; + } + } +} + +@media screen and (max-width: $xs) { + .simple_form_calculator { + width: 100%; + margin-top: 24px; + } + .scales_img { + width: 100%; + } +} diff --git a/app/assets/stylesheets/pages/feature_flags.scss b/app/assets/stylesheets/pages/feature_flags.scss new file mode 100644 index 000000000..a68714537 --- /dev/null +++ b/app/assets/stylesheets/pages/feature_flags.scss @@ -0,0 +1,79 @@ +.feature-container { + margin-bottom: 10px; + display: flex; + flex-direction: column; + gap: 12px; + + label { + display: inline-block; + font-weight: semibold; + margin-right: 10px; + margin-left: 10px; + vertical-align: middle; + line-height: 20px; + color: $dark_gray + } + + .description-feature { + margin-top: 2px; + } + + input[type="checkbox"] { + appearance: none; + border: 2px solid $dark_gray; + border-radius: 4px; + height: 20px; + margin-right: 10px; + margin-top: 2px; + width: 20px; + + &:checked { + background-color: $success; + border-color: $dark_gray; + } + } + + span { + display: inline-block; + margin-left: 6px; + vertical-align: middle; + } +} + +input[type="submit"] { + background-color: $success; + border: none; + border-radius: 4px; + color: #fff; + cursor: pointer; + font-size: 16px; + padding: 10px; + min-width: 110px; + @include transition(all 0.5s ease-in-out); + + &:hover { + background-color: $matte_lime_green; + } +} + +.btn-grey { + background-color: $grey; + border: none; + border-radius: 4px; + color: #fff; + cursor: pointer; + font-size: 16px; + padding: 10px; + min-width: 110px; + text-align: center; + @include transition(all 0.5s ease-in-out); + + &:hover { + background-color: $dark_gray; + } +} + +.right-bottom { + right: 0; + bottom: 0; +} diff --git a/app/javascript/css/main.css.scss b/app/assets/stylesheets/pages/main.scss similarity index 59% rename from app/javascript/css/main.css.scss rename to app/assets/stylesheets/pages/main.scss index 0db29f59d..7dbf143ae 100644 --- a/app/javascript/css/main.css.scss +++ b/app/assets/stylesheets/pages/main.scss @@ -1,27 +1,11 @@ body { - margin: 0 auto; - overflow-x: hidden; position: relative; - min-height: 100vh; - padding-bottom: 32px; -} - -body:not(.admin)::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: url("../images/mother.jpeg"); + margin: 0 auto; + background: asset-url("mother.jpeg") no-repeat center top; background-size: cover; - background-position: center; - background-repeat: no-repeat; - filter: brightness(50%); -} -.body-inside { - /* This will make it stack on top of the ::before */ - position: relative; + overflow-x: hidden; + height: 100vh; + font-family: "Comfortaa", sans-serif; } a { @@ -37,33 +21,24 @@ a { } } -.page-header { - max-width: 1110px; - font-family: "Comfortaa", sans-serif; - margin: auto; - margin-bottom: 10px; - display: flex; - justify-content: space-between; - flex-wrap: wrap; - align-items: center; - border-bottom: 2px solid $gray; +.body-inside { + position: absolute; + background-color: #00000078; + min-height: 100%; + width: 100%; + top: 0; + left: 0; } -div.jumbotron { - font-family: "Comfortaa", sans-serif; +.jumbotron { background-color: $color; - padding: 25px 10px; - max-width: 1110px; + max-width: $max_width_content; margin: 0 auto; } -.func-btns { - display: flex; - justify-content: space-between; - flex-wrap: wrap; - align-items: flex-end; - width: 315px; - font-family: "Nunito", sans-serif; +.jumbotron-fluid { + padding-top: 0; + padding-bottom: 0; } .mn-vd { @@ -79,48 +54,6 @@ div.jumbotron { } } -.main-btns { - display: flex; - justify-content: space-around; - flex-wrap: wrap; - max-width: 420px; - margin: 20px auto; - - & > :last-of-type { - & img { - margin-right: 10px; - } - - &:hover { - color: $color; - } - } -} - -.donate-btn, -.main-btns { - background-color: transparent; - border: none; - letter-spacing: 2px; - text-transform: uppercase; - font-family: "Nunito", sans-serif; - - a { - border: 2px solid $gray; - border-radius: 4px; - padding: 17px 36px; - font-size: 12px; - color: $color; - text-align: center; - min-width: 187px; - - &:hover { - color: $success; - border-color: $success; - } - } -} - .logo { font-size: 24px; color: $color; @@ -131,20 +64,6 @@ div.jumbotron { } } -.tab { - text-transform: uppercase; - font-size: 14px; - padding: 33px 25px; - color: $color; - border-bottom: 3px solid transparent; - @include transition(all 0.5s ease-in-out); - - &:hover { - color: $color; - border-bottom: 3px solid $success; - } -} - /* home-page */ .homepage_title { text-align: center; @@ -166,12 +85,13 @@ main p { margin: auto; box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05); border-radius: 6px; + margin-top: 64px; + input, select { display: inline-block; outline: none; - background: $color; border: 2px solid $gray; box-sizing: border-box; border-radius: 4px; @@ -181,15 +101,14 @@ main p { input[type="submit"] { text-transform: uppercase; white-space: initial; - color: $gray; - padding: 15px; + padding: 10px; height: 100%; - max-width: 230px; - font-size: 14px; + font-size: 16px; + border: none; &:hover { - color: $success; - border-color: $success; + color: $white; + background-color: $matte_lime_green; } &:active { @@ -214,12 +133,17 @@ h3.container { padding: 20px; } -div.calculation-results { +.tab-active { + color: darkgreen !important; + border-bottom: solid darkgreen 3px; +} + +.calculation-results { padding: 10px; margin-top: 20px; position: center; background-color: $color; - max-width: 1110px; + max-width: $max_width_content; min-height: 151px; border-radius: 6px; } @@ -236,7 +160,7 @@ div.calculation-results { display: inline-flex; .img-border { - display: inline-block; + flex-shrink: 0; height: 70px; width: 70px; border: 2px solid #f5f5f5; @@ -262,7 +186,7 @@ div.calculation-results { .result-card, .last-result-card { font-weight: 300; - padding: 30px; + padding: 20px; p { font-size: 22px; @@ -279,6 +203,7 @@ div.calculation-results { body.admin { background: none; + background-color: #fff; } body:where(.admin)::before { @@ -286,7 +211,7 @@ body:where(.admin)::before { } .admin-container { - padding-top: 100px; + padding-top: 60px; } .admin-container h1 { @@ -294,8 +219,9 @@ body:where(.admin)::before { } .admin-table { - .admin-table-header > *, - .admin-table-body > * { + + .admin-table-header>*, + .admin-table-body>* { display: flex; } @@ -308,17 +234,31 @@ body:where(.admin)::before { } } + td { + max-width: 200px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .admin-table-links { - a { + + a, + form { color: $success; &:hover { - color: #3d5217; + color: $matte_lime_green; } } + form { + display: inline-block; + transition: all 0.5s ease-in-out; + } + .admin-table-body { - & > * { + &>* { align-items: center; } @@ -331,7 +271,7 @@ body:where(.admin)::before { .flash-message { color: $color; - padding: 20px; + padding: 15px; border-radius: 3px; &.notice { @@ -339,34 +279,42 @@ body:where(.admin)::before { } &.alert { - background: $danger; + background: $error; } } +.bordered { + border: solid darkgray 3px; + padding: 20px; + margin-bottom: 50px +} + +.admin-legend { + float: none; + width: auto; + padding: 20px; +} + @media screen and (max-width: $xs) { - .tab { - display: none; + + .body-inside { + width: 100%; + padding-right: 0; + padding-left: 0; } - .homepage_title { - margin-top: 50px; + + .jumbotron { + width: 100%; } - div.jumbotron, - div.container { - max-width: 96%; - margin-right: 2%; - margin-left: 2%; - padding-left: 0px; + + .calculation-results { + width: 100%; } .calculation-results span { width: 410px; } - .page-header { - display: flex; - justify-content: space-between; - } - .donate-btn a { font-size: 12px; } @@ -376,7 +324,6 @@ body:where(.admin)::before { a { padding: 10px; - margin-top: 0.5rem; } } @@ -421,34 +368,13 @@ body:where(.admin)::before { .row_break { display: block; } -} -@media screen and (max-width: $md) and (min-width: $xs) { - .homepage_title { - margin-top: 50px; - } - .page-header { - width: auto; - margin-right: 16px; - margin-left: 16px; - } - .calculation-results, - .jumbotron { - width: 96%; - } -} - -@media screen and (max-width: 768px) { .donate-btn a { - margin-bottom: 0.4rem; + padding: 10px; } } -@media screen and (max-width: 380px) { - main p { - margin: 0 auto; - } - .main-btns { - margin: 0 auto; - } +abbr[title] { + text-decoration: none; + border-bottom: 0; } diff --git a/app/javascript/css/message.css.scss b/app/assets/stylesheets/pages/message.scss similarity index 100% rename from app/javascript/css/message.css.scss rename to app/assets/stylesheets/pages/message.scss diff --git a/app/controllers/account/app_configs_controller.rb b/app/controllers/account/app_configs_controller.rb deleted file mode 100644 index e5c1fc73b..000000000 --- a/app/controllers/account/app_configs_controller.rb +++ /dev/null @@ -1,58 +0,0 @@ -# frozen_string_literal: true - -class Account::AppConfigsController < Account::BaseController - before_action :app_config - load_and_authorize_resource - - def update - update_diapers_calculator - end - - private - - def app_config - @app_config = AppConfig.instance - end - - def diapers_calculator_params - params.permit([ - :first_amount, :first_price, :second_amount, :second_price, :third_amount, - :third_price, :fourth_amount, :fourth_price, :fifth_amount, :fifth_price, - :sixth_amount, :sixth_price, :seventh_amount, :seventh_price - ]) - end - - def update_diapers_calculator - @app_config.diapers_calculator = { - (1..3) => { - amount: params[:first_amount], - price: params[:first_price] - }, - (4..6) => { - amount: params[:second_amount], - price: params[:second_price] - }, - (7..9) => { - amount: params[:third_amount], - price: params[:third_price] - }, - (10..12) => { - amount: params[:fourth_amount], - price: params[:fourth_price] - }, - (13..18) => { - amount: params[:fifth_amount], - price: params[:fifth_price] - }, - (19..24) => { - amount: params[:sixth_amount], - price: params[:sixth_price] - }, - (25..30) => { - amount: params[:seventh_amount], - price: params[:seventh_price] - } - } - @app_config.save - end -end diff --git a/app/controllers/account/calculators/fields_controller.rb b/app/controllers/account/calculators/fields_controller.rb deleted file mode 100644 index 7cb828134..000000000 --- a/app/controllers/account/calculators/fields_controller.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -class Account::Calculators::FieldsController < ApplicationController - before_action :calculator, only: :new - - def new - @field = Field.new(field_params) - @calculator = Calculator.new(fields: [@field]) - - respond_to do |format| - format.js - end - end - - private - - def calculator - @calculator = Calculator.friendly.find(params[:calculator_slug]) - end - - def field_params - params.require(:field).permit(:kind, :type) - end -end diff --git a/app/controllers/account/calculators_controller.rb b/app/controllers/account/calculators_controller.rb index 6d63ff39e..2c05320fa 100644 --- a/app/controllers/account/calculators_controller.rb +++ b/app/controllers/account/calculators_controller.rb @@ -4,6 +4,11 @@ class Account::CalculatorsController < Account::BaseController before_action :calculator, only: [:edit, :update, :destroy] load_and_authorize_resource + def index + @q = collection.ransack(params[:q]) + @calculators = @q.result.page(params[:page]) + end + def show # TODO: fill it end @@ -18,7 +23,7 @@ def create if @calculator.save redirect_to account_calculators_path, notice: t("notifications.calculator_created") else - render action: "new" + render :new, status: :unprocessable_entity end end @@ -28,18 +33,22 @@ def update else collect_fields_for_form - render action: "edit" + render :edit, status: :unprocessable_entity end end def destroy - @calculator.destroy! + @calculator.destroy - redirect_to account_calculators_path, notice: t("notifications.calculator_deleted") + redirect_to account_calculators_path, notice: t("notifications.calculator_deleted"), status: :see_other end private + def collection + Calculator.ordered_by_name + end + def calculator @calculator = Calculator.friendly.find(params[:slug]) end diff --git a/app/controllers/account/categories_controller.rb b/app/controllers/account/categories_controller.rb index f6f024d7a..bd13c0bcc 100644 --- a/app/controllers/account/categories_controller.rb +++ b/app/controllers/account/categories_controller.rb @@ -4,7 +4,8 @@ class Account::CategoriesController < Account::BaseController load_and_authorize_resource def index - @categories = collection + @q = collection.ransack(params[:q]) + @categories = @q.result.page(params[:page]) end def new @@ -12,7 +13,8 @@ def new end def edit - @category = resource + @category = resource + @unfilled_categories = Category.with_unfilled_diapers_periods end def create @@ -29,6 +31,7 @@ def update @category = resource if @category.update(category_params) + Categories::PreferableService.new(@category).call if @category.preferable? redirect_to account_categories_path, notice: t("notifications.category_updated") else render :edit, status: :unprocessable_entity @@ -45,7 +48,7 @@ def destroy private def collection - Category.all + Category.ordered_by_name end def resource @@ -53,6 +56,6 @@ def resource end def category_params - params.require(:category).permit(:name) + params.require(:category).permit(:name, :priority, :preferable) end end diff --git a/app/controllers/account/dashboard_controller.rb b/app/controllers/account/dashboard_controller.rb new file mode 100644 index 000000000..4c702e1c0 --- /dev/null +++ b/app/controllers/account/dashboard_controller.rb @@ -0,0 +1,4 @@ +class Account::DashboardController < Account::BaseController + def index + end +end diff --git a/app/controllers/account/diapers_periods/categories_controller.rb b/app/controllers/account/diapers_periods/categories_controller.rb new file mode 100644 index 000000000..f098c5739 --- /dev/null +++ b/app/controllers/account/diapers_periods/categories_controller.rb @@ -0,0 +1,30 @@ +class Account::DiapersPeriods::CategoriesController < Account::BaseController + def destroy + @category = resource + + if @category.diapers_periods.destroy_all + render formats: :turbo_stream, status: :see_other + else + render :with_periods, formats: :turbo_stream, status: :unprocessable_entity + end + end + + def with_periods + @unfilled_categories = collection.with_unfilled_diapers_periods + @categories_with_periods = collection.with_diapers_periods + end + + def available + @categories = collection.without_diapers_periods + end + + private + + def collection + Category.ordered_by_name + end + + def resource + collection.find(params[:id]) + end +end diff --git a/app/controllers/account/diapers_periods_controller.rb b/app/controllers/account/diapers_periods_controller.rb new file mode 100644 index 000000000..6bc7970ea --- /dev/null +++ b/app/controllers/account/diapers_periods_controller.rb @@ -0,0 +1,70 @@ +class Account::DiapersPeriodsController < Account::BaseController + def index + @category = category_resource + @unfilled_categories = category_collection.with_unfilled_diapers_periods + @diapers_periods = @category.diapers_periods.ordered + end + + def new + @category = category_resource + @period_start = DiapersPeriod.start_date(@category) + @diapers_period = DiapersPeriod.new(category_id: @category.id, period_start: @period_start) + end + + def edit + @diapers_period = DiapersPeriod.find(params[:id]) + end + + def create + @category = Category.find(params[:diapers_period][:category_id]) + @unfilled_categories = category_collection.with_unfilled_diapers_periods + @diapers_period = @category.diapers_periods.build(diapers_period_params) + @diapers_periods = @category.diapers_periods.ordered + + if @diapers_period.save + respond_to :turbo_stream + else + render :new, status: :unprocessable_entity + end + end + + def update + @category = Category.find(params[:diapers_period][:category_id]) + @unfilled_categories = category_collection.with_unfilled_diapers_periods + @diapers_period = DiapersPeriod.find(params[:id]) + @diapers_periods = @category.diapers_periods.ordered + + if @diapers_period.update(diapers_period_params) + respond_to :turbo_stream + else + render :edit, status: :unprocessable_entity + end + end + + def destroy + @diapers_period = DiapersPeriod.find(params[:id]) + @category = @diapers_period.category + @unfilled_categories = category_collection.with_unfilled_diapers_periods + @diapers_periods = @category.diapers_periods.ordered + + if @diapers_period.destroy + render formats: :turbo_stream, status: :see_other + else + render :index, formats: :turbo_stream, status: :unprocessable_entity + end + end + + private + + def category_collection + Category.ordered_by_name + end + + def category_resource + category_collection.find(params[:category_id]) + end + + def diapers_period_params + params.require(:diapers_period).permit(:price, :period_start, :period_end, :usage_amount, :category_id) + end +end diff --git a/app/controllers/account/feature_flags_controller.rb b/app/controllers/account/feature_flags_controller.rb new file mode 100644 index 000000000..48f11382b --- /dev/null +++ b/app/controllers/account/feature_flags_controller.rb @@ -0,0 +1,6 @@ +class Account::FeatureFlagsController < Account::BaseController + def update + UpdateFeatureFlagsService.new(params.require(:feature_flags)).call + redirect_to edit_account_site_setting_path, notice: t("notifications.feature_flags_updated") + end +end diff --git a/app/controllers/account/histories_controller.rb b/app/controllers/account/histories_controller.rb index 1fddae5d6..4fae98f82 100644 --- a/app/controllers/account/histories_controller.rb +++ b/app/controllers/account/histories_controller.rb @@ -4,6 +4,6 @@ class Account::HistoriesController < Account::BaseController def index raise CanCan::AccessDenied unless current_user.admin? - @versions = PaperTrail::Version.order("created_at DESC").limit(100) + @versions = PaperTrail::Version.order("created_at DESC").limit(100).page(params[:page]) end end diff --git a/app/controllers/account/messages_controller.rb b/app/controllers/account/messages_controller.rb index cb999d242..ebf2c6bbc 100644 --- a/app/controllers/account/messages_controller.rb +++ b/app/controllers/account/messages_controller.rb @@ -4,10 +4,21 @@ class Account::MessagesController < Account::BaseController load_and_authorize_resource def index - @message = Message.order(created_at: :desc) + @q = collection.ransack(params[:q]) + @messages = @q.result.page(params[:page]) end def show - @message = Message.find(params[:id]) + @message = resource + end + + private + + def resource + collection.find(params[:id]) + end + + def collection + Message.ordered_by_title end end diff --git a/app/controllers/account/products_controller.rb b/app/controllers/account/products_controller.rb new file mode 100644 index 000000000..dfc05c113 --- /dev/null +++ b/app/controllers/account/products_controller.rb @@ -0,0 +1,74 @@ +class Account::ProductsController < Account::BaseController + def index + @q = collection.ransack(params[:q]) + @products = @q.result.page(params[:page]) + end + + def show + @product = resource + end + + def new + @product = Product.new + @categories = category_collection + end + + def edit + @product = resource + @categories = category_collection + + @product.build_unsigned_categories + end + + def create + @product = Product.new(product_params) + @categories = category_collection + + if @product.save + redirect_to account_products_path, notice: t(".created") + else + render :new, status: :unprocessable_entity + end + end + + def update + @product = resource + @categories = category_collection + + if @product.update(product_params) + redirect_to account_products_path, notice: t(".updated") + else + @product.build_unsigned_categories + render :edit, status: :unprocessable_entity + end + end + + def destroy + @product = resource + + if @product.destroy + redirect_to account_products_path, notice: t(".deleted") + else + redirect_to account_products_path, status: :unprocessable_entity + end + end + + private + + def resource + collection.find(params[:id]) + end + + def collection + Product.ordered_by_title + end + + def category_collection + Category.ordered_by_name + end + + def product_params + params.require(:product).permit(:title, prices_attributes: [:id, + :sum, :category_id, :_destroy]) + end +end diff --git a/app/controllers/account/site_settings_controller.rb b/app/controllers/account/site_settings_controller.rb index cfa3eb167..6ae7ecd0b 100644 --- a/app/controllers/account/site_settings_controller.rb +++ b/app/controllers/account/site_settings_controller.rb @@ -4,11 +4,15 @@ class Account::SiteSettingsController < Account::BaseController load_and_authorize_resource def edit - @site_setting = resource + @site_setting = resource + @categories = category_collection.with_diapers_periods + @unfilled_categories = category_collection.with_unfilled_diapers_periods end def update - @site_setting = resource + @site_setting = resource + @categories = category_collection.with_diapers_periods + @unfilled_categories = category_collection.with_unfilled_diapers_periods if @site_setting.update(site_setting_params) redirect_to edit_account_site_setting_path, notice: t("notifications.site_setting_updated") @@ -17,12 +21,26 @@ def update end end + def revert + @site_setting = resource + + if SiteSetting.restore_defaults! + redirect_to edit_account_site_setting_path, notice: t("notifications.site_setting_reverted") + else + render :edit, status: :unprocessable_entity + end + end + private def resource SiteSetting.current end + def category_collection + Category.ordered_by_name + end + def site_setting_params params.require(:site_setting).permit(:title, :favicon) end diff --git a/app/controllers/account/users_controller.rb b/app/controllers/account/users_controller.rb index 13470d58b..e36afe64d 100644 --- a/app/controllers/account/users_controller.rb +++ b/app/controllers/account/users_controller.rb @@ -6,47 +6,77 @@ class Account::UsersController < Account::BaseController layout "account" before_action :set_paper_trail_whodunnit - before_action :user, except: [:index] load_and_authorize_resource def index - @users = User.all + @q = collection.ransack(params[:q]) + @users = @q.result.page(params[:page]) respond_to do |format| format.html format.csv do UserReportJob.perform_later - send_data UsersCsvGenerator.call(@users, fields: ["email", "last_sign_in_at"]) + send_data UsersCsvGenerator.call(@users, fields: ["email", "first_name", "last_name", "last_sign_in_at"]) end end end + def new + @user = User.new + end + + def create + @user = User.new(user_params) + + @user.skip_confirmation! + + if @user.save + UserMailer.welcome_email(@user).deliver_now if user_params[:send_credentials_email] == "1" + + redirect_to account_user_path(id: @user), notice: t("notifications.user_created") + else + render :new, status: :unprocessable_entity + end + end + def update - if user.update(user_params) - redirect_to account_user_path(id: user) + @user = resource + + if @user.update(user_params) + redirect_to account_user_path(id: @user), notice: t("notifications.user_updated") else - render "edit" + render :edit, status: :unprocessable_entity end end + def destroy + resource.destroy + + redirect_to account_users_path, notice: t("notifications.user_deleted"), status: :see_other + end + private def user_params prms = params.require(:user).permit( - :first_name, :last_name, :country, :password, :password_confirmation, - :blocked, :avatar + :email, :first_name, :last_name, :country, :role, :password, :password_confirmation, + :blocked, :avatar, :send_credentials_email ) - if prms[:password].blank? || prms[:password_confirmation].blank? + if action_name == "update" && (prms[:password].blank? || prms[:password_confirmation].blank?) prms = prms.merge(skip_password_validation: true) end prms end - def user - @user ||= User.find(params[:id]) + def collection + User.ordered_by_email + end + + def resource + User.find(params[:id]) end def render404 diff --git a/app/controllers/api/v1/diaper_calculators_controller.rb b/app/controllers/api/v1/diaper_calculators_controller.rb index efce64e57..3b278e487 100644 --- a/app/controllers/api/v1/diaper_calculators_controller.rb +++ b/app/controllers/api/v1/diaper_calculators_controller.rb @@ -1,38 +1,23 @@ # frozen_string_literal: true class Api::V1::DiaperCalculatorsController < ApplicationController - def create - result = Calculators::DiapersService.new(params[:childs_age].to_i) - .calculate! + def calculate + @validation = CalculatorValidator.new(params) - diapers_be_used = t("calculators.calculator.diaper").pluralize( - count: result.to_be_used_diapers_amount, - locale: I18n.locale - ) + if @validation.valid? + calc_service = Calculators::DiaperUsageService.new(params[:childs_years], params[:childs_months], set_category_id) + calc_service.calculate + calculator_decorator = CalculatorDecorator.new(calc_service.result) - diapers_used = t("calculators.calculator.diaper").pluralize( - count: result.used_diapers_amount, - locale: I18n.locale - ) + render json: calculator_decorator.to_json, status: :ok + else + render json: { error: @validation.error }, status: :unprocessable_entity + end + end - values = [ - { name: "money_spent", - result: result.used_diapers_price || 0 }, - { name: "money_will_be_spent", - result: result.to_be_used_diapers_price || 0 }, - { name: "used_diapers_amount", - result: result.used_diapers_amount || 0 }, - { name: "to_be_used_diapers_amount", - result: result.to_be_used_diapers_amount || 0 } - ] + private - render( - json: { - result: values, - date: params[:childs_age].to_i, - word_form_to_be_used: diapers_be_used, - word_form_used: diapers_used - } - ) + def set_category_id + params[:category_id].presence || Category.preferable.first.id end end diff --git a/app/controllers/calculators_controller.rb b/app/controllers/calculators_controller.rb index a52a503ed..186ccc413 100644 --- a/app/controllers/calculators_controller.rb +++ b/app/controllers/calculators_controller.rb @@ -1,32 +1,48 @@ # frozen_string_literal: true class CalculatorsController < ApplicationController - before_action :find_calculator, only: [:show, :calculate] before_action :authenticate_user!, only: :receive_recomendations def index - @calculators = Calculator.friendly.all + if Flipper[:show_calculators_list].enabled? + @q = collection.ransack(params[:q]) + @calculators = @q.result + else + head :not_found + end end def show + @calculator = resource end def calculate + @calculator = resource end def calculator - # renders calculator.html.slim + @diaper_categories = Category.ordered_by_diapers_periods_price + @preferable_category = Category.preferable.first + + if Flipper[:new_calculator_design].enabled? + render "calculators/new_calculator" + else + render "calculators/old_calculator" + end end def receive_recomendations current_user.toggle(:receive_recomendations) - current_user.save end private - def find_calculator - @calculator = Calculator.friendly.find(params[:slug]) + def collection + Calculator.ordered_by_name + end + + def resource + collection.friendly.find(params[:slug]) end end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 546341897..9c43de829 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -3,4 +3,7 @@ class HomeController < ApplicationController def index end + + def about + end end diff --git a/app/controllers/sitemap_controller.rb b/app/controllers/sitemap_controller.rb new file mode 100644 index 000000000..bd206990e --- /dev/null +++ b/app/controllers/sitemap_controller.rb @@ -0,0 +1,9 @@ +class SitemapController < ApplicationController + # an action that shows a page with links to other pages of the site - a sitemap + def index + respond_to do |format| + format.html + format.xml + end + end +end diff --git a/app/decorators/calculator_decorator.rb b/app/decorators/calculator_decorator.rb new file mode 100644 index 000000000..117a5b059 --- /dev/null +++ b/app/decorators/calculator_decorator.rb @@ -0,0 +1,47 @@ +class CalculatorDecorator + attr_reader :result + + def initialize(result) + @result = result + end + + def to_json + { + result: results, + date: age, + text_products_to_be_used: text_products_to_be_used, + text_products_used: text_products_used + } + end + + private + + def results + { + money_spent: result[:used_diapers_price].round(1), + money_will_be_spent: result[:to_be_used_diapers_price].round(1), + used_diapers_amount: result[:used_diapers_amount], + to_be_used_diapers_amount: result[:to_be_used_diapers_amount], + used_diapers_amount_pluralize: I18n.t("calculators.#{calculator_type}_calculator.bought_diapers", + count: result[:used_diapers_amount].ceil), + to_be_diapers_amount_pluralize: I18n.t("calculators.#{calculator_type}_calculator.will_buy_diapers", + count: result[:to_be_used_diapers_amount].ceil) + } + end + + def age + @result[:age] + end + + def text_products_to_be_used + "#{@result[:to_be_used_diapers_amount]} #{I18n.t("calculators.#{calculator_type}_calculator.will_buy_diapers")}" + end + + def text_products_used + "#{@result[:used_diapers_amount]} #{I18n.t("calculators.#{calculator_type}_calculator.bought_diapers")}" + end + + def calculator_type + Flipper[:new_calculator_design].enabled? ? "new" : "old" + end +end diff --git a/app/helpers/account/users_helper.rb b/app/helpers/account/users_helper.rb new file mode 100644 index 000000000..1a5e18581 --- /dev/null +++ b/app/helpers/account/users_helper.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Account::UsersHelper + def toggle_block_param(user) + { blocked: !user.blocked } + end + + def toggle_confirm(user) + t(".confirm_#{user.blocked? ? "unblock" : "block"}") + end + + def toggle_class(user) + user.blocked? ? "lock" : "lock-open" + end +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c956e5b7d..ac1446716 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,24 +1,6 @@ # frozen_string_literal: true module ApplicationHelper - def flash_messages - { - notice: notice, - alert: alert - }.compact_blank - end - - def message_class_by_name(type) - case type.to_s - when "notice" - "alert-success" - when "alert" - "alert-danger" - else - "alert-warning" - end - end - def current_locale?(locale) I18n.locale == locale end @@ -26,4 +8,8 @@ def current_locale?(locale) def switch_locale_to (I18n.locale == :en) ? :uk : :en end + + def highlighted_row(object) + object.preferable? ? "table-success" : "text-inherit" + end end diff --git a/app/helpers/calculators_helper.rb b/app/helpers/calculators_helper.rb index 087631e20..5c3e1e21e 100644 --- a/app/helpers/calculators_helper.rb +++ b/app/helpers/calculators_helper.rb @@ -4,4 +4,37 @@ module CalculatorsHelper def extract_max_selector(fields) fields.map { |field| field.selector&.gsub(/\D/, "").to_i }.max end + + def collection_product_category + [t(".form.budgetary"), + t(".form.medium"), + t(".form.premium")] + end + + def years_number + (0..2).map { |year| t("calculators.date.years", count: year) } + end + + def month_number(style) + case style + when "old" then (0..11).map { |month| t("calculators.date.months", count: month) } + when "new" then (0..11).to_a + end + end + + def new_calculator_items + [{ image: "diapers_bought_2.png", data_target: "diapersUsed", unit: t(".pieces"), text_target: "boughtDiapersPluralize", text: t(".bought_diapers", count: 0) }, + "arrow", + { image: "diapers_to_buy_2.png", data_target: "diapersToBeUsed", unit: t(".pieces"), text_target: "willBuyDiapersPluralize", text: t(".will_buy_diapers", count: 0) }, + { image: "money_spent_2.png", data_target: "moneySpent", unit: t(".unit"), text: t(".money_spent") }, + "arrow", + { image: "money_to_spent_2.png", data_target: "moneyWillBeSpent", unit: t(".unit"), text: t(".money_will_be_spent") }] + end + + def old_calculator_items + [{ image: "diapers_to_buy.png", data_target: "diapersToBeUsed", text_target: "willBuyDiapersPluralize", text: t(".will_buy_diapers", count: 0) }, + { image: "diapers_bought.png", data_target: "diapersUsed", text_target: "boughtDiapersPluralize", text: t(".bought_diapers", count: 0) }, + { image: "money_to_spent.png", data_target: "moneyWillBeSpent", text: t(".money_will_be_spent") }, + { image: "money_spent.png", data_target: "moneySpent", text: t(".money_spent") }] + end end diff --git a/app/helpers/link_helper.rb b/app/helpers/link_helper.rb new file mode 100644 index 000000000..6cf6fa764 --- /dev/null +++ b/app/helpers/link_helper.rb @@ -0,0 +1,5 @@ +module LinkHelper + def seo_link_attributes + { rel: "noreferrer nofollow noopener" } + end +end diff --git a/app/helpers/turbo_stream_actions_helper.rb b/app/helpers/turbo_stream_actions_helper.rb new file mode 100644 index 000000000..075d5488c --- /dev/null +++ b/app/helpers/turbo_stream_actions_helper.rb @@ -0,0 +1,7 @@ +module TurboStreamActionsHelper + def toast(message, background: "#0094FF") + turbo_stream_action_tag(:toast, message: message, background: background) + end +end + +Turbo::Streams::TagBuilder.prepend(TurboStreamActionsHelper) diff --git a/app/javascript/ajax/calculate_result_button.js b/app/javascript/ajax/calculate_result_button.js deleted file mode 100644 index dce165f52..000000000 --- a/app/javascript/ajax/calculate_result_button.js +++ /dev/null @@ -1,63 +0,0 @@ -$(document).on('turbolinks:load', function() { - const form = document.getElementById('form'); - const childs_years = document.getElementById('childs_years'); - const childs_months = document.getElementById('childs_months'); - const two_years_childs_months = document.getElementById('two_years_childs_months'); - - if (!form) { - return - } - - two_years_childs_months.classList.add('hidden') - two_years_childs_months.required = false - - childs_years.addEventListener('input', () => { - if (childs_years.value == 2) { - childs_months.classList.add('hidden') - childs_months.required = false - - two_years_childs_months.classList.remove('hidden') - two_years_childs_months.required = true - } else { - two_years_childs_months.classList.add('hidden') - two_years_childs_months.required = false - - childs_months.classList.remove('hidden') - childs_months.required = true - } - }); - - form.addEventListener('submit', function(e) { - - e.preventDefault(); - - let months = 0; - - if (childs_years.value == 2) { - months = (+$("#two_years_childs_months").val()); - } else { - months = (+$("#childs_months").val()) - } - - const formData = { - childs_age: $("#childs_years").val() * 12 + months, - price_id: $("#product_category").selectedIndex, - locale: $("#form").attr("data-locale") - } - - $.ajax({ - url: "/api/v1/diaper_calculators", - type: "POST", - data: formData, - dataType: "json", - success: function(data) { - for (var i = data.result.length - 1; i >= 0; i--) { - const oneItemFromArray = data.result[i] - $('[data-type="' + oneItemFromArray.name + '"]').text(Math.round(oneItemFromArray.result * 100) / 100); - } - $("#localized_uk_to_be_used_diapers_amount").text(data.word_form_to_be_used + " ви ще використаєте") - $("#localized_uk_used_diapers_amount").text(data.word_form_used + " ви вже використали") - } - }) - }); -}) diff --git a/app/javascript/ajax/checkbox.js b/app/javascript/ajax/checkbox.js index a69f1d451..cedc9da44 100644 --- a/app/javascript/ajax/checkbox.js +++ b/app/javascript/ajax/checkbox.js @@ -1,5 +1,5 @@ jQuery(document).ready(function($){ - $("#button_submit").on('click', function(){ + $(".calculate-btn").on('click', function(){ if($("#checkbox_submit").prop('checked')){ $.ajax({ type: "POST", diff --git a/app/javascript/ajax/result_button.js b/app/javascript/ajax/result_button.js index ac55d6a28..772be1a29 100644 --- a/app/javascript/ajax/result_button.js +++ b/app/javascript/ajax/result_button.js @@ -1,4 +1,4 @@ -$(document).on('turbolinks:load', function() { +$(document).on('turbo:load', function() { const form = document.getElementById('form'); if (!form) { return diff --git a/app/javascript/application.js b/app/javascript/application.js new file mode 100644 index 000000000..f0f77ce64 --- /dev/null +++ b/app/javascript/application.js @@ -0,0 +1,10 @@ +// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails +import "controllers"; +import "channels"; +import "jquery" +import "@hotwired/turbo-rails"; +import "bootstrap"; +import "@fortawesome/fontawesome-free"; +import "@rails/request.js"; +import "@rails/actioncable"; +import "turbo_streams/toast"; diff --git a/app/javascript/channels/index.js b/app/javascript/channels/index.js index 0cfcf7491..dd47d8499 100644 --- a/app/javascript/channels/index.js +++ b/app/javascript/channels/index.js @@ -1,5 +1,3 @@ // Load all the channels within this directory and all subdirectories. // Channel files must be named *_channel.js. - -const channels = require.context('.', true, /_channel\.js$/) -channels.keys().forEach(channels) +// This file is important, please do not remove it! diff --git a/app/javascript/controllers/application.js b/app/javascript/controllers/application.js index f8d76c808..e59d1e4b0 100644 --- a/app/javascript/controllers/application.js +++ b/app/javascript/controllers/application.js @@ -1,15 +1,11 @@ -// This file is auto-generated by ./bin/rails stimulus:manifest:update -// Run that command whenever you add a new controller or create them with -// ./bin/rails generate stimulus controllerName +import { Application } from "@hotwired/stimulus" +import { Turbo } from "@hotwired/turbo-rails"; -import { Application } from "@hotwired/stimulus"; -import { definitionsFromContext } from "@hotwired/stimulus-webpack-helpers"; -const application = Application.start(); +const application = Application.start() +Turbo.start(); // Configure Stimulus development experience -application.debug = false; -window.Stimulus = application; +application.debug = false +window.Stimulus = application -const context = require.context("../controllers", true, /_controller\.js$/); - -application.load(definitionsFromContext(context)); +export { application } diff --git a/app/javascript/controllers/burger_controller.js b/app/javascript/controllers/burger_controller.js new file mode 100644 index 000000000..c019582a6 --- /dev/null +++ b/app/javascript/controllers/burger_controller.js @@ -0,0 +1,11 @@ +import { Controller } from "@hotwired/stimulus"; + +export default class extends Controller { + static targets = ["navbarNav", "iconLines", "iconCross"]; + + toggle() { + this.navbarNavTarget.classList.toggle('hidden'); + this.iconLinesTarget.classList.toggle('hidden'); + this.iconCrossTarget.classList.toggle('hidden'); + } +} diff --git a/app/javascript/controllers/handle_browser_tab_controller.js b/app/javascript/controllers/handle_browser_tab_controller.js index 4554542fb..911be9e47 100644 --- a/app/javascript/controllers/handle_browser_tab_controller.js +++ b/app/javascript/controllers/handle_browser_tab_controller.js @@ -1,33 +1,22 @@ import { Controller } from '@hotwired/stimulus' export default class extends Controller { - connect() { - this.input = this.element.querySelector("input#site_setting_title") - this.title = this.element.querySelector(".tab-text") - this.icon = this.element.querySelector('.tab-icon') + static targets = ["title", "icon"] - this.input.addEventListener('input', (event) => { - this.setTitle(event); - }); - - const fileInput = this.element.querySelector("input#site_setting_favicon") - fileInput.addEventListener('change', this.readURL.bind(this)) - } setTitle(event) { - this.title.textContent = event.target.value + this.titleTarget.textContent = event.target.value } - readURL(event) { + setIcon(event) { if (event.target.files && event.target.files[0]) { const reader = new FileReader(); - const icon = this.element.querySelector('.tab-icon'); - reader.onload = function (e) { - icon.setAttribute('src', e.target.result); - }; + reader.onload = (e) => { + this.iconTarget.setAttribute('src', e.target.result); + }; - reader.readAsDataURL(event.target.files[0]); + reader.readAsDataURL(event.target.files[0]); } } } diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js new file mode 100644 index 000000000..54ad4cad4 --- /dev/null +++ b/app/javascript/controllers/index.js @@ -0,0 +1,11 @@ +// Import and register all your controllers from the importmap under controllers/* + +import { application } from "controllers/application" + +// Eager load all controllers defined in the import map under controllers/**/*_controller +import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading" +eagerLoadControllersFrom("controllers", application) + +// Lazy load controllers as they appear in the DOM (remember not to preload controllers in import map!) +// import { lazyLoadControllersFrom } from "@hotwired/stimulus-loading" +// lazyLoadControllersFrom("controllers", application) diff --git a/app/javascript/controllers/input_child_info_controller.js b/app/javascript/controllers/input_child_info_controller.js new file mode 100644 index 000000000..4066bc192 --- /dev/null +++ b/app/javascript/controllers/input_child_info_controller.js @@ -0,0 +1,96 @@ +import { Controller } from "@hotwired/stimulus"; +import { FetchRequest } from "@rails/request.js"; +import { toastUtils } from "helpers/toast_helper"; + +export default class extends Controller { + static targets = ["month", "year", "productCategory"]; + static outlets = ["results"]; + static values = { + url: { + type: String, + default: "en/api/v1/diaper_calculators", + }, + months: Array + }; + + connect() { + //hide option '__' from user in year selector + this.yearTarget[0].disabled = true; + this.yearTarget[0].hidden = true; + + //hide option '__' from user in month selector + this.monthTarget[0].disabled = true; + this.monthTarget[0].hidden = true; + } + + yearChanged(e) { + // Determining the number of options for months + const amountOptions = e.target.value.includes("2") ? this.monthsValue.slice(0, 7) : this.monthsValue; + + // Save the previous month value before updating + const previousMonthValue = this.monthTarget.value; + + // Clear old options from the month selection list + this.monthTarget.innerHTML = ''; + + // Adding new options to the month selection list + amountOptions.forEach((option) => { + this.monthTarget.appendChild(this.getBasicOption(option)); + + // If the previous month value is saved, set it as the selected value + if (option == previousMonthValue) { + this.monthTarget.value = previousMonthValue; + } + }); + } + + submit(e) { + e.preventDefault(); + + let formData = { + childs_years: parseInt(this.yearTarget.value), + childs_months: parseInt(this.monthTarget.value), + category_id: this.productCategoryTarget.value, + }; + + const request = new FetchRequest("POST", this.urlValue, { + responseKind: "json", + body: JSON.stringify(formData), + }); + + this.sendRequest(request); + } + + async sendRequest(request) { + const response = await request.perform(); + const result = await response.json; + + + if (response.ok) { + this.resultsOutlet.showResults(result); + } else if (response.statusCode == 422) { + toastUtils.showToast(result.error, "error"); + } + } + + getNillOption(previous_month_value) { + let option = document.createElement("option"); + + option.innerText = "__"; + option.disabled = true; + option.hidden = true; + option.value = ""; + if (previous_month_value == "") option.selected = true; + + return option; + } + + getBasicOption(i) { + let option = document.createElement("option"); + + option.value = i; + option.innerText = i; + + return option; + } +} diff --git a/app/javascript/controllers/loader_controller.js b/app/javascript/controllers/loader_controller.js new file mode 100644 index 000000000..28ec3b3ce --- /dev/null +++ b/app/javascript/controllers/loader_controller.js @@ -0,0 +1,30 @@ +import { Controller } from "@hotwired/stimulus"; + +export default class extends Controller { + static targets = ["loaderMask"]; + + connect() { + this.createLoaderMask(); + } + + createLoaderMask() { + const maskDiv = document.createElement('div'); + maskDiv.classList.add('mask'); + + maskDiv.setAttribute('data-loader-target', 'loaderMask'); + + const loaderDiv = document.createElement('div'); + loaderDiv.classList.add('loader'); + + maskDiv.appendChild(loaderDiv); + this.element.appendChild(maskDiv); + } + + + show_loader(event) { + const loaderMask = this.loaderMaskTarget; + loaderMask.style.opacity = 0.7; + loaderMask.style.zIndex = 100; + } +} + diff --git a/app/javascript/controllers/password_visibility_controller.js b/app/javascript/controllers/password_visibility_controller.js new file mode 100644 index 000000000..7fac88915 --- /dev/null +++ b/app/javascript/controllers/password_visibility_controller.js @@ -0,0 +1,18 @@ +import { Controller } from "@hotwired/stimulus"; + +export default class extends Controller { + static targets = ['password', 'icon'] + + toggle() { + const TEXT_INPUT_TYPE = 'text'; + const PASSWORD_INPUT_TYPE = 'password'; + + if (this.passwordTarget && this.passwordTarget.type === PASSWORD_INPUT_TYPE) { + this.passwordTarget.type = TEXT_INPUT_TYPE; + this.iconTarget.classList.replace('fa-eye-slash', 'fa-eye'); + } else if (this.passwordTarget) { + this.passwordTarget.type = PASSWORD_INPUT_TYPE; + this.iconTarget.classList.replace('fa-eye', 'fa-eye-slash'); + } + } +} diff --git a/app/javascript/controllers/price_form_controller.js b/app/javascript/controllers/price_form_controller.js new file mode 100644 index 000000000..aa65bd53e --- /dev/null +++ b/app/javascript/controllers/price_form_controller.js @@ -0,0 +1,40 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = [ "priceInput", "price", "checkbox", "hiddenField" ] + + connect() { + for(let i = 0; i < this.checkboxTargets.length; i++) { + if (!this.priceInputTargets[i].value) { + this.checkboxTargets[i].checked = false + this.priceTargets[i].hidden = true + } + } + } + + togglePrice(event) { + this.priceTargets.forEach((target, i) => { + if (event.target.attributes.name.value == target.attributes.name.value) { + target.hidden = !target.hidden; + + if (target.hidden) { + this.priceInputTargets[i].value = ''; + } + } + }); + } + + removePrice(event) { + for (let i = 0; i < this.priceTargets.length; i++) { + if (event.target.attributes.name.value == this.priceTargets[i].attributes.name.value) { + this.priceInputTargets[i].value = '' + } + } + } + + submit() { + for(let i = 0; i < this.checkboxTargets.length; i++) { + this.hiddenFieldTargets[i].value = !this.checkboxTargets[i].checked + } + } +} diff --git a/app/javascript/controllers/results_controller.js b/app/javascript/controllers/results_controller.js new file mode 100644 index 000000000..2fc4578ed --- /dev/null +++ b/app/javascript/controllers/results_controller.js @@ -0,0 +1,24 @@ +import { Controller } from "@hotwired/stimulus"; + +export default class extends Controller { + static targets = [ + "diapersUsed", + "diapersToBeUsed", + "moneySpent", + "moneyWillBeSpent", + "willBuyDiapersPluralize", + "boughtDiapersPluralize", + ]; + + showResults(data) { + let result = data.result; + + this.moneySpentTarget.innerHTML = Math.ceil(result.money_spent); + this.moneyWillBeSpentTarget.innerHTML = Math.ceil(result.money_will_be_spent); + this.diapersUsedTarget.innerHTML = Math.ceil(result.used_diapers_amount); + this.diapersToBeUsedTarget.innerHTML = Math.ceil(result.to_be_used_diapers_amount); + + this.willBuyDiapersPluralizeTarget.innerHTML = result.to_be_diapers_amount_pluralize; + this.boughtDiapersPluralizeTarget.innerHTML = result.used_diapers_amount_pluralize; + } +} diff --git a/app/javascript/controllers/stimulus_application.js b/app/javascript/controllers/stimulus_application.js new file mode 100644 index 000000000..b38e1367c --- /dev/null +++ b/app/javascript/controllers/stimulus_application.js @@ -0,0 +1,12 @@ +import { Application } from "@hotwired/stimulus"; +import { definitionsFromContext } from "@hotwired/stimulus-webpack-helpers"; + +const application = Application.start(); + +// Configure Stimulus development experience +application.debug = false; +window.Stimulus = application; + +const context = require.context("../controllers", true, /_controller\.js$/); + +application.load(definitionsFromContext(context)); diff --git a/app/javascript/css/account_edit_show.css.scss b/app/javascript/css/account_edit_show.css.scss deleted file mode 100644 index b4c485d49..000000000 --- a/app/javascript/css/account_edit_show.css.scss +++ /dev/null @@ -1,17 +0,0 @@ -.flex-container { - display: flex; -} - -.flex-child { - flex: 1; -} - -.flex-child:first-child { - margin-right: 20px; -} - -.flex-child img { - display: block; - margin: 0 auto; - width: 75%; -} diff --git a/app/javascript/css/calculator.css.scss b/app/javascript/css/calculator.css.scss deleted file mode 100644 index 13deff6f2..000000000 --- a/app/javascript/css/calculator.css.scss +++ /dev/null @@ -1,179 +0,0 @@ -.calculate-btn { - width: 100%; - height: 56px; - margin-top: 40px; - color: #fff; - background-color: #8fba3b; - border: none; - border-radius: 4px; - padding-top: 2px; - font-size: 14px; - letter-spacing: 2px; - text-align: center; - font-weight: 400; - font-family: "Nunito", sans-serif; - font-style: normal; - transition: transform 0.5s linear; - max-width: 300px; -} - -#calc { - padding-top: 2px; - margin-right: 10px; -} - -.form-p { - font-size: 20px; - line-height: 30px; - font-weight: 400; - color: #666666; - position: relative; - left: 20px; - margin-bottom: 0px; -} -.form-a { - font-size: 20px; - line-height: 30px; - font-weight: 400; - color: #666666; - position: relative; - top: 17px; - left: 0px; - margin-bottom: 0px; -} - -.calculator__cross__space { - position: relative; - top: -5px; -} - -.form { - padding-left: 15px; - max-width: 800px; -} - -.row-l { - margin-left: 0px; - margin-right: 0px; -} - -.flex-item { - display: flex; - gap: 10px; - width: 100%; - flex-wrap: wrap; - select { - margin-top: 25px; - width: 300px; - } -} - -.flex-item input[type="text"], -.flex-item input[type="date"] { - height: 50px; - margin-right: 20px; -} - -.check-label { - margin-left: 15px; -} - -.form-input { - width: 160px; - padding-left: 20px; -} - -.last-year option:nth-child(1n + 9) { - display: none; -} - -.hidden { - display: none; -} - -#date { - width: 236px; - padding-left: 20px; - padding-right: 12px; - color: #999999; -} - -.result-btn { - text-align: center; -} - -.result-btn #calc { - padding: 0; - margin: 0; -} - -.logo-zerowaste { - width: 11em; -} - -.logo-zerowaste img { - width: 100%; - border-radius: 5px; -} - -.description-btn { - margin-left: 50px; - margin-top: 45px; - a { - color: $color; - background-color: transparent; - text-decoration: none; - } -} - -.col-xl-8.result-card { - span { - text-align: left; - margin-left: 30px; - a { - color: $success; - background-color: transparent; - text-decoration: none; - } - a:hover { - color: #256d36; - background-color: transparent; - text-decoration: none; - } - } -} - -.z-1 { - z-index: 1; -} - -@media screen and (max-width: 1199px) and (min-width: 400px) { - button.calculate-btn.result-btn.description-btn { - margin: auto; - } -} - -@media screen and (max-width: $sm) { - .logo-zerowaste img { - width: 100%; - } - - .logo-zerowaste { - width: 9em; - } - .calculator__cross__space { - margin-right: 5px; - } - .form { - padding-left: 10px; - } - .form-p { - left: 10px; - } - .flex-item { - width: 300px; - } - .result-btn { - width: 300px; - } -} diff --git a/app/javascript/css/contact_us.css.scss b/app/javascript/css/contact_us.css.scss deleted file mode 100644 index 62dfe4ec4..000000000 --- a/app/javascript/css/contact_us.css.scss +++ /dev/null @@ -1,26 +0,0 @@ -.contact-form .msg, -.contact-form .email { - margin-bottom: 1rem; -} - -.contact-form textarea { - border: 2px solid $gray; -} - -.text { - margin-bottom: 0.5rem; -} - -.contact-info { - color: #000; - background-color: $color; - width: 40%; - border-radius: 10px; - text-align: center; - min-width: max-content; - & a { - color: #000; - border-bottom: solid #212529 2px; - padding: 1%; - } -} diff --git a/app/javascript/helpers/toast_helper.js b/app/javascript/helpers/toast_helper.js new file mode 100644 index 000000000..62aa5d915 --- /dev/null +++ b/app/javascript/helpers/toast_helper.js @@ -0,0 +1,35 @@ +import Toastify from "toastify-js"; + +function getColorBackground(background) { + switch (background) { + case "error": + return "#DC3545"; + case "notice": + return "#8FBA3B"; + case "alert": + return "#FF6A00"; + default: + return "#DC3545"; + } +} + +function showToast(message, background) { + const backgroundColor = getColorBackground(background); + + Toastify({ + text: message, + duration: 20000, + destination: "", + close: true, + gravity: "top", + position: "right", + stopOnFocus: true, + style: { + background: backgroundColor, + } + }).showToast() +} + +export const toastUtils = { + showToast, +}; diff --git a/app/javascript/images/search.png b/app/javascript/images/search.png deleted file mode 100644 index 974055ce4..000000000 Binary files a/app/javascript/images/search.png and /dev/null differ diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js deleted file mode 100644 index 5a0b8efe2..000000000 --- a/app/javascript/packs/application.js +++ /dev/null @@ -1,43 +0,0 @@ -// This file is automatically compiled by Webpack, along with any other files -// present in this directory. You're encouraged to place your actual application logic in -// a relevant structure within app/javascript and only use these pack files to reference -// that code so it'll be compiled. - -import Rails from '@rails/ujs'; -import Turbolinks from 'turbolinks'; -import * as ActiveStorage from '@rails/activestorage'; -import 'channels'; - -require('jquery'); -require("@nathanvda/cocoon"); - -// const jQuery = require('jquery'); -// global.$ = global.jQuery = jQuery; -// window.$ = window.jQuery = jQuery; - -import 'bootstrap'; -import '@fortawesome/fontawesome-free/js/all'; -import '../stylesheets/application'; -// import 'ajax/result_button'; -import 'ajax/checkbox'; -import 'plugins/flatpickr'; -import "@fortawesome/fontawesome-free/css/all" - -import "../js/calculators/edit" -import "../controllers/application" - -import "../ajax/calculate_result_button" - -const images = require.context('../images', true) -Rails.start(); -Turbolinks.start(); -ActiveStorage.start(); -// document.addEventListener('turbolinks:load', () => { -// $('[data-toggle="tooltip"]').tooltip(); -// $('[data-toggle="popover"]').popover(); -// }); -$('document').ready(function() { - setTimeout(function() { - $('.alert').slideUp(); - }, 10000); -}); diff --git a/app/javascript/stylesheets/application.scss b/app/javascript/stylesheets/application.scss deleted file mode 100644 index 4f5dcd6df..000000000 --- a/app/javascript/stylesheets/application.scss +++ /dev/null @@ -1,52 +0,0 @@ -$success: #8FBA3B; -$color: #fff; -$error: #9e1503; -$gray: #8D8D8D; - -$xs: 576px; -$sm: 768px; -$md: 1024px; - -@import "~bootstrap/scss/bootstrap"; -@import "../css/main.css.scss"; -@import "../css/message.css.scss"; -@import "../css/browser_tab.css.scss"; -@import "../css/account_edit_show.css.scss"; -@import "../css/calculator.css.scss"; - -@font-face { - font-family: 'Comfortaa'; - src: url('../fonts/Comfortaa-Regular.eot'); - src: url('../fonts/Comfortaa-Regular.eot?#iefix') format('embedded-opentype'), - url('../fonts/Comfortaa-Regular.woff2') format('woff2'), - url('../fonts/Comfortaa-Regular.woff') format('woff'), - url('../fonts/Comfortaa-Regular.ttf') format('truetype'); - font-weight: normal; - font-style: normal; - font-display: swap; -} - -/*Mxn*/ -@mixin transform($transforms) { - -webkit-transform: $transforms; - -moz-transform: $transforms; - -o-transform: $transforms; - -ms-transform: $transforms; - transform: $transforms; -} -@mixin translate ($x, $y) { - @include transform(translate($x, $y)); -} -@mixin transition($args) { - -webkit-transition: $args; - -moz-transition: $args; - -ms-transition: $args; - -o-transition: $args; - transition: $args; -} -*, :after, :before { - box-sizing: border-box; -} -html { - height: 100%; -} diff --git a/app/javascript/turbo_streams/toast.js b/app/javascript/turbo_streams/toast.js new file mode 100644 index 000000000..b2010abaa --- /dev/null +++ b/app/javascript/turbo_streams/toast.js @@ -0,0 +1,8 @@ +import { toastUtils } from "helpers/toast_helper"; + +window.Turbo.StreamActions.toast = function() { + const message = this.getAttribute("message") + const background = this.getAttribute("background") + + toastUtils.showToast(message, background) +} diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 38d371e41..bc50f077b 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -3,10 +3,10 @@ class UserMailer < ApplicationMailer default from: "zerowastemailer@gmail.com" - def test_email(email, message = nil) - @email = email - @message = message + def welcome_email(user) + @user = user + @url = root_url - mail(to: @email, subject: I18n.t("mailer.test_mail.subject")) + mail(to: @user.email, subject: I18n.t("mailer.welcome_mail.subject")) end end diff --git a/app/models/ability.rb b/app/models/ability.rb index 6a86b4714..623fade86 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -11,7 +11,6 @@ def initialize(user) can :manage, Calculator can :manage, User can :manage, Message - can :manage, AppConfig can :manage, Category can :manage, SiteSetting end diff --git a/app/models/app_config.rb b/app/models/app_config.rb deleted file mode 100644 index 0e3546681..000000000 --- a/app/models/app_config.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -# == Schema Information -# -# Table name: app_configs -# -# id :bigint not null, primary key -# diapers_calculator :jsonb -# created_at :datetime not null -# updated_at :datetime not null -# -class AppConfig < ApplicationRecord - acts_as_singleton -end diff --git a/app/models/calculator.rb b/app/models/calculator.rb index 42a43b7f8..9701f853f 100644 --- a/app/models/calculator.rb +++ b/app/models/calculator.rb @@ -14,13 +14,15 @@ # # Indexes # +# index_calculators_on_name (name) UNIQUE # index_calculators_on_slug (slug) UNIQUE # index_calculators_on_uuid (uuid) UNIQUE # + class Calculator < ApplicationRecord extend FriendlyId - friendly_id :name, use: :slugged + friendly_id :name, use: :sequentially_slugged has_paper_trail @@ -28,10 +30,14 @@ class Calculator < ApplicationRecord accepts_nested_attributes_for :fields, allow_destroy: true - validates :name, length: { minimum: 2 }, - format: { with: /\A[a-zA-Z0-9\s]+\z/, message: :name_format_validation }, - uniqueness: true + validates :name, presence: true + validates :name, + length: { in: 2..30 }, + uniqueness: true, + format: { with: /\A[a-zA-Zа-яієїґ'А-ЯІЄЇҐ0-9\-\s]+\z/ }, + allow_blank: true + scope :ordered_by_name, -> { order(:name) } scope :by_name_or_slug, lambda { |search| where( "name ILIKE ? OR slug ILIKE ?", @@ -39,4 +45,12 @@ class Calculator < ApplicationRecord "%#{search&.strip}%" ) } + + def normalize_friendly_id(input) + input.to_slug.transliterate(:ukrainian).normalize.to_s + end + + def self.ransackable_attributes(auth_object = nil) + ["created_at", "id", "name", "preferable", "slug", "updated_at", "uuid"] + end end diff --git a/app/models/category.rb b/app/models/category.rb index 1932fcf3f..4a8af8ca6 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,8 +1,54 @@ # frozen_string_literal: true +# == Schema Information +# +# Table name: categories +# +# id :bigint not null, primary key +# name :string +# priority :integer default(0), not null +# created_at :datetime not null +# updated_at :datetime not null +# preferable :boolean default: false +# class Category < ApplicationRecord + PRIORITY_RANGE = 0..10 + + enum preferable: { not_preferable: false, preferable: true } + + has_many :prices, dependent: :destroy + has_many :diapers_periods, dependent: :destroy has_many :category_categoryables, dependent: :restrict_with_exception has_many :categoryables, through: :category_categoryables validates :name, presence: true + validates :name, + length: { minimum: 3, maximum: 30 }, + format: { with: /\A[\p{L}0-9\s'-]+\z/i }, + uniqueness: { case_sensitive: false }, + allow_blank: true + validates :priority, numericality: { greater_than_or_equal_to: 0 } + + scope :ordered_by_name, -> { order(:name) } + scope :ordered_by_priority, -> { order(:priority) } + scope :unsigned_categories, ->(product) { where.not(id: product.categories_by_prices) } + + scope :without_diapers_periods, -> { left_outer_joins(:diapers_periods).where(diapers_periods: { category_id: nil }).distinct } + scope :with_diapers_periods, -> { joins(:diapers_periods).distinct } + scope :with_unfilled_diapers_periods, -> { + left_joins(:diapers_periods) + .group(:id) + .having("MAX(diapers_periods.period_end) IS NULL OR MAX(diapers_periods.period_end) < ?", 30) + } + + scope :ordered_by_diapers_periods_price, -> { + where.not(id: with_unfilled_diapers_periods) + .joins(:diapers_periods) + .group("categories.id") + .order("MIN(diapers_periods.price) ASC") + } + + def self.ransackable_attributes(auth_object = nil) + ["created_at", "id", "name", "priority", "updated_at"] + end end diff --git a/app/models/category_categoryable.rb b/app/models/category_categoryable.rb index d39f4016a..b30b0c99f 100644 --- a/app/models/category_categoryable.rb +++ b/app/models/category_categoryable.rb @@ -1,5 +1,26 @@ # frozen_string_literal: true +# == Schema Information +# +# Table name: category_categoryables +# +# id :bigint not null, primary key +# categoryable_type :string +# created_at :datetime not null +# updated_at :datetime not null +# category_id :bigint +# categoryable_id :bigint +# +# Indexes +# +# index_category_categoryables_on_category_id (category_id) +# index_category_categoryables_on_categoryable (categoryable_type,categoryable_id) +# unique_of_category_categoryables_index (categoryable_type,categoryable_id,category_id) UNIQUE +# +# Foreign Keys +# +# fk_rails_... (category_id => categories.id) +# class CategoryCategoryable < ApplicationRecord belongs_to :categoryable, polymorphic: true belongs_to :category diff --git a/app/models/diapers_period.rb b/app/models/diapers_period.rb new file mode 100644 index 000000000..2f310a911 --- /dev/null +++ b/app/models/diapers_period.rb @@ -0,0 +1,41 @@ +# == Schema Information +# +# Table name: diapers_periods +# +# category_id :bigint null: false +# price :decimal precision: 8, scale: 2 +# period_start :integer null: false +# period_end :integer null: false +# usage_amount :integer null: false +# created_at :datetime null: false +# updated_at :datetime null: false +# index ["category_id"], name: "index_diapers_periods_on_category_id" + +class DiapersPeriod < ApplicationRecord + belongs_to :category + + validates :price, presence: true + validates :price, numericality: { greater_than_or_equal_to: 0, less_than: 1000 }, allow_blank: true + + validates :period_start, + presence: true, + numericality: { only_integer: true, greater_than_or_equal_to: 1 } + + validates :period_end, presence: true + validates :period_end, + numericality: { only_integer: true, greater_than: :period_start, less_than_or_equal_to: 30 }, + allow_blank: true + + validates :usage_amount, presence: true + validates :usage_amount, + numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than: 100 }, + allow_blank: true + + scope :ordered, -> { order(:id) } + + def self.start_date(category) + last_period = category.diapers_periods.order(:created_at).last + + last_period ? (last_period.period_end + 1) : 1 + end +end diff --git a/app/models/message.rb b/app/models/message.rb index 37ae26e48..49190473b 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -12,7 +12,17 @@ # updated_at :datetime not null # class Message < ApplicationRecord + scope :ordered_by_title, -> { order(:title) } + validates :title, presence: true, length: { minimum: 5 } validates :message, presence: true, length: { minimum: 20 } validates :email, presence: true, format: { with: URI::MailTo::EMAIL_REGEXP } + + def self.ransackable_attributes(auth_object = nil) + ["created_at", "email", "id", "message", "title", "updated_at"] + end + + def self.ransackable_associations(auth_object = nil) + [] + end end diff --git a/app/models/price.rb b/app/models/price.rb index 6fa947ab3..4e1828b9c 100644 --- a/app/models/price.rb +++ b/app/models/price.rb @@ -1,9 +1,28 @@ # frozen_string_literal: true +# == Schema Information +# +# Table name: prices +# +# id :bigint not null, primary key +# priceable_type :string +# sum :decimal(8, 2) +# created_at :datetime not null +# updated_at :datetime not null +# category_id :integer +# priceable_id :bigint +# +# Indexes +# +# index_prices_on_category_id (category_id) +# index_prices_on_category_id_and_priceable_id_and_priceable_type (category_id,priceable_id,priceable_type) UNIQUE +# index_prices_on_priceable (priceable_type,priceable_id) +# class Price < ApplicationRecord belongs_to :priceable, polymorphic: true belongs_to :category, optional: true validates :sum, presence: true + validates :sum, numericality: { greater_than_or_equal_to: 0, less_than: 1_000_000 } validates :category_id, uniqueness: { scope: [:priceable_id, :priceable_type] } end diff --git a/app/models/product.rb b/app/models/product.rb index 588d1a8f0..590d71a7d 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -19,12 +19,19 @@ class Product < ApplicationRecord DIAPER = "diaper" - belongs_to :product_type - has_many :category_categoryables, as: :categoryable, dependent: :destroy - has_many :categories, through: :category_categoryables + scope :ordered_by_title, -> { order(:title) } + has_many :prices, as: :priceable, dependent: :destroy + has_many :categories_by_prices, through: :prices, source: :category + + validates :title, presence: true + validates :title, + length: { in: 2..30 }, + uniqueness: true, + format: { with: /\A[a-zA-Zа-яієїґ'А-ЯІЄЇҐ0-9\-\s]+\z/ }, + if: -> { title.present? } - validates :title, presence: true, length: { in: 2..50 } + accepts_nested_attributes_for :prices, reject_if: :blank_prices, allow_destroy: true def self.diaper find_by(title: DIAPER) @@ -33,4 +40,24 @@ def self.diaper def price_by_category(category) prices.where(category: category).first end + + def find_or_build_price_for_category(category) + prices.find_by(category: category) || prices.build(category: category) + end + + def build_unsigned_categories + unsigned_categories = Category.unsigned_categories(self) + + prices.build(unsigned_categories.map { |category| { category: category } }) + end + + def self.ransackable_attributes(auth_object = nil) + ["created_at", "id", "product_type_id", "title", "updated_at", "uuid"] + end + + private + + def blank_prices(attributes) + attributes[:sum].blank? + end end diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb index 5e1d4002f..09a918494 100644 --- a/app/models/site_setting.rb +++ b/app/models/site_setting.rb @@ -2,8 +2,8 @@ # # Table name: site_settings # -# id :integer not null, primary key -# title :string default("ZeroWaste") +# id :bigint not null, primary key +# title :string default("ZeroWaste"), not null # created_at :datetime not null # updated_at :datetime not null # @@ -12,23 +12,39 @@ class SiteSetting < ApplicationRecord has_one_attached :favicon, dependent: :destroy - validates :title, presence: true, length: { maximum: 20, minimum: 3 } + validates :title, presence: true + validates :title, length: { minimum: 3, maximum: 30 }, if: -> { title.present? } validates :favicon, attached: true, - content_type: [:png, :jpg, :jpeg, :ico], - size: { less_than: 500.kilobytes, - message: I18n.t("account.site_settings.validations.size") } + content_type: [:png, :ico], + size: { less_than_or_equal_to: 1.kilobytes }, + dimension: { width: { min: 16, max: 180 }, + height: { min: 16, max: 180 }}, + aspect_ratio: :square after_initialize :set_default_favicon singleton_class.alias_method :current, :instance + def self.restore_defaults! + default_attributes = { + title: "ZeroWaste", + favicon: { + io: File.open("app/assets/images/icons/favicon-48x48.png"), + filename: "favicon-48x48.png", + content_type: "image/png" + } + } + + SiteSetting.current.update(default_attributes) + end + private def set_default_favicon if new_record? && !favicon.attached? favicon.attach( - io: File.open("app/assets/images/logo_zerowaste.png"), - filename: "logo_zerowaste.png", + io: File.open("app/assets/images/icons/favicon-48x48.png"), + filename: "favicon-48x48.png", content_type: "image/png" ) end diff --git a/app/models/user.rb b/app/models/user.rb index 3349c5a48..76254bd71 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -38,7 +38,11 @@ # index_users_on_reset_password_token (reset_password_token) UNIQUE # class User < ApplicationRecord - attr_accessor :current_password, :skip_password_validation + attr_accessor :current_password, :skip_password_validation, :send_credentials_email + + scope :ordered_by_email, -> { order(:email) } + scope :ordered_by_first_name, -> { order(:first_name) } + scope :ordered_by_last_name, -> { order(:last_name) } has_paper_trail ignore: [ :current_sign_in_at, :last_sign_in_at, :confirmation_token, @@ -59,28 +63,33 @@ def self.grouped_collection_by_role devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :confirmable, :lockable, :timeoutable, :trackable, :async, :omniauthable, omniauth_providers: [:google_oauth2, :facebook] - validates :email, presence: true, uniqueness: { case_sensitive: false }, - length: { minimum: 6, maximum: 100 }, - format: { with: URI::MailTo::EMAIL_REGEXP } + validates :email, presence: true, uniqueness: { case_sensitive: false } + validates :email, length: { minimum: 6, maximum: 100 }, allow_blank: true + validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }, allow_blank: true + validates :password, presence: true, unless: :skip_password_validation validates :password, - presence: true, confirmation: true, length: { in: 8..64 }, + unless: :skip_password_validation, + allow_blank: true + validates :password, + confirmation: true, format: { with: %r{[-!$%^&*()_+|~=`{}\[\]:";'<>?,./\w]{8,}} }, - unless: :skip_password_validation + unless: :skip_password_validation, + allow_blank: true + validates :first_name, :last_name, presence: true + validates :first_name, :last_name, length: { in: 2..50 }, allow_blank: true validates :first_name, :last_name, - presence: true, - length: { minimum: 2 }, - on: [:create, :update], - format: { with: /[a-zA-Zа-їА-ЯЄІЇ]+-?'?`?/ } + format: { with: /[a-zA-Zа-їА-ЯЄІЇ]+-?'?`?/ }, + allow_blank: true validates :avatar, content_type: ["image/png", "image/jpeg", "image/jpg"], size: { less_than: 2.megabytes } def self.from_omniauth(access_token) data = access_token.info - user = User.where(email: data["email"]).first - split_name = data["name"].split + user = User.find_by(email: data["email"]) + split_name = data["name"].split if data["name"].present? user ||= User.create(first_name: data["first_name"] || split_name[0], last_name: data["last_name"] || split_name[1], email: data["email"], @@ -111,12 +120,15 @@ def password_required? super end - def self.new_with_session(params, session) - super.tap do |user| - if (data = session["devise.google_oauth2"]) && - session["devise.google_oauth2_data"]["extra"]["raw_info"] - user.email = data["email"] - end - end + def full_name + [first_name, last_name].compact_blank.join(" ") + end + + def self.ransackable_attributes(auth_object = nil) + ["created_at", "id", "blocked", "country", "email", "first_name", "last_name", "updated_at"] + end + + def self.ransackable_associations(auth_object = nil) + [] end end diff --git a/app/services/calculators/diaper_usage_service.rb b/app/services/calculators/diaper_usage_service.rb new file mode 100644 index 000000000..faa902ca2 --- /dev/null +++ b/app/services/calculators/diaper_usage_service.rb @@ -0,0 +1,50 @@ +class Calculators::DiaperUsageService + attr_accessor :age, :used_diapers_amount, :to_be_used_diapers_amount, + :used_diapers_price, :to_be_used_diapers_price + + def initialize(years, month, category_id) + @age = years.to_i * 12 + month.to_i + @category_id = category_id + @used_diapers_amount = 0 + @to_be_used_diapers_amount = 0 + @used_diapers_price = 0 + @to_be_used_diapers_price = 0 + end + + def calculate + used_diapers_amount_all_periods = 0 + used_diapers_price_all_periods = 0 + + diapers_periods = DiapersPeriod.where(category_id: @category_id) + + diapers_periods.each do |diapers_period| + quantity_in_period = diapers_period.usage_amount * 30.5 * (diapers_period.period_end - diapers_period.period_start + 1) + cost_in_period = quantity_in_period * diapers_period.price + + used_diapers_amount_all_periods += quantity_in_period + used_diapers_price_all_periods += cost_in_period + + if diapers_period.period_start <= @age + months_in_period = [age, diapers_period.period_end].min - diapers_period.period_start + 1 + quantity_in_period = diapers_period.usage_amount * 30.5 * months_in_period + cost_in_period = quantity_in_period * diapers_period.price + + @used_diapers_amount += quantity_in_period + @used_diapers_price += cost_in_period + end + end + + @to_be_used_diapers_amount = used_diapers_amount_all_periods - used_diapers_amount + @to_be_used_diapers_price = used_diapers_price_all_periods - used_diapers_price + end + + def result + { + age: @age, + used_diapers_amount: @used_diapers_amount, + to_be_used_diapers_amount: @to_be_used_diapers_amount, + used_diapers_price: @used_diapers_price, + to_be_used_diapers_price: @to_be_used_diapers_price + } + end +end diff --git a/app/services/calculators/diapers_service.rb b/app/services/calculators/diapers_service.rb deleted file mode 100644 index 7133ffb6e..000000000 --- a/app/services/calculators/diapers_service.rb +++ /dev/null @@ -1,59 +0,0 @@ -# frozen_string_literal: true - -class Calculators::DiapersService - attr_accessor :age, :used_diapers_amount, :to_be_used_diapers_amount, - :used_diapers_price, :to_be_used_diapers_price, :config - - def initialize(age) - @age = age - @used_diapers_amount = 0 - @to_be_used_diapers_amount = 0 - @used_diapers_price = 0 - @to_be_used_diapers_price = 0 - @config = AppConfig.instance.diapers_calculator - total - end - - def calculate! - @config.each_key do |key| - key = to_range key - if key.last <= @age - change(key, key.size) - elsif key.include? @age - change(key, @age - key.first + 1) - end - end - @to_be_used_diapers_amount -= used_diapers_amount - @to_be_used_diapers_price -= used_diapers_price - self - end - - private - - def change(period, coef) - @used_diapers_amount += month_amount(period) * coef - @used_diapers_price += month_price(period) * coef - end - - def to_range(str) - arr = str.split("..").map { |d| Integer(d) } - arr[0]..arr[1] - end - - def total - @config.each do |key, value| - @to_be_used_diapers_amount += value["amount"].to_f * 30.5 * - to_range(key).size - @to_be_used_diapers_price += - value["amount"].to_f * value["price"].to_f * 30.5 * to_range(key).size - end - end - - def month_amount(period) - @config[period.to_s]["amount"].to_f * 30.5 - end - - def month_price(period) - month_amount(period) * @config[period.to_s]["price"].to_f - end -end diff --git a/app/services/categories/preferable_service.rb b/app/services/categories/preferable_service.rb new file mode 100644 index 000000000..1135769c2 --- /dev/null +++ b/app/services/categories/preferable_service.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class Categories::PreferableService + def initialize(category) + @category = category + end + + def call + if @category.preferable? + Category.where.not(id: @category.id).update(preferable: :not_preferable) + end + end +end diff --git a/app/services/database_backup_service.rb b/app/services/database_backup_service.rb new file mode 100644 index 000000000..7a34122ee --- /dev/null +++ b/app/services/database_backup_service.rb @@ -0,0 +1,69 @@ +class DatabaseBackupService + BACKUP_SANDBOX_NAME = "zero_waste_sandbox.dump".freeze + MAX_NUMBER_BACKUP = 10 + + class << self + def database_name + ActiveRecord::Base.connection.current_database + end + + def backup_dir + @backup_dir ||= Rails.root.join("db", "backups") + end + + def backup_archive_dir + @backup_archive_dir ||= Rails.root.join(backup_dir, "archive") + end + + def backup_full_path(file_name = "") + file_name = generate_backup_filename if file_name.blank? + + File.join(backup_dir, file_name) + end + + def sandbox_enable(dump_flag) + dump_flag.tap do + return dump_flag if sandbox_enabled? == dump_flag + + operation = dump_flag ? "create" : "restore" + command = "rake 'db:backup:#{operation}[#{BACKUP_SANDBOX_NAME}]'" + + return !dump_flag unless system(command) + + copy_to_archive(backup_full_path(BACKUP_SANDBOX_NAME)) unless dump_flag + end + end + + def sandbox_enabled? + backup_file = File.join(backup_dir, BACKUP_SANDBOX_NAME) + + File.exist?(backup_file) + end + + def copy_to_archive(backup_file) + prune_old_backups if exceeds_backup_limit? + + new_file_name = generate_backup_filename + new_file_path = File.join(backup_archive_dir, new_file_name) + + FileUtils.mv(backup_file, new_file_path) + end + + private_class_method + + def generate_backup_filename + "#{Time.current.strftime("%Y%m%d%H%M%S")}_#{database_name}.dump" + end + + def prune_old_backups + files = Dir.glob(File.join(backup_archive_dir, "*")).select { |f| File.file?(f) } + oldest_file = files.min_by { |f| File.mtime(f) } + + FileUtils.rm(oldest_file) if oldest_file + end + + def exceeds_backup_limit? + Dir.glob(File.join(backup_archive_dir, "*")).size >= MAX_NUMBER_BACKUP + end + end +end diff --git a/app/services/update_feature_flags_service.rb b/app/services/update_feature_flags_service.rb new file mode 100644 index 000000000..c4dab3946 --- /dev/null +++ b/app/services/update_feature_flags_service.rb @@ -0,0 +1,16 @@ +class UpdateFeatureFlagsService + def initialize(params) + @feature_params = params + end + + def call + Flipper.features.each do |feature| + feature_name = feature.name + is_enabled = @feature_params["#{feature_name}_enabled"].to_s == "1" + + is_enabled = DatabaseBackupService.sandbox_enable(is_enabled) if feature_name == "sandbox_mode" + + Flipper.public_send((is_enabled ? "enable" : "disable").to_s, feature_name) + end + end +end diff --git a/app/validators/calculator_validator.rb b/app/validators/calculator_validator.rb new file mode 100644 index 000000000..d6520ec3b --- /dev/null +++ b/app/validators/calculator_validator.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class CalculatorValidator + attr_reader :params, :error + + def initialize(params) + @params = params + end + + def valid? + childs_years = params.fetch(:childs_years, nil) + childs_months = params.fetch(:childs_months, nil) + + if childs_years.blank? && childs_months.blank? + @error = I18n.t("calculators.errors.year_and_month_error_msg") + false + elsif childs_years.blank? + @error = I18n.t("calculators.errors.year_error_msg") + false + elsif childs_months.blank? + @error = I18n.t("calculators.errors.month_error_msg") + false + else + true + end + end +end diff --git a/app/views/account/app_configs/edit.html.erb b/app/views/account/app_configs/edit.html.erb new file mode 100644 index 000000000..c19550958 --- /dev/null +++ b/app/views/account/app_configs/edit.html.erb @@ -0,0 +1,132 @@ +<% set_meta_tags(title: t(".meta-title")) %> + +
+

<%= t('.diapers_calculator_config') %>

+
+ +
+ <%= form_with(url: account_app_config_path, method: :patch, id: 'form-diapers') do |f| %> + +
+
+ <%= f.label t('.first_period'), class: 'h3' %> +
+
+ <%= f.label t('.second_period'), class: 'h3' %> +
+
+ +
+
+ <%= f.label :first_amount, t('.amount') %> + <%= f.number_field :first_amount, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('1..3', 'amount') %> +
+
+ <%= f.label :first_price, t('.price') %> + <%= f.number_field :first_price, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('1..3', 'price') %> +
+
+ <%= f.label :second_amount, t('.amount') %> + <%= f.number_field :second_amount, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('4..6', 'amount') %> +
+
+ <%= f.label :second_price, t('.price') %> + <%= f.number_field :second_price, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('4..6', 'price') %> +
+
+ +
+
+ <%= f.label t('.third_period'), class: 'h3' %> +
+
+ <%= f.label t('.fourth_period'), class: 'h3' %> +
+
+ +
+
+ <%= f.label :third_amount, t('.amount') %> + <%= f.number_field :third_amount, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('7..9', 'amount') %> +
+
+ <%= f.label :third_price, t('.price') %> + <%= f.number_field :third_price, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('7..9', 'price') %> +
+
+ <%= f.label :fourth_amount, t('.amount') %> + <%= f.number_field :fourth_amount, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('10..12', 'amount') %> +
+
+ <%= f.label :fourth_price, t('.price') %> + <%= f.number_field :fourth_price, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('10..12', 'price') %> +
+
+ +
+
+ <%= f.label t('.fifth_period'), class: 'h3' %> +
+
+ <%= f.label t('.sixth_period'), class: 'h3' %> +
+
+ +
+
+ <%= f.label :fifth_amount, t('.amount') %> + <%= f.number_field :fifth_amount, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('13..18', 'amount') %> +
+
+ <%= f.label :fifth_price, t('.price') %> + <%= f.number_field :fifth_price, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('13..18', 'price') %> +
+
+ <%= f.label :sixth_amount, t('.amount') %> + <%= f.number_field :sixth_amount, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('19..24', 'amount') %> +
+
+ <%= f.label :sixth_price, t('.price') %> + <%= f.number_field :sixth_price, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('19..24', 'price') %> +
+
+ +
+
+ <%= f.label t('.seventh_period'), class: 'h3' %> +
+
+
+ +
+
+ <%= f.label :seventh_amount, t('.amount') %> + <%= f.number_field :seventh_amount, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('25..30', 'amount') %> +
+
+ <%= f.label :seventh_price, t('.price') %> + <%= f.number_field :seventh_price, step: 0.5, min: 0, class: 'form-input-number w-100', + value: @app_config.diapers_calculator.dig('25..30', 'price') %> +
+
+ +
+
+ + <% end %> +
diff --git a/app/views/account/app_configs/edit.html.slim b/app/views/account/app_configs/edit.html.slim deleted file mode 100644 index b8018ae60..000000000 --- a/app/views/account/app_configs/edit.html.slim +++ /dev/null @@ -1,86 +0,0 @@ -.container -h2.text-center = t '.diapers_calculator_config' -.container.text-center.mt-5 - = form_with url: account_app_config_path, method: :patch, id: 'form-diapers' do |f| - .row.my-3 - .col - = f.label t('.first_period'), class: 'h3' - .col - = f.label t('.second_period'), class: 'h3' - .row - .col - = f.label :first_amount, t('.amount') - = f.number_field :first_amount, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('1..3', 'amount') - .col - = f.label :first_amount, t('.price') - = f.number_field :first_price, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('1..3', 'price') - .col - = f.label :second_amount, t('.amount') - = f.number_field :second_amount, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('4..6', 'amount') - .col - = f.label :second_price, t('.price') - = f.number_field :second_price, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('4..6', 'price') - .row.my-3 - .col - = f.label t('.third_period'), class: 'h3' - .col - = f.label t('.fourth_period'), class: 'h3' - .row - .col - = f.label :third_amount, t('.amount') - = f.number_field :third_amount, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('7..9', 'amount') - .col - = f.label :third_price, t('.price') - = f.number_field :third_price, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('7..9', 'price') - .col - = f.label :fourth_amount, t('.amount') - = f.number_field :fourth_amount, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('10..12', 'amount') - .col - = f.label :fourth_price, t('.price') - = f.number_field :fourth_price, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('10..12', 'price') - .row.my-3 - .col - = f.label t('.fifth_period'), class: 'h3' - .col - = f.label t('.sixth_period'), class: 'h3' - .row - .col - = f.label :fifth_amount, t('.amount') - = f.number_field :fifth_amount, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('13..18', 'amount') - .col - = f.label :fifth_price, t('.price') - = f.number_field :fifth_price, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('13..18', 'price') - .col - = f.label :sixth_amount, t('.amount') - = f.number_field :sixth_amount, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('19..24', 'amount') - .col - = f.label :sixth_price, t('.price') - = f.number_field :sixth_price, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('19..24', 'price') - .row.my-3 - .col - = f.label t('.seventh_period'), class: 'h3' - .col - .row - .col-3 - = f.label :seventh_amount, t('.amount') - = f.number_field :seventh_amount, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('25..30', 'amount') - .col-3 - = f.label :seventh_price, t('.price') - = f.number_field :seventh_price, step: 0.5, min: 0, class: 'form-input-number', - value: @app_config.diapers_calculator.dig('25..30', 'price') - .col-6 - button.calculate-btn.result-btn[type='submit'] - = t '.update' diff --git a/app/views/account/calculators/edit.html.erb b/app/views/account/calculators/edit.html.erb new file mode 100644 index 000000000..10d648a0a --- /dev/null +++ b/app/views/account/calculators/edit.html.erb @@ -0,0 +1,83 @@ +
+ <%= simple_form_for @calculator, url: { action: 'update' }, wrapper: :horizontal_form, html: { novalidate: false } do |f| %> +
+
+ <%= f.input :name, class: 'form-control', required: true %> +
+
+ <%= f.input :preferable, class: 'form-control' %> +
+
+ +

<%= t('.add_new_field_label') %>

+ +
+
+ <%= select_tag :kind, + options_from_collection_for_select(Field.kinds.keys, :itself, :capitalize), + id: 'calculator_fields_kind', + prompt: t('.form.select_field_kind_label'), + class: 'custom-select', + data: { 'fields-list' => { form: [NamedValue.name, Select.name], + parameter: [Value.name, RangeField.name, Select.name, Calculation.name], + result: [Calculation.name] } } %> +
+
+ <%= select_tag :type, '', id: 'calculator_fields_type', + prompt: t('.form.select_field_type_label'), + class: 'custom-select', + disabled: true %> +
+
+ <%= link_to t('buttons.create'), '#', + class: 'btn btn-success text-white disabled', + id: 'add-calculator-field', + data: { url: new_account_calculator_field_path(calculator_slug: @calculator) } %> +
+
+ +
+

<%= t('.form.form_label') %>

+
+ <% if @form_fields.any? %> + <%= f.fields_for :fields, @form_fields do |ff| %> + <%= render 'account/calculators/fields/form', f: ff %> + <% end %> + <% else %> +

<%= t('.form.no_fields_yet_label') %>

+ <% end %> +
+ +

<%= t('.form.parameters_label') %>

+
+ <% if @parameter_fields.any? %> + <%= f.fields_for :fields, @parameter_fields do |ff| %> + <%= render 'account/calculators/fields/form', f: ff %> + <% end %> + <% else %> +

<%= t('.form.no_fields_yet_label') %>

+ <% end %> +
+ +

<%= t('.form.results_label') %>

+
+ <% if @result_fields.any? %> + <%= f.fields_for :fields, @result_fields do |ff| %> + <%= render 'account/calculators/fields/form', f: ff %> + <% end %> + <% else %> +

<%= t('.form.no_fields_yet_label') %>

+ <% end %> +
+
+ +
+
+ <%= f.button :submit, t('.form.update_calculator_button'), class: 'btn btn-green me-2' %> + <%= link_to account_calculators_path, class: 'btn btn-danger d-flex align-items-center justify-content-center' do %> + <%= t('buttons.cancel') %> + <% end %> +
+
+ <% end %> +
diff --git a/app/views/account/calculators/edit.html.slim b/app/views/account/calculators/edit.html.slim deleted file mode 100644 index 9ea6774e1..000000000 --- a/app/views/account/calculators/edit.html.slim +++ /dev/null @@ -1,74 +0,0 @@ -#calculators-edit.container - - if @calculator.errors.any? - div - h2 - = t('activerecord.form_errors', :count => @calculator.errors.count, - :model => t('models.calculator').downcase) - ul - - @calculator.errors.full_messages.each do |error_message| - li= error_message -few - = simple_form_for @calculator, url: { action: 'update' }, wrapper: :horizontal_form, html: { novalidate: false } do |f| - .form-group.row - .col-4.has-float-label.my-auto - = f.input :name, class: 'form-control', required: true - .col-4.has-float-label.my-auto - = f.input :slug, class: 'form-control', required: true - .col-4.has-float-label.my-auto - = f.input :preferable, class: 'form-control' - - h4.mt-5 =t('.add_new_field_label') - - .form-group.row - .col-6 - = select_tag :kind, - options_from_collection_for_select(Field.kinds.keys, :itself, :capitalize), - id: 'calculator_fields_kind', - prompt: t('.form.select_field_kind_label'), - class: 'custom-select', - data: { 'fields-list' => { form: [NamedValue.name, Select.name], - parameter: [Value.name, RangeField.name, Select.name, Calculation.name], - result: [Calculation.name] } } - .col-4 - = select_tag :type, '', id: 'calculator_fields_type', - prompt: t('.form.select_field_type_label'), - class: 'custom-select', - disabled: true - - .col-2 - = link_to t('.form.create_button'), '#', - class: 'btn btn-success text-white disabled', - id: 'add-calculator-field', - data: { url: new_account_calculator_field_path(calculator_slug: @calculator) } - - .my-5 - h4.mb-2 =t('.form.form_label') - .form-group.row data-kind='form' data-selector-letter=('form'[0].upcase) data-last-selector=(extract_max_selector(@form_fields)) - - if @form_fields.any? - = f.fields_for :fields, @form_fields do |ff| - = render 'account/calculators/fields/form', f: ff - - else - p.ml-3.my-3.text-black-50 data-empty-text=true =t('.form.no_fields_yet_label') - - h4.mb-2 =t('.form.parameters_label') - .form-group.row data-kind='parameter' data-selector-letter=('parameter'[0].upcase) data-last-selector=(extract_max_selector(@parameter_fields)) - - if @parameter_fields.any? - = f.fields_for :fields, @parameter_fields do |ff| - = render 'account/calculators/fields/form', f: ff - - else - p.ml-3.my-3.text-black-50 data-empty-text=true =t('.form.no_fields_yet_label') - - h4.mb-2 =t('.form.results_label') - .form-group.row data-kind='result' data-selector-letter=('result'[0].upcase) data-last-selector=(extract_max_selector(@result_fields)) - - if @result_fields.any? - = f.fields_for :fields, @result_fields do |ff| - = render 'account/calculators/fields/form', f: ff - - else - p.ml-3.my-3.text-black-50 data-empty-text=true =t('.form.no_fields_yet_label') - - .row.my-4 - .col-12.d-flex.justify-content-end - = f.button :submit, t('.form.update_calculator_button'), class: 'btn btn-success mr-2' - = link_to account_calculator_path, class: 'btn btn-danger' do - span.mr-1 =t('.form.cancel_button') - i.fa.fa-times-circle diff --git a/app/views/account/calculators/fields/_calculation.html.slim b/app/views/account/calculators/fields/_calculation.html.slim deleted file mode 100644 index fd6a37182..000000000 --- a/app/views/account/calculators/fields/_calculation.html.slim +++ /dev/null @@ -1,10 +0,0 @@ -.col-lg-1.col-md-2.col-sm-12 - .display-4.text-black-50[data-selector=true]= f.object.selector -= f.input :label, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-3 col-md-2 col-sm-12' } -= f.input :value, class: 'form-control', label: 'Formula', placeholder: 'P2 * F1 / 10', required: true, - wrapper_html: { class: 'col-lg-4 col-md-3 col-sm-12' } -= f.input :unit, collection: Field.units.keys, selected: f.object.unit, class: 'custom-select', - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -.col-lg-1.col-md-2.col-sm-12.has-float-label.pt-4.mt-2 - = link_to_remove_association 'Delete', f, class: 'btn btn-danger' diff --git a/app/views/account/calculators/fields/_form.html.slim b/app/views/account/calculators/fields/_form.html.slim deleted file mode 100644 index ca78e8c8f..000000000 --- a/app/views/account/calculators/fields/_form.html.slim +++ /dev/null @@ -1,19 +0,0 @@ -.nested-fields.w-100 - .field - .row.my-3 - - case f.object.type - - when 'NamedValue' - = render 'account/calculators/fields/named_value', f: f - - when 'Calculation' - = render 'account/calculators/fields/calculation', f: f - - when 'RangeField' - = render 'account/calculators/fields/range_value', f: f - - when 'Select' - = render 'account/calculators/fields/select', f: f - - when 'Value' - = render 'account/calculators/fields/value', f: f - - - if f.object.new_record? - = f.input :kind, as: :hidden, input_html: { value: f.object.kind } - = f.input :type, as: :hidden, input_html: { value: f.object.type } - = f.input :selector, as: :hidden, input_html: { data: { 'selector-input': true } } diff --git a/app/views/account/calculators/fields/_named_value.html.slim b/app/views/account/calculators/fields/_named_value.html.slim deleted file mode 100644 index 68284b868..000000000 --- a/app/views/account/calculators/fields/_named_value.html.slim +++ /dev/null @@ -1,14 +0,0 @@ -.col-lg-1.col-md-2.col-sm-12 - .display-4.text-black-50[data-selector=true]= f.object.selector -= f.input :name, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -= f.input :label, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -= f.input :from, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -= f.input :to, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -= f.input :unit, collection: Field.units.keys, selected: f.object.unit, class: 'custom-select', - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -.col-lg-1.col-md-2.col-sm-12.has-float-label.pt-4.mt-2 - = link_to_remove_association 'Delete', f, class: 'btn btn-danger' diff --git a/app/views/account/calculators/fields/_new.html.slim b/app/views/account/calculators/fields/_new.html.slim deleted file mode 100644 index 32bb24516..000000000 --- a/app/views/account/calculators/fields/_new.html.slim +++ /dev/null @@ -1,3 +0,0 @@ -= simple_form_for calculator do |f| - = f.fields_for :fields, child_index: -> { Time.zone.now.to_i } do |ff| - = render 'account/calculators/fields/form', f: ff diff --git a/app/views/account/calculators/fields/_range_value.html.slim b/app/views/account/calculators/fields/_range_value.html.slim deleted file mode 100644 index cf7e8a08c..000000000 --- a/app/views/account/calculators/fields/_range_value.html.slim +++ /dev/null @@ -1,14 +0,0 @@ -.col-lg-1.col-md-2.col-sm-12 - .display-4.text-black-50[data-selector=true]= f.object.selector -= f.input :label, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -= f.input :from, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -= f.input :to, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -= f.input :value, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -= f.input :unit, collection: Field.units.keys, selected: f.object.unit, class: 'custom-select', - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -.col-lg-1.col-md-2.col-sm-12.has-float-label.pt-4.mt-2 - = link_to_remove_association 'Delete', f, class: 'btn btn-danger' diff --git a/app/views/account/calculators/fields/_select.html.slim b/app/views/account/calculators/fields/_select.html.slim deleted file mode 100644 index 6b817dfa2..000000000 --- a/app/views/account/calculators/fields/_select.html.slim +++ /dev/null @@ -1,6 +0,0 @@ -.col-lg-1.col-md-2.col-sm-12 - .display-4.text-black-50[data-selector=true]= f.object.selector -= f.input :label, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-3 col-md-2 col-sm-12' } -.col-lg-1.col-md-2.col-sm-12.has-float-label.pt-4.mt-2 - = link_to_remove_association 'Delete', f, class: 'btn btn-danger' diff --git a/app/views/account/calculators/fields/_value.html.slim b/app/views/account/calculators/fields/_value.html.slim deleted file mode 100644 index 04e6c0089..000000000 --- a/app/views/account/calculators/fields/_value.html.slim +++ /dev/null @@ -1,10 +0,0 @@ -.col-lg-1.col-md-2.col-sm-12 - .display-4.text-black-50[data-selector=true]= f.object.selector -= f.input :label, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-3 col-md-2 col-sm-12' } -= f.input :value, class: 'form-control', required: true, - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -= f.input :unit, collection: Field.units.keys, selected: f.object.unit, class: 'custom-select', - wrapper_html: { class: 'col-lg-2 col-md-2 col-sm-12' } -.col-lg-1.col-md-2.col-sm-12.has-float-label.pt-4.mt-2 - = link_to_remove_association 'Delete', f, class: 'btn btn-danger' diff --git a/app/views/account/calculators/fields/new.js.erb b/app/views/account/calculators/fields/new.js.erb deleted file mode 100644 index 9f2401ba2..000000000 --- a/app/views/account/calculators/fields/new.js.erb +++ /dev/null @@ -1,19 +0,0 @@ -// Render HTML for one field on backend -var newFieldForm = $("<%= escape_javascript(render 'account/calculators/fields/new', calculator: @calculator) %>") - -// Extract new selector data -var fieldsContainer = $("[data-kind=<%= @field.kind %>]") -var selectorLetter = fieldsContainer.data("selector-letter") -var selectorNumber = (parseInt(fieldsContainer.data("last-selector")) || 0) + 1 - -// Hide 'No fields yet' text -$("[data-empty-text]", fieldsContainer).remove() -// Increment current selector on fields group by 1 -fieldsContainer.data("last-selector", selectorNumber) - -// Set selector in HTML for new field -$("[data-selector-input]", newFieldForm).val(`${selectorLetter}${selectorNumber}`) -$("[data-selector]", newFieldForm).html(`${selectorLetter}${selectorNumber}`) - -// Append field to the group of fields -$('.nested-fields', newFieldForm).appendTo(fieldsContainer) diff --git a/app/views/account/calculators/index.html.erb b/app/views/account/calculators/index.html.erb new file mode 100644 index 000000000..922eb9f02 --- /dev/null +++ b/app/views/account/calculators/index.html.erb @@ -0,0 +1,50 @@ +<% set_meta_tags(title: t(".meta-title")) %> + +
+
+ <%= render partial: "account/shared/search_form", locals: { + q: @q, + search_url: account_calculators_path, + search_attribute: :name_cont + } %> + +
+ <%= link_to new_account_calculator_path, class: "btn btn-green px-4 py-2" do %> + + <%= t(".add_calculator_button") %> + <% end %> +
+
+ + + + + + + + + + + + + + <% @calculators.each do |calculator| %> + "> + + + + + + + + <% end %> + +
<%= sort_link(@q, :id, "#", default_order: :desc) %><%= sort_link(@q, :name, t(".table.calculator_name"), default_order: :desc) %><%= sort_link(@q, :slug, t(".table.calculator_slug"), default_order: :desc) %><%= t('.table.show') %><%= t('.table.edit') %><%= t('.table.delete') %>
<%= calculator.id %><%= calculator.name %><%= calculator.slug %><%= link_to icon('fa-solid', 'eye'), account_calculator_path(slug: calculator) %><%= link_to icon('fa-solid', 'edit'), edit_account_calculator_path(slug: calculator) %> + <%= button_to account_calculator_path(slug: calculator), method: :delete, + data: { turbo_confirm: t(".confirm_delete") } do %> + + <% end %> +
+
+ +<%= paginate @calculators %> diff --git a/app/views/account/calculators/index.html.slim b/app/views/account/calculators/index.html.slim deleted file mode 100644 index bc94840ef..000000000 --- a/app/views/account/calculators/index.html.slim +++ /dev/null @@ -1,32 +0,0 @@ -.container - = form_tag account_calculators_path, method: :get, class: 'd-flex justify-content-end mb-5' do - .d-flex - = text_field_tag :search, params[:search], class: 'form-control mr-sm-2', placeholder: t('.search_placeholder') - = button_tag type: :submit, name: nil, class: 'btn btn-primary px-4 d-flex align-items-center' do - i.fa.fa-search.mr-2 - span =t('.search_button') - = link_to new_account_calculator_path, class: 'btn btn-success px-4 ml-1' do - i.fa.fa-plus.mr-2 - span =t('.add_calculator_button') - - table.table.admin-table - thead - tr - th[scope="col"] ID - th[scope="col"] =t('.table.calculator_slug') - th[scope="col"] =t('.table.calculator_name') - th[scope="col"] =t('.table.calculator_actions') - tbody.admin-table-links - - @calculators.each do |calculator| - tr class=(calculator.preferable ? 'table-success' : 'table-light') - td= calculator.id - td= calculator.slug - td= calculator.name - td.actions - = link_to account_calculator_path(slug: calculator) do - i.fa.fa-eye.mx-2 - = link_to edit_account_calculator_path(slug: calculator) do - i.fa.fa-pen.mx-2 - = link_to account_calculator_path(slug: calculator), method: :delete, - data: { confirm: t('.confirm_delete') } do - i.fa.fa-trash.mx-2 diff --git a/app/views/account/calculators/new.html.erb b/app/views/account/calculators/new.html.erb new file mode 100644 index 000000000..ec4afee47 --- /dev/null +++ b/app/views/account/calculators/new.html.erb @@ -0,0 +1,15 @@ +
+ <%= simple_form_for @calculator, url: account_calculators_path do |f| %> +
+
+ <%= f.input :name, class: 'form-control' %> +
+
+
+ <%= f.button :submit, t('.create_calculator_button'), class: 'btn btn-green me-2 height-auto w-auto' %> + <%= link_to account_calculators_path, class: 'btn btn-danger d-flex align-items-center justify-content-center height-auto w-auto' do %> + <%= t('buttons.cancel') %> + <% end %> +
+ <% end %> +
diff --git a/app/views/account/calculators/new.html.slim b/app/views/account/calculators/new.html.slim deleted file mode 100644 index fce5cac05..000000000 --- a/app/views/account/calculators/new.html.slim +++ /dev/null @@ -1,19 +0,0 @@ -.container - - if @calculator.errors.any? - div - h2 - = t('activerecord.form_errors', :count => @calculator.errors.count, - :model => t('models.calculator').downcase) - ul - - @calculator.errors.full_messages.each do |error_message| - li= error_message - = form_for @calculator, url: { action: 'create' } do |f| - .admin-table - .admin-table-body.row.justify-content-center - .col-1.font-weight-bold= f.label :name - .col-1= f.text_field :name - .col-2.d-flex.justify-content-end - = f.submit "", value: t('.create_calculator_button'), class: 'btn btn-success mr-2' - = link_to account_calculators_path, class: 'btn btn-danger' do - span.mr-1 =t('.cancel_button') - i.fa.fa-times-circle diff --git a/app/views/account/categories/edit.html.erb b/app/views/account/categories/edit.html.erb new file mode 100644 index 000000000..5f5a3f0da --- /dev/null +++ b/app/views/account/categories/edit.html.erb @@ -0,0 +1,27 @@ +
+ <%= simple_form_for @category, url: { action: "update" }, html: { novalidate: false } do |f| %> +
+
+ <%= f.input :name, class: "form-control col-sm-11", required: true %> + <%= f.input :priority, collection: Category::PRIORITY_RANGE, wrapper: :custom_vertical_select %> + <% if @unfilled_categories&.exclude?(@category) %> +
+ <%= f.check_box :preferable, + { disabled: (@category.preferable?), + class: (@category.preferable? ? "opacity-50 cursor-not-allowed" : "") + }, + "preferable", "not_preferable" + %> + <%= f.label :preferable %> +
+ <% end %> +
+
+
+ <%= f.submit t(".form.update_category_button"), class: 'btn btn-green me-2 height w-auto' %> + <%= link_to account_categories_path, class: 'btn btn-danger d-flex align-items-center justify-content-center' do %> + <%= t('buttons.cancel') %> + <% end %> +
+ <% end %> +
diff --git a/app/views/account/categories/edit.html.slim b/app/views/account/categories/edit.html.slim deleted file mode 100644 index 7bb594749..000000000 --- a/app/views/account/categories/edit.html.slim +++ /dev/null @@ -1,18 +0,0 @@ -.container - - if @category.errors.any? - div - h2 - = t('activerecord.form_errors', :count => @category.errors.count, - :model => t('models.category').downcase) - ul - - @category.errors.full_messages.each do |error_message| - li= error_message -few - = simple_form_for @category, url: { action: 'update' }, html: { novalidate: false } do |f| - .form-group.row - .col-12.has-float-label.my-auto - = f.input :name, class: 'form-control col-sm-11', required: true - = f.submit "", value: t('.update_button'), class: 'btn btn-success mr-2' - = link_to account_categories_path, class: 'btn btn-danger' do - span.mr-1 =t('.cancel_button') - i.fa.fa-times-circle diff --git a/app/views/account/categories/index.html.erb b/app/views/account/categories/index.html.erb new file mode 100644 index 000000000..9742a90f5 --- /dev/null +++ b/app/views/account/categories/index.html.erb @@ -0,0 +1,54 @@ +<% set_meta_tags(title: t(".meta-title")) %> + +
+
+ <%= render partial: "account/shared/search_form", locals: { + q: @q, + search_url: account_categories_path, + search_attribute: :name_cont + } %> + +
+ <%= link_to new_account_category_path, class: "btn btn-green px-4 py-2" do %> + + <%= t(".add_category_button") %> + <% end %> +
+
+ + + + + + + + + + + + + <% @categories.each do |category| %> + + + + + + + + <% end %> + +
<%= sort_link(@q, :id, "#", default_order: :desc) %><%= sort_link(@q, :name, t(".table.title"), default_order: :desc) %><%= sort_link(@q, :priority, t(".table.priority"), default_order: :desc) %><%= t(".table.edit") %><%= t(".table.delete") %>
<%= category.id %><%= category.name %><%= category.priority %><%= link_to icon("fa-solid", "edit"), edit_account_category_path(id: category) %> + <% if category.preferable? %> +
+ "> +
+ <% else %> + <%= button_to account_category_path(id: category), method: :delete, + data: { turbo_confirm: t(".confirm_delete") } do %> + + <% end %> + <% end %> +
+
+ +<%= paginate @categories %> diff --git a/app/views/account/categories/index.html.slim b/app/views/account/categories/index.html.slim deleted file mode 100644 index 2923c0a7a..000000000 --- a/app/views/account/categories/index.html.slim +++ /dev/null @@ -1,27 +0,0 @@ -.container - = form_tag account_category_path(id: @categories), method: :get, class: 'd-flex justify-content-end mb-5' do - .d-flex - = link_to new_account_category_path(id: @categories), class: 'btn btn-success px-4 ml-1' do - i.fa.fa-plus.mr-2 - span =t('.add_category_button') - -div class="container home" - - table.table - thead - tr - th scope="col" # - th scope="col" =t('.table.title') - th scope="col" =t('.table.actions') - - tbody - - @categories.each do |category| - tr - th scope="row" = category.id - td = category.name - td.actions - = link_to edit_account_category_path(id: category) do - i.fa.fa-pen.mx-2 - = link_to account_category_path(id: category), method: :delete, - data: { confirm: t('.confirm_delete') } do - i.fa.fa-trash.mx-2 diff --git a/app/views/account/categories/new.html.erb b/app/views/account/categories/new.html.erb new file mode 100644 index 000000000..f16c39b90 --- /dev/null +++ b/app/views/account/categories/new.html.erb @@ -0,0 +1,14 @@ +<%= simple_form_for @category, url: { action: 'create' }, html: { novalidate: false } do |f| %> +
+
+ <%= f.input :name, class: 'form-control col-sm-11' %> + <%= f.input :priority, collection: Category::PRIORITY_RANGE, wrapper: :custom_vertical_select %> +
+
+
+ <%= f.submit t('.form.create_category_button'), class: 'btn btn-green me-2' %> + <%= link_to account_categories_path, class: 'btn btn-danger d-flex align-items-center justify-content-center' do %> + <%= t('buttons.cancel') %> + <% end %> +
+<% end %> diff --git a/app/views/account/categories/new.html.slim b/app/views/account/categories/new.html.slim deleted file mode 100644 index 6f56d3dcd..000000000 --- a/app/views/account/categories/new.html.slim +++ /dev/null @@ -1,18 +0,0 @@ -.container - - if @category.errors.any? - div - h2 - = t('activerecord.form_errors', :count => @category.errors.count, - :model => t('models.category').downcase) - ul - - @category.errors.full_messages.each do |error_message| - li= error_message -few - = simple_form_for @category, url: { action: 'create' }, html: { novalidate: false } do |f| - .form-group.row - .col-12.has-float-label.my-auto - = f.input :name, class: 'form-control col-sm-11', required: true - = f.submit "", value: t('.create_button'), class: 'btn btn-success mr-2' - = link_to account_categories_path, class: 'btn btn-danger' do - span.mr-1 =t('.cancel_button') - i.fa.fa-times-circle diff --git a/app/views/account/dashboard/index.html.slim b/app/views/account/dashboard/index.html.slim new file mode 100644 index 000000000..8367e6a2c --- /dev/null +++ b/app/views/account/dashboard/index.html.slim @@ -0,0 +1 @@ +h1 hello #{current_user.full_name} diff --git a/app/views/account/diapers_periods/categories/available.turbo_stream.erb b/app/views/account/diapers_periods/categories/available.turbo_stream.erb new file mode 100644 index 000000000..5c7808fc9 --- /dev/null +++ b/app/views/account/diapers_periods/categories/available.turbo_stream.erb @@ -0,0 +1,5 @@ +<%= turbo_stream.replace( + :diapers_periods, + partial: "account/diapers_periods/categories/partials/available/content", + locals: { categories: @categories } + ) %> diff --git a/app/views/account/diapers_periods/categories/destroy.turbo_stream.erb b/app/views/account/diapers_periods/categories/destroy.turbo_stream.erb new file mode 100644 index 000000000..8b6d8a712 --- /dev/null +++ b/app/views/account/diapers_periods/categories/destroy.turbo_stream.erb @@ -0,0 +1 @@ +<%= turbo_stream.remove(dom_id(@category)) %> diff --git a/app/views/account/diapers_periods/categories/partials/available/_content.html.erb b/app/views/account/diapers_periods/categories/partials/available/_content.html.erb new file mode 100644 index 000000000..bb41476be --- /dev/null +++ b/app/views/account/diapers_periods/categories/partials/available/_content.html.erb @@ -0,0 +1,41 @@ +<%= turbo_frame_tag :diapers_periods do %> +

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

+
+ <% if categories.present? %> + + + + + + + + + <% categories.each do |category| %> + + + + <% end %> + +
<%= t(".category_name") %><%= t(".table.add") %>
<%= category.name %> + <%= link_to( + new_account_diapers_period_path(category_id: category.id), + class: "flex justify-center", + data: { turbo_stream: true } + ) do %> + + <% end %> +
+ <% else %> +
+ +

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

+
+ <% end %> + + <%= link_to( + (t".back_button"), + with_periods_account_diapers_periods_categories_path, + data: { turbo_stream: true }, + class: "btn-grey px-4 py-2" + ) %> +<% end %> diff --git a/app/views/account/diapers_periods/categories/partials/with_periods/_content.html.erb b/app/views/account/diapers_periods/categories/partials/with_periods/_content.html.erb new file mode 100644 index 000000000..a5f0390d0 --- /dev/null +++ b/app/views/account/diapers_periods/categories/partials/with_periods/_content.html.erb @@ -0,0 +1,62 @@ +<%= turbo_frame_tag :diapers_periods do %> + <% if categories.present? %> + + + + + + + + + + <% categories.each do |category| %> + + + + + + <% end %> + +
<%= t(".category_name") %><%= t(".table.show") %><%= t(".table.delete") %>
+ <%= category.name %> + <% if unfilled_categories.include?(category) %> +
+ "> + + +
+ <% end %> +
+ <%= link_to( + icon("fa-solid", "eye"), + account_diapers_periods_path(category_id: category.id), + data: { turbo_stream: true } + )%> + + <% if category.preferable? %> +
+ "> +
+ <% else %> + <%= button_to( + account_diapers_periods_category_path(id: category.id), + method: :delete, + data: { turbo_confirm: t(".confirm_delete") }) do %> + + <% end %> + <% end %> +
+ <% else %> +
+ +

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

+
+ <% end %> + + <%= link_to( + t(".add_button"), + available_account_diapers_periods_categories_path, + data: { turbo_stream: true }, + class: "btn-green px-4 py-2" + ) %> +<% end %> diff --git a/app/views/account/diapers_periods/categories/with_periods.turbo_stream.erb b/app/views/account/diapers_periods/categories/with_periods.turbo_stream.erb new file mode 100644 index 000000000..d5a7f1857 --- /dev/null +++ b/app/views/account/diapers_periods/categories/with_periods.turbo_stream.erb @@ -0,0 +1,5 @@ +<%= turbo_stream.replace( + :diapers_periods, + partial: "account/diapers_periods/categories/partials/with_periods/content", + locals: { categories: @categories_with_periods, unfilled_categories: @unfilled_categories } + ) %> diff --git a/app/views/account/diapers_periods/create.turbo_stream.erb b/app/views/account/diapers_periods/create.turbo_stream.erb new file mode 100644 index 000000000..b8c20c91a --- /dev/null +++ b/app/views/account/diapers_periods/create.turbo_stream.erb @@ -0,0 +1,10 @@ +<%= turbo_stream.replace( + :diapers_periods, + partial: "account/diapers_periods/partials/index/content", + locals: { + diapers_period: @diapers_period, + unfilled_categories: @unfilled_categories, + category: @category, + diapers_periods: @diapers_periods + } + ) %> diff --git a/app/views/account/diapers_periods/destroy.turbo_stream.erb b/app/views/account/diapers_periods/destroy.turbo_stream.erb new file mode 100644 index 000000000..017da1e0c --- /dev/null +++ b/app/views/account/diapers_periods/destroy.turbo_stream.erb @@ -0,0 +1,19 @@ +<%= turbo_stream.remove(dom_id(@diapers_period)) %> + +<% if @diapers_periods.present? %> + <%= turbo_stream.replace( + dom_id(@diapers_periods.last, "delete_button"), + partial: "account/diapers_periods/partials/index/delete_button", + locals: { + category: @category, + diapers_period: @diapers_periods.last, + diapers_periods: @diapers_periods + } + ) %> +<% end %> + +<%= turbo_stream.replace( + :add_new_link, + partial: "account/diapers_periods/partials/index/add_new_link", + locals: { category: @category, unfilled_categories: @unfilled_categories } + ) %> diff --git a/app/views/account/diapers_periods/edit.turbo_stream.erb b/app/views/account/diapers_periods/edit.turbo_stream.erb new file mode 100644 index 000000000..8b6aed4f8 --- /dev/null +++ b/app/views/account/diapers_periods/edit.turbo_stream.erb @@ -0,0 +1,5 @@ +<%= turbo_stream.replace( + :diapers_periods, + partial: "account/diapers_periods/partials/edit/form", + locals: { period: @diapers_period } + ) %> diff --git a/app/views/account/diapers_periods/index.turbo_stream.erb b/app/views/account/diapers_periods/index.turbo_stream.erb new file mode 100644 index 000000000..6ab7aa4c2 --- /dev/null +++ b/app/views/account/diapers_periods/index.turbo_stream.erb @@ -0,0 +1,9 @@ +<%= turbo_stream.replace( + :diapers_periods, + partial: "account/diapers_periods/partials/index/content", + locals: { + diapers_periods: @diapers_periods, + category: @category, + unfilled_categories: @unfilled_categories + } + ) %> diff --git a/app/views/account/diapers_periods/new.turbo_stream.erb b/app/views/account/diapers_periods/new.turbo_stream.erb new file mode 100644 index 000000000..bce47614f --- /dev/null +++ b/app/views/account/diapers_periods/new.turbo_stream.erb @@ -0,0 +1,5 @@ +<%= turbo_stream.replace( + :diapers_periods, + partial: "account/diapers_periods/partials/new/form", + locals: { period: @diapers_period, category: @category } + ) %> diff --git a/app/views/account/diapers_periods/partials/edit/_form.html.erb b/app/views/account/diapers_periods/partials/edit/_form.html.erb new file mode 100644 index 000000000..94a993ee2 --- /dev/null +++ b/app/views/account/diapers_periods/partials/edit/_form.html.erb @@ -0,0 +1,42 @@ +<%= turbo_frame_tag :diapers_periods do %> +

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

+ <%= simple_form_for(period, url: account_diapers_period_path(id: period), method: :patch, html: { class: "mt-4" }) do |form| %> +
+
"> + <%= form.input :period_start, + label: t(".period_start"), + input_html: { value: period.period_start, disabled: true, style: "cursor: not-allowed" } %> +
+ +
"> + <%= form.input :period_end, + label: t(".period_end"), + input_html: { disabled: true, style: "cursor: not-allowed" } %> +
+
+ +
+
+ <%= form.input :usage_amount, + label: t(".usage_amount") %> +
+ +
+ <%= form.input :price, + label: t(".price") %> +
+
+ + <%= form.input :category_id, as: :hidden, input_html: { value: period.category_id } %> + +
+ <%= form.submit t('buttons.update')%> + <%= link_to( + t(".back_button"), + account_diapers_periods_path(category_id: period.category_id), + class: "btn-grey mt-2", + data: { turbo_stream: true } + ) %> +
+ <% end %> +<% end %> diff --git a/app/views/account/diapers_periods/partials/index/_add_new_link.erb b/app/views/account/diapers_periods/partials/index/_add_new_link.erb new file mode 100644 index 000000000..a8884e868 --- /dev/null +++ b/app/views/account/diapers_periods/partials/index/_add_new_link.erb @@ -0,0 +1,8 @@ +<% if unfilled_categories.include?(category) %> + <%= link_to( + t(".add_new"), + new_account_diapers_period_path(category_id: category.id), + class: "btn-green px-4 py-2", + data: { turbo_stream: true } + ) %> +<% end %> diff --git a/app/views/account/diapers_periods/partials/index/_content.html.erb b/app/views/account/diapers_periods/partials/index/_content.html.erb new file mode 100644 index 000000000..45f131579 --- /dev/null +++ b/app/views/account/diapers_periods/partials/index/_content.html.erb @@ -0,0 +1,61 @@ +<%= turbo_frame_tag :diapers_periods do %> +

<%= t(".periods_for") %> <%= category.name %>

+ <% if unfilled_categories.include?(category) %> + + <% end %> + + + + + + + + + + + + + <% diapers_periods.each do |diapers_period| %> + + + + + + + + + <% end %> + +
<%= t(".period_start") %><%= t(".period_end") %><%= t(".usage_amount") %><%= t(".price") %><%= t(".table.edit") %><%= t(".table.delete") %>
<%= diapers_period.period_start %><%= diapers_period.period_end %><%= diapers_period.usage_amount %><%= diapers_period.price %> + <%= link_to( + edit_account_diapers_period_path(id: diapers_period.id), + data: { turbo_stream: true } + ) do %> + + <% end %> + + <%= turbo_frame_tag dom_id(diapers_period, "delete_button") do %> + <%= render( + partial: "account/diapers_periods/partials/index/delete_button", + locals: { category: category, diapers_period: diapers_period, diapers_periods: diapers_periods} + ) %> + <% end %> +
+ + <%= turbo_frame_tag :add_new_link do %> + <%= render( + partial: "account/diapers_periods/partials/index/add_new_link", + locals: { category: category, unfilled_categories: unfilled_categories } + ) %> + <% end %> + + <%= link_to( + t(".back_button"), + with_periods_account_diapers_periods_categories_path, + class: "btn-grey px-4 py-2", + data: { turbo_stream: true } + ) %> +<% end %> diff --git a/app/views/account/diapers_periods/partials/index/_delete_button.erb b/app/views/account/diapers_periods/partials/index/_delete_button.erb new file mode 100644 index 000000000..760913d41 --- /dev/null +++ b/app/views/account/diapers_periods/partials/index/_delete_button.erb @@ -0,0 +1,15 @@ +<% if diapers_period == diapers_periods.last && category.not_preferable? %> + <%= button_to( + account_diapers_period_path(id: diapers_period.id), + method: :delete, + data: { turbo_confirm: t(".confirm_delete") } + ) do %> + + <% end %> +<% else %> +
+ "> + + +
+<% end %> diff --git a/app/views/account/diapers_periods/partials/new/_form.html.erb b/app/views/account/diapers_periods/partials/new/_form.html.erb new file mode 100644 index 000000000..6413c609b --- /dev/null +++ b/app/views/account/diapers_periods/partials/new/_form.html.erb @@ -0,0 +1,45 @@ +<%= turbo_frame_tag :diapers_periods do %> +

<%= t(".new_period") %> <%= category.name %>

+ <%= simple_form_for(period, url: account_diapers_periods_path(id: period), html: { class: "mt-4" }) do |form| %> +
+
"> + <%= form.input :period_start, + input_html: { value: period.period_start, disabled: true, style: "cursor: not-allowed" }, + label: t(".period_start")%> + <%= form.hidden_field :period_start, value: period.period_start %> +
+ +
+ <%= form.input :period_end, + input_html: { min: period.period_start + 1, step: 1 }, + label: t(".period_end") %> +
+
+ +
+
+ <%= form.input :usage_amount, + input_html: { min: 0, step: 1 }, + label: t(".usage_amount")%> +
+ +
+ <%= form.input :price, + input_html: { min: 0, step: 0.01 }, + label: t(".price")%> +
+
+ + <%= form.input :category_id, as: :hidden, input_html: { value: period.category_id } %> + +
+ <%= form.submit t('buttons.create'), class: "btn-green px-4 py-2"%> + <%= link_to( + t(".back_button"), + account_diapers_periods_path(category_id: category.id), + class: "btn-grey px-4 py-2", + data: { turbo_stream: true } + ) %> +
+ <% end %> +<% end %> diff --git a/app/views/account/diapers_periods/update.turbo_stream.erb b/app/views/account/diapers_periods/update.turbo_stream.erb new file mode 100644 index 000000000..859d5685a --- /dev/null +++ b/app/views/account/diapers_periods/update.turbo_stream.erb @@ -0,0 +1,9 @@ +<%= turbo_stream.replace( + :diapers_periods, + partial: "account/diapers_periods/partials/index/content", + locals: { + diapers_periods: @diapers_periods, + unfilled_categories: @unfilled_categories, + category: @category + } + ) %> diff --git a/app/views/account/histories/index.html.erb b/app/views/account/histories/index.html.erb new file mode 100644 index 000000000..42e93eaab --- /dev/null +++ b/app/views/account/histories/index.html.erb @@ -0,0 +1,40 @@ +<% set_meta_tags(title: t(".meta-title")) %> + +
+

<%= t('.history_title') %>

+ + + + + + + + + + + + + <% @versions.each do |version| %> + + + + + + + + + <% end %> + +
<%= t '.table.version_created_at' %><%= t '.table.event_ID' %><%= t '.table.user_id' %><%= t '.table.action' %><%= t '.table.more_info_(field, old_value, new_value)' %><%= t '.table.model_type' %>
<%= l(version.created_at, format: "%-d.%m.%Y %H:%M:%S") %><%= version.id %><%= version.item_id %><%= version.event %> + + <% version.changeset.each do |key, val| %> + + + + + <% end %> +
<%= key %><%= val.join(' => ') %>
+
<%= version.item_type %>
+
+ +<%= paginate @versions %> diff --git a/app/views/account/histories/index.html.slim b/app/views/account/histories/index.html.slim deleted file mode 100644 index 63c3ddc20..000000000 --- a/app/views/account/histories/index.html.slim +++ /dev/null @@ -1,29 +0,0 @@ -.container.bg-light.p-3 - h2.text-center.p-3 =t('.history_title') - table.table.table-striped.table-bordered - thead - tr.text-center.table-secondary - th.align-baseline = t '.table.version_created_at' - th.align-baseline = t '.table.event_ID' - th.align-baseline = t '.table.user_id' - th.align-baseline = t '.table.action' - th.align-baseline = t '.table.more_info_(field, old_value, new_value)' - th.align-baseline = t '.table.model_type' - tbody - - @versions.each do |version| - tr.align-baseline - td = l(version.created_at, format: "%-d.%m.%Y %H:%M:%S") - td = version.id - td = version.item_id - td = version.event - td - table.table-borderless - - version.changeset.each do |key, val| - tr - td = key - td = val.join(' => ') - td = version.item_type - -.container - .btn.btn-light.m-3 - = link_to t('.back_link'), account_users_path, class: 'text-secondary' diff --git a/app/views/account/messages/index.html.erb b/app/views/account/messages/index.html.erb new file mode 100644 index 000000000..a702b7bf4 --- /dev/null +++ b/app/views/account/messages/index.html.erb @@ -0,0 +1,35 @@ +<% set_meta_tags(title: t(".meta-title")) %> + +
+ <%= render partial: "account/shared/search_form", locals: { + q: @q, + search_url: account_messages_path, + search_attribute: :title_or_email_or_message_cont + } %> + + + + + + + + + + + + + + <% @messages.each do |message| %> + + + + + + + + <% end %> + +
This table displays a list of messages.
<%= sort_link(@q, :id, "#", default_order: :desc) %><%= sort_link(@q, :title, t('.table.title'), default_order: :desc) %><%= sort_link(@q, :email, t('.table.email'), default_order: :desc) %><%= sort_link(@q, :message, t('.table.message'), default_order: :desc) %><%= t('.table.show_more') %>
<%= message.id %><%= message.title %><%= message.email %><%= message.message.first(40) %><%= link_to icon('fa-solid', 'eye'), account_message_path(id: message, locale: I18n.locale) %>
+
+ +<%= paginate @messages %> diff --git a/app/views/account/messages/index.html.slim b/app/views/account/messages/index.html.slim deleted file mode 100644 index 656f134e5..000000000 --- a/app/views/account/messages/index.html.slim +++ /dev/null @@ -1,18 +0,0 @@ -div class="container home" - table.table - thead - tr - th scope="col" # - th scope="col" =t('.table.title') - th scope="col" =t('.table.email') - th scope="col" =t('.table.message') - th scope="col" =t('.table.show_more') - - tbody - - @message.each do |message| - tr - th scope="row" = message.id - td = message.title - td = message.email - td = message.message.first(40) - td.text-center = link_to fa_icon('eye'), account_message_path(message) diff --git a/app/views/account/messages/show.html.erb b/app/views/account/messages/show.html.erb new file mode 100644 index 000000000..5ca56a2d0 --- /dev/null +++ b/app/views/account/messages/show.html.erb @@ -0,0 +1,23 @@ +<%= link_to account_messages_path, class: "rounded mt-3 px-2 flex items-center" do %> + <%= image_tag "icons/arrow-left.svg", class: "z-1 mr-2 mb-0.5" %> + <%= t('buttons.back') %> +<% end %> +
+
+
+

<%= t('.header') %>

+
+
<%= t('.table.title_col') %>
+
<%= @message.title %>
+ +
<%= t('.table.message_col') %>
+
<%= @message.message %>
+ +
<%= t('.table.email_col') %>
+
<%= @message.email %>
+ +
<%= t('.table.time_col') %>
+
<%= l(@message.created_at, format: :short) %>
+
+
+
diff --git a/app/views/account/messages/show.html.slim b/app/views/account/messages/show.html.slim deleted file mode 100644 index f356eb322..000000000 --- a/app/views/account/messages/show.html.slim +++ /dev/null @@ -1,15 +0,0 @@ -.container.flex-container - .flex-child - h2 = t '.header' - dl - dt = t '.table.title_col' - dd = @message.title - - dt = t '.table.message_col' - dd = @message.message - - dt = t '.table.email_col' - dd = @message.email - - dt = t '.table.time_col' - dd = l(@message.created_at, format: :short) diff --git a/app/views/account/passwords/new.html.slim b/app/views/account/passwords/new.html.slim index 3477ada44..ec91c7a89 100644 --- a/app/views/account/passwords/new.html.slim +++ b/app/views/account/passwords/new.html.slim @@ -5,7 +5,7 @@ .card-body = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| = render "account/shared/error_messages", resource: resource - .field.form-group.text-left + .field.form-group.text-start = f.label :email, value: t('.email_label') br = f.email_field :email, class:"form-control", autofocus: true, autocomplete: "email" diff --git a/app/views/account/products/edit.html.erb b/app/views/account/products/edit.html.erb new file mode 100644 index 000000000..2aafe7ff8 --- /dev/null +++ b/app/views/account/products/edit.html.erb @@ -0,0 +1,3 @@ +
+ <%= render "account/products/partials/edit/form", product: @product, categories: @categories %> +
diff --git a/app/views/account/products/edit.turbo_stream.erb b/app/views/account/products/edit.turbo_stream.erb new file mode 100644 index 000000000..d1927f93c --- /dev/null +++ b/app/views/account/products/edit.turbo_stream.erb @@ -0,0 +1,5 @@ +<%= turbo_stream.replace( + dom_id(@product, :form), + partial: "account/products/partials/edit/form", + locals: { product: @product, categories: @categories } + ) %> diff --git a/app/views/account/products/index.html.erb b/app/views/account/products/index.html.erb new file mode 100644 index 000000000..61e4a1a0e --- /dev/null +++ b/app/views/account/products/index.html.erb @@ -0,0 +1,53 @@ +<% set_meta_tags(title: t(".meta-title")) %> + +
+
+ <%= render partial: "account/shared/search_form", locals: { + q: @q, + search_url: account_products_path, + search_attribute: :title_cont + } %> + +
+ <%= link_to new_account_product_path, class: "btn btn-green px-4 py-2" do %> + + <%= t(".add_product_button") %> + <% end %> +
+
+ + + + + + + + + + + + + <% @products.includes(prices: :category).each do |product| %> + + + + + + + + <% end %> + +
<%= sort_link(@q, :id, "#", default_order: :desc) %><%= sort_link(@q, :title, t('.table.title'), default_order: :desc) %><%= t('.table.prices') %><%= t('.table.edit') %><%= t('.table.delete') %>
<%= product.id %><%= product.title %> + <% product.prices.includes(:category).each do |price| %> + <%= "#{price.category.name}: #{price.sum}" %> +
+ <% end %> +
<%= link_to icon('fa-solid', 'edit'), edit_account_product_path(id: product) %> + <%= button_to account_product_path(id: product), method: :delete, + data: { turbo_confirm: t(".confirm_delete") } do %> + + <% end %> +
+
+ +<%= paginate @products %> diff --git a/app/views/account/products/new.html.erb b/app/views/account/products/new.html.erb new file mode 100644 index 000000000..794911253 --- /dev/null +++ b/app/views/account/products/new.html.erb @@ -0,0 +1,3 @@ +
+ <%= render "account/products/partials/new/form", product: @product, categories: @categories %> +
diff --git a/app/views/account/products/new.turbo_stream.erb b/app/views/account/products/new.turbo_stream.erb new file mode 100644 index 000000000..6045be10f --- /dev/null +++ b/app/views/account/products/new.turbo_stream.erb @@ -0,0 +1,5 @@ +<%= turbo_stream.replace( + dom_id(@product, :form), + partial: "account/products/partials/new/form", + locals: { product: @product, categories: @categories } + ) %> diff --git a/app/views/account/products/partials/edit/_form.html.erb b/app/views/account/products/partials/edit/_form.html.erb new file mode 100644 index 000000000..92765e727 --- /dev/null +++ b/app/views/account/products/partials/edit/_form.html.erb @@ -0,0 +1,26 @@ + <%= simple_form_for product, method: :patch, url: account_product_path, html: { id: dom_id(product, :form) }, data: { controller: "price-form", action: "submit->price-form#submit" } do |f| %> +
+
+ <%= f.input :title, label: t('.title'), class: 'form-control col-sm-11' %> + <% if categories.exists? %> + <%= f.simple_fields_for :prices do |prices_form| %> +
+ <%= check_box_tag prices_form.object.category.name, 1, true, data: { price_form_target: 'checkbox', action: "click->price-form#removePrice click->price-form#togglePrice" }, class: 'me-1' %> + <%= label_tag prices_form.object.category.name %> +
+ <%= prices_form.input :sum, label: false, input_html: { placeholder: t('.form.sum'), data: { price_form_target: 'priceInput' } } %> + <%= prices_form.hidden_field :category_id, value: prices_form.object.category.id %> + <%= prices_form.hidden_field :_destroy, data: { price_form_target: 'hiddenField' } %> +
+
+ <% end %> + <% end %> +
+
+
+ <%= f.submit t('.form.update_product_button'), class: 'btn btn-green me-2' %> + <%= link_to account_products_path, class: 'btn btn-danger d-flex align-items-center justify-content-center' do %> + <%= t('buttons.cancel') %> + <% end %> +
+ <% end %> diff --git a/app/views/account/products/partials/new/_form.html.erb b/app/views/account/products/partials/new/_form.html.erb new file mode 100644 index 000000000..a5ea2faef --- /dev/null +++ b/app/views/account/products/partials/new/_form.html.erb @@ -0,0 +1,25 @@ +<%= simple_form_for product, url: account_products_path, html: { id: dom_id(product, :form) }, data: { controller: "price-form" } do |f| %> +
+
+ <%= f.input :title, label: t(".title"), class: "form-control col-sm-11" %> + <% categories.each do |category| %> +
+ <%= check_box_tag category.name, 1, false, data: { action: "click->price-form#togglePrice", price_form_target: "checkbox" }, class: "me-1" %> + <%= label_tag category.name %> +
+ <%= f.simple_fields_for :prices, f.object.find_or_build_price_for_category(category) do |prices_form| %> + <%= prices_form.input :sum, label: false, input_html: { placeholder: t(".form.sum"), data: { price_form_target: "priceInput" } } %> + <%= prices_form.hidden_field :category_id, value: category.id %> + <% end %> +
+
+ <% end %> +
+
+
+ <%= f.submit t(".form.create_product_button"), class: "btn btn-green me-2 w-auto" %> + <%= link_to account_products_path, class: "btn btn-danger d-flex align-items-center justify-content-center" do %> + <%= t("buttons.cancel") %> + <% end %> +
+<% end %> diff --git a/app/views/account/products/show.html.slim b/app/views/account/products/show.html.slim new file mode 100644 index 000000000..cc00ee7ed --- /dev/null +++ b/app/views/account/products/show.html.slim @@ -0,0 +1,23 @@ +.container + table.table + thead + tr + th scope="col" # + th scope="col" =t('.table.title') + th scope="col" =t('.table.prices') + th scope="col" =t('.table.actions') + + tbody + tr + td = @product.id + td = @product.title + td + - @product.prices.includes(:category).each do |price| + span = "#{price.category.name}: #{price.sum}" + br + td.actions + = link_to edit_account_product_path(id: @product) do + i.fa.fa-pen.mx-2 + = button_to account_product_path(id: @product), method: :delete, + data: { confirm: t('.confirm_delete') } do + i.fa.fa-trash.mx-2 diff --git a/app/views/account/sessions/new.html.slim b/app/views/account/sessions/new.html.slim index d7f0629ae..234b8cdee 100644 --- a/app/views/account/sessions/new.html.slim +++ b/app/views/account/sessions/new.html.slim @@ -14,7 +14,7 @@ - f.label :password = f.password_field :password, class:"form-control", placeholder: t('.form.password'), autocomplete: "current-password" - if devise_mapping.rememberable? - .field.form-group.text-left + .field.form-group.text-start = f.check_box :remember_me = f.label :remember_me .actions diff --git a/app/views/account/shared/_navigation.html.erb b/app/views/account/shared/_navigation.html.erb new file mode 100644 index 000000000..1ae3e7583 --- /dev/null +++ b/app/views/account/shared/_navigation.html.erb @@ -0,0 +1,55 @@ + + diff --git a/app/views/account/shared/_navigation.html.slim b/app/views/account/shared/_navigation.html.slim deleted file mode 100644 index 094c79032..000000000 --- a/app/views/account/shared/_navigation.html.slim +++ /dev/null @@ -1,18 +0,0 @@ -body - header.page-header - = link_to image_tag('logo_zerowaste.png'), root_path, class: 'logo-zerowaste' - .tabs - - if FeatureFlag.get('show_admin_menu').active? - - if user_signed_in? - - if current_user.admin? - = link_to t('.admin'), account_calculators_path, class: 'tab' - = link_to t('.log_out'), destroy_user_session_path, class: 'tab' - - else - = link_to t('.sign_up'), new_user_registration_path, class: 'tab' - = link_to t('.log_in'), new_user_session_path, class: 'tab', id: 'log_in' - = link_to t('.contact_us'), new_message_path, class: 'tab' - .func-btns - .donate-btn - = link_to t('.donate'), "https://zerowastelviv.org.ua/pidtrymaty/", target: '_blank' - - = link_to t("#{switch_locale_to}"), url_for(locale: switch_locale_to), class: 'btn btn-outline-success btn-sm' diff --git a/app/views/account/shared/_search_form.html.erb b/app/views/account/shared/_search_form.html.erb new file mode 100644 index 000000000..c055dd228 --- /dev/null +++ b/app/views/account/shared/_search_form.html.erb @@ -0,0 +1,6 @@ +
+ <%= search_form_for(q, url: search_url, method: :get, class: "d-flex mb-5") do |f| %> + <%= f.search_field search_attribute, placeholder: t(".search_placeholder"), class: "form-input me-2" %> + <%= f.button t(".search_button"), class: "btn btn-blue px-4 items-center" %> + <% end %> +
diff --git a/app/views/account/site_settings/_browser_tab.html.slim b/app/views/account/site_settings/_browser_tab.html.slim index 132b24ef2..c59888c57 100644 --- a/app/views/account/site_settings/_browser_tab.html.slim +++ b/app/views/account/site_settings/_browser_tab.html.slim @@ -1,5 +1,5 @@ .tab-browser .tab-content - = image_tag(SiteSetting.current.favicon, class: 'tab-icon', alt: 'Tab Browser Image') - span.tab-text + = image_tag(SiteSetting.current.favicon, class: 'tab-icon', alt: 'Tab Browser Image', data: { handle_browser_tab_target: "icon" }) + span.tab-text data-handle-browser-tab-target="title" = SiteSetting.current.title diff --git a/app/views/account/site_settings/edit.html.erb b/app/views/account/site_settings/edit.html.erb new file mode 100644 index 000000000..301c3a66d --- /dev/null +++ b/app/views/account/site_settings/edit.html.erb @@ -0,0 +1,62 @@ +<% set_meta_tags(title: t(".meta-title")) %> + +
+ + <%= t(".site_settings") %> + +
+ <%= simple_form_for @site_setting, url: account_site_setting_path, html: { data: { controller: "handle-browser-tab" } } do |f| %> +
+
+ <%= f.input :title, class: "form-control", input_html: { data: { action: "input->handle-browser-tab#setTitle" } } %> + <%= f.input :favicon, wrapper: :custom_vertical_file, input_html: { data: { action: "change->handle-browser-tab#setIcon" } } %> +
+ <%= render "browser_tab", site_setting: @site_setting %> +
+
+
+ <%= f.submit t("buttons.save") %> + <% end %> + + <%= button_to t("buttons.revert"), revert_account_site_setting_path, + method: :put, + data: { turbo_confirm: t(".confirm_default") }, + class: "btn-grey absolute bottom-0 left-0 ml-32" %> +
+
+ +
+ <%= t(".diapers_categories") %> + + <%= render "account/diapers_periods/categories/partials/with_periods/content", categories: @categories, unfilled_categories: @unfilled_categories %> +
+ +
+ + <%= t(".site_features") %> + + <%= simple_form_for :feature_flags, url: account_features_flags_path, method: :patch do |f| %> + <% Flipper.features.each do |feature| %> +
+ <%= f.input "#{feature.name}_enabled", as: :boolean, label: t("account.feature_flags.#{feature.name}.name"), input_html: { checked: feature.enabled? } %> +
+ <%= feature.description %> +
+
+ <% end %> + +
+ <%= f.submit t("buttons.save"), data: { action: "click->loader#show_loader" }, class: "btn-green px-4 py-2" %> +
+ <% end %> +
+ +
+ + <%= t(".dev_features") %> + +

+ <%= t(".rails_db_description") %> +

+ <%= link_to "Rails DB", rails_db_path, class: "btn-grey px-4 py-2" %> +
diff --git a/app/views/account/site_settings/edit.html.slim b/app/views/account/site_settings/edit.html.slim deleted file mode 100644 index 697458ca9..000000000 --- a/app/views/account/site_settings/edit.html.slim +++ /dev/null @@ -1,9 +0,0 @@ -= simple_form_for @site_setting, url: account_site_setting_path, html: { data: { controller: "handle-browser-tab" } } do |f| - .form-group.row - .col-12.has-float-label.my-auto - = f.input :title, class: 'form-control', data: { target: "handle-browser-tab.title" } - = f.input :favicon, class: 'form-control', data: { target: "handle-browser-tab.icon" } - = render 'browser_tab', site_setting: @site_setting - - = f.submit value: t('.update_button'), class: 'btn btn-success mr-2' - i.fa.fa-times-circle diff --git a/app/views/account/users/edit.html.erb b/app/views/account/users/edit.html.erb new file mode 100644 index 000000000..a5c6bbb99 --- /dev/null +++ b/app/views/account/users/edit.html.erb @@ -0,0 +1,43 @@ +
+
+

+ <%= t('.table.edit_user_info') %> +

+ <%= simple_form_for(@user, url: account_user_path(id: @user), remote: false, wrapper: :horizontal_form) do |f| %> + <%= f.input :first_name, placeholder: t('.form.name_label'), autofocus: true, autocomplete: 'first name' %> + <%= f.input :last_name, placeholder: t('.form.surname_label'), autofocus: true, autocomplete: 'last name' %> + <%= f.input :country, autofocus: true %> + +
+ <%= f.input :password, autocomplete: 'new-password', hint: t('.form.password_hint'), input_html: { data: { password_visibility_target: 'password' } }, required: false %> + <%= render 'shared/password_icon' %> +
+ +
+ <%= f.input :password_confirmation, autocomplete: 'new-password', input_html: { data: { password_visibility_target: 'password' } }, required: false %> + <%= render 'shared/password_icon' %> +
+ + <%= f.input :avatar, as: :file, direct_upload: true, class: 'm-3', label: t('.avatar'), hint: t('.form.avatar_hint'), wrapper: :horizontal_form %> +
+ <%= f.submit t('.form.update_user_button'), class: 'btn btn-green me-2 height w-auto' %> + <%= link_to account_users_path, class: 'btn btn-danger d-flex align-items-center justify-content-center' do %> + <%= t('buttons.cancel') %> + <% end %> +
+ <% end %> +
+ +
+

+ <%= t('.avatar') %> +

+
+ <% if @user.avatar.attached? && @user.avatar.persisted? %> + <%= image_tag @user.avatar, class: "w-75 d-block my-0 mx-auto" %> + <% else %> + <%= image_tag 'user.png', class: "w-75 d-block my-0 mx-auto" %> + <% end %> +
+
+
diff --git a/app/views/account/users/edit.html.slim b/app/views/account/users/edit.html.slim deleted file mode 100644 index 08b2a5e5b..000000000 --- a/app/views/account/users/edit.html.slim +++ /dev/null @@ -1,18 +0,0 @@ -.container.flex-container - .flex-child - h2.text-center = t '.table.edit_user_info' - = simple_form_for(@user, url: account_user_path(id: @user), remote: false, wrapper: :horizontal_form) do |f| - = f.input :first_name, placeholder: t('.form.name_label'), autofocus: true, autocomplete: 'first name' - = f.input :last_name, placeholder: t('.form.surname_label'), autofocus: true, autocomplete: 'last name' - = f.input :country, autofocus: true - = f.input :password, autocomplete: 'new-password', hint: t('.form.password_hint'), required: false - = f.input :password_confirmation, autocomplete: 'new-password', required: false - = f.input :avatar, as: :file, direct_upload: true, class: 'm-3', label: t('.avatar'), hint: t('.form.avatar_hint'), wrapper: :horizontal_form - = f.submit t('.form.update_user_button'), class: 'btn btn-primary' - .flex-child - h2.text-center = t '.avatar' - dd - - if @user.avatar.attached? && @user.avatar.persisted? - = image_tag @user.avatar - - else - = image_tag 'user.png' diff --git a/app/views/account/users/index.html.erb b/app/views/account/users/index.html.erb new file mode 100644 index 000000000..588018bc4 --- /dev/null +++ b/app/views/account/users/index.html.erb @@ -0,0 +1,60 @@ +<% set_meta_tags(title: t(".meta-title")) %> + +
+
+ <%= render partial: "account/shared/search_form", locals: { + q: @q, + search_url: account_users_path, + search_attribute: :email_or_first_name_or_last_name_cont + } %> + +
+
+

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

+

<%= link_to icon("fa-solid", "download"), account_users_path(format: "csv") %>

+
+
+ + + + + + + + + + + + + + + + <% @users.each do |user| %> + + + + + + + + + + + <% end %> + +
<%= sort_link(@q, :email, t(".table.email_col"), default_order: :desc) %><%= sort_link(@q, :first_name, t(".table.first_name"), default_order: :desc) %><%= sort_link(@q, :last_name, t(".table.last_name"), default_order: :desc) %><%= sort_link(@q, :updated_at, t(".table.last_visit_col"), default_order: :desc) %><%= t(".table.show") %><%= t(".table.edit") %><%= t(".table.ban") %><%= t(".table.delete") %>
<%= user.email %><%= user.first_name %><%= user.last_name %><%= user.last_sign_in_at %><%= link_to icon("fa-solid", "eye"), account_user_path(id: user.id) %><%= link_to icon("fa-solid", "edit"), edit_account_user_path(id: user.id) %> + <%= button_to account_user_path(id: user, user: toggle_block_param(user)), + method: :patch, + data: { turbo_confirm: toggle_confirm(user) } do %> + <%= icon("fa-solid", toggle_class(user)) %> + <% end %> + + <%= button_to account_user_path(id: user), method: :delete, + data: { turbo_confirm: t(".confirm_delete") } do %> + + <% end %> +
+
+
+ +<%= paginate @users %> diff --git a/app/views/account/users/index.html.slim b/app/views/account/users/index.html.slim deleted file mode 100644 index 762787857..000000000 --- a/app/views/account/users/index.html.slim +++ /dev/null @@ -1,22 +0,0 @@ -div class="container home" - .row - .col - h1 = t '.main_header' - h3 = link_to fa_icon('download'), account_users_path(format: "csv") - table.table - thead - tr - td = t '.table.email_col' - td = t '.table.last_visit_col' - td = t '.table.view_info_col' - td = t '.table.edit' - td = t '.table.ban' - - @users.each do |user| - tr id="user-info-#{user.id}" - td = user.email - td = user.last_sign_in_at - td = link_to fa_icon('eye'), account_user_path(id: user.id) - td = link_to fa_icon('edit'), edit_account_user_path(id: user.id) - td = link_to fa_icon(user.blocked? ? 'lock' : 'lock-open'), - account_user_path(id: user, user: {blocked: user.blocked? ? false : true}), - onclick: "alert('Are you sure?')", method: :patch diff --git a/app/views/account/users/new.html.erb b/app/views/account/users/new.html.erb new file mode 100644 index 000000000..f650c79bc --- /dev/null +++ b/app/views/account/users/new.html.erb @@ -0,0 +1,27 @@ +
+
+

+ <%= t('.table.create_new_user') %> +

+ <%= simple_form_for(@user, url: account_users_path, wrapper: :horizontal_form) do |f| %> + <%= f.input :email, placeholder: 'example@example.com' %> + <%= f.input :first_name, placeholder: t('.form.first_name_label'), required: true %> + <%= f.input :last_name, placeholder: t('.form.last_name_label'), required: true %> + <%= f.input :country %> + <%= f.input :role, collection: ['user', 'admin'] %> + +
+ <%= f.input :password, input_html: { data: { password_visibility_target: 'password' } }, hint: t('.form.password_hint'), required: true %> + <%= render 'shared/password_icon' %> +
+ +
+ <%= f.input :password_confirmation, input_html: { data: { password_visibility_target: 'password' } }, required: true %> + <%= render 'shared/password_icon' %> +
+ + <%= f.input :send_credentials_email, as: :boolean, label: t('.form.send_credentials_email'), input_html: { checked: true } %> + <%= f.submit t('.form.create_user_button'), class: 'btn btn-primary w-auto' %> + <% end %> +
+
diff --git a/app/views/account/users/show.html.erb b/app/views/account/users/show.html.erb new file mode 100644 index 000000000..06d91d832 --- /dev/null +++ b/app/views/account/users/show.html.erb @@ -0,0 +1,47 @@ +<%= link_to account_users_path, class: "rounded mt-3 px-2 flex items-center" do %> + <%= image_tag "icons/arrow-left.svg", class: "z-1 mr-2 mb-0.5" %> + <%= t('buttons.back') %> +<% end %> + +
+
+
+

<%= t('.header') %>

+
+
<%= t('.table.email_col') %>
+
<%= @user.email %>
+ +
<%= t('.table.first_name_col') %>
+
<%= @user.first_name %>
+ +
<%= t('.table.last_name_col') %>
+
<%= @user.last_name %>
+ +
<%= t('.table.country_col') %>
+
<%= @user.country %>
+ +
<%= t('.table.last_sign_in_col') %>
+
<%= @user.last_sign_in_at %>
+ +
<%= t('.table.current_IP_col') %>
+
<%= @user.current_sign_in_ip %>
+ +
<%= t('.table.last_IP_col') %>
+
<%= @user.last_sign_in_ip %>
+ +
<%= t('.table.ban_col') %>
+
<%= t(".table.#{ @user.blocked? ? 'blocked' : 'unblocked' }_label") %>
+
+
+ +
+

<%= t('.avatar') %>

+
+ <% if @user.avatar.attached? %> + <%= image_tag @user.avatar, class: "w-75 d-block my-0 mx-auto" %> + <% else %> + <%= image_tag 'user.png', class: "w-75 d-block my-0 mx-auto" %> + <% end %> +
+
+
diff --git a/app/views/account/users/show.html.slim b/app/views/account/users/show.html.slim deleted file mode 100644 index 7fba7ca12..000000000 --- a/app/views/account/users/show.html.slim +++ /dev/null @@ -1,30 +0,0 @@ -.container.flex-container - .flex-child - h2 = t '.header' - dl - dt = t '.table.email_col' - dd = @user.email - - dt = t '.table.first_name_col' - dd = @user.first_name - - dt = t '.table.last_name_col' - dd = @user.last_name - - dt = t '.table.country_col' - dd = @user.country - - dt = t '.table.last_sign_in_col' - dd = @user.last_sign_in_at - - dt = t '.table.current_IP_col' - dd = @user.current_sign_in_ip - - dt = t '.table.last_IP_col' - dd = @user.last_sign_in_ip - - dt = t '.table.ban_col' - dd = t(".table.#{ @user.blocked? ? 'blocked' : 'unblocked' }_label") - .flex-child - h2.text-center = t('.avatar') - dd = @user.avatar.attached? ? image_tag(@user.avatar) : image_tag('user.png') diff --git a/app/views/calculators/calculate.html.slim b/app/views/calculators/calculate.html.slim deleted file mode 100644 index b63d6ca30..000000000 --- a/app/views/calculators/calculate.html.slim +++ /dev/null @@ -1 +0,0 @@ -p here we call the calculator with name #{@calculator.name} diff --git a/app/views/calculators/calculator.html.slim b/app/views/calculators/calculator.html.slim deleted file mode 100644 index 54ad081c2..000000000 --- a/app/views/calculators/calculator.html.slim +++ /dev/null @@ -1,89 +0,0 @@ -.jumbotron - .container-fluid - a.rounded.float-right.calculator__cross__space href=root_path - = image_tag "close.svg", height: 40, class:"z-1 position-relative" - p.form-p - = t '.form_description' - .form - = form_with url: "#", id: "form", method: :get, data: { locale: I18n.locale } do |form| - .flex-item - select.custom-select#childs_years [required] - option [disabled selected hidden value] - = t('.form.childs_years_label') - - (0..2).each do |year| - option value = year - = "#{year} #{t('datetime.prompts.year').downcase.pluralize(count: year, locale: I18n.locale)}" - select.custom-select#childs_months - option [disabled selected hidden value] - =t('.form.childs_months_label') - - (0..11).each do |month| - option value = month - = "#{month} #{t('datetime.prompts.month').downcase.pluralize(count: month, locale: I18n.locale)}" - select.custom-select#two_years_childs_months - option [disabled selected hidden value] - =t('.form.childs_months_label') - - (0..6).each do |month| - option value = month - = "#{month} #{t('datetime.prompts.month').downcase.pluralize(count: month, locale: I18n.locale)}" - - - if FeatureFlag.get('feature_budget_category').active? - p.form-a - = t '.form_price' - select.custom-select#product_category [required] - option - =t('calculators.calculator.form.budgetary') - option selected="" - =t('calculators.calculator.form.medium') - option - =t('calculators.calculator.form.premium') - = form.text_field :baby_weight, placeholder:t('.form.baby_weight_label'), class:"form-input d-none" - = form.text_field :diapers_per_day, placeholder: "Diapers per day", class:"form-input d-none" - / div.flex-item.mt-4 - / = simple_format("", { type: "checkbox", name: "email_receiver", id: "checkbox_submit" }, - / wrapper_tag: "input") - / = simple_format(t("calculators.calculator.want_recomentation_label"), - / { for: "checkbox_submit" }, wrapper_tag: "label") - button.calculate-btn.result-btn[type="submit" id="button_submit"] - = + +
+ + + + + + + + + + <% @calculators.each do |calculator| %> + "> + + + + + <% end %> + +
<%= sort_link(@q, :id, t('.id_column'), default_order: :desc) %><%= sort_link(@q, :name, t('.calculator_name'), default_order: :desc) %><%= t('.calculator_actions') %>
<%= calculator.id %><%= calculator.name %> + <%= link_to '#', class: 'disabled-link', onclick: 'return false;' do %> + + <% end %> +
+
diff --git a/app/views/calculators/new_calculator.html.erb b/app/views/calculators/new_calculator.html.erb new file mode 100644 index 000000000..2dbf7a326 --- /dev/null +++ b/app/views/calculators/new_calculator.html.erb @@ -0,0 +1,89 @@ +
+ <%= link_to root_path, class: "px-2 mt-3 rounded back-link" do %> +
+ <%= inline_svg("icons/arrow-left.svg", class: "z-1") %> + <%= t("calculators.buttons.to_main") %> +
+ <% end %> + +

<%= t(".diaper_сalculator") %>

+
+ <%= simple_form_for(:child, url: "#", html: { class: "simple_form_calculator", + data: { controller: "input-child-info", + input_child_info_url_value: api_v1_diaper_calculators_url, + input_child_info_months_value: month_number("new"), + input_child_info_results_outlet: ".result" }}) do |form| %> +
+
+ <%= label_tag "child_years", t(".form.description") %> +
+ +
+ <%= form.input_field :years, + collection: 0..2, + prompt: "__", + class: "select-age ms-2 rounded", + data: { input_child_info_target: "year", action: "input-child-info#yearChanged" } %> + + <%= label_tag "child_years", t(".form.childs_years_label"), class: "select-age-label" %> + + <%= form.input_field :months, + collection: month_number("new"), + prompt: "__", + class: "select-age rounded", + data: { input_child_info_target: "month" } %> + + <%= label_tag "child_months", t(".form.childs_months_label"), class: "select-age-label" %> +
+ +
+ <%= label_tag "child_product_category", t(".form.price") %> +
+ + <%= form.input_field :product_category, + collection: @diaper_categories, + selected: @preferable_category&.id, + label: t(".form_price"), + class: "form_fild price_select rounded w-100", + data: { input_child_info_target: "productCategory" } %> + + <%= form.submit t("calculators.buttons.calculate"), + class: "calculate-btn result-btn", + data: { action: "input-child-info#submit" } %> +
+ <% end %> + + <%= image_tag "scales.png", class: "scales_img", alt: "Scales" %> +
+
+ +
+ <% new_calculator_items.each do |item| %> + <% if item == "arrow" %> +
+ <%= image_tag "icons/vector_5.png", class: "vector", alt: "horizontal arrow" %> + <%= image_tag "icons/vector_2.png", class: "vector-mobile", alt: "vertical arrow" %> +
+ <% else %> +
+ <%= image_tag item[:image], class: "img-margin", alt: "icon" %> +

0

+

<%= item[:unit] %>

+

<%= item[:text] %>

+
+ <% end %> + <% end %> +
+ +
+
+
+ <%= render "layouts/description_block" %> +
+
+ +
+
+
diff --git a/app/views/calculators/old_calculator.html.erb b/app/views/calculators/old_calculator.html.erb new file mode 100644 index 000000000..94e8c16c2 --- /dev/null +++ b/app/views/calculators/old_calculator.html.erb @@ -0,0 +1,70 @@ +
+ <%= link_to root_path, class: "px-2 mt-3 rounded back-link" do %> +
+ <%= image_tag "icons/arrow-left.svg", class: "z-1", alt: "arrow left" %> + <%= t("calculators.buttons.to_main") %> +
+ <% end %> + +
+
+ <%= t(".form.description") %> +
+ <%= simple_form_for(:child, url: "#", html: { class: "simple_form_calculator w-full mx-5", + data: { controller: "input-child-info", + input_child_info_url_value: api_v1_diaper_calculators_url, + input_child_info_months_value: month_number("old"), + input_child_info_results_outlet: ".result" }}) do |form| %> +
+ <%= form.input_field :years, + collection: years_number, + prompt: t(".form.years_prompt"), + class: "rounded custom-select", + data: { input_child_info_target: "year", action: "input-child-info#yearChanged" } %> + + <%= form.input_field :months, + collection: month_number("old"), + prompt: t(".form.months_prompt"), + class: "rounded custom-select mx-5", + data: { input_child_info_target: "month" } %> +
+ <%= form.hidden_field :product_category, collection: collection_product_category, + selected: t(".form.medium"), + data: { input_child_info_target: "productCategory" } %> +
+ <%= form.submit t("calculators.buttons.calculate"), + class: "calculate-btn result-btn calc-item old-btn", + data: { action: "input-child-info#submit" } %> +
+ <% end %> +
+
+ +
+
+ <% old_calculator_items.each do |item| %> +
+
+ <%= image_tag item[:image], class: "rounded", alt: "icon" %> +
+ +

0

+ <%= item[:text] %> +
+
+ <% end %> +
+
+ +
+
+
+ <%= render "layouts/description_block" %> +
+
+ +
+
+
diff --git a/app/views/calculators/show.html.slim b/app/views/calculators/show.html.slim index f2ce06722..e56045b52 100644 --- a/app/views/calculators/show.html.slim +++ b/app/views/calculators/show.html.slim @@ -7,36 +7,36 @@ h1.display-4.text-center.mt-5.mb-5 .jumbotron .container .row.main-container - .rounded.float-left - = image_pack_tag "search.png", height: 70 + .rounded.float-start + = image_tag "search.png", height: 70 .form-container - h3.container.ml-2= t 'calculators.calculator.form_description' + h3.container.ms-2= t 'calculators.calculator.form_description' form#form.container.mt-3 action="" .container.input-group.d-flex.justify-content-between label.text-center for="" input#birth.col.datepick placeholder=("#{t 'calculators.calculator.form.childs_birthday_label'}") type="text" / - / .container.ml-3.mt-4.form-check + / .container.ms-3.mt-4.form-check / input#flexCheckChecked.form-check-input checked="checked" type="checkbox" value="" / / label.form-check-label for="flexCheckChecked" / = t 'calculators.calculator.want_recomentation_label' - button.btn.btn-success.ml-3.mt-4 type="submit" - = image_pack_tag "calculator.png", height: 25 + button.btn.btn-success.ms-3.mt-4 type="submit" + = image_tag "calculator.png", height: 25 = t 'calculators.calculator.calculate_result_button' .container.calculation-results .row .col-sm.result-card - = image_pack_tag "diapers_bought.png", class:"rounded float-left", height: 70 + = image_tag "diapers_bought.png", class:"rounded float-left", height: 70 p data-type="bought_diapers" 0 = t 'calculators.calculator.bought_diapers' .col-sm.result-card - = image_pack_tag "money.png", class:"rounded float-left", height: 70 + = image_tag "money.png", class:"rounded float-left", height: 70 p data-type="money_spent" 0 = t 'calculators.calculator.money_spent' .col-sm.result-card - = image_pack_tag "naphtha.png", class:"rounded float-left", height: 70 + = image_tag "naphtha.png", class:"rounded float-left", height: 70 p data-type="mililiters_of_naphtha" 0 = t 'calculators.calculator.mililiters_of_naphtha' .col-sm.last-result-card - = image_pack_tag "plastic.png", class:"rounded float-left", height: 70 + = image_tag "plastic.png", class:"rounded float-left", height: 70 p data-type="garbage_created" 0 = t 'calculators.calculator.gram_of_plastic' diff --git a/app/views/devise/passwords/new.html.erb b/app/views/devise/passwords/new.html.erb new file mode 100644 index 000000000..30994be77 --- /dev/null +++ b/app/views/devise/passwords/new.html.erb @@ -0,0 +1,24 @@ +
+
+
+

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

+

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

+ + <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %> + <%= render "devise/shared/error_messages", resource: resource %> + +
+ <%= f.email_field :email, autofocus: true, autocomplete: "email", class: "form-control", placeholder: t(".email_placeholder"), required: true %> +
+ +
+ <%= f.submit t(".send_instructions_button"), class: "btn-green text-center px-4 py-2" %> +
+
+ <%= t(".back_to") %><%= render "devise/shared/links" %> +
+ + <% end %> +
+
+
diff --git a/app/views/devise/passwords/new.html.slim b/app/views/devise/passwords/new.html.slim deleted file mode 100644 index bbabc00cf..000000000 --- a/app/views/devise/passwords/new.html.slim +++ /dev/null @@ -1,14 +0,0 @@ - .position-block - .card.text-center - .card-block.p-4 - h2= t('.forgot_password_header') - = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| - = render "devise/shared/error_messages", resource: resource - .d-flex.justify-content-between.flex-wrap - = f.label :email, t('.form.email_label') - = f.email_field :email, autofocus: true, autocomplete: "email", class: "form-control" - br/ - .d-flex.justify-content-between.flex-wrap.flex-row-reverse - = f.submit t('.send_instructions_button'), class: "btn btn-primary" - .d-block.text-left - = render "devise/shared/links" diff --git a/app/views/devise/registrations/new.html.erb b/app/views/devise/registrations/new.html.erb new file mode 100644 index 000000000..847406ddd --- /dev/null +++ b/app/views/devise/registrations/new.html.erb @@ -0,0 +1,35 @@ +<% set_meta_tags(title: t(".meta-title")) %> + +
+
+
+

+ <%= t(".sign_up_header") %> +

+ + <%= simple_form_for resource, as: resource_name, url: registration_path(resource_name), wrapper: :horizontal_form do |f| %> + <%= f.input :email, placeholder: "example@example.com", autofocus: true %> + +
+ <%= f.input :password, hint: t(".form.password_hint"), input_html: { data: { password_visibility_target: "password" } }, required: true %> + <%= render "shared/password_icon" %> +
+ +
+ <%= f.input :password_confirmation, input_html: { data: { password_visibility_target: "password" } }, required: true %> + <%= render "shared/password_icon" %> +
+ + <%= f.input :first_name, required: true %> + <%= f.input :last_name, required: true %> + <%= f.input :country, selected: "UA", include_blank: false %> + +
+ <%= f.submit t(".form.sign_up_button"), class: "btn btn-primary" %> + + <%= render "devise/shared/links" %> +
+ <% end %> +
+
+
diff --git a/app/views/devise/registrations/new.html.slim b/app/views/devise/registrations/new.html.slim deleted file mode 100644 index 5978fba10..000000000 --- a/app/views/devise/registrations/new.html.slim +++ /dev/null @@ -1,16 +0,0 @@ -.position-block - .card - .card-block.p-4 - h2.text-center.p-2 - = t('.sign_up_header') - = simple_form_for resource, as: resource_name, url: registration_path(resource_name), wrapper: :horizontal_form do |f| - = f.input :email, placeholder: 'example@example.com', autofocus: true - = f.input :password, hint: t('.form.password_hint') - = f.input :password_confirmation - = f.input :first_name - = f.input :last_name - = f.input :country, include_blank: false - .d-flex.justify-content-between.flex-wrap.flex-row-reverse - = f.submit t('.form.sign_up_button'), class: 'btn btn-primary' - .d-block - = render "devise/shared/links" diff --git a/app/views/devise/sessions/new.html.erb b/app/views/devise/sessions/new.html.erb new file mode 100644 index 000000000..4a7541d78 --- /dev/null +++ b/app/views/devise/sessions/new.html.erb @@ -0,0 +1,27 @@ +<% set_meta_tags(title: t(".meta-title")) %> + +
+
+
+

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

+ + <%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %> + <%= f.input :email, class: "form-control", autofocus: true, autocomplete: "email", placeholder: t(".email_placeholder") %> + + + <% if devise_mapping.rememberable? %> + <%= f.input :remember_me, as: :boolean, inline_label: true %> + <% end %> + +
+ <%= f.submit t(".log_in"), class: "btn w-full font-bold text-center btn-green" %> + + <%#= render "devise/shared/links" %> +
+ <% end %> +
+
+
diff --git a/app/views/devise/sessions/new.html.slim b/app/views/devise/sessions/new.html.slim deleted file mode 100644 index ad1ca81fb..000000000 --- a/app/views/devise/sessions/new.html.slim +++ /dev/null @@ -1,16 +0,0 @@ -.position-block - .card - .card-block.p-4 - h2.text-center.p-2 - = t('.log_in') - = simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| - - flash.each do |type, msg| - .alert.alert-danger - = msg - = f.input :email, class: 'form-control', autofocus: true, autocomplete: "email" - = f.input :password, class: 'form-control', autocomplete: "current-password" - = f.input :remember_me, as: :boolean, inline_label: true if devise_mapping.rememberable? - .d-flex.justify-content-between.flex-wrap.flex-row-reverse.align-content-center - = f.submit t('.log_in'), class: "btn btn-primary" - .d-block - = render "devise/shared/links" diff --git a/app/views/devise/shared/_links.html.erb b/app/views/devise/shared/_links.html.erb new file mode 100644 index 000000000..85a31af59 --- /dev/null +++ b/app/views/devise/shared/_links.html.erb @@ -0,0 +1,25 @@ +<% if controller_name != "sessions" %> + <%= link_to t(".log_in"), new_session_path(resource_name) %> +<% end %> + +<% if devise_mapping.registerable? && controller_name != "registrations" %> + <%#= link_to t(".sign_up"), new_registration_path(resource_name) %> +<% end %> + +<% if devise_mapping.recoverable? && controller_name != "passwords" && controller_name != "registrations" %> +
+ <%#= link_to t(".forgot_your_password"), new_password_path(resource_name) %> +
+<% end %> + +<% if devise_mapping.omniauthable? && controller_name != "passwords"%> +
+ +
+<% end %> diff --git a/app/views/devise/shared/_links.html.slim b/app/views/devise/shared/_links.html.slim deleted file mode 100644 index 3f85e7c18..000000000 --- a/app/views/devise/shared/_links.html.slim +++ /dev/null @@ -1,18 +0,0 @@ -- if controller_name != 'sessions' - = link_to t(".log_in"), new_session_path(resource_name) - br -- if devise_mapping.registerable? && controller_name != 'registrations' - = link_to t(".sign_up"), new_registration_path(resource_name) - br -- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' - = link_to t(".forgot_your_password"), new_password_path(resource_name) - br -- if devise_mapping.omniauthable? - - resource_class.omniauth_providers.each do |provider| - - if provider == :google_oauth2 - = link_to t(".google_sign_in"), omniauth_authorize_path(resource_name, provider) - br - - else - = link_to t('.sign_in_with', :provider =>OmniAuth::Utils.camelize(provider)), omniauth_authorize_path(resource_name, provider) - br - \ No newline at end of file diff --git a/app/views/home/about.html.erb b/app/views/home/about.html.erb new file mode 100644 index 000000000..6838c9b48 --- /dev/null +++ b/app/views/home/about.html.erb @@ -0,0 +1,19 @@ +<% set_meta_tags({ + title: t('about_us.title'), + description: "Information about ZeroWaste organization and team" +})%> + +
+

<%= t('about_us.title') %>

+

<%= t('about_us.description.first_paragraph') %>

+

<%= t('about_us.description.second_paragraph') %>

+

<%= t('about_us.description.third_paragraph') %>

+
+
+

<%= t('our_team.title') %>

+

<%= t('our_team.description') %>

+
+ <%= link_to image_tag("logo_zerowaste.png", alt: "Zero Waste Logo", class: "logo-zerowaste"), "https://zerowastelviv.org.ua/", target: "_blank", rel: "noopener" %> + <%= link_to image_tag("softserve_academy_logo.png", alt: "Softserve Academy Logo", class: "logo-zerowaste"), "https://career.softserveinc.com/uk-ua/softserve-academy", target: "_blank", rel: "noopener" %> +
+
diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb new file mode 100644 index 000000000..053034971 --- /dev/null +++ b/app/views/home/index.html.erb @@ -0,0 +1,7 @@ +
+

<%= t '.homepage_title' %>

+

<%= t '.description' %>

+ + <%= link_to t('.visit_website'), t('.link'), target: '_blank', class: "main-btn btn-outline-gray" %> + <%= link_to t('.calculate'), calculator_path, class: "main-btn btn-outline-green" %> +
diff --git a/app/views/home/index.html.slim b/app/views/home/index.html.slim deleted file mode 100644 index 7ed920c0a..000000000 --- a/app/views/home/index.html.slim +++ /dev/null @@ -1,7 +0,0 @@ -main.container - h1.homepage_title = t '.homepage_title' - p = t '.description' - .main-btns - = link_to t('.visit_website'), "https://zerowastelviv.org.ua", target: '_blank' - a.btn-success href=calculator_path - = t '.calculate' diff --git a/app/views/kaminari/_gap.html.erb b/app/views/kaminari/_gap.html.erb new file mode 100644 index 000000000..6190f3d55 --- /dev/null +++ b/app/views/kaminari/_gap.html.erb @@ -0,0 +1,2 @@ + +<%= t('views.pagination.truncate').html_safe %> diff --git a/app/views/kaminari/_next_page.html.erb b/app/views/kaminari/_next_page.html.erb new file mode 100644 index 000000000..9d23c6a41 --- /dev/null +++ b/app/views/kaminari/_next_page.html.erb @@ -0,0 +1,4 @@ + + + <%= link_to_unless current_page.last?, t('views.pagination.next').html_safe, url, rel: 'next', remote: remote, class: "page-nav" %> + diff --git a/app/views/kaminari/_page.html.erb b/app/views/kaminari/_page.html.erb new file mode 100644 index 000000000..ad442b1f3 --- /dev/null +++ b/app/views/kaminari/_page.html.erb @@ -0,0 +1,4 @@ + + + <%= link_to_unless page.current?, page, url, {remote: remote, rel: page.rel, class: "page-nav"} %> + diff --git a/app/views/kaminari/_paginator.html.erb b/app/views/kaminari/_paginator.html.erb new file mode 100644 index 000000000..85c5a0fad --- /dev/null +++ b/app/views/kaminari/_paginator.html.erb @@ -0,0 +1,26 @@ +<%# The container tag + # available local variables + # current_page: a page object for the currently displayed page + # total_pages: total number of pages + # per_page: number of items to fetch per page + # remote: data-remote + # paginator: the paginator that renders the pagination tags inside +%> +<%= paginator.render do -%> + +<% end -%> diff --git a/app/views/kaminari/_prev_page.html.erb b/app/views/kaminari/_prev_page.html.erb new file mode 100644 index 000000000..7c49b6817 --- /dev/null +++ b/app/views/kaminari/_prev_page.html.erb @@ -0,0 +1,4 @@ + + + <%= link_to_unless current_page.first?, t('views.pagination.previous').html_safe, url, rel: 'prev', remote: remote, class: "page-nav" %> + diff --git a/app/views/layouts/_account_footer.html.erb b/app/views/layouts/_account_footer.html.erb new file mode 100644 index 000000000..7952d2a17 --- /dev/null +++ b/app/views/layouts/_account_footer.html.erb @@ -0,0 +1,8 @@ + diff --git a/app/views/layouts/_account_navbar.html.erb b/app/views/layouts/_account_navbar.html.erb new file mode 100644 index 000000000..35774f393 --- /dev/null +++ b/app/views/layouts/_account_navbar.html.erb @@ -0,0 +1,84 @@ + diff --git a/app/views/layouts/_account_navbar.html.slim b/app/views/layouts/_account_navbar.html.slim deleted file mode 100644 index 7937e914d..000000000 --- a/app/views/layouts/_account_navbar.html.slim +++ /dev/null @@ -1,21 +0,0 @@ -nav.navbar.navbar-expand-lg.navbar-light.bg-light.border-bottom.border-success - .container-fluid - div.collapse.navbar-collapse.row.justify-content-between.m-0 - = link_to image_tag('logo_zerowaste.png'), root_path, class: 'logo-zerowaste' - ul.navbar-nav - li.nav-item.mx-3 - = link_to t('.calculators'), account_calculators_path, class: 'navbar-brand text-success h3' - li.nav-item.mx-3 - = link_to t('.histories'), account_histories_path, class: 'navbar-brand text-success h3' - li.nav-item.mx-3 - = link_to t('.users'), account_users_path, class: 'navbar-brand text-success h3' - li.nav-item.mx-3 - = link_to t('.messages'), account_messages_path, class: 'navbar-brand text-success h3' - li.nav-item.mx-3 - = link_to t('.app_config'), edit_account_app_config_path, class: 'navbar-brand text-success h3' - li.nav-item.mx-3 - = link_to t('.categories'), account_categories_path, class: 'navbar-brand text-success h3' - li.nav-item.mx-3 - = link_to t('.site_settings'), edit_account_site_setting_path, class: 'navbar-brand text-success h3' - - = link_to t(".#{switch_locale_to}"), url_for(locale: switch_locale_to), class: 'btn btn-outline-success btn-sm' diff --git a/app/views/layouts/_description_button.html.slim b/app/views/layouts/_description_button.html.slim index b28c05523..12ff24d6b 100644 --- a/app/views/layouts/_description_button.html.slim +++ b/app/views/layouts/_description_button.html.slim @@ -1,6 +1,6 @@ - if I18n.locale == :en = it ".use_less", - use_less_link: It.link("https://zerowastelviv.org.ua/en/zero-waste-nappies-en/", target: '_blank') + use_less_link: It.link("https://zerowastelviv.org.ua/en/zero-waste-nappies-en/", target: '_blank', class: "px-5") - else = it ".use_less", - use_less_link: It.link("https://zerowastelviv.org.ua/zero-waste-nappies/", target: '_blank') + use_less_link: It.link("https://zerowastelviv.org.ua/zero-waste-nappies/", target: '_blank', class: "px-2") diff --git a/app/views/layouts/_flash_messages.html.erb b/app/views/layouts/_flash_messages.html.erb new file mode 100644 index 000000000..567fa0dc8 --- /dev/null +++ b/app/views/layouts/_flash_messages.html.erb @@ -0,0 +1,3 @@ +<% flash.each do |message_type, message| %> + <%= turbo_stream.toast(message, background: message_type) %> +<% end %> diff --git a/app/views/layouts/_flash_messages.html.slim b/app/views/layouts/_flash_messages.html.slim deleted file mode 100644 index 00d3d6469..000000000 --- a/app/views/layouts/_flash_messages.html.slim +++ /dev/null @@ -1,6 +0,0 @@ -- flash_messages.each do |message_type, message| - .alert.alert-dismissible.fade.show.position-absolute.container-fluid.fixed-top class=(message_class_by_name(message_type)) - = message - button.close[type="button" data-dismiss="alert" aria-label="Close"] - span[aria-hidden="true"] - | × diff --git a/app/views/layouts/account.html.erb b/app/views/layouts/account.html.erb new file mode 100644 index 000000000..468db7d8c --- /dev/null +++ b/app/views/layouts/account.html.erb @@ -0,0 +1,25 @@ + + + + + <%= favicon_link_tag(url_for(SiteSetting.current.favicon)) %> + <%= display_meta_tags( + site: SiteSetting.current.title, + reverse: true + ) %> + + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbo-track': 'reload' %> + <%= stylesheet_link_tag "tailwind", "inter-font", "data-turbo-track": "reload" %> + <%= javascript_importmap_tags %> + + + <%= render 'layouts/flash_messages' %> + <%= render 'layouts/account_navbar' %> +
+ <%= yield %> +
+ <%= render 'layouts/account_footer' %> + + diff --git a/app/views/layouts/account.html.slim b/app/views/layouts/account.html.slim deleted file mode 100644 index d5d52cae2..000000000 --- a/app/views/layouts/account.html.slim +++ /dev/null @@ -1,16 +0,0 @@ -doctype html -html - head - meta content=("text/html; charset=UTF-8") http-equiv="Content-Type" / - title = SiteSetting.current.title - = favicon_link_tag(url_for(SiteSetting.current.favicon)) - meta content="width=device-width,initial-scale=1" name="viewport" / - = csrf_meta_tags - = csp_meta_tag - = stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' - = javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' - body.admin - = render 'layouts/flash_messages' - = render 'layouts/account_navbar' - .container.admin-container - = yield diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 000000000..33d027d80 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,25 @@ + + + + + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + <%= favicon_link_tag(url_for(SiteSetting.current.favicon)) %> + <%= display_meta_tags( + site: SiteSetting.current.title, + viewport: 'width=device-width, initial-scale=1.0', + reverse: true + ) %> + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbo-track': 'reload' %> + <%= stylesheet_link_tag "tailwind", "inter-font", "data-turbo-track": "reload" %> + <%= javascript_importmap_tags %> + + +
+ <%= render 'layouts/flash_messages' %> + <%= render 'account/shared/navigation' %> + <%= yield %> + <%= any_login_here if defined?(AnyLogin) %> +
+ + diff --git a/app/views/layouts/application.html.slim b/app/views/layouts/application.html.slim deleted file mode 100644 index f05efb9da..000000000 --- a/app/views/layouts/application.html.slim +++ /dev/null @@ -1,24 +0,0 @@ -doctype html -html - head - meta content=("text/html; charset=UTF-8") http-equiv="Content-Type" / - title = SiteSetting.current.title - = favicon_link_tag(url_for(SiteSetting.current.favicon)) - meta content="width=device-width,initial-scale=1" name="viewport" / - = csrf_meta_tags - = csp_meta_tag - = stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' - = javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' - = render "layouts/ga" - / body.wrapper - / div.filter_block - / = render 'layouts/flash_messages' - / = render 'account/shared/navigation' - / = yield - / = any_login_here if defined?(AnyLogin) - body - .body-inside - = render 'layouts/flash_messages' - = render 'account/shared/navigation' - = yield - = any_login_here if defined?(AnyLogin) diff --git a/app/views/messages/new.html.erb b/app/views/messages/new.html.erb new file mode 100644 index 000000000..83b49842a --- /dev/null +++ b/app/views/messages/new.html.erb @@ -0,0 +1,57 @@ +<% set_meta_tags(title: t(".meta-title")) %> + +
+
+
+

+ <%= t('.contact_us_header') %> +

+
+ <%= form_with model: @message do |form| %> +
+
+ <%= t('.title') %> +
+ <%= form.text_field :title, class:'form-control', placeholder: t('.title_hint'), minlength: "5", required: true %> +
+ +
+
+ <%= t('.message') %> +
+ <%= form.text_area :message, class: 'form-control', placeholder: (t('.message_hint')), size: "25x2", minlength:"20", required: true %> +
+
+ <%= form.submit t('.send'), class:"btn btn-primary mt-3" %> +
+ <% end %> +
+
+
+
+
+ + + <%= link_to "zerowastelviv.org.ua", "https://zerowastelviv.org.ua", target: "_blank", **seo_link_attributes %> + +
+
+ <%= link_to "https://www.facebook.com/zerowastelviv/", target: "_blank", **seo_link_attributes do %> + <%= inline_svg("facebook_logo.svg", class: "w-12 px-2", title: "Facebook Logo") %> + <% end %> + + <%= link_to "https://www.youtube.com/channel/UCpFxQ1UgIbwSAvWe0gOw0Zg", target: "_blank", **seo_link_attributes do %> + <%= inline_svg("youtube_logo.svg", class: "w-12 px-2", title: "Youtube Logo") %> + <% end %> + + <%= link_to "https://www.instagram.com/zerowastelviv/", target: "_blank", **seo_link_attributes do %> + <%= inline_svg("instagram_logo.svg", class: "w-12 px-2", title: "Instagram Logo") %> + <% end %> +
+
+
diff --git a/app/views/messages/new.html.slim b/app/views/messages/new.html.slim deleted file mode 100644 index 05e7e42bf..000000000 --- a/app/views/messages/new.html.slim +++ /dev/null @@ -1,31 +0,0 @@ -.position-block - .card - .card-block.p-4 - h2.text-center.p-2 - = t('.contact_us_header') - .contact-form - =form_with model: @message do |form| - .title - .text = t('.title') - =form.text_field :title, class:'form-control', placeholder:t('.title_hint'), minlength:"5", required: true - .email - .text = t('.email') - =form.email_field :email, class:'form-control', placeholder:'example@example.com', required: true - .msg - .text = t('.message') - =form.text_area :message, class:'form-control', placeholder:(t('.message_hint')), size:"25x2", minlength:"20", required: true - .d-flex.justify-content-between.flex-wrap.flex-row-reverse - = form.submit :Send, class:"btn btn-primary", value:t('.send') -br -.contact-info.card-block.p-3.m-auto - .place - span.fas.fa-map-marker-alt> - span.text = t('.company_address') - .phone - span.fas.fa-phone-alt> - span.text +380xxxxxxx - .email - span.fas.fa-envelope> - span.text zerowastelviv@gmail.com - .about_us - a href="/about_us" = t ('.about_us') diff --git a/app/views/shared/_password_icon.html.erb b/app/views/shared/_password_icon.html.erb new file mode 100644 index 000000000..e845e0506 --- /dev/null +++ b/app/views/shared/_password_icon.html.erb @@ -0,0 +1,3 @@ + + + diff --git a/app/views/sitemap/index.html.slim b/app/views/sitemap/index.html.slim new file mode 100644 index 000000000..3ba89f83c --- /dev/null +++ b/app/views/sitemap/index.html.slim @@ -0,0 +1,14 @@ +.container.list-unstyled.text-success + h2.mb-4.text-center = t('.sitemap') + hr.mt-4.mb-5 + .row + .col-md-6 + h3.mb-4 = link_to t('.homepage'), root_url, class: "text-success text-decoration-none" + ul.list-unstyled.mb-4 + li.mb-2 + = link_to t('.about_us'), about_path, class: "text-white" + .col-md-6 + h3.mb-4.text-success = t('.calculators') + ul.list-unstyled.mb-4 + li.mb-2 + = link_to t('.calculator-diapers'), calculator_url, class: "text-white" diff --git a/app/views/sitemap/index.xml.builder b/app/views/sitemap/index.xml.builder new file mode 100644 index 000000000..e223b7a18 --- /dev/null +++ b/app/views/sitemap/index.xml.builder @@ -0,0 +1,22 @@ +xml.instruct! :xml, version: "1.0" +xml.urlset "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9", "xmlns:image" => "http://www.google.com/schemas/sitemap-image/1.1", "xmlns:video" => "http://www.google.com/schemas/sitemap-video/1.1" do + I18n.with_locale(locale) do + xml.url do + xml.loc root_url + xml.lastmod Time.now.iso8601 + xml.changefreq "monthly" + end + + xml.url do + xml.loc calculator_url + xml.lastmod Time.now.iso8601 + xml.changefreq "weekly" + end + + xml.url do + xml.loc about_url + xml.lastmod Time.now.iso8601 + xml.changefreq "yearly" + end + end +end diff --git a/app/views/user_mailer/welcome_email.html.erb b/app/views/user_mailer/welcome_email.html.erb new file mode 100644 index 000000000..10f323585 --- /dev/null +++ b/app/views/user_mailer/welcome_email.html.erb @@ -0,0 +1,12 @@ +

<%= t('.greeting', name: @user.first_name) %>

+
+

<%= t('.login_info') %>:

+

<%= t('.email', email: @user.email) %>

+

<%= t('.password', password: @user.password) %>

+
+

+ <%= t('.to_login') %>: <%= link_to "ZeroWaste", @url %>. +

+

+ <%= t('.thanks') %> +

diff --git a/app/views/user_mailer/welcome_email.text.erb b/app/views/user_mailer/welcome_email.text.erb new file mode 100644 index 000000000..edb93c8a1 --- /dev/null +++ b/app/views/user_mailer/welcome_email.text.erb @@ -0,0 +1,8 @@ +<%= t('.greeting', name: @user.first_name) %> +<%= t('.login_info') %>: + <%= t('.email', email: @user.email) %> + <%= t('.password', password: @user.password) %> + +<%= t('.to_login') %> : <%= @url %> + +<%= t('.thanks') %> diff --git a/bin/dev b/bin/dev new file mode 100755 index 000000000..74ade1664 --- /dev/null +++ b/bin/dev @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +if ! gem list foreman -i --silent; then + echo "Installing foreman..." + gem install foreman +fi + +exec foreman start -f Procfile.dev "$@" diff --git a/bin/importmap b/bin/importmap new file mode 100755 index 000000000..36502ab16 --- /dev/null +++ b/bin/importmap @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby + +require_relative "../config/application" +require "importmap/commands" diff --git a/bin/render-build.sh b/bin/render-build.sh old mode 100644 new mode 100755 index aacff69f5..60e69ce14 --- a/bin/render-build.sh +++ b/bin/render-build.sh @@ -4,5 +4,6 @@ set -o errexit bundle install bundle exec rake db:migrate +bundle exec rake db:seed bundle exec rake assets:precompile bundle exec rake assets:clean diff --git a/bin/rubocop.sh b/bin/rubocop.sh old mode 100644 new mode 100755 diff --git a/bin/webpack b/bin/webpack deleted file mode 100755 index 62114baeb..000000000 --- a/bin/webpack +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -ENV['RAILS_ENV'] ||= ENV['RACK_ENV'] || 'development' -ENV['NODE_ENV'] ||= 'development' - -require 'pathname' -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', - Pathname.new(__FILE__).realpath) - -require 'bundler/setup' - -require 'webpacker' -require 'webpacker/webpack_runner' - -APP_ROOT = File.expand_path('..', __dir__) -Dir.chdir(APP_ROOT) do - Webpacker::WebpackRunner.run(ARGV) -end diff --git a/bin/webpack-dev-server b/bin/webpack-dev-server deleted file mode 100755 index e4f41ccd4..000000000 --- a/bin/webpack-dev-server +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -ENV['RAILS_ENV'] ||= ENV['RACK_ENV'] || 'development' -ENV['NODE_ENV'] ||= 'development' - -require 'pathname' -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', - Pathname.new(__FILE__).realpath) - -require 'bundler/setup' - -require 'webpacker' -require 'webpacker/dev_server_runner' - -APP_ROOT = File.expand_path('..', __dir__) -Dir.chdir(APP_ROOT) do - Webpacker::DevServerRunner.run(ARGV) -end diff --git a/config/application.rb b/config/application.rb index a8b4439e7..effb599d4 100644 --- a/config/application.rb +++ b/config/application.rb @@ -12,7 +12,7 @@ module ZeroWaste class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 6.1 + config.load_defaults 7.1 config.active_job.queue_adapter = :sidekiq # Configuration for the application, engines, and railties goes here. @@ -20,11 +20,13 @@ class Application < Rails::Application # These settings can be overridden in specific environments using the files # in config/environments, which are processed later. # - # config.time_zone = "Central Time (US & Canada)" + config.time_zone = "Kyiv" # config.eager_load_paths << Rails.root.join("extras") config.i18n.available_locales = [:en, :uk] config.i18n.default_locale = :en config.i18n.load_path += Dir[Rails.root.join("config", "locales", "**", "*.{rb,yml}")] + + config.assets.css_compressor = nil end end diff --git a/config/database.yml.sample b/config/database.yml.sample index 9a248369b..4526d46d2 100644 --- a/config/database.yml.sample +++ b/config/database.yml.sample @@ -7,7 +7,6 @@ default: &default password: <%= ENV["ZW_DATABASE_PASSWORD"] %> port: <%= ENV.fetch("ZW_DATABASE_PORT") { "5432" } %> - pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default database: zero_waste_development diff --git a/config/environments/development.rb b/config/environments/development.rb index 4d7f9d3e1..519517cee 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -64,7 +64,7 @@ # Debug mode disables concatenation and preprocessing of assets. # This option may cause significant delays in view rendering with a large # number of complex assets. - config.assets.debug = true + config.assets.compile = true # Suppress logger output for asset requests. config.assets.quiet = true diff --git a/config/environments/production.rb b/config/environments/production.rb index fb755a534..343f49737 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -30,7 +30,6 @@ config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present? # Compress CSS using a preprocessor. - # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile = false diff --git a/config/environments/test.rb b/config/environments/test.rb index f6ecab9eb..55d120509 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -34,7 +34,7 @@ config.cache_store = :null_store # Raise exceptions instead of rendering exception templates. - config.action_dispatch.show_exceptions = false + config.action_dispatch.show_exceptions = :none # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false @@ -48,6 +48,7 @@ # The :test delivery method accumulates sent emails in the # ActionMailer::Base.deliveries array. config.action_mailer.delivery_method = :test + config.action_mailer.default_url_options = { host: "localhost" } # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr diff --git a/config/importmap.rb b/config/importmap.rb new file mode 100644 index 000000000..0ed3f37e8 --- /dev/null +++ b/config/importmap.rb @@ -0,0 +1,16 @@ +# Pin npm packages by running ./bin/importmap + +pin "application", preload: true +pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true +pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true +pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true +pin "jquery", to: "https://ga.jspm.io/npm:jquery@3.7.0/dist/jquery.js" +pin_all_from "app/javascript/controllers", under: "controllers" +pin_all_from "app/javascript/channels", under: "channels" +pin_all_from "app/javascript/turbo_streams", under: "turbo_streams" +pin_all_from "app/javascript/helpers", under: "helpers" +pin "bootstrap", to: "https://ga.jspm.io/npm:bootstrap@5.3.0/dist/js/bootstrap.esm.js", preload: true +pin "@fortawesome/fontawesome-free", to: "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.4.0/js/all.js", preload: true +pin "@popperjs/core", to: "https://ga.jspm.io/npm:@popperjs/core@2.11.8/lib/index.js", preload: true +pin "@rails/actioncable", to: "actioncable.esm.js", preload: true +pin "toastify-js", to: "https://ga.jspm.io/npm:toastify-js@1.12.0/src/toastify.js", preload: true diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index ba194685a..d8de57926 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -13,4 +13,4 @@ # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in the app/assets # folder are already added. -# Rails.application.config.assets.precompile += %w( admin.js admin.css ) +Rails.application.config.assets.precompile += ["turbo-streams.js", "bootstrap.min.js", "popper.js", "jquery.min.js", "jquery_ujs.js", "toastify-js"] diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index fd6620d43..d75635fa4 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -178,7 +178,7 @@ # ==> Configuration for :validatable # Range for password length. - # config.password_length = 6..128 + config.password_length = 8..64 # Email regex used to validate email formats. It simply asserts that # one (and only one) @ exists in the given string. This is mainly @@ -309,6 +309,8 @@ # When set to false, does not sign a user in automatically after their password is # changed. Defaults to true, so a user is signed in automatically after changing a password. # config.sign_in_after_change_password = true + config.responder.error_status = :unprocessable_entity + config.responder.redirect_status = :see_other end Devise::Async.setup do |config| diff --git a/config/initializers/factory_bot.rb b/config/initializers/factory_bot.rb new file mode 100644 index 000000000..ce6893dba --- /dev/null +++ b/config/initializers/factory_bot.rb @@ -0,0 +1,11 @@ +if defined?(FactoryBot) + module FactoryBotCharacters + def clear_special_characters(string) + string.gsub(/[^0-9A-Za-zа-яА-Я ]/, "") + end + end + + class FactoryBot::SyntaxRunner + include FactoryBotCharacters + end +end diff --git a/config/initializers/flipper/features.rb b/config/initializers/flipper/features.rb new file mode 100644 index 000000000..24f9571ad --- /dev/null +++ b/config/initializers/flipper/features.rb @@ -0,0 +1,12 @@ +if Flipper::Adapters::ActiveRecord::Feature.table_exists? + require_relative "flipper_feature" + + Flipper[:new_calculator_design].en_description = "This feature flag is responsible for enabling new calculator design" + Flipper[:new_calculator_design].uk_description = "Відкриває можливість використовувати новий дизайн калькулятора" + + Flipper[:show_calculators_list].en_description = "This feature flag controls the visibility of the calculators page on the public side" + Flipper[:show_calculators_list].uk_description = "Цей прапорець відображає або приховує сторінку калькуляторів на публічній стороні" + + Flipper[:sandbox_mode].en_description = "This feature flag is responsible for enabling sandbox mode" + Flipper[:sandbox_mode].uk_description = "Відкриває можливість використовувати режим пісочниці" +end diff --git a/config/initializers/flipper/flipper.rb b/config/initializers/flipper/flipper.rb new file mode 100644 index 000000000..97f69ca95 --- /dev/null +++ b/config/initializers/flipper/flipper.rb @@ -0,0 +1,26 @@ +if Flipper::Adapters::ActiveRecord::Feature.table_exists? + require "flipper/adapters/active_record" + + require_relative "flipper_feature" + require "./app/services/database_backup_service" + + Flipper.configure do |config| + config.default do + Flipper.new(Flipper::Adapters::ActiveRecord.new) + end + end + + Flipper.features.each do |feature| + case feature.name + when "sandbox_mode" + Flipper.disable(feature.name) unless DatabaseBackupService.sandbox_enabled? + when "show_calculators_list" + Flipper.disable(feature.name) + else + Flipper.enable(feature.name) + end + end + + # add string below after creating staging environment + # Flipper.remove(:sandbox_mode) if Rails.env.production? +end diff --git a/config/initializers/flipper/flipper_feature.rb b/config/initializers/flipper/flipper_feature.rb new file mode 100644 index 000000000..b984e3e44 --- /dev/null +++ b/config/initializers/flipper/flipper_feature.rb @@ -0,0 +1,18 @@ +if Flipper::Adapters::ActiveRecord::Feature.table_exists? + class Flipper::Feature + delegate :en_description, :en_description=, to: :feature_record + delegate :uk_description, :uk_description=, to: :feature_record + + alias_method :name, :key + + def description + public_send("#{I18n.locale}_description") + end + + private + + def feature_record + @feature_record ||= Flipper::Adapters::ActiveRecord::Feature.find_or_create_by(key: key) + end + end +end diff --git a/config/initializers/kaminari_config.rb b/config/initializers/kaminari_config.rb new file mode 100644 index 000000000..8e623edd8 --- /dev/null +++ b/config/initializers/kaminari_config.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +Kaminari.configure do |config| + config.default_per_page = 10 + config.window = 2 + # config.max_per_page = nil + config.outer_window = 1 + # config.left = 0 + # config.right = 0 + # config.page_method_name = :page + # config.param_name = :page + # config.max_pages = nil + # config.params_on_first_page = false +end diff --git a/config/initializers/rails_db.rb b/config/initializers/rails_db.rb new file mode 100644 index 000000000..e2fc05a67 --- /dev/null +++ b/config/initializers/rails_db.rb @@ -0,0 +1,35 @@ +if Object.const_defined?(:RailsDb) + RailsDb.setup do |config| + # # enabled or not + # config.enabled = Rails.env.development? + + # # automatic engine routes mounting + # config.automatic_routes_mount = true + + # set tables which you want to hide ONLY + # config.black_list_tables = ['users', 'accounts'] + + # set tables which you want to show ONLY + # config.white_list_tables = ['posts', 'comments'] + + # # Enable http basic authentication + # config.http_basic_authentication_enabled = false + + # # Enable http basic authentication + # config.http_basic_authentication_user_name = 'rails_db' + + # # Enable http basic authentication + # config.http_basic_authentication_password = 'password' + + # # Enable http basic authentication + # config.verify_access_proc = proc { |controller| true } + + # # Sandbox mode (only read-only operations) + config.sandbox = true + + # Enable access for admins only + config.verify_access_proc = proc do |controller| + controller.current_user ? controller.current_user.admin? : false + end + end +end diff --git a/config/initializers/ransack.rb b/config/initializers/ransack.rb new file mode 100644 index 000000000..94a44ed96 --- /dev/null +++ b/config/initializers/ransack.rb @@ -0,0 +1,6 @@ +Ransack.configure do |c| + c.custom_arrows = { + up_arrow: '', + down_arrow: '' + } +end diff --git a/config/initializers/simple_form_bootstrap.rb b/config/initializers/simple_form_bootstrap.rb index 2ab221dc0..373eb7340 100644 --- a/config/initializers/simple_form_bootstrap.rb +++ b/config/initializers/simple_form_bootstrap.rb @@ -1,36 +1,35 @@ # frozen_string_literal: true -# Please do not make direct changes to this file! -# This generator is maintained by the community around simple_form-bootstrap: -# https://github.com/rafaelfranca/simple_form-bootstrap -# All future development, tests, and organization should happen there. -# Background history: https://github.com/heartcombo/simple_form/issues/1561 +# These defaults are defined and maintained by the community at +# https://github.com/heartcombo/simple_form-bootstrap +# Please submit feedback, changes and tests only there. +ALERT_DANGER = "alert alert-danger" +COL_FORM_LABEL = "col-form-label pt-0" +COL_FORM_LABEL_SM = "col-sm-3 col-form-label" +COL_FORM_LABEL_SM_PT = "col-sm-3 col-form-label pt-0" +COL_SM = "col-sm-9" +IS_VALID = "is-valid" +IS_INVALID = "is-invalid" +FORM_CHECK_LABEL = "form-check-label" +FORM_CHECK = "form-check" +FORM_CHECK_INPUT = "form-check-input" +FORM_CONTROL = "form-control" +FORM_GROUP = "form-group" +FORM_LABEL = "form-label" +FORM_LABEL_BLOCK = "form-label d-block" +FORM_SELECT = "form-select" +FORM_TEXT = "form-text" +FLEX = "d-flex flex-row justify-content-between align-items-center" +INVALID_FEEDBACK = "invalid-feedback" +INVALID_FEEDBACK_BLOCK = "invalid-feedback d-block" +MB = "mb-3" +ROW_MB = "row mb-3" # Uncomment this and change the path if necessary to include your own # components. # See https://github.com/heartcombo/simple_form#custom-components # to know more about custom components. -# Dir[Rails.root.join('lib/components/**/*.rb')].each { |f| require f } - -IS_VALID = "is-valid" -IS_INVALID = "is-invalid" -FORM_CHECK_LABEL = "form-check-label" -FORM_GROUP = "form-group" -FORM_GROUP_VALID = "form-group-valid" -FORM_GROUP_INVALID = "form-group-valid" -FORM_CONTROL = "form-control" -INVALID_FEEDBACK = "invalid-feedback" -FORM_TEXT = "form-text text-muted" -FORM_CHECK = "form-check" -FORM_CHECK_INPUT = "form-check-input" -COL_FORM_LABEL = "col-form-label pt-0" -INVALID_FEEDBACK_BLOCK = "invalid-feedback d-block" -FLEX = "d-flex flex-row justify-content-between align-items-center" -FORM_GROUP_ROW = "form-group row" -COL_FORM_LABEL_SM = "col-sm-3 col-form-label" -COL_SM = "col-sm-9" -CUSTOM_CONTROL_INPUT = "custom-control-input" -CUSTOM_CONTROL_LABEL = "custom-control-label" +Dir[Rails.root.join("lib", "components", "**", "*.rb")].sort.each { |f| require f } # Use this setup block to configure all options available in SimpleForm. SimpleForm.setup do |config| @@ -41,9 +40,7 @@ config.boolean_label_class = FORM_CHECK_LABEL # How the label text should be generated altogether with the required text. - config.label_text = lambda { |label, required, _explicit_label| - "#{label} #{required}" - } + config.label_text = lambda { |label, required, explicit_label| "#{label} #{required}" } # Define the way to render check boxes / radio buttons with labels. config.boolean_style = :inline @@ -56,7 +53,7 @@ config.include_default_input_wrapper_class = false # CSS class to add for error notification helper. - config.error_notification_class = "alert alert-danger" + config.error_notification_class = ALERT_DANGER # Method used to tidy up errors. Specify any Rails Array method. # :first lists the first message for each field. @@ -70,9 +67,7 @@ # vertical forms # # vertical default_wrapper - config.wrappers :vertical_form, tag: "div", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :vertical_form, class: MB do |b| b.use :html5 b.use :placeholder b.optional :maxlength @@ -80,114 +75,99 @@ b.optional :pattern b.optional :min_max b.optional :readonly - b.use :label - b.use :input, class: FORM_CONTROL, error_class: IS_INVALID, - valid_class: IS_VALID - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :label, class: FORM_LABEL + b.use :input, class: FORM_CONTROL, error_class: IS_INVALID, valid_class: IS_VALID + b.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + b.use :hint, wrap_with: { class: FORM_TEXT } end # vertical input for boolean - config.wrappers :vertical_boolean, tag: "fieldset", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :vertical_boolean, tag: "fieldset", class: MB do |b| b.use :html5 b.optional :readonly - b.wrapper :form_check_wrapper, tag: "div", class: FORM_CHECK do |bb| - bb.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, - valid_class: IS_VALID + b.wrapper :form_check_wrapper, class: FORM_CHECK do |bb| + bb.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, valid_class: IS_VALID bb.use :label, class: FORM_CHECK_LABEL - bb.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK } - bb.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + bb.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + bb.use :hint, wrap_with: { class: FORM_TEXT } end end # vertical input for radio buttons and check boxes - config.wrappers :vertical_collection, item_wrapper_class: FORM_CHECK, - item_label_class: FORM_CHECK_LABEL, - tag: "fieldset", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :vertical_collection, item_wrapper_class: FORM_CHECK, item_label_class: FORM_CHECK_LABEL, tag: "fieldset", class: MB do |b| b.use :html5 b.optional :readonly b.wrapper :legend_tag, tag: "legend", class: COL_FORM_LABEL do |ba| ba.use :label_text end - b.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, - valid_class: IS_VALID - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, valid_class: IS_VALID + b.use :full_error, wrap_with: { class: INVALID_FEEDBACK_BLOCK } + b.use :hint, wrap_with: { class: FORM_TEXT } end # vertical input for inline radio buttons and check boxes - config.wrappers :vertical_collection_inline, - item_wrapper_class: "form-check form-check-inline", - item_label_class: FORM_CHECK_LABEL, tag: "fieldset", - class: FORM_GROUP, error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :vertical_collection_inline, item_wrapper_class: "form-check form-check-inline", item_label_class: FORM_CHECK_LABEL, tag: "fieldset", class: MB do |b| b.use :html5 b.optional :readonly b.wrapper :legend_tag, tag: "legend", class: COL_FORM_LABEL do |ba| ba.use :label_text end - b.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, - valid_class: IS_VALID - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, valid_class: IS_VALID + b.use :full_error, wrap_with: { class: INVALID_FEEDBACK_BLOCK } + b.use :hint, wrap_with: { class: FORM_TEXT } end # vertical file input - config.wrappers :vertical_file, tag: "div", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :vertical_file, class: MB do |b| b.use :html5 b.use :placeholder b.optional :maxlength b.optional :minlength b.optional :readonly - b.use :label - b.use :input, class: "form-control-file", error_class: IS_INVALID, - valid_class: IS_VALID - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :label, class: FORM_LABEL + b.use :input, class: FORM_CONTROL, error_class: IS_INVALID, valid_class: IS_VALID + b.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + b.use :hint, wrap_with: { class: FORM_TEXT } + end + + # vertical select input + config.wrappers :vertical_select, class: MB do |b| + b.use :html5 + b.optional :readonly + b.use :label, class: FORM_LABEL + b.use :input, class: FORM_SELECT, error_class: IS_INVALID, valid_class: IS_VALID + b.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + b.use :hint, wrap_with: { class: FORM_TEXT } end # vertical multi select - config.wrappers :vertical_multi_select, tag: "div", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :vertical_multi_select, class: MB do |b| b.use :html5 b.optional :readonly - b.use :label - b.wrapper tag: "div", class: FLEX do |ba| - ba.use :input, class: "form-control mx-1", error_class: IS_INVALID, - valid_class: IS_VALID + b.use :label, class: FORM_LABEL + b.wrapper class: FLEX do |ba| + ba.use :input, class: "form-select mx-1", error_class: IS_INVALID, valid_class: IS_VALID end - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :full_error, wrap_with: { class: INVALID_FEEDBACK_BLOCK } + b.use :hint, wrap_with: { class: FORM_TEXT } end # vertical range input - config.wrappers :vertical_range, tag: "div", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :vertical_range, class: MB do |b| b.use :html5 b.use :placeholder b.optional :readonly b.optional :step - b.use :label - b.use :input, class: "form-control-range", error_class: IS_INVALID, - valid_class: IS_VALID - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :label, class: FORM_LABEL + b.use :input, class: "form-range", error_class: IS_INVALID, valid_class: IS_VALID + b.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + b.use :hint, wrap_with: { class: FORM_TEXT } end # horizontal forms # # horizontal default_wrapper - config.wrappers :horizontal_form, tag: "div", class: FORM_GROUP_ROW, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :horizontal_form, class: ROW_MB do |b| b.use :html5 b.use :placeholder b.optional :maxlength @@ -196,130 +176,110 @@ b.optional :min_max b.optional :readonly b.use :label, class: COL_FORM_LABEL_SM - b.wrapper :grid_wrapper, tag: "div", class: COL_SM do |ba| - ba.use :input, class: FORM_CONTROL, error_class: IS_INVALID, - valid_class: IS_VALID - ba.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK } - ba.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.wrapper :grid_wrapper, class: COL_SM do |ba| + ba.use :input, class: FORM_CONTROL, error_class: IS_INVALID, valid_class: IS_VALID + ba.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + ba.use :hint, wrap_with: { class: FORM_TEXT } end end # horizontal input for boolean - config.wrappers :horizontal_boolean, tag: "div", class: FORM_GROUP_ROW, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :horizontal_boolean, class: ROW_MB do |b| b.use :html5 b.optional :readonly - b.wrapper tag: "label", class: "col-sm-3" do |ba| - ba.use :label_text - end - b.wrapper :grid_wrapper, tag: "div", class: COL_SM do |wr| - wr.wrapper :form_check_wrapper, tag: "div", class: FORM_CHECK do |bb| - bb.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, - valid_class: IS_VALID + b.wrapper :grid_wrapper, class: "col-sm-9 offset-sm-3" do |wr| + wr.wrapper :form_check_wrapper, class: FORM_CHECK do |bb| + bb.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, valid_class: IS_VALID bb.use :label, class: FORM_CHECK_LABEL - bb.use :full_error, - wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - bb.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + bb.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + bb.use :hint, wrap_with: { class: FORM_TEXT } end end end # horizontal input for radio buttons and check boxes - config.wrappers :horizontal_collection, item_wrapper_class: FORM_CHECK, - item_label_class: FORM_CHECK_LABEL, - tag: "div", class: FORM_GROUP_ROW, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :horizontal_collection, item_wrapper_class: FORM_CHECK, item_label_class: FORM_CHECK_LABEL, class: ROW_MB do |b| b.use :html5 b.optional :readonly - b.use :label, class: "col-sm-3 col-form-label pt-0" - b.wrapper :grid_wrapper, tag: "div", class: COL_SM do |ba| - ba.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, - valid_class: IS_VALID - ba.use :full_error, - wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - ba.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :label, class: COL_FORM_LABEL_SM_PT + b.wrapper :grid_wrapper, class: COL_SM do |ba| + ba.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, valid_class: IS_VALID + ba.use :full_error, wrap_with: { class: INVALID_FEEDBACK_BLOCK } + ba.use :hint, wrap_with: { class: FORM_TEXT } end end # horizontal input for inline radio buttons and check boxes - config.wrappers :horizontal_collection_inline, - item_wrapper_class: "form-check form-check-inline", - item_label_class: FORM_CHECK_LABEL, tag: "div", - class: FORM_GROUP_ROW, error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :horizontal_collection_inline, item_wrapper_class: "form-check form-check-inline", item_label_class: FORM_CHECK_LABEL, class: ROW_MB do |b| b.use :html5 b.optional :readonly - b.use :label, class: "col-sm-3 col-form-label pt-0" - b.wrapper :grid_wrapper, tag: "div", class: COL_SM do |ba| - ba.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, - valid_class: IS_VALID - ba.use :full_error, - wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - ba.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :label, class: COL_FORM_LABEL_SM_PT + b.wrapper :grid_wrapper, class: COL_SM do |ba| + ba.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, valid_class: IS_VALID + ba.use :full_error, wrap_with: { class: INVALID_FEEDBACK_BLOCK } + ba.use :hint, wrap_with: { class: FORM_TEXT } end end # horizontal file input - config.wrappers :horizontal_file, tag: "div", class: FORM_GROUP_ROW, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :horizontal_file, class: ROW_MB do |b| b.use :html5 b.use :placeholder b.optional :maxlength b.optional :minlength b.optional :readonly b.use :label, class: COL_FORM_LABEL_SM - b.wrapper :grid_wrapper, tag: "div", class: COL_SM do |ba| - ba.use :input, error_class: IS_INVALID, valid_class: IS_VALID - ba.use :full_error, - wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - ba.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.wrapper :grid_wrapper, class: COL_SM do |ba| + ba.use :input, class: FORM_CONTROL, error_class: IS_INVALID, valid_class: IS_VALID + ba.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + ba.use :hint, wrap_with: { class: FORM_TEXT } + end + end + + # horizontal select input + config.wrappers :horizontal_select, class: ROW_MB do |b| + b.use :html5 + b.optional :readonly + b.use :label, class: COL_FORM_LABEL_SM + b.wrapper :grid_wrapper, class: COL_SM do |ba| + ba.use :input, class: FORM_SELECT, error_class: IS_INVALID, valid_class: IS_VALID + ba.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + ba.use :hint, wrap_with: { class: FORM_TEXT } end end # horizontal multi select - config.wrappers :horizontal_multi_select, tag: "div", class: FORM_GROUP_ROW, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :horizontal_multi_select, class: ROW_MB do |b| b.use :html5 b.optional :readonly b.use :label, class: COL_FORM_LABEL_SM - b.wrapper :grid_wrapper, tag: "div", class: COL_SM do |ba| - ba.wrapper tag: "div", class: FLEX do |bb| - bb.use :input, class: "form-control mx-1", error_class: IS_INVALID, - valid_class: IS_VALID + b.wrapper :grid_wrapper, class: COL_SM do |ba| + ba.wrapper class: FLEX do |bb| + bb.use :input, class: "form-select mx-1", error_class: IS_INVALID, valid_class: IS_VALID end - ba.use :full_error, - wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - ba.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + ba.use :full_error, wrap_with: { class: INVALID_FEEDBACK_BLOCK } + ba.use :hint, wrap_with: { class: FORM_TEXT } end end # horizontal range input - config.wrappers :horizontal_range, tag: "div", class: FORM_GROUP_ROW, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :horizontal_range, class: ROW_MB do |b| b.use :html5 b.use :placeholder b.optional :readonly b.optional :step - b.use :label, class: COL_FORM_LABEL_SM - b.wrapper :grid_wrapper, tag: "div", class: COL_SM do |ba| - ba.use :input, class: "form-control-range", error_class: IS_INVALID, - valid_class: IS_VALID - ba.use :full_error, - wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - ba.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :label, class: COL_FORM_LABEL_SM_PT + b.wrapper :grid_wrapper, class: COL_SM do |ba| + ba.use :input, class: "form-range", error_class: IS_INVALID, valid_class: IS_VALID + ba.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + ba.use :hint, wrap_with: { class: FORM_TEXT } end end # inline forms # # inline default_wrapper - config.wrappers :inline_form, tag: "span", error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :inline_form, class: "col-12" do |b| b.use :html5 b.use :placeholder b.optional :maxlength @@ -327,207 +287,113 @@ b.optional :pattern b.optional :min_max b.optional :readonly - b.use :label, class: "sr-only" + b.use :label, class: "visually-hidden" - b.use :input, class: FORM_CONTROL, error_class: IS_INVALID, - valid_class: IS_VALID - b.use :error, wrap_with: { tag: "div", class: INVALID_FEEDBACK } - b.optional :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :input, class: FORM_CONTROL, error_class: IS_INVALID, valid_class: IS_VALID + b.use :error, wrap_with: { class: INVALID_FEEDBACK } + b.optional :hint, wrap_with: { class: FORM_TEXT } end # inline input for boolean - config.wrappers :inline_boolean, tag: "span", - class: "form-check mb-2 mr-sm-2", - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :inline_boolean, class: "col-12" do |b| b.use :html5 b.optional :readonly - b.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, - valid_class: IS_VALID - b.use :label, class: FORM_CHECK_LABEL - b.use :error, wrap_with: { tag: "div", class: INVALID_FEEDBACK } - b.optional :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.wrapper :form_check_wrapper, class: FORM_CHECK do |bb| + bb.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, valid_class: IS_VALID + bb.use :label, class: FORM_CHECK_LABEL + bb.use :error, wrap_with: { class: INVALID_FEEDBACK } + bb.optional :hint, wrap_with: { class: FORM_TEXT } + end end # bootstrap custom forms # - # custom input for boolean - config.wrappers :custom_boolean, tag: "fieldset", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| - b.use :html5 - b.optional :readonly - b.wrapper :form_check_wrapper, - tag: "div", class: "custom-control custom-checkbox" do |bb| - bb.use :input, class: CUSTOM_CONTROL_INPUT, error_class: IS_INVALID, - valid_class: IS_VALID - bb.use :label, class: CUSTOM_CONTROL_LABEL - bb.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK } - bb.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } - end - end - # custom input switch for boolean - config.wrappers :custom_boolean_switch, tag: "fieldset", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :custom_boolean_switch, class: MB do |b| b.use :html5 b.optional :readonly - b.wrapper :form_check_wrapper, tag: "div", - class: "custom-control custom-switch" do |bb| - bb.use :input, class: CUSTOM_CONTROL_INPUT, error_class: IS_INVALID, - valid_class: IS_VALID - bb.use :label, class: CUSTOM_CONTROL_LABEL + b.wrapper :form_check_wrapper, tag: "div", class: "form-check form-switch" do |bb| + bb.use :input, class: FORM_CHECK_INPUT, error_class: IS_INVALID, valid_class: IS_VALID + bb.use :label, class: FORM_CHECK_LABEL bb.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK } - bb.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } - end - end - - # custom input for radio buttons and check boxes - config.wrappers :custom_collection, item_wrapper_class: "custom-control", - item_label_class: CUSTOM_CONTROL_LABEL, - tag: "fieldset", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| - b.use :html5 - b.optional :readonly - b.wrapper :legend_tag, tag: "legend", class: COL_FORM_LABEL do |ba| - ba.use :label_text + bb.use :hint, wrap_with: { class: FORM_TEXT } end - b.use :input, class: CUSTOM_CONTROL_INPUT, error_class: IS_INVALID, - valid_class: IS_VALID - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } end - # custom input for inline radio buttons and check boxes - config.wrappers :custom_collection_inline, - item_wrapper_class: "custom-control custom-control-inline", - item_label_class: CUSTOM_CONTROL_LABEL, tag: "fieldset", - class: FORM_GROUP, error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + # Input Group - custom component + # see example app and config at https://github.com/heartcombo/simple_form-bootstrap + config.wrappers :input_group, class: MB do |b| b.use :html5 + b.use :placeholder + b.optional :maxlength + b.optional :minlength + b.optional :pattern + b.optional :min_max b.optional :readonly - b.wrapper :legend_tag, tag: "legend", class: COL_FORM_LABEL do |ba| - ba.use :label_text + b.use :label, class: FORM_LABEL + b.wrapper :input_group_tag, class: "input-group" do |ba| + ba.optional :prepend + ba.use :input, class: FORM_CONTROL, error_class: IS_INVALID, valid_class: IS_VALID + ba.optional :append + ba.use :full_error, wrap_with: { class: INVALID_FEEDBACK } end - b.use :input, class: CUSTOM_CONTROL_INPUT, error_class: IS_INVALID, - valid_class: IS_VALID - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :hint, wrap_with: { class: FORM_TEXT } end - # custom file input - config.wrappers :custom_file, tag: "div", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + # Floating Labels form + # + # floating labels default_wrapper + config.wrappers :floating_labels_form, class: "form-floating mb-3" do |b| b.use :html5 b.use :placeholder b.optional :maxlength b.optional :minlength + b.optional :pattern + b.optional :min_max b.optional :readonly + b.use :input, class: FORM_CONTROL, error_class: IS_INVALID, valid_class: IS_VALID b.use :label - b.wrapper :custom_file_wrapper, tag: "div", class: "custom-file" do |ba| - ba.use :input, class: "custom-file-input", error_class: IS_INVALID, - valid_class: IS_VALID - ba.use :label, class: "custom-file-label" - ba.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK } - end - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + b.use :hint, wrap_with: { class: FORM_TEXT } end # custom multi select - config.wrappers :custom_multi_select, tag: "div", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + config.wrappers :floating_labels_select, class: "form-floating mb-3" do |b| b.use :html5 b.optional :readonly + b.use :input, class: FORM_SELECT, error_class: IS_INVALID, valid_class: IS_VALID b.use :label - b.wrapper tag: "div", class: FLEX do |ba| - ba.use :input, class: "custom-select mx-1", error_class: IS_INVALID, - valid_class: IS_VALID - end - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + b.use :hint, wrap_with: { class: FORM_TEXT } end - # custom range input - config.wrappers :custom_range, tag: "div", class: FORM_GROUP, - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + # custom vertical select + config.wrappers :custom_vertical_select, class: MB do |b| b.use :html5 - b.use :placeholder b.optional :readonly - b.optional :step - b.use :label - b.use :input, class: "custom-range", error_class: IS_INVALID, - valid_class: IS_VALID - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK_BLOCK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :label, class: FORM_LABEL_BLOCK + b.use :input + b.use :full_error, wrap_with: { class: INVALID_FEEDBACK_BLOCK } end - # Input Group - custom component - # see example app and config at https://github.com/rafaelfranca/simple_form-bootstrap - # config.wrappers :input_group, tag: 'div', class: FORM_GROUP, error_class: - # FORM_GROUP_INVALID, valid_class: FORM_GROUP_VALID do |b| - # b.use :html5 - # b.use :placeholder - # b.optional :maxlength - # b.optional :minlength - # b.optional :pattern - # b.optional :min_max - # b.optional :readonly - # b.use :label - # b.wrapper :input_group_tag, tag: 'div', class: 'input-group' do |ba| - # ba.optional :prepend - # ba.use :input, class: FORM_CONTROL, error_class: IS_INVALID, - # valid_class: IS_VALID - # ba.optional :append - # end - # b.use :full_error, wrap_with: { tag: 'div', class: INVALID_FEEDBACK_BLOCK} - # b.use :hint, wrap_with: { tag: 'small', class: FORM_TEXT } - # end - - # Floating Labels form - # - # floating labels default_wrapper - config.wrappers :floating_labels_form, tag: "div", class: "form-label-group", - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| + # custom vertical file input + config.wrappers :custom_vertical_file, class: MB do |b| b.use :html5 b.use :placeholder b.optional :maxlength b.optional :minlength - b.optional :pattern - b.optional :min_max b.optional :readonly - b.use :input, class: FORM_CONTROL, error_class: IS_INVALID, - valid_class: IS_VALID - b.use :label - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } - end - - # custom multi select - config.wrappers :floating_labels_select, tag: "div", - class: "form-label-group", - error_class: FORM_GROUP_INVALID, - valid_class: FORM_GROUP_VALID do |b| - b.use :html5 - b.optional :readonly - b.use :input, class: "custom-select", error_class: IS_INVALID, - valid_class: IS_VALID - b.use :label - b.use :full_error, wrap_with: { tag: "div", class: INVALID_FEEDBACK } - b.use :hint, wrap_with: { tag: "small", class: FORM_TEXT } + b.use :label, class: FORM_LABEL_BLOCK + b.use :input, error_class: IS_INVALID, valid_class: IS_VALID + b.use :full_error, wrap_with: { class: INVALID_FEEDBACK } + b.use :hint, wrap_with: { class: FORM_TEXT } end # The default wrapper to be used by the FormBuilder. config.default_wrapper = :vertical_form # Custom wrappers for input types. This should be a hash containing an input - # type as key and the wrapper that will be used for all inputs with specified - # type. + # type as key and the wrapper that will be used for all inputs with specified type. config.wrapper_mappings = { boolean: :vertical_boolean, check_boxes: :vertical_collection, @@ -536,18 +402,7 @@ file: :vertical_file, radio_buttons: :vertical_collection, range: :vertical_range, - time: :vertical_multi_select + time: :vertical_multi_select, + select: :vertical_select } - - # enable custom form wrappers - # config.wrapper_mappings = { - # boolean: :custom_boolean, - # check_boxes: :custom_collection, - # date: :custom_multi_select, - # datetime: :custom_multi_select, - # file: :custom_file, - # radio_buttons: :custom_collection, - # range: :custom_range, - # time: :custom_multi_select - # } end diff --git a/config/locales/en/active_storage.yml b/config/locales/en/active_storage.yml index ecc172849..6101d4d62 100644 --- a/config/locales/en/active_storage.yml +++ b/config/locales/en/active_storage.yml @@ -1,21 +1,21 @@ en: errors: messages: - content_type_invalid: "has not allowed to upload %{content_type} files, allowed types: %{authorized_types}" - file_size_out_of_range: "has size %{file_size} that is not between required range" + content_type_invalid: "Only .PNG and .ICO file formats are allowed" + file_size_out_of_range: "file size must be less than or equal to 1 KB" limit_out_of_range: "total number is out of range" image_metadata_missing: "is not a valid image" - dimension_min_inclusion: "must be greater than or equal to %{width} x %{height} pixel." - dimension_max_inclusion: "must be less than or equal to %{width} x %{height} pixel." - dimension_width_inclusion: "width is not included between %{min} and %{max} pixel." - dimension_height_inclusion: "height is not included between %{min} and %{max} pixel." - dimension_width_greater_than_or_equal_to: "width must be greater than or equal to %{length} pixel." - dimension_height_greater_than_or_equal_to: "height must be greater than or equal to %{length} pixel." - dimension_width_less_than_or_equal_to: "width must be less than or equal to %{length} pixel." - dimension_height_less_than_or_equal_to: "height must be less than or equal to %{length} pixel." - dimension_width_equal_to: "width must be equal to %{length} pixel." - dimension_height_equal_to: "height must be equal to %{length} pixel." - aspect_ratio_not_square: "must be a square image" + dimension_min_inclusion: "must be greater than or equal to %{width} x %{height} pixel" + dimension_max_inclusion: "must be less than or equal to %{width} x %{height} pixel" + dimension_width_inclusion: "width is not included between %{min} and %{max} pixel" + dimension_height_inclusion: "height is not included between %{min} and %{max} pixel" + dimension_width_greater_than_or_equal_to: "width must be greater than or equal to %{length} pixel" + dimension_height_greater_than_or_equal_to: "height must be greater than or equal to %{length} pixel" + dimension_width_less_than_or_equal_to: "width must be less than or equal to %{length} pixel" + dimension_height_less_than_or_equal_to: "height must be less than or equal to %{length} pixel" + dimension_width_equal_to: "width must be equal to %{length} pixel" + dimension_height_equal_to: "height must be equal to %{length} pixel" + aspect_ratio_not_square: "resolution must be a multiple of square (for example: 16x16px)" aspect_ratio_not_portrait: "must be a portrait image" aspect_ratio_not_landscape: "must be a landscape image" aspect_ratio_is_not: "must have an aspect ratio of %{aspect_ratio}" diff --git a/config/locales/en/devise.en.yml b/config/locales/en/devise.en.yml index 7fa7912c8..b04e334de 100644 --- a/config/locales/en/devise.en.yml +++ b/config/locales/en/devise.en.yml @@ -4,63 +4,71 @@ en: # uk: "Українська" devise: confirmations: - confirmed: "Your email address has been successfully confirmed." - send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes." - send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes." + confirmed: "Your email address has been successfully confirmed" + send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes" + send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes" failure: - already_authenticated: "You are already signed in." - inactive: "Your account is not activated yet." - invalid: "Invalid %{authentication_keys} or password." - locked: "Your account is locked." - last_attempt: "You have one more attempt before your account is locked." - not_found_in_database: "Invalid %{authentication_keys} or password." - timeout: "Your session expired. Please sign in again to continue." - unauthenticated: "You need to sign in or sign up before continuing." - unconfirmed: "You have to confirm your email address before continuing." + already_authenticated: "You have been signed in already" + inactive: "Your account has not been activated yet" + invalid: "Invalid %{authentication_keys} or password" + invalid_token: "Invalid email or password" + locked: "Your account is locked" + last_attempt: "You have one more attempt before your account is locked" + not_found_in_database: "Invalid %{authentication_keys} or password" + timeout: "Your session time has expired. Please sign in again to continue" + unauthenticated: "You need to sign in or sign up before continuing" + unconfirmed: "You have to confirm your email address before continuing" mailer: confirmation_instructions: - subject: "Confirmation instructions" + subject: "Account confirmation instructions" reset_password_instructions: subject: "Reset password instructions" unlock_instructions: - subject: "Unlock instructions" + subject: "Account unlock instructions" email_changed: subject: "Email Changed" password_change: subject: "Password Changed" omniauth_callbacks: - failure: "Could not authenticate you from %{kind} because \"%{reason}\"." - success: "Successfully authenticated from %{kind} account." + continue_with: "Or continue with" + failure: "Could not authenticate you from %{kind} because \"%{reason}\"" + success: "Successfully authenticated from %{kind} account" passwords: - no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided." - send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes." - send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." - updated: "Your password has been changed successfully. You are now signed in." - updated_not_active: "Your password has been changed successfully." + format: "Invalid format - must be at least 8 characters long, including one uppercase letter, one lowercase letter and a number" + no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided" + send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes" + send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes" + updated: "Your password has been changed successfully. You are signed in now" + updated_not_active: "Your password has been changed successfully" registrations: - destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon." - signed_up: "Welcome! You have signed up successfully." - signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated." - signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked." - signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account." - update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirmation link to confirm your new email address." - updated: "Your account has been updated successfully." + destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon" + signed_up: "Welcome! You have signed up successfully" + signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated" + signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked" + signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account" + update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirmation link to confirm your new email address" + updated: "Your account has been updated successfully" updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again" sessions: - signed_in: "Signed in successfully." - signed_out: "Signed out successfully." - already_signed_out: "Signed out successfully." + signed_in: "Signed in successfully" + signed_out: "Signed out successfully" + already_signed_out: "Signed out successfully" unlocks: - send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes." - send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes." - unlocked: "Your account has been unlocked successfully. Please sign in to continue." + send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes" + send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes" + unlocked: "Your account has been unlocked successfully. Please sign in to continue" errors: messages: - already_confirmed: "was already confirmed, please try signing in" + already_confirmed: "was already confirmed. Please try signing in" confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one" expired: "has expired, please request a new one" not_found: "not found" not_locked: "was not locked" not_saved: one: "1 error prohibited this %{resource} from being saved:" + few: "%{count} errors prohibited this %{resource} from being saved:" + many: "%{count} errors prohibited this %{resource} from being saved:" other: "%{count} errors prohibited this %{resource} from being saved:" + wrong_email: "Your login is incorrect" + wrong_password: "Your password is incorrect" + only_letters: "Only letters" diff --git a/config/locales/en/en.yml b/config/locales/en/en.yml index 1da2080e1..90f476e0e 100644 --- a/config/locales/en/en.yml +++ b/config/locales/en/en.yml @@ -31,72 +31,154 @@ en: uk: "Українська" + buttons: + save: "Save" + update: "Update" + create: "Create" + cancel: "Cancel" + revert: "Revert" + back: "Back" + views: + pagination: + previous: "‹ Prev" + next: "Next ›" + truncate: "…" calculators: - calculator: - diaper: "diaper" - form_description: "Child’s age:" - form_price: "Price category" + index: + meta-title: "Calculators" + new_calculator: + diaper_сalculator: "Diaper calculator" form: - childs_birthday_label: "Child's birthday" - childs_age_label: "Child`s age" - childs_years_label: "years" - childs_months_label: "months" - baby_weight_label: "Baby weight" + description: "Child’s age:" + price: "Price category" + childs_years_label: "y/o." + childs_months_label: "mth." budgetary: "budgetary" medium: "medium" premium: "premium" - calculate_result_button: "Calculate" - want_recomentation_label: "Yes, I want to receive email messages with recommendations" + bought_diapers: "already used" + will_buy_diapers: "to be used in the future" + money_spent: "already spent on diapers" + money_will_be_spent: "yet to be spent on diapers" + pieces: "pcs." + unit: "uah" + old_calculator: + form: + description: "Child’s age:" + years_prompt: "years" + months_prompt: "months" bought_diapers: "diapers already used" - will_buy_diapers: "diapers to be used in the future" money_spent: "UAH already spent on diapers" + will_buy_diapers: "diapers to be used in the future" money_will_be_spent: "UAH yet to be spent on diapers" - mililiters_of_naphtha: "Mililiters of Naphtha" - gram_of_plastic: "Gram of Plastic" + errors: + year_and_month_error_msg: "Please, select years and months" + year_error_msg: "Please, select years" + month_error_msg: "Please, select month" show: welcome_header: "Welcome to ZeroWaste" + buttons: + to_main: "To main" + calculate: "Calculate" + index: + meta-title: "Calculators" + id_column: "ID Column" + calculator_name: "Calculator Name" + calculator_actions: "Calculator Actions" + date: + months: + one: "%{count} month" + few: "%{count} months" + many: "%{count} months" + other: "%{count} months" + years: + one: "%{count} year" + few: "%{count} years" + many: "%{count} years" + other: "%{count} years" layouts: navigation: + about_us: "About us" admin: "Admin" + calculate: "Diaper calculator" log_out: "Log Out" sign_up: "Sign Up" log_in: "Log In" - сontact_us: "Contact us" + contact_us: "Contact us" contacts: "%{contacts:Contacts}" local_lang: "Українська" description_block: - description_block_html: "These are approximate results. The exact numbers for your - family may differ depending on your daily habits and the diaper brand of choice. At any point of using - diapers there is a way to reduce the number of diapers used. You are welcome to learn more about how - this can be done and what reusable alternatives to disposable diapers there are. You can also learn - more about %{calculate_link_one:how we calculate} the number and cost of diapers - or %{calculate_link_two:contact us} with any other questions you may have." + description_block_html: + "These are approximate results. The exact numbers for your + family may differ depending on your daily habits and the diaper brand of choice. At any point of using + diapers there is a way to reduce the number of diapers used. You are welcome to learn more about how + this can be done and what reusable alternatives to disposable diapers there are. You can also learn + more about %{calculate_link_one:how we calculate} the number and cost of diapers + or %{calculate_link_two:contact us} with any other questions you may have." description_button: use_less: "%{use_less_link:HOW TO USE LESS}" homepage: homepage_title: "Welcome to the diaper calculator" - description: "The calculator tells you how many disposable diapers your baby has already used and will use in the future before switching to regular underwear. And also how much money you have already spent on diapers and how much money you have yet to spend." + description: + "The calculator tells you how many disposable diapers your baby has already used and will use in the future before + switching to regular underwear. And also how much money you have already spent on diapers and how much money you have yet to spend." calculate: "Let's go" - visit_website: "Visit WebSite" + visit_website: "Visit website" account_navbar: + homepage: "Home page" calculators: "Calculators" histories: "History" users: "Users" messages: "Messages" - app_config: "App Config" site_settings: "Site Settings" - categories: 'Categories' + categories: "Categories" + products: "Products" + zerowaste_logo: "ZeroWaste logo" + account_footer: + created_with: "Created with" + by: "by" + mailer: + welcome_mail: + subject: "Welcome to ZeroWaste!" + user_mailer: + welcome_email: + greeting: "Welcome to ZeroWaste, %{name}" + login_info: "You have successfully signed up to zerowaste.com, your login info is" + email: "Email: %{email}" + password: "Password: %{password}" + to_login: "To login to the site, just follow this link" + thanks: "Thanks for joining and have a great day!" messages: new: + meta-title: "Contact Us" contact_us_header: "Contact us" email: "Email" message: "Message" title: "Title" send: "Send" - title_hint: "title (min 5 characters)" + title_hint: "Title (min 5 characters)" message_hint: "Your message (min 20 characters)" company_address: "Company address" about_us: "About us" + sitemap: + index: + sitemap: "Sitemap" + homepage: "Home page" + about_us: "About us" + calculator-diapers: "Calculator diapers" + calculators: "Calculators" + message: "Write us a message" + about_us: + title: "About Us" + description: + first_paragraph: "We work in many directions for the sake of a clean future and sustainable development of our city and country." + second_paragraph: "Zero Waste encourages us to use resources rationally and consciously." + third_paragraph: "The main goal of zero waste is to move to a circular economy, where there is no garbage as such, and what is called garbage becomes a valuable resource." + our_team: + title: "Our Team" + description: + "Zero Waste Lviv and SoftServe present a calculator - an online tool for calculating the number of disposable and reusable items used. + The calculator was developed as part of the charity crowdsourcing platform Open Tech. The technical development is carried out by students of SoftServe Academy." account: account: edit: @@ -104,21 +186,11 @@ en: new_password_label: "New password:" confirm_password_label: "Confirm new password:" change_password_button: "Change password" - app_configs: - edit: - diapers_calculator_config: "Diapers calculator configuration" - first_period: "First period" - second_period: "Second period" - third_period: "Third period" - fourth_period: "Fourth period" - fifth_period: "Fifth period" - sixth_period: "Sixth period" - seventh_period: "Seventh period" - amount: "Amount" - price: "Price" - update: "Update" messages: index: + meta-title: "Messages" + search_placeholder: "Search" + search_button: "Search" table: title: "Title" email: "Email" @@ -133,29 +205,83 @@ en: time_col: "Date" categories: index: - add_category_button: 'Add category' - confirm_delete: 'Delete category?' - cancel_button: 'Cancel' + meta-title: "Categories" + search_placeholder: "Search" + search_button: "Search" + table: + title: "Title" + actions: "Actions" + priority: "Priority" + edit: "Edit" + delete: "Delete" + add_category_button: "Add category" + confirm_delete: "Delete category?" + cannot_delete: "You cannot delete preferable category." edit: - update_button: 'Update' - cancel_button: 'Cancel' + form: + update_category_button: "Update category" new: - create_button: 'Create' - cancel_button: 'Cancel' - site_settings: - validations: - size: 'is too large' - edit: - update_button: 'Update' + form: + create_category_button: "Create category" + products: + index: + meta-title: "Products" + table: + title: "Title" + prices: "Prices" + actions: "Actions" + edit: "Edit" + delete: "Delete" + add_product_button: "Add product" + confirm_delete: "Delete product?" + show: + table: + title: "Title" + prices: "Prices" + actions: "Actions" + confirm_delete: "Delete product?" + partials: + new: + form: + title: "Title" + form: + sum: "Sum" + create_product_button: "Create product" + edit: + form: + title: "Title" + form: + sum: "Sum" + update_product_button: "Update product" + created: "A product was successfully created" + updated: "A product was successfully updated" + deleted: "A product was successfully deleted" users: index: + meta-title: "Users" main_header: "Dashboard" + add_user_button: "Add user" + confirm_block: "Are you sure you want to block this user?" + confirm_unblock: "Are you sure you want to unblock this user?" + confirm_delete: "Are you sure you want to delete this user?" table: email_col: "Email" + first_name: "First name" + last_name: "Last name" last_visit_col: "Last visit" - view_info_col: "Show" + show: "Show" edit: "Edit" ban: "Ban" + delete: "Delete" + new: + table: + create_new_user: "Create new user" + form: + first_name_label: "First name" + last_name_label: "Last name" + password_hint: "Minimum 8 characters" + create_user_button: "Create user" + send_credentials_email: "Send email with credentials" edit: avatar: "User profile photo" table: @@ -164,7 +290,7 @@ en: name_label: "Name" surname_label: "Surname" password_hint: "Leave blank if you don't want to change it" - avatar_hint: "Avatar must be less than 2 MB. Allowed file types: PNG,JPG and JPEG" + avatar_hint: "Avatar must be less than 2 MB. Allowed file types: PNG, JPG and JPEG" update_user_button: "Update user" show: header: "User information" @@ -179,10 +305,110 @@ en: ban_col: "Status" blocked_label: "Blocked" unblocked_label: "Unblocked" + button: "Back" calculators: index: - search_placeholder: "Search" - search_button: "Search" + meta-title: "Calculators" + add_calculator_button: "Add calculator" + confirm_delete: "Are you sure you want to delete calculator?" + table: + calculator_slug: "Slug" + calculator_name: "Name" + calculator_actions: "Actions" + show: "Show" + edit: "Edit" + delete: "Delete" + edit: + add_new_field_label: "Add new field" + form: + select_field_kind_label: "Select field kind" + select_field_type_label: "Select field type" + form_label: "Form" + parameters_label: "Parameters" + results_label: "Results" + no_fields_yet_label: "No fields yet" + update_calculator_button: "Update calculator" + new: + create_calculator_button: "Create calculator" + cancel_button: "Сancel" + prohibited_to_update: " prevent the calculator from updating" + prohibited_to_save: " перешкоджають збереженню калькулятора" + error: "помилки" + site_settings: + edit: + meta-title: "Site Settings" + site_settings: "Site settings" + site_features: "Site features" + dev_features: "Development features" + rails_db_description: "Access to database (read only)" + apply_button: "Save" + confirm_default: "Are you sure you want to revert the title and favicon to their default settings?" + diapers_periods: + partials: + edit: + form: + edit_name: "Edit Diapers Period" + period_start: "Period Start" + period_end: "Period End" + usage_amount: "Usage Amount" + price: "Price" + back_button: "Back" + cannot_edit_period: "You can't edit the start and end of the period" + index: + delete_button: + confirm_delete: "Are you sure you want to delete this period?" + cannot_delete_category: "You can't delete periods in preferable category." + cannot_delete_period: "You can only delete the last period." + add_new_link: + add_new: "Add New Period" + content: + periods_for: "Diapers Periods for category:" + confirm_delete: "Are you sure you want to delete this period?" + period_start: "Period Start" + period_end: "Period End" + usage_amount: "Usage Amount" + price: "Price" + table: + edit: "Edit" + delete: "Delete" + add_new: "Add New Period" + back_button: "Back" + warning: "This category isn't showing in Calculator, because it doesn't cover all periods. Please, add new periods, so the category covers 30 months." + cannot_delete: "You can't delete periods in preferable category." + new: + form: + new_period: "New Diapers Period for Category:" + period_start: "Period Start" + period_end: "Period End" + usage_amount: "Usage Amount" + price: "Price" + back_button: "Back" + cannot_edit_start_period: "You can't edit the start of the period" + categories: + partials: + available: + content: + available: "Select category:" + no_categories_available: "No Available categories. Create new Category." + category_name: "Category name" + confirm_delete: "Are you sure you want to delete all periods?" + back_button: "Back" + table: + add: "Add" + with_periods: + content: + category_name: "Category name" + confirm_delete: "Are you sure you want to delete all periods?" + table: + show: "Show" + delete: "Delete" + no_categories: "No diapers categories found. Add some from Available list." + add_button: "Add New" + tooltip: "This category isn't shown in Calculator, because it doesn't have all periods covered." + cannot_delete_category: "You can't delete periods in preferable category." + calculators: + index: + meta-title: "Calculators" add_calculator_button: "Add calculator" confirm_delete: "Are you sure you want to delete calculator?" table: @@ -194,51 +420,56 @@ en: form: select_field_kind_label: "Select field kind" select_field_type_label: "Select field type" - create_button: "Create" form_label: "Form" parameters_label: "Parameters" results_label: "Results" no_fields_yet_label: "No fields yet" update_calculator_button: "Update calculator" - cancel_button: "Cancel" new: create_calculator_button: "Create calculator" - cancel_button: "Cancel" + feature_flags: + submit_button: "Save" + new_calculator_design: + name: "Enable new calculator design" + show_calculators_list: + name: "Show calculators on the public side" + sandbox_mode: + name: "Enable sandbox mode" sessions: new: - log_in_header: "Log in" - log_in_button: "Log in" + log_in_header: "Log In" + log_in_button: "Log In" form: email: "Email" password: "Password" shared: links: forgot_your_password: "Forgot your password?" - log_in: "Log in" + log_in: "Log In" confirmations: new: resend_confirmation_instructions_header: "Resend confirmation instructions" resend_confirmation_instructions_button: "Resend confirmation instructions" mailer: confirmation_instructions: - greetings_to_user: Welcome, %{recipient}! + greetings_to_user: "Welcome, %{recipient}!" confirmation_email_through_link: "You can confirm your account email through the link below:" confirmation_account_link: "Confirm my account" email_changed: - greeting: Hello %{recipient}! - message_confirmed: We're contacting you to notify you that your email has been changed to %{email}. - message_unconfirmed: We're contacting you to notify you that your email is being changed to %{email}. + greeting: "Hello, %{recipient}!" + message_confirmed: "We're contacting you to notify you that your email has been changed to %{email}." + message_unconfirmed: "We're contacting you to notify you that your email is being changed to %{email}." password_change: - greeting: Hello %{recipient}! + greeting: "Hello, %{recipient}!" successful_change: "We're contacting you to notify you that your password has been changed." reset_password_instructions: - greeting: Hello %{recipient}! + greeting: "Hello, %{recipient}!" change_password_link: "Change my password" request_change_password: "Someone has requested a link to change your password. You can do this through the link below." ignore_email: "If you didn't request this, please ignore this email." access_to_changing: "Your password won't change until you access the link above and create a new one." unlock_instructions: - greeting: Hello %{recipient}! + greeting: "Hello, %{recipient}!" locked_message: "Your account has been locked due to an excessive number of unsuccessful sign in attempts." unlock_your_account: "Click the link below to unlock your account:" unlock_link: "Unlock my account" @@ -263,6 +494,7 @@ en: email_label: "Email" histories: index: + meta-title: "History" history_title: "History" back_link: "Back" table: @@ -276,7 +508,10 @@ en: passwords: new: forgot_password_header: "Forgot your password?" - send_instructions_button: "Send me reset password instructions" + forgot_password_message: "Enter your email address and we'll send you reset instructions." + email_placeholder: "Enter your email" + send_instructions_button: "Reset" + back_to: "Back to" form: email_label: "Email" edit: @@ -288,31 +523,35 @@ en: change_password_button: "Change my password" sessions: new: - log_in: "Log in" + meta-title: "Log In" + log_in: "Log In" + email_placeholder: "Enter your email" + password_placeholder: "Enter your password" shared: links: forgot_your_password: "Forgot your password?" - log_in: "Log in" - sign_up: "Sign up" + log_in: "Log In" + sign_up: "Sign Up" sign_in_with: "Sign in with %{provider}" google_sign_in: "Sign in with Google" registrations: new: + meta-title: "Sign Up" sign_up_header: "Sign Up" form: email_label: "Email" password_label: "Password" - password_characters_minimum_label: "Characters Minimum" - password_confirmation_label: "Password Confirmation" - first_name_label: "First Name" - last_name_label: "Last Name" + password_characters_minimum_label: "Characters minimum" + password_confirmation_label: "Password confirmation" + first_name_label: "First name" + last_name_label: "Last name" sign_up_button: "Sign Up" password_hint: "Minimum 8 characters" edit: update_user_button: "Update information" current_password_label: "Current password:" confirm_password_label: "Confirm new password:" - change_password_button: "Змінити пароль" + change_password_button: "Change my password" delete_account_label: "Delete my profile" are_user_satisfied_question: "Unhappy?" delete_account_button: "Delete profile" @@ -325,69 +564,82 @@ en: timeout: "Your session expired. Please sign in again to continue" models: calculator: "Calculator" + category: "Category" activerecord: errors: models: field: attributes: type: - blank: " can't be blank" + blank: "can't be blank" label: - blank: " can't be blank" + blank: "can't be blank" kind: - blank: " can't be blank" + blank: "can't be blank" named_value: attributes: name: - too_short: " is too short" + too_short: "is too short" from: - not_an_integer: " must be an integer" - not_a_number: " must be an integer" + not_an_integer: "must be an integer" + not_a_number: "must be an integer" to: - not_an_integer: " must be an integer" - not_a_number: " must be an integer" + not_an_integer: "must be an integer" + not_a_number: "must be an integer" range_field: attributes: from: - not_an_integer: " must be an integer" - not_a_number: " must be an integer" + not_an_integer: "must be an integer" + not_a_number: "must be an integer" to: - not_an_integer: " must be an integer" - not_a_number: " must be an integer" + not_an_integer: "must be an integer" + not_a_number: "must be an integer" value: - too_short: " is too short" + too_short: "is too short" calculation: attributes: value: - too_short: " is too short" + too_short: "is too short" select: attributes: value: - too_short: " is too short" + too_short: "is too short" value: attributes: value: - too_short: " is too short" - invalid: " is invalid" + too_short: "is too short" + invalid: "contains invalid characters" product_type: attributes: title: - blank: "The field 'Title' can't be blank." - too_short: "The field 'Title' is too short." + blank: "The field 'Title' can't be blank" + too_short: "The field 'Title' is too short" invalid: "Invalid value for the field 'Title'" calculator: attributes: name: - blank: " can't be blank" - too_short: " is too short" - invalid: " is invalid" - name_format_validation: must contain only letters or numbers + blank: "can't be blank" + too_short: "is too short (minimum is 2 characters)" + too_long: "is too long (maximum is %{count} characters)" + invalid: "contains invalid characters" + taken: "has already been taken, please choose another one" + category: + attributes: + name: + invalid: "contains invalid characters" + taken: "has already been taken, please choose another one" product: attributes: title: - blank: "The field 'Title' can't be blank" - too_long: "The field 'Title' is too long" - too_short: "The field 'Title' is too short." + blank: "can't be blank" + too_long: "is too long (maximum %{count} symbols)" + too_short: "is too short (minimum %{count} symbols)" + taken: "has already been taken, please choose another one" + invalid: "contains invalid characters" + price: + attributes: + sum: + less_than: "is too long" form_errors: one: "One error prohibited %{model} from being saved" other: "%{count} errors prohibited this %{model} from being saved" @@ -399,171 +651,195 @@ en: first_name: "First name" last_name: "Last name" country: "Country" + role: "Role" + remember_me: "Remember me" successful_update: "User info was successfully updated!" admin: remember_me: "Remember me" + site_setting: + title: "Title" + diapers_period: + price: "Price" + period_start: "Period Start" + period_end: "Period End" + usage_amount: "Usage Amount" calculator: name: "Name" slug: "Slug" preferable: "Preferable" + category: + name: "Title" + priority: "Priority" + preferable: "Main" + price: + sum: "Sum" + product: + sum: "Sum" notifications: calculator_created: "Calculator has been successfully created" calculator_updated: "Calculator has been successfully updated" calculator_deleted: "Calculator has been successfully deleted" + user_created: "User has been successfully created" + user_updated: "User has been successfully updated" + user_deleted: "User has been successfully deleted" message_sent: "Message has been sent" - category_created: "Category was successfully created." - category_updated: "Category was successfully updated." - category_deleted: "Category was successfully destroyed." - site_setting_updated: "Setting was successfully updated" + category_created: "Category was successfully created" + category_updated: "Category was successfully updated" + category_deleted: "Category was successfully deleted" + feature_flags_updated: "Features updated successfully" + site_setting_updated: "Settings were successfully updated" + site_setting_reverted: "The title and favicon have been successfully reverted to default" + diapers_period_not_deleted: "Can't delete diapers period." + category_diapers_period_not_deleted: "Can't delete diapers periods from category." # time: # formats: # long: '%A, %d %B, %Y' # short: '%d, %B, %Y' date: abbr_day_names: - - Sun - - Mon - - Tue - - Wed - - Thu - - Fri - - Sat + - Sun + - Mon + - Tue + - Wed + - Thu + - Fri + - Sat abbr_month_names: - - - - Jan - - Feb - - Mar - - Apr - - May - - Jun - - Jul - - Aug - - Sep - - Oct - - Nov - - Dec + - + - Jan + - Feb + - Mar + - Apr + - May + - Jun + - Jul + - Aug + - Sep + - Oct + - Nov + - Dec day_names: - - Sunday - - Monday - - Tuesday - - Wednesday - - Thursday - - Friday - - Saturday + - Sunday + - Monday + - Tuesday + - Wednesday + - Thursday + - Friday + - Saturday formats: default: "%Y-%m-%d" long: "%B %d, %Y" short: "%b %d" month_names: - - - - January - - February - - March - - April - - May - - June - - July - - August - - September - - October - - November - - December + - + - January + - February + - March + - April + - May + - June + - July + - August + - September + - October + - November + - December order: - - :year - - :month - - :day + - :year + - :month + - :day datetime: distance_in_words: about_x_hours: - one: about 1 hour - other: about %{count} hours + one: "about 1 hour" + other: "about %{count} hours" about_x_months: - one: about 1 month - other: about %{count} months + one: "about 1 month" + other: "about %{count} months" about_x_years: - one: about 1 year - other: about %{count} years + one: "about 1 year" + other: "about %{count} years" almost_x_years: - one: almost 1 year - other: almost %{count} years - half_a_minute: half a minute + one: "almost 1 year" + other: "almost %{count} years" + half_a_minute: "half a minute" less_than_x_seconds: - one: less than 1 second - other: less than %{count} seconds + one: "less than 1 second" + other: "less than %{count} seconds" less_than_x_minutes: - one: less than a minute - other: less than %{count} minutes + one: "less than a minute" + other: "less than %{count} minutes" over_x_years: - one: over 1 year - other: over %{count} years + one: "over 1 year" + other: "over %{count} years" x_seconds: - one: 1 second + one: "1 second" other: "%{count} seconds" x_minutes: - one: 1 minute + one: "1 minute" other: "%{count} minutes" x_days: - one: 1 day + one: "1 day" other: "%{count} days" x_months: - one: 1 month + one: "1 month" other: "%{count} months" x_years: - one: 1 year + one: "1 year" other: "%{count} years" prompts: - second: Second - minute: Minute - hour: Hour - day: Day - month: Month - year: Year + second: "Second" + minute: "Minute" + hour: "Hour" + day: "Day" + month: "Month" + year: "Year" errors: format: "%{attribute} %{message}" messages: - accepted: must be accepted - blank: can't be blank - confirmation: doesn't match %{attribute} - empty: can't be empty - equal_to: must be equal to %{count} - even: must be even - exclusion: is reserved - greater_than: must be greater than %{count} - greater_than_or_equal_to: must be greater than or equal to %{count} - in: must be in %{count} - inclusion: is not included in the list - invalid: is invalid - less_than: must be less than %{count} - less_than_or_equal_to: must be less than or equal to %{count} - model_invalid: 'Validation failed: %{errors}' - not_a_number: is not a number - not_an_integer: must be an integer - odd: must be odd - other_than: must be other than %{count} - present: must be blank - required: must exist - taken: has already been taken + accepted: "must be accepted" + blank: "can't be blank" + confirmation: "doesn't match %{attribute}" + empty: "can't be empty" + equal_to: "must be equal to %{count}" + even: "must be even" + exclusion: "is reserved" + greater_than: "must be greater than %{count}" + greater_than_or_equal_to: "must be greater than or equal to %{count}" + in: "must be in %{count}" + inclusion: "is not included in the list" + invalid: "is invalid" + less_than: "must be less than %{count}" + less_than_or_equal_to: "must be less than or equal to %{count}" + model_invalid: "Validation failed: %{errors}" + not_a_number: "is not a number" + not_an_integer: "must be an integer" + odd: "must be odd" + other_than: "must be other than %{count}" + present: "must be blank" + required: "must exist" + taken: "has already been taken" too_long: - one: is too long (maximum is 1 character) - other: is too long (maximum is %{count} characters) + one: "is too long (maximum is 1 character)" + other: "is too long (maximum is %{count} characters)" too_short: - one: is too short (minimum is 1 character) - other: is too short (minimum is %{count} characters) + one: "is too short (minimum is 1 character)" + other: "is too short (minimum is %{count} characters)" wrong_length: - one: is the wrong length (should be 1 character) - other: is the wrong length (should be %{count} characters) + one: "is the wrong length (should be 1 character)" + other: "is the wrong length (should be %{count} characters)" template: - body: 'There were problems with the following fields:' + body: "There were problems with the following fields:" header: - one: 1 error prohibited this %{model} from being saved + one: "1 error prohibited this %{model} from being saved" other: "%{count} errors prohibited this %{model} from being saved" helpers: select: - prompt: Please select + prompt: "Please select" submit: - create: Create %{model} - submit: Save %{model} - update: Update %{model} + create: "Create %{model}" + submit: "Save %{model}" + update: "Update %{model}" number: currency: format: @@ -585,14 +861,14 @@ en: decimal_units: format: "%n %u" units: - billion: Billion - million: Million - quadrillion: Quadrillion - thousand: Thousand - trillion: Trillion - unit: '' + billion: "Billion" + million: "Million" + quadrillion: "Quadrillion" + thousand: "Thousand" + trillion: "Trillion" + unit: "" format: - delimiter: '' + delimiter: "" precision: 3 significant: true strip_insignificant_zeros: true @@ -600,30 +876,30 @@ en: format: "%n %u" units: byte: - one: Byte - other: Bytes - eb: EB - gb: GB - kb: KB - mb: MB - pb: PB - tb: TB + one: "Byte" + other: "Bytes" + eb: "EB" + gb: "GB" + kb: "KB" + mb: "MB" + pb: "PB" + tb: "TB" percentage: format: - delimiter: '' + delimiter: "" format: "%n%" precision: format: - delimiter: '' + delimiter: "" support: array: last_word_connector: ", and " two_words_connector: " and " words_connector: ", " time: - am: am + am: "am" formats: default: "%a, %d %b %Y %H:%M:%S %z" long: "%B %d, %Y %H:%M" short: "%d %b %H:%M" - pm: pm + pm: "pm" diff --git a/config/locales/en/layouts.yml b/config/locales/en/layouts.yml index 610ad0c37..7ea8138e0 100644 --- a/config/locales/en/layouts.yml +++ b/config/locales/en/layouts.yml @@ -5,7 +5,12 @@ en: description: "The calculator tells you how many disposable diapers your baby has already used and will use in the future before switching to regular underwear. And also how much money you have already spent on diapers and how much money you have yet to spend." calculate: "Let's go" visit_website: "Visit WebSite" + link: 'https://zerowastelviv.org.ua/en' account: shared: navigation: - donate: "DONATE" + donate: "Donate" + calculators: "Calculators" + search_form: + search_placeholder: "Search" + search_button: "Search" diff --git a/config/locales/en/simple_form.en.yml b/config/locales/en/simple_form.en.yml new file mode 100644 index 000000000..5852f3db0 --- /dev/null +++ b/config/locales/en/simple_form.en.yml @@ -0,0 +1,8 @@ +en: + simple_form: + labels: + defaults: + required: "%{text} %{mark}" + required: + text: "Required" + mark: "*" diff --git a/config/locales/uk/active_storage.yml b/config/locales/uk/active_storage.yml index 1c8bdfde9..ec47a2719 100644 --- a/config/locales/uk/active_storage.yml +++ b/config/locales/uk/active_storage.yml @@ -1,22 +1,23 @@ uk: errors: messages: - content_type_invalid: "Вам заборонено завантажувати %{content_type} файли, дозволені типи: %{authorized_types}" - file_size_out_of_range: "розмір %{file_size} більше необхідного" - limit_out_of_range: "кількість файлів більше необхідного" + content_type_invalid: "Дозволені лише формати файлів .PNG та .ICO" + file_size_out_of_range: "розмір файлу повинен бути менше або дорівнювати 1 КБ" + limit_out_of_range: "кількість файлів перевищує допустиму" image_metadata_missing: "не є допустимим зображенням" - dimension_min_inclusion: "мусить бути більше або дорівнювати %{width} x %{height} пікселям" - dimension_max_inclusion: "мусить бути менше або дорівнювати %{width} x %{height} пікселям" - dimension_width_inclusion: "ширина не включена між %{min} і %{max} пікселям" - dimension_height_inclusion: "висота не включена між %{min} і %{max} пікселям" - dimension_width_greater_than_or_equal_to: "ширина мусить бути більше або дорівнювати %{length} пікселям" - dimension_height_greater_than_or_equal_to: "висота мусить бути більше або дорівнювати %{length} пікселям" - dimension_width_less_than_or_equal_to: "ширина мусить бути менше або дорівнювати %{length} пікселям" - dimension_height_less_than_or_equal_to: "висота мусить бути менше або дорівнювати %{length} пікселям" - dimension_width_equal_to: "ширина мусить дорівнювати %{length} пікселям" - dimension_height_equal_to: "висота мусить дорівнювати %{length} пікселям" - aspect_ratio_not_square: "мусить бути квадратне зображення" - aspect_ratio_not_portrait: "мусить бути портретне зображення" - aspect_ratio_not_landscape: "мусить бути пейзажне зображення" - aspect_ratio_is_not: "мусить мати співвідношення сторін %{aspect_ratio}" + dimension_min_inclusion: "повинен бути більше або дорівнювати %{width} x %{height} пікселям" + dimension_max_inclusion: "повинен бути менше або дорівнювати %{width} x %{height} пікселям" + dimension_width_inclusion: "має ширину, що не включена між %{min} і %{max} пікселями" + dimension_height_inclusion: "має висоту, що не включена між %{min} і %{max} пікселями" + dimension_width_greater_than_or_equal_to: "повинен мати ширину, що більше або дорівнює %{length} пікселям" + dimension_height_greater_than_or_equal_to: "повинен мати висоту, що більше або дорівнює %{length} пікселям" + dimension_width_less_than_or_equal_to: "повинен мати ширину, що менше або дорівнює %{length} пікселям" + dimension_height_less_than_or_equal_to: "повинен мати висоту, що менше або дорівнює %{length} пікселям" + dimension_width_equal_to: "повинен мати ширину, що дорівнює %{length} пікселям" + dimension_height_equal_to: "повинен мати висоту, що дорівнює %{length} пікселям" + aspect_ratio_not_square: "повинен мати роздільну здатність, кратну квадрату (наприклад: 16x16px)" + aspect_ratio_not_portrait: "повинен мати портретну орієнтацію" + aspect_ratio_not_landscape: "повинен мати пейзажну орієнтацію" + aspect_ratio_is_not: "повинен мати співвідношення сторін %{aspect_ratio}" aspect_ratio_unknown: "має невідоме співвідношення сторін" + image_not_processable: "не є дійсним зображенням" diff --git a/config/locales/uk/devise.uk.yml b/config/locales/uk/devise.uk.yml index 5e8041486..3bc8e6a74 100644 --- a/config/locales/uk/devise.uk.yml +++ b/config/locales/uk/devise.uk.yml @@ -2,19 +2,20 @@ uk: # en: English devise: confirmations: - confirmed: "Ваш обліковий запис підтверджено. Ви увійшли в систему." - send_instructions: "Ви отримаєте лист з інструкціями по підтвердженню вашого облікового запису протягом декількох хвилин." - send_paranoid_instructions: "Якщо Ваша email адреса існує в нашій базі даних, то протягом декількох хвилин Ви отримаєте лист з інструкціями по підтвердженню Вашого облікового запису." + confirmed: "Ваша електронна пошта підтверджена" + send_instructions: "Ви отримаєте лист з інструкціями щодо підтвердження вашого облікового запису протягом декількох хвилин." + send_paranoid_instructions: "Якщо ваша електронна пошта існує в нашій базі даних, то протягом декількох хвилин Ви отримаєте лист з інструкціями щодо підтвердження вашого облікового запису." failure: - already_authenticated: "Ви вже увійшли в систему." - inactive: "Ваш обліковий запис ще не активований." - invalid: "Невірний email чи пароль." - invalid_token: "Невірний ключ аутентифікації." - locked: "Ваш обліковий запис заблоковано." - not_found_in_database: "Невірний email чи пароль." - timeout: "Час вашої сесії вичерпано. Будь-ласка, увійдіть в систему знову." - unauthenticated: "Вам необхідно увійти в систему чи зареєструватися." - unconfirmed: "Ви маєте підтвердити Ваш обліковий запис." + already_authenticated: "Ви вже увійшли до системи" + inactive: "Ваш обліковий запис ще не активований" + invalid: "Невірна електронна пошта чи пароль" + invalid_token: "Невірний ключ аутентифікації" + locked: "Ваш обліковий запис заблоковано" + last_attempt: "У вас є ще одна спроба, перш ніж ваш акаунт буде заблоковано" + not_found_in_database: "Невірна електронна пошта чи пароль" + timeout: "Час вашої сесії вичерпано. Будь ласка, увійдіть до системи знову" + unauthenticated: "Вам необхідно увійти до системи чи зареєструватися" + unconfirmed: "Ви маєте підтвердити ваш обліковий запис" mailer: confirmation_instructions: subject: "Інструкції з підтвердження облікового запису" @@ -22,43 +23,50 @@ uk: subject: "Інструкції з відновлення паролю" unlock_instructions: subject: "Інструкції з розблокування облікового запису" + email_changed: + subject: "Електронну пошту змінено" + password_change: + subject: "Пароль змінено" omniauth_callbacks: - failure: "Ви не можете увійти в систему з облікового запису %{kind}, так як \"%{reason}\"." - success: "Вхід в систему з облікового запису %{kind} успішний." + continue_with: "Або продовжити через" + failure: "Ви не можете увійти до системи з облікового запису %{kind}, оскільки \"%{reason}\"." + success: "Вхід до системи з облікового запису %{kind} успішний" passwords: - format: "Невірний формат - має складати мінімум 8 символів, у тому числі одну прописну букву, рядкову букву і цифру." - no_token: "Ця сторінка доступна тільки при переході з email для скидання паролю. Якщо Ви перейшли по посиланню з листа, будь-ласка, переконайтесь, що Ви використовували повний URL." - send_instructions: "Протягом декількох хвилин Ви отримаєте лист з інструкціями по скиданню Вашого паролю." - send_paranoid_instructions: "Якщо Ваша email адреса існує в нашій базі даних, то протягом декількох хвилин Ви отримаєте лист з інструкціями по відновленню Вашого паролю." - updated: "Ваш пароль було змінено. Ви увійшли в систему." - updated_not_active: "Ваш пароль було змінено успішно." + format: "Невірний формат – має складати мінімум 8 символів, у тому числі одну велику літеру, малу літеру і цифру" + no_token: "Ця сторінка доступна тільки при переході з електронної пошти для скидання паролю. Якщо ви перейшли за посиланням з листа, будь ласка, переконайтесь, що ви використовували повний URL" + send_instructions: "Протягом декількох хвилин ви отримаєте лист з інструкціями щодо скидання вашого паролю" + send_paranoid_instructions: "Якщо ваша електронна пошта існує в нашій базі даних, то протягом декількох хвилин Ви отримаєте лист з інструкціями щодо відновлення вашого паролю" + updated: "Ваш пароль було змінено. Ви увійшли до системи" + updated_not_active: "Ваш пароль було змінено успішно" registrations: - destroyed: "До побачення! Ваш обліковий запис був успішно видалений. Сподіваємось незабаром побачитись з Вами знову." - signed_up: "Ласкаво просимо! Ви успішно зареєструвалися." - signed_up_but_inactive: "Ви успішно зареєструвалися, але Ви не можете увійти в систему тому, що Ваш обліковий запис ще не активований." - signed_up_but_locked: "Ви успішно зареєструвалися, але Ви не можете увійти в систему тому, що Ваш обліковий запис заблоковано." - signed_up_but_unconfirmed: "Ви отримаєте лист з інструкціями по підтвердженню вашого облікового запису протягом декількох хвилин." - updated: "Ваш обліковий запис змінено." - update_needs_confirmation: "Ваш обліковий запис оновлено успішно, але необхідно підтвердити Вашу нову email адресу. Будь-ласка, перевірте свою електронну скриньку і перейдіть за посиланням \"Підтвердити\", шоб завершити оновлення email адреси." + destroyed: "До побачення! Ваш обліковий запис був успішно видалений. Сподіваємось незабаром побачитись з вами знову" + signed_up: "Ласкаво просимо! Ви успішно зареєструвалися" + signed_up_but_inactive: "Ви успішно зареєструвалися, але ви не можете увійти до системи тому, що ваш обліковий запис ще не активований" + signed_up_but_locked: "Ви успішно зареєструвалися, але ви не можете увійти до системи тому, що ваш обліковий запис заблоковано" + signed_up_but_unconfirmed: "На вашу електронну адресу було надіслано повідомлення з посиланням для підтвердження. Будь ласка, перейдіть за посиланням для активації облікового запису" + updated: "Ваш обліковий запис змінено успішно" + updated_but_not_signed_in: "Ваш обліковий запис було успішно оновлено, але оскільки ваш пароль було змінено, вам потрібно увійти знову" + update_needs_confirmation: "Ваш обліковий запис оновлено успішно, але необхідно підтвердити вашу нову електронну пошту. Будь ласка, перевірте свою електронну скриньку і перейдіть за посиланням \"Підтвердити\", шоб завершити оновлення електронної пошти" sessions: - signed_in: "Ви увійшли в систему." - signed_out: "Ви вийшли з системи." + signed_in: "Ви увійшли до системи" + signed_out: "Ви вийшли з системи" + already_signed_out: "Успішний вихід з системи" unlocks: - send_instructions: "Протягом декількох хвилин Ви отримаєте лист з інструкціями по розблокуванню Вашого облікового запису." - send_paranoid_instructions: "Якщо Ваш обліковий запис існує, то протягом декількох хвилин Ви отримаєте лист з інструкціями по його розблокуванню." - unlocked: "Ваш обліковий запис розблоковано. Ви увійшли в систему." + send_instructions: "Протягом декількох хвилин ви отримаєте лист з інструкціями щодо розблокування вашого облікового запису" + send_paranoid_instructions: "Якщо ваш обліковий запис існує, то протягом декількох хвилин ви отримаєте лист з інструкціями щодо його розблокування" + unlocked: "Ваш обліковий запис розблоковано. Будь ласка, увійдіть до системи, щоб продовжити" errors: messages: - already_confirmed: "вже підтверждено. Будь-ласка, спробуйте увійти в систему" - confirmation_period_expired: "має бути підтверджено протягом %{period}, будь-ласка, запросіть підтвердження запису завтра" - expired: "застаріла. Будь-ласка, запросіть нову" + already_confirmed: "вже підтверждено. Будь ласка, спробуйте увійти до системи" + confirmation_period_expired: "має бути підтверджено протягом %{period}, будь ласка, запросіть підтвердження знову" + expired: "застаріла. Будь ласка, запросіть нову" not_found: "не знайдено" not_locked: "не заблоковано" not_saved: one: "%{resource}: не вдалося зберегти через %{count} помилку" - few: "%{resource}: не вдалося зберегти через %{count} помилок" + few: "%{resource}: не вдалося зберегти через %{count} помилки" many: "%{resource}: не вдалося зберегти через %{count} помилок" - other: "%{resource}: не вдалося зберегти через %{count} помилку" + other: "%{resource}: не вдалося зберегти через %{count} помилок" wrong_email: "Ваш логін невірний" wrong_password: "Ваш пароль невірний" only_letters: "Лише літери" diff --git a/config/locales/uk/layouts.yml b/config/locales/uk/layouts.yml index 59cf5bdd3..547d3a232 100644 --- a/config/locales/uk/layouts.yml +++ b/config/locales/uk/layouts.yml @@ -2,10 +2,15 @@ uk: home: index: homepage_title: "Вас вітає калькулятор підгузків" - description: "Цей калькулятор дозволяє порахувати, скільки одноразових підгузків ваша дитина вже використала та ще використає до того часу, як перейде на звичайну білизну. А також визначити вартість уже куплених підгузків та суму, яку ви витратите на них у майбутньому." + description: "Цей калькулятор дає змогу порахувати, скільки одноразових підгузків ваша дитина вже використала та ще використає до того часу, як перейде на звичайну білизну. А також визначити вартість уже куплених підгузків та суму, яку ви витратите на них у майбутньому." calculate: "Почати" visit_website: "Наш сайт" + link: 'https://zerowastelviv.org.ua/' account: shared: navigation: donate: "Підтримати" + calculators: "Калькулятори" + search_form: + search_placeholder: "Пошук" + search_button: "Шукати" diff --git a/config/locales/uk/simple_form.uk.yml b/config/locales/uk/simple_form.uk.yml new file mode 100644 index 000000000..3eae859de --- /dev/null +++ b/config/locales/uk/simple_form.uk.yml @@ -0,0 +1,8 @@ +uk: + simple_form: + labels: + defaults: + required: "%{text} %{mark}" + required: + text: "Обовʼязкове поле" + mark: "*" diff --git a/config/locales/uk/uk.yml b/config/locales/uk/uk.yml index d3039992d..4354d31c7 100644 --- a/config/locales/uk/uk.yml +++ b/config/locales/uk/uk.yml @@ -1,37 +1,88 @@ uk: en: English + buttons: + save: "Зберегти" + update: "Оновити" + create: "Створити" + cancel: "Скасувати" + revert: "Скинути" + back: "Назад" + views: + pagination: + previous: "‹ Поперед." + next: "Наступна ›" + truncate: "…" calculators: - calculator: - diaper: "підгузок" - form_description: "Скільки виповнилося дитині:" - form_price: "Цінова категорія" + index: + meta-title: "Калькулятори" + new_calculator: + diaper_сalculator: "Калькулятор підгузків" form: - childs_birthday_label: "Дата народження дитини" - childs_age_label: "Вік дитини" - childs_years_label: "повних років" - childs_months_label: "місяців" - baby_weight_label: "Baby weight" + description: "Вік дитини:" + price: "Цінова категорія" + childs_years_label: "р." + childs_months_label: "міс." budgetary: "бюджетна" medium: "середня" premium: "преміум" - calculate_result_button: "Розрахувати" - want_recomentation_label: "Так, я хочу отримувати листи з рекомендаціями" - bought_diapers: "підгузок ви вже використали" + bought_diapers: "ви вже використали" + will_buy_diapers: "ви ще використаєте" + money_spent: "ви вже витратили" + money_will_be_spent: "ви ще витратите" + pieces: "шт." + unit: "грн" + old_calculator: + form: + description: "Вік дитини:" + years_prompt: "повних років" + months_prompt: "місяців" + bought_diapers: + one: "підгузок ви вже використали" + few: "підгузки ви вже використали" + many: "підгузків ви вже використали" + other: "підгузків ви вже використали" + will_buy_diapers: + one: "підгузок ви ще використаєте" + few: "підгузки ви ще використаєте" + many: "підгузків ви ще використаєте" + other: "підгузків ви ще використаєте" money_spent: "грн ви вже витратили" - will_buy_diapers: "підгузки які будуть використані" money_will_be_spent: "грн ви ще витратите" - mililiters_of_naphtha: "Мілілітрів нафти" - gram_of_plastic: "Грамів пластику" + errors: + year_and_month_error_msg: "Будь ласка, виберіть, скільки років та місяців дитині" + year_error_msg: "Будь ласка, виберіть, скільки років дитині" + month_error_msg: "Будь ласка, виберіть, скільки місяців дитині" show: welcome_header: "Ласкаво просимо до ZeroWaste" calculate_result_button: "Pозрахувати" - bought_diapers: "Кількості підгузків, що вже були використані" - will_buy_diapers: "Кількість підгузків, які ще будуть використані" + bought_diapers: "Кількість використаних підгузків" + will_buy_diapers: "Кількість підгузків, які ще будуть використані до моменту, коли дитина перейде на звичайну білизну" money_spent: "Вартість використаних підгузків" - money_will_be_spent: "вартість підгузків, які ви ще будуть використані до моменту, коли дитина перейде на звичайну білизну" + money_will_be_spent: "Вартість підгузків, які ще будуть використані до моменту, коли дитина перейде на звичайну білизну" + buttons: + to_main: "На головну" + calculate: "Розрахувати" + index: + meta-title: "Калькулятори" + id_column: "№" + calculator_name: "Назва" + calculator_actions: "Дії" + date: + months: + one: "%{count} місяць" + few: "%{count} місяці" + many: "%{count} місяців" + other: "%{count} місяців" + years: + one: "%{count} рік" + few: "%{count} роки" + many: "%{count} років" + other: "%{count} років" layouts: navigation: + about_us: "Про нас" admin: "Адміністратор" + calculate: "Калькулятор підгузків" log_out: "Вийти" sign_up: "Зареєструватися" log_in: "Увійти" @@ -39,29 +90,47 @@ uk: contacts: "%{contacts_uk:Контакти}" local_lang: "English" description_block: - description_block_html: "Ці результати є приблизними, точні цифри для вашої сімʼї можуть бути дещо іншими - та залежать від ваших щоденних звичок та обраної марки підгузків. На будь-якому етапі користування підгузками - є можливість зменшити рівень їхнього використання. Запрошуємо вас дізнатися більше про методи, як це можна - зробити, та про доступні багаторазові альтернативи одноразовим дитячим підгузкам. А ще ви можете почитати - детальніше про те, %{calculate_link_one:як ми розраховуємо} кількість та вартість підгузків, - або %{calculate_link_two:написати нам}, якщо маєте інші запитання." + description_block_html: + "Ці результати є приблизними, точні цифри для вашої сімʼї можуть бути дещо іншими + та залежать від ваших щоденних звичок та обраної марки підгузків. На будь-якому етапі користування підгузками + є можливість зменшити рівень їхнього використання. Запрошуємо вас дізнатися більше про методи, як це можна + зробити, та про достmупні багаторазові альтернативи одноразовим дитячим підгузкам. А ще ви можете почитати + докладніше про те, %{calculate_link_one:як ми розраховуємо} кількість та вартість підгузків, + або %{calculate_link_two:написати нам}, якщо маєте інші запитання." description_button: use_less: "%{use_less_link:ЯК ЗМЕНШИТИ ВИКОРИСТАННЯ}" homepage: homepage_title: "Вас вітає калькулятор підгузків" - description: "Цей калькулятор дозволяє порахувати, скільки одноразових підгузків ваша дитина вже використала та ще використає до того часу, як перейде на звичайну білизну. А також визначити вартість уже куплених підгузків та суму, яку ви витратите на них у майбутньому." + description: "Цей калькулятор дає змогу порахувати, скільки одноразових підгузків ваша дитина вже використала та ще використає до того часу, як перейде на звичайну білизну. А також визначити вартість уже куплених підгузків та суму, яку ви витратите на них у майбутньому." calculate: "Почати" visit_website: "Наш сайт" account_navbar: + homepage: "Головна сторінка" calculators: "Калькулятори" histories: "Історія" users: "Користувачі" messages: "Повідомлення" - app_config: "Налаштування" site_settings: "Налаштування сайту" categories: "Категорії" + products: "Продукти" + zerowaste_logo: "логотип ZeroWaste" + account_footer: + created_with: "Створено з" + by: "в" + mailer: + welcome_mail: + subject: "Ласкаво просимо до ZeroWaste!" + user_mailer: + welcome_email: + greeting: "Ласкаво просимо до ZeroWaste, %{name}" + login_info: "Ви успішно зареєструвалися на zerowaste.com, ваші дані для входу" + email: "Електронна пошта: %{email}" + password: "Пароль: %{password}" + to_login: "Щоб увійти на сайт, просто перейдіть за цим посиланням" + thanks: "Дякуємо за приєднання та бажаємо гарного дня!" messages: new: + meta-title: "Зв'яжіться з нами" contact_us_header: "Зв'яжіться з нами" email: "Електронна пошта" message: "Повідомлення" @@ -71,6 +140,26 @@ uk: message_hint: "Напишіть ваше повідомлення тут (мінімум 20 символів)" company_address: "Адреса компанії" about_us: "Про нас" + sitemap: + index: + sitemap: "Мапа сайту" + homepage: "Головна сторінка" + about_us: "Про нас" + calculator-diapers: "Калькулятор підгузків" + calculators: "Калькулятори" + message: "Напишіть нам повідомлення" + about_us: + title: "Про нас" + description: + first_paragraph: "Ми працюємо в багатьох напрямках на користь чистого майбутнього та сталого розвитку нашого міста та країни." + second_paragraph: "Zero Waste закликає нас раціонально та свідомо використовувати ресурси." + third_paragraph: "Основна мета zero waste – перейти до економіки замкненого циклу, де немає сміття як такого, а те, що називають сміттям, стає цінним ресурсом." + our_team: + title: "Наша команда" + description: + "Zero Waste Lviv та SoftServe представляють калькулятор – онлайн-інструмент для розрахунку кількості + одноразових та повторно використовуваних предметів. Калькулятор розроблений як частина благодійної платформи Open Tech. + Технічна реалізація здійснюється студентами SoftServe Academy." account: account: edit: @@ -78,26 +167,16 @@ uk: new_password_label: "Новий пароль:" confirm_password_label: "Підтвердіть новий пароль:" change_password_button: "Змінити пароль" - app_configs: - edit: - diapers_calculator_config: "Налаштування калькулятора памперсів" - first_period: "Перший період" - second_period: "Другий період" - third_period: "Третій період" - fourth_period: "Четвертий період" - fifth_period: "П'ятий період" - sixth_period: "Шостий період" - seventh_period: "Сьомий період" - amount: "Кількість" - price: "Вартість" - update: "Оновити" messages: index: + meta-title: "Повідомлення" + search_placeholder: "Пошук" + search_button: "Шукати" table: title: "Заголовок" email: "Електронна пошта" message: "Повідомлення" - show_more: "Детальніше" + show_more: "Докладніше" show: header: "Інформація" table: @@ -107,31 +186,83 @@ uk: time_col: "Дата" categories: index: + meta-title: "Категорії" + search_placeholder: "Пошук" + search_button: "Шукати" table: - title: 'Назва' - actions: 'Дії' - add_category_button: 'Додати категорію' - confirm_delete: 'Видалити категорію?' + title: "Назва" + actions: "Дії" + priority: "Пріоритет" + edit: "Відредагувати" + delete: "Видалити" + add_category_button: "Додати категорію" + confirm_delete: "Видалити категорію?" + cannot_delete: "Ви не можете видалити основну категорію." edit: - update_button: 'Оновити' - cancel_button: 'Скасувати' + form: + update_category_button: "Оновити категорію" new: - create_button: 'Create' - cancel_button: 'Скасувати' - site_settings: - validations: - size: 'надто великий' - edit: - update_button: 'Оновити' + form: + create_category_button: "Створити категорію" + products: + index: + meta-title: "Продукти" + table: + title: "Назва" + prices: "Ціни" + actions: "Дії" + edit: "Відредагувати" + delete: "Видалити" + add_product_button: "Додати продукт" + confirm_delete: "Видалити продукт?" + show: + table: + title: "Назва" + prices: "Ціни" + actions: "Дії" + confirm_delete: "Видалити продукт?" + partials: + new: + form: + title: "Назва" + form: + sum: "Сума" + create_product_button: "Створити продукт" + edit: + form: + title: "Назва" + form: + sum: "Сума" + update_product_button: "Оновити продукт" + created: "Продукт був успішно створений" + updated: "Продукт був успішно оновлений" + deleted: "Продукт був успішно видалений" users: index: + meta-title: "Користувачі" main_header: "Адмінпанель" + add_user_button: "Створити нового користувача" + confirm_block: "Ви справді хочете заблокувати цього користувача?" + confirm_unblock: "Ви справді хочете розблокувати цього користувача?" + confirm_delete: "Ви справді хочете видалити цього користувача?" table: - email_col: "Електронна адреса" + email_col: "Електронна пошта" + first_name: "Ім'я" + last_name: "Прізвище" last_visit_col: "Час останнього візиту" - view_info_col: "Показати" + show: "Показати" edit: "Відредагувати" ban: "Заблокувати" + delete: "Видалити" + new: + table: + create_new_user: "Створіть користувача" + form: + first_name_label: "Ім'я" + last_name_label: "Прізвище" + password_hint: "Мінімум 8 символів" + create_user_button: "Створити нового користувача" + send_credentials_email: "Надіслати електронного листа з даними користувача" edit: avatar: "Фото профілю користувача" table: @@ -140,7 +271,7 @@ uk: name_label: "Ім'я" surname_label: "Прізвище" password_hint: "Залиште порожнім, якщо не хочете змінювати" - avatar_hint: "Розмір зображення не має перевищувати 2 Мб. Дозволені типи файлів: PNG,JPG та JPEG" + avatar_hint: "Розмір зображення не має перевищувати 2 Мб. Дозволені типи файлів: PNG, JPG та JPEG" update_user_button: "Оновити інформацію" show: header: "Інформація про користувача" @@ -157,38 +288,119 @@ uk: unblocked_label: "Розблокований" calculators: index: - search_placeholder: "Пошук" - search_button: "Шукати" + meta-title: "Калькулятори" add_calculator_button: "Додати калькулятор" confirm_delete: "Ви справді хочете видалити калькулятор?" table: calculator_slug: "Шлях" calculator_name: "Назва" calculator_actions: "Дії" + show: "Показати" + edit: "Відредагувати" + delete: "Видалити" edit: add_new_field_label: "Додати нове поле" form: select_field_kind_label: "Оберіть поле" select_field_type_label: "Оберіть тип поля" - create_button: "Створити" form_label: "Форма" parameters_label: "Параметри" results_label: "Результати" no_fields_yet_label: "Полів поки нема" update_calculator_button: "Оновити калькулятор" - cancel_button: "Скасувати" new: create_calculator_button: "Створити калькулятор" cancel_button: "Скасувати" prohibited_to_update: " перешкоджають оновленню калькулятора" prohibited_to_save: " перешкоджають збереженню калькулятора" error: "помилки" + site_settings: + edit: + meta-title: "Налаштування сайту" + site_settings: "Налаштування сайту" + site_features: "Особливості сайту" + rails_db_description: "Доступ до бази даних (лише перегляд)" + dev_features: "Для розробників" + diapers_categories: "Категорії підгузків" + apply_button: "Зберегти" + confirm_default: "Ви впевнені, що бажаєте повернути налаштування за замовчуванням для назви та іконки сайту?" + diapers_periods: + partials: + edit: + form: + edit_name: "Редагувати періоди для підгузків" + period_start: "Початок періоду" + period_end: "Кінець періоду" + usage_amount: "Обсяг використання " + price: "Ціна" + back_button: "Назад" + cannot_edit_period: "Ви не можете редагувати початок та кінець періоду" + index: + delete_button: + confirm_delete: "Ви впевнені, що бажаєте видалити цей період?" + cannot_delete_category: "Ви не можете видалити періоди в основній категорії." + cannot_delete_period: "Ви можете видалити лише останній період." + add_new_link: + add_new: "Додати новий період" + content: + periods_for: "Періоди підгудків для категорії:" + confirm_delete: "Ви впевнені, що бажаєте видалити цей період?" + period_start: "Початок періоду" + period_end: "Кінець періоду" + usage_amount: "Обсяг використання " + price: "Ціна" + table: + edit: "Редагувати" + delete: "Видалити" + add_new: "Додати новий період" + back_button: "Назад" + warning: "Ця категорія не відображається в калькуляторі, оскільки вона не охоплює всі періоди. Будь ласка, додайте нові періоди, щоб категорія охоплювала 30 місяців." + cannot_delete: "Ви не можете видалити періоди в основній категорії." + new: + form: + new_period: "Новий період для підгузків категорії:" + period_start: "Початок періоду" + period_end: "Кінець періоду" + usage_amount: "Обсяг використання " + price: "Ціна" + back_button: "Назад" + cannot_edit_start_period: "Ви не можете редагувати початок періоду" + categories: + partials: + available: + content: + available: "Оберіть категорію:" + no_categories_available: "Немає доступних категорій. Створіть нову категорію." + category_name: "Назва категорії" + confirm_delete: "Ви впевнені, що бажаєте видалити всі періоди?" + back_button: "Назад" + table: + add: "Додати" + with_periods: + content: + category_name: "Назва категорії" + confirm_delete: "Ви впевнені, що бажаєте видалити всі періоди?" + table: + show: "Показати" + delete: "Видалити" + no_categories: "Не знайдено періодів для підгузків. Додайте новий зі списку доступних." + add_button: "Додати" + tooltip: "Ця категорія не відображається в Калькуляторі, оскільки вона не охоплює всі періоди." + cannot_delete_category: "Ви не можете видалити періоди в основній категорії." + feature_flags: + submit_button: "Зберегти" + new_calculator_design: + name: "Увімкнути новий дизайн калькулятора" + show_calculators_list: + name: "Показати калькулятори користувачам" + sandbox_mode: + name: "Увімкнути режим пісочниці" sessions: new: log_in_header: "Увійти" log_in_button: "Увійти" form: - email: "Пошта" + email: "Електронна пошта" password: "Пароль" shared: links: @@ -200,31 +412,31 @@ uk: resend_confirmation_instructions_button: "Повторно надіслати інструкцію з підтвердженням" mailer: confirmation_instructions: - greetings_to_user: Ласкаво просимо, %{recipient}! + greetings_to_user: "Ласкаво просимо, %{recipient}!" confirmation_email_through_link: "Ви можете підтвердити свій акаунт за посиланням нижче:" confirmation_account_link: "Підтвердити мій акаунт" email_changed: greeting: Привіт, %{recipient}! - message_confirmed: Ми пишемо, щоб повідомити про зміну Вашої електронної пошти на %{email}. - message_unconfirmed: Ми пишемо, щоб повідомити, що Вашу електронну пошту змінено на %{email}. + message_confirmed: "Ми пишемо, щоб повідомити, що вашу електронну пошту було змінено на %{email}." + message_unconfirmed: "Ми пишемо, щоб повідомити, що вашу електронну пошту буде змінено на %{email}." password_change: - greeting: Привіт, %{recipient}! - successful_change: "Ми пишемо, щоб повідомити про зміну Вашого пароля" + greeting: "Привіт, %{recipient}!" + successful_change: "Ми пишемо, щоб повідомити про зміну вашого пароля" reset_password_instructions: - greeting: Привіт %{recipient}! + greeting: "Привіт, %{recipient}!" change_password_link: "Змінити мій пароль" - request_change_password: "Хтось надіслав запит на зміну Вашого пароля. Ви можете зробити це за посиланням нижче" + request_change_password: "Хтось надіслав запит на зміну вашого пароля. Ви можете зробити це за посиланням нижче:" ignore_email: "Якщо ви не надсилали запит, будь ласка, проігноруйте цей лист." - access_to_changing: "Ваш пароль не буде змінено, доки Ви не перейдете за посиланням вище та не зміните його." + access_to_changing: "Ваш пароль не буде змінено, доки ви не перейдете за посиланням вище та не зміните його." unlock_instructions: - greeting: Привіт, %{recipient}! + greeting: "Привіт, %{recipient}!" locked_message: "Ваш акаунт було заблоковано через надто велику кількість неуспішних спроб увійти." - unlock_your_account: "Натисніть на посилання нижче, аби розблокувати Ваш акаунт:" + unlock_your_account: "Натисніть на посилання нижче, щоб розблокувати ваш акаунт:" unlock_link: "Розблокувати мій акаунт" unlocks: new: - resend_unlock_instructions_header: "Повторно надіслати інструкцію розблокування" - resend_unlock_instructions_button: "Повторно надіслати інструкцію розблокування" + resend_unlock_instructions_header: "Повторно надіслати інструкцію з розблокування" + resend_unlock_instructions_button: "Повторно надіслати інструкцію з розблокування" passwords: password: blank: "Новий пароль не може бути порожнім" @@ -242,6 +454,7 @@ uk: email_label: "Електронна пошта" histories: index: + meta-title: "Історія" history_title: "Історія" back_link: "Назад" table: @@ -255,7 +468,10 @@ uk: passwords: new: forgot_password_header: "Забули пароль?" - send_instructions_button: "Надішліть мені інструкції щодо скидання пароля" + forgot_password_message: "Введіть свою електронну адресу, і ми надішлемо вам інструкції для скидання пароля." + email_placeholder: "Введіть свою ел.пошту" + send_instructions_button: "Скинути" + back_to: "Назад до" form: email_label: "Електронна пошта" edit: @@ -267,7 +483,10 @@ uk: change_password_button: "Змінити пароль" sessions: new: + meta-title: "Увійти" log_in: "Увійти" + email_placeholder: "Введіть свою ел.пошту" + password_placeholder: "Введіть свій пароль" shared: links: forgot_your_password: "Забули пароль?" @@ -277,12 +496,13 @@ uk: google_sign_in: "Увійти через Google" registrations: new: + meta-title: "Зареєструватися" sign_up_header: "Зареєструватися" form: - email_label: "Поштова Скринька" + email_label: "Електронна пошта" password_label: "Пароль" - password_characters_minimum_label: "Мінімум Символів" - password_confirmation_label: "Підтвердження Паролю" + password_characters_minimum_label: "Мінімум символів" + password_confirmation_label: "Підтвердження паролю" first_name_label: "Ім'я" last_name_label: "Прізвище" sign_up_button: "Зареєструватися" @@ -301,13 +521,125 @@ uk: resend_confirmation_button: "Надіслати запит на підтвердження знову" resend_confirmation_instructions_header: "Надіслати запит на підтвердження знову" failure: - timeout: "Час вашої сесії закінчено. Будь ласка, увійдіть у систему знову" + timeout: "Час вашої сесії вичерпано. Будь ласка, увійдіть до системи знову" models: calculator: "Калькулятор" + category: "Категорію" activerecord: + errors: + models: + calculator: + attributes: + name: + blank: "не може бути порожньою" + too_long: + one: "занадто довга (максимум %{count} знак)" + few: "занадто довга (максимум %{count} знаки)" + many: "занадто довга (максимум %{count} знаків)" + other: "занадто довга (максимум %{count} знаків)" + too_short: + one: "занадто коротка (мінімум %{count} знак)" + few: "занадто коротка (мінімум %{count} знаки)" + many: "занадто коротка (мінімум %{count} знаків)" + other: "занадто коротка (мінімум %{count} знаків)" + taken: "вже викориcтовується, будь ласка, оберіть іншу" + invalid: "містить неприпустимі символи" + category: + attributes: + name: + blank: "не може бути порожньою" + too_long: + one: "занадто довга (максимум %{count} знак)" + few: "занадто довга (максимум %{count} знаки)" + many: "занадто довга (максимум %{count} знаків)" + other: "занадто довга (максимум %{count} знаків)" + too_short: + one: "занадто коротка (мінімум %{count} знак)" + few: "занадто коротка (мінімум %{count} знаки)" + many: "занадто коротка (мінімум %{count} знаків)" + other: "занадто коротка (мінімум %{count} знаків)" + invalid: "містить неприпустимі символи" + taken: "вже викориcтовується, будь ласка, оберіть іншу" + site_setting: + attributes: + title: + blank: "не може бути порожньою" + too_long: + one: "занадто довга (максимум %{count} знак)" + few: "занадто довга (максимум %{count} знаки)" + many: "занадто довга (максимум %{count} знаків)" + other: "занадто довга (максимум %{count} знаків)" + too_short: + one: "занадто коротка (мінімум %{count} знак)" + few: "занадто коротка (мінімум %{count} знаки)" + many: "занадто коротка (мінімум %{count} знаків)" + other: "занадто коротка (мінімум %{count} знаків)" + diapers_period: + attributes: + price: + blank: "не може бути порожньою" + product: + attributes: + title: + blank: "не може бути порожньою" + too_long: + one: "занадто довга (максимум %{count} знак)" + few: "занадто довга (максимум %{count} знаки)" + many: "занадто довга (максимум %{count} знаків)" + other: "занадто довга (максимум %{count} знаків)" + too_short: + one: "занадто коротка (мінімум %{count} знак)" + few: "занадто коротка (мінімум %{count} знаки)" + many: "занадто коротка (мінімум %{count} знаків)" + other: "занадто коротка (мінімум %{count} знаків)" + taken: "вже викориcтовується, будь ласка, оберіть іншу" + invalid: "містить неприпустимі символи" + price: + attributes: + sum: + less_than: "занадто велика" + user: + attributes: + email: + invalid: "недійсна" + blank: "не може бути порожньою" + taken: "вже зайнята, вкажіть іншу" + first_name: + invalid: "недійсне" + too_long: "занадто довге (максимум %{count} знаків)" + too_short: "занадто коротке (мінімум %{count} знаки)" + last_name: + invalid: "недійсне" + too_long: "занадто довге (максимум %{count} знаків)" + too_short: "занадто коротке (мінімум %{count} знаки)" + avatar: + content_type: + "%{extension}" + # extension_allowlist_error: "Вам заборонено завантажувати %{extension} файли, дозволені типи: %{allowed_types}" + + # uk: + # carrierwave: + # hint: "Дозволені формати: %{allowed_extensions}, рекомендоване розширення фото - %{dimension}, а максимальний розмір файлу: %{size}" + # errors: + # messages: + # carrierwave_processing_error: не вдалося обробити + # carrierwave_integrity_error: не є дозволеним типом файлу + # carrierwave_download_error: не вдалося завантажити + # extension_denylist_error: "Вам заборонено завантажувати %{extension} файли, заборонені типи: %{prohibited_types}" + # content_type_allowlist_error: "Вам заборонено завантажувати %{content_type} файли, дозволені типи: %{allowed_types}" + # content_type_denylist_error: "Вам заборонено завантажувати %{content_type} файли" + # processing_error: "Не вдалося опрацювати, можливо, це не зображення?" + # min_size_error: "Розмір файлу має бути більшим за %{min_size}" + # max_size_error: "Розмір файлу має бути менше %{max_size}" + # mini_magick_processing_error: "Не вдалося опрацювати з MiniMagick, можливо, це не зображення?" + messages: + record_invalid: "Виникли помилки: %{errors}" + restrict_dependent_destroy: + has_one: "Неможливо видалити запис, оскільки існує залежність: %{record}" + has_many: "Неможливо видалити запис, оскільки існують залежності: %{record}" form_errors: - one: "Одна помилка перешкоджає зберегти %{model}" - few: "%{count} помилки перешкоджають зберегти %{model}" + one: "Одна помилка перешкоджає зберегти %{model}:" + few: "%{count} помилки перешкоджають зберегти %{model}:" attributes: user: email: "Електронна пошта" @@ -316,235 +648,228 @@ uk: first_name: "Ім'я" last_name: "Прізвище" country: "Країна" + role: "Роль" remember_me: "Запам'ятати мене" successful_update: "Інформацію про користувача було успішно оновлено!" admin: remember_me: "Запам'ятати мене" + site_setting: + title: "Назва" + diapers_period: + price: "Ціна" + period_start: "Початок періоду" + period_end: "Кінець періоду" + usage_amount: "Обсяг використання" calculator: name: "Назва" slug: "Шлях" preferable: "Бажаний" - errors: - models: - calculator: - attributes: - name: - name_format_validation: Only letters and numbers allowed - user: - attributes: - avatar: - content_type: "%{extension}" - # extension_allowlist_error: "Вам заборонено завантажувати %{extension} файли, дозволені типи: %{allowed_types}" - - # uk: - # carrierwave: - # hint: "Дозволені формати: %{allowed_extensions}, рекомендоване розширення фото - %{dimension}, а максимальний розмір файлу: %{size}" - # errors: - # messages: - # carrierwave_processing_error: не вдалося обробити - # carrierwave_integrity_error: не є дозволеним типом файлу - # carrierwave_download_error: не вдалося завантажити - # extension_denylist_error: "Вам заборонено завантажувати %{extension} файли, заборонені типи: %{prohibited_types}" - # content_type_allowlist_error: "Вам заборонено завантажувати %{content_type} файли, дозволені типи: %{allowed_types}" - # content_type_denylist_error: "Вам заборонено завантажувати %{content_type} файли" - # processing_error: "Не вдалося опрацювати, можливо, це не зображення?" - # min_size_error: "Розмір файлу має бути більшим за %{min_size}" - # max_size_error: "Розмір файлу має бути менше %{max_size}" - # mini_magick_processing_error: "Не вдалося опрацювати з MiniMagick, можливо, це не зображення?" - messages: - record_invalid: 'Виникли помилки: %{errors}' - restrict_dependent_destroy: - has_one: 'Неможливо видалити запис, так як існує залежність: %{record}' - has_many: 'Неможливо видалити запис, так як існують залежності: %{record}' + category: + name: "Назва" + priority: "Пріоритет" + preferable: "Основна" + price: + sum: "Сума" + product: + title: "Назва" notifications: calculator_created: "Калькулятор було успішно створено" calculator_updated: "Калькулятор було успішно оновлено" calculator_deleted: "Калькулятор було успішно видалено" + user_created: "Користувача було успішно створено" + user_updated: "Користувача було успішно оновлено" + user_deleted: "Користувача було успішно видалено" message_sent: "Повідомлення було надіслано" - category_created: "Категорію було успішно створено." - category_updated: "Категорію було успішно оновлено." - category_deleted: "Категорію було успішно видалено." + category_created: "Категорію було успішно створено" + category_updated: "Категорію було успішно оновлено" + category_deleted: "Категорію було успішно видалено" + feature_flags_updated: "Оновлено успішно" site_setting_updated: "Налаштування було успішно оновлено" + site_setting_reverted: "Заголовок та іконку сайту успішно відновлено до стандартних" + diapers_period_not_deleted: "Неможливо видалити період підгузків." + category_diapers_period_not_deleted: "Неможливо видалити періоди підгузків з категорії." # time: # formats: # long: '%A, %d %B, %Y' # short: '%d, %B, %Y' date: abbr_day_names: - - нд. - - пн. - - вт. - - ср. - - чт. - - пт. - - сб. + - нд. + - пн. + - вт. + - ср. + - чт. + - пт. + - сб. abbr_month_names: - - - - січ. - - лют. - - бер. - - квіт. - - трав. - - черв. - - лип. - - серп. - - вер. - - жовт. - - лист. - - груд. + - + - січ. + - лют. + - бер. + - квіт. + - трав. + - черв. + - лип. + - серп. + - вер. + - жовт. + - лист. + - груд. day_names: - - неділя - - понеділок - - вівторок - - середа - - четвер - - п'ятниця - - субота + - неділя + - понеділок + - вівторок + - середа + - четвер + - п'ятниця + - субота formats: default: "%d.%m.%Y" long: "%d %B %Y" short: "%d %b" month_names: - - - - Січня - - Лютого - - Березня - - Квітня - - Травня - - Червня - - Липня - - Серпня - - Вересня - - Жовтня - - Листопада - - Грудня + - + - Січня + - Лютого + - Березня + - Квітня + - Травня + - Червня + - Липня + - Серпня + - Вересня + - Жовтня + - Листопада + - Грудня order: - - :day - - :month - - :year + - :day + - :month + - :year datetime: distance_in_words: about_x_hours: - one: близько %{count} години - few: близько %{count} годин - many: близько %{count} годин - other: близько %{count} години + one: "близько %{count} години" + few: "близько %{count} годин" + many: "близько %{count} годин" + other: "близько %{count} годин" about_x_months: - one: близько %{count} місяця - few: близько %{count} місяців - many: близько %{count} місяців - other: близько %{count} місяця + one: "близько %{count} місяця" + few: "близько %{count} місяців" + many: "близько %{count} місяців" + other: "близько %{count} місяців" about_x_years: - one: близько %{count} року - few: близько %{count} років - many: близько %{count} років - other: близько %{count} року + one: "близько %{count} року" + few: "близько %{count} років" + many: "близько %{count} років" + other: "близько %{count} років" almost_x_years: - one: майже %{count} рік - few: майже %{count} роки - many: майже %{count} років - other: майже %{count} років - half_a_minute: пів хвилини + one: "майже %{count} рік" + few: "майже %{count} роки" + many: "майже %{count} років" + other: "майже %{count} років" + half_a_minute: "пів хвилини" less_than_x_seconds: - one: менше %{count} секунди - few: менше %{count} секунд - many: менше %{count} секунд - other: менше %{count} секунди + one: "менше %{count} секунди" + few: "менше %{count} секунд" + many: "менше %{count} секунд" + other: "менше %{count} секунд" less_than_x_minutes: - one: менше %{count} хвилини - few: менше %{count} хвилин - many: менше %{count} хвилин - other: менше %{count} хвилини + one: "менше %{count} хвилини" + few: "менше %{count} хвилин" + many: "менше %{count} хвилин" + other: "менше %{count} хвилин" over_x_years: - one: більше %{count} року - few: більше %{count} років - many: більше %{count} років - other: більше %{count} року + one: "понад %{count} року" + few: "понад %{count} років" + many: "понад %{count} років" + other: "понад %{count} років" x_seconds: one: "%{count} секунда" few: "%{count} секунди" many: "%{count} секунд" - other: "%{count} секунди" + other: "%{count} секунд" x_minutes: one: "%{count} хвилина" few: "%{count} хвилини" many: "%{count} хвилин" - other: "%{count} хвилини" + other: "%{count} хвилин" x_days: one: "%{count} день" few: "%{count} дні" many: "%{count} днів" - other: "%{count} дня" + other: "%{count} днів" x_months: one: "%{count} місяць" few: "%{count} місяці" many: "%{count} місяців" - other: "%{count} місяця" + other: "%{count} місяців" x_years: one: "%{count} рік" few: "%{count} роки" many: "%{count} років" - other: "%{count} року" + other: "%{count} років" prompts: - second: Секунда - minute: Хвилина - hour: Година - day: День - month: Місяць - year: Рік + second: "Секунда" + minute: "Хвилина" + hour: "Година" + day: "День" + month: "Місяць" + year: "Рік" + errors: format: "%{attribute} %{message}" messages: - accepted: має бути прийнятий - blank: не може бути пустим - confirmation: не збігається з підтвердженням - empty: не може бути порожнім - equal_to: має дорівнювати %{count} - even: має бути парним - exclusion: зарезервовано - greater_than: має бути більше ніж %{count} - greater_than_or_equal_to: має бути більше ніж або дорівнювати %{count} - inclusion: не включено до переліку - invalid: недійсний - less_than: має бути менше ніж %{count} - less_than_or_equal_to: має бути менше ніж або дорівнювати %{count} - model_invalid: 'Виникли помилки: %{errors}' - not_a_number: не число - not_an_integer: не є цілим числом - odd: має бути непарним - other_than: має відрізнятись від %{count} - present: має бути пустим - required: не може бути порожнім - taken: вже зайнятий + accepted: "може бути прийнятим" + blank: "не може бути порожнім" + confirmation: "не збігається з підтвердженням" + empty: "не може бути порожнім" + equal_to: "мусить дорівнювати %{count}" + even: "мусить бути парним" + exclusion: "є зарезервованим" + greater_than: "мусить бути більше ніж %{count}" + greater_than_or_equal_to: "мусить бути більше ніж або дорівнювати %{count}" + in: "має бути в %{count}" + inclusion: "не є включеним до переліку" + invalid: "не є дійсним" + less_than: "мусить бути менше ніж %{count}" + less_than_or_equal_to: "мусить бути менше ніж або дорівнювати %{count}" + model_invalid: "Виникли помилки: %{errors}" + not_a_number: "не є числом" + not_an_integer: "не є цілим числом" + odd: "мусить бути непарним" + other_than: "мусить відрізнятись від %{count}" + present: "мусить бути пустим" + required: "не може бути порожнім" + taken: "вже є зайнятим" too_long: - one: занадто довгий (максимум %{count} знак) - few: занадто довгий (максимум %{count} знаки) - many: занадто довгий (максимум %{count} знаків) - other: занадто довгий (максимум %{count} знаку) + one: "є занадто довгим (максимум %{count} знак)" + few: "є занадто довгим (максимум %{count} знаки)" + many: "є занадто довгим (максимум %{count} знаків)" + other: "є занадто довгим (максимум %{count} знаків)" too_short: - one: занадто короткий (мінімум %{count} знак) - few: занадто короткий (мінімум %{count} знаки) - many: занадто короткий (мінімум %{count} знаків) - other: занадто короткий (мінімум %{count} знаку) + one: "є занадто коротким (мінімум %{count} знак)" + few: "є занадто коротким (мінімум %{count} знаки)" + many: "є занадто коротким (мінімум %{count} знаків)" + other: "є занадто коротким (мінімум %{count} знаків)" wrong_length: - one: неправильна довжина (має бути %{count} знак) - few: неправильна довжина (має бути %{count} знаки) - many: неправильна довжина (має бути %{count} знаків) - other: неправильна довжина (має бути %{count} знаку) + one: "неправильна довжина (має бути %{count} знак)" + few: "неправильна довжина (має бути %{count} знаки)" + many: "неправильна довжина (має бути %{count} знаків)" + other: "неправильна довжина (має бути %{count} знаків)" template: - body: 'Помилки виявлено в таких полях:' + body: "Помилки виявлено в таких полях:" header: one: "%{model} не збережено через %{count} помилку" few: "%{model} не збережено через %{count} помилки" many: "%{model} не збережено через %{count} помилок" - other: "%{model} не збережено через %{count} помилки" + other: "%{model} не збережено через %{count} помилок" helpers: select: - prompt: 'Оберіть: ' + prompt: "Оберіть: " submit: - create: Створити %{model} - submit: Зберегти %{model} - update: Зберегти %{model} + create: "Створити %{model}" + submit: "Зберегти %{model}" + update: "Зберегти %{model}" number: currency: format: @@ -554,7 +879,7 @@ uk: separator: "," significant: false strip_insignificant_zeros: false - unit: грн. + unit: "грн" format: delimiter: " " precision: 3 @@ -566,33 +891,33 @@ uk: format: "%n %u" units: billion: - one: Мільярд - few: Мільярдів - many: Мільярдів - other: Мільярдів + one: "Мільярд" + few: "Мільярдів" + many: "Мільярдів" + other: "Мільярдів" million: - one: Мільйон - few: Мільйонів - many: Мільйонів - other: Мільйонів + one: "Мільйон" + few: "Мільйонів" + many: "Мільйонів" + other: "Мільйонів" quadrillion: - one: Квадрильйон - few: Квадрильйонів - many: Квадрильйонів - other: Квадрильйонів + one: "Квадрильйон" + few: "Квадрильйонів" + many: "Квадрильйонів" + other: "Квадрильйонів" thousand: - one: Тисяча - few: Тисяч - many: Тисяч - other: Тисяч + one: "Тисяча" + few: "Тисяч" + many: "Тисяч" + other: "Тисяч" trillion: - one: Трильйон - few: Трильйонів - many: Трильйонів - other: Трильйонів - unit: '' + one: "Трильйон" + few: "Трильйонів" + many: "Трильйонів" + other: "Трильйонів" + unit: "" format: - delimiter: '' + delimiter: "" precision: 1 significant: false strip_insignificant_zeros: false @@ -600,29 +925,31 @@ uk: format: "%n %u" units: byte: - one: байт - few: байти - many: байтів - other: байту - gb: ГБ - kb: кБ - mb: МБ - tb: ТБ + one: "байт" + few: "байти" + many: "байтів" + other: "байтів" + eb: "ЕБ" + gb: "ГБ" + kb: "кБ" + mb: "МБ" + pb: "ПБ" + tb: "ТБ" percentage: format: - delimiter: '' + delimiter: "" precision: format: - delimiter: '' + delimiter: "" support: array: last_word_connector: " та " two_words_connector: " і " words_connector: ", " time: - am: до полудня + am: "до полудня" formats: default: "%a, %d %b %Y, %H:%M:%S %z" long: "%d %B %Y, %H:%M" short: "%d %b, %H:%M" - pm: по полудні + pm: "пополудні" diff --git a/config/routes.rb b/config/routes.rb index 30d095228..7de991fc5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,24 +6,34 @@ # authenticate :user do # mount Sidekiq::Web => 'admins/sidekiq' # end - mount Sidekiq::Web => "/sidekiq" - devise_for :users, only: :omniauth_callbacks, - controllers: { omniauth_callbacks: - "users/omniauth_callbacks" } + # devise_for :users, only: :omniauth_callbacks, + # controllers: { omniauth_callbacks: + # "users/omniauth_callbacks" } get "/", to: "application#redirection", as: :root_redirection + concern :paginatable do + get "(page/:page)", action: :index, on: :collection + end + scope "/(:locale)", locale: /uk|en/ do - devise_for :users, controllers: { registrations: "users/registrations" }, - skip: :omniauth_callbacks + devise_for :users, only: [:session] + # devise_for :users, skip: [:omniauth_callbacks, :registration] + + # as :user do + # get :sign_up, to: "users/registrations#new", as: :new_user_registration + # post :sign_up, to: "users/registrations#create", as: :user_registration + # end root "home#index" + get "/sitemap", to: "sitemap#index" get "/calculator", to: "calculators#calculator" post "/receive_recomendations", to: "calculators#receive_recomendations" - get "/about_us", to: redirect("/about_us.html") + + get "about-us", to: "home#about", as: "about" resources :calculators, only: [:index, :show], param: :slug do member do @@ -32,13 +42,27 @@ end resources :messages, only: [:new, :create] namespace :account do - resources :users, only: [:index, :show, :edit, :update] - resources :calculators, param: :slug - resources :categories - resources :histories, only: :index - resources :messages, only: [:index, :show] - resource :app_config, only: [:edit, :update] - resource :site_setting, only: [:edit, :update] + root "dashboard#index" + resources :users, concerns: :paginatable + resources :calculators, param: :slug, concerns: :paginatable + resources :categories, concerns: :paginatable + resources :products, concerns: :paginatable + resources :histories, only: :index, concerns: :paginatable + resources :messages, only: [:index, :show], concerns: :paginatable + patch "/feature_flags", to: "feature_flags#update", as: "features_flags" + + resource :site_setting, only: [:edit, :update] do + put :revert + end + + resources :diapers_periods + + namespace :diapers_periods do + resources :categories, only: [:destroy] do + get :with_periods, on: :collection + get :available, on: :collection + end + end scope module: :calculators do resources :calculators, only: [], param: :slug do @@ -52,7 +76,8 @@ resources :calculators, only: [] do post :compute, on: :member end - resource :diaper_calculators, only: [:create] + post "/diaper_calculators", + to: "diaper_calculators#calculate" end namespace :v2 do resources :calculators, only: [] do diff --git a/config/storage.yml b/config/storage.yml index d32f76e8f..ea05e08a0 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -6,6 +6,10 @@ local: service: Disk root: <%= Rails.root.join("storage") %> +render: + service: Disk + root: "/opt/activestorage-data" + # Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) # amazon: # service: S3 diff --git a/config/tailwind.config.js b/config/tailwind.config.js new file mode 100644 index 000000000..50f4af088 --- /dev/null +++ b/config/tailwind.config.js @@ -0,0 +1,40 @@ +const defaultTheme = require('tailwindcss/defaultTheme') + +module.exports = { + content: [ + './public/*.html', + './app/helpers/**/*.rb', + './app/javascript/**/*.js', + './app/views/**/*.erb' + ], + theme: { + extend: { + fontFamily: { + sans: ['Comfortaa', ...defaultTheme.fontFamily.sans], + }, + colors: { + success: '#8fba3b', + color: '#fff', + error: '#9e1503', + gray: '#8d8d8d', + matte_lime_green: '#73952f', + light_gray: '#ececec', + grey: '#999999', + dark_gray: '#515151', + dark_green: '#256d36', + white: '#ffffff', + blue: '#007bff', + dark_blue: '#0069d9', + }, + minWidth: { + '36': '36px', + }, + }, + }, + plugins: [ + require('@tailwindcss/forms'), + require('@tailwindcss/aspect-ratio'), + require('@tailwindcss/typography'), + require('@tailwindcss/container-queries'), + ] +} diff --git a/config/webpack/development.js b/config/webpack/development.js deleted file mode 100644 index 08a36772d..000000000 --- a/config/webpack/development.js +++ /dev/null @@ -1,7 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'development' - -const environment = require('./environment') - -const config = environment.toWebpackConfig() -config.output.filename = "js/[name]-[hash].js" -module.exports = config diff --git a/config/webpack/environment.js b/config/webpack/environment.js deleted file mode 100644 index 44f33e1a0..000000000 --- a/config/webpack/environment.js +++ /dev/null @@ -1,10 +0,0 @@ -const { environment } = require('@rails/webpacker') -const webpack = require('webpack') -environment.plugins.prepend('Provide', - new webpack.ProvidePlugin({ - $: 'jquery/src/jquery', - jQuery: 'jquery/src/jquery' - }) -) - -module.exports = environment diff --git a/config/webpack/production.js b/config/webpack/production.js deleted file mode 100644 index be0f53aac..000000000 --- a/config/webpack/production.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'production' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/config/webpack/staging.js b/config/webpack/staging.js deleted file mode 100644 index be0f53aac..000000000 --- a/config/webpack/staging.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'production' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/config/webpack/test.js b/config/webpack/test.js deleted file mode 100644 index c5edff94a..000000000 --- a/config/webpack/test.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'development' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/config/webpack/uat.js b/config/webpack/uat.js deleted file mode 100644 index be0f53aac..000000000 --- a/config/webpack/uat.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'production' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/config/webpacker.yml b/config/webpacker.yml deleted file mode 100644 index 71dacadad..000000000 --- a/config/webpacker.yml +++ /dev/null @@ -1,93 +0,0 @@ -# Note: You must restart bin/webpack-dev-server for changes to take effect - -default: &default - source_path: app/javascript - source_entry_path: packs - public_root_path: public - public_output_path: packs - cache_path: tmp/cache/webpacker - webpack_compile_output: true - resolved_paths: [] - - # Additional paths webpack should lookup modules - # ['app/assets', 'engine/foo/app/assets'] - additional_paths: ['app/javascript/images'] - - # Reload manifest.json on all requests so we reload latest compiled packs - cache_manifest: false - - # Extract and emit a css file - extract_css: false - - static_assets_extensions: - - .jpg - - .jpeg - - .png - - .gif - - .tiff - - .ico - - .svg - - .eot - - .otf - - .ttf - - .woff - - .woff2 - - extensions: - - .mjs - - .js - - .sass - - .scss - - .css - - .module.sass - - .module.scss - - .module.css - - .png - - .svg - - .gif - - .jpeg - - .jpg - -development: - <<: *default - compile: true - - # Reference: https://webpack.js.org/configuration/dev-server/ - dev_server: - https: false - host: localhost - port: 3035 - public: localhost:3035 - hmr: false - # Inline should be set to true if using HMR - inline: true - overlay: true - compress: true - disable_host_check: true - use_local_ip: false - quiet: false - pretty: false - headers: - 'Access-Control-Allow-Origin': '*' - watch_options: - ignored: '**/node_modules/**' - - -test: - <<: *default - compile: true - - # Compile test packs to a separate directory - public_output_path: packs-test - -production: - <<: *default - - # Production depends on precompilation of packs prior to booting for performance. - compile: false - - # Extract and emit a css file - extract_css: true - - # Cache manifest.json for performance - cache_manifest: true diff --git a/test/controllers/.keep b/db/backups/.keep similarity index 100% rename from test/controllers/.keep rename to db/backups/.keep diff --git a/test/fixtures/files/.keep b/db/backups/archive/.keep similarity index 100% rename from test/fixtures/files/.keep rename to db/backups/archive/.keep diff --git a/db/migrate/20210123171144_create_versions.rb b/db/migrate/20210123171144_create_versions.rb index 984f4985c..a27708b2d 100644 --- a/db/migrate/20210123171144_create_versions.rb +++ b/db/migrate/20210123171144_create_versions.rb @@ -1,6 +1,6 @@ # This migration creates the `versions` table, the only schema PT requires. # All other migrations PT provides are optional. -class CreateVersions < ActiveRecord::Migration[6.1] +class CreateVersions < ActiveRecord::Migration[7.1] # The largest text column available in all supported RDBMS is # 1024^3 - 1 bytes, roughly one gibibyte. We specify a size # so that MySQL will use `longtext` instead of `text`. Otherwise, diff --git a/db/migrate/20210408145903_create_fields.rb b/db/migrate/20210408145903_create_fields.rb index d397850ad..9c357f747 100644 --- a/db/migrate/20210408145903_create_fields.rb +++ b/db/migrate/20210408145903_create_fields.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreateFields < ActiveRecord::Migration[6.1] +class CreateFields < ActiveRecord::Migration[7.1] def change create_table :fields do |t| t.uuid :uuid, null: false diff --git a/db/migrate/20210409131859_create_calculators.rb b/db/migrate/20210409131859_create_calculators.rb index 3acbf4692..6195f5b6d 100644 --- a/db/migrate/20210409131859_create_calculators.rb +++ b/db/migrate/20210409131859_create_calculators.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreateCalculators < ActiveRecord::Migration[6.1] +class CreateCalculators < ActiveRecord::Migration[7.1] def change create_table :calculators do |t| t.uuid :uuid, null: false diff --git a/db/migrate/20210409171311_create_product_types.rb b/db/migrate/20210409171311_create_product_types.rb index 78bf552ce..59861670b 100644 --- a/db/migrate/20210409171311_create_product_types.rb +++ b/db/migrate/20210409171311_create_product_types.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreateProductTypes < ActiveRecord::Migration[6.1] +class CreateProductTypes < ActiveRecord::Migration[7.1] def change create_table :product_types do |t| t.uuid :uuid, null: false diff --git a/db/migrate/20210409175743_create_products.rb b/db/migrate/20210409175743_create_products.rb index 8c3918fb1..a22f50d7d 100644 --- a/db/migrate/20210409175743_create_products.rb +++ b/db/migrate/20210409175743_create_products.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreateProducts < ActiveRecord::Migration[6.1] +class CreateProducts < ActiveRecord::Migration[7.1] def change create_table :products do |t| t.uuid :uuid diff --git a/db/migrate/20210412104001_add_uuidchecking_to_products.rb b/db/migrate/20210412104001_add_uuidchecking_to_products.rb index df9cde5f4..9f2350da7 100644 --- a/db/migrate/20210412104001_add_uuidchecking_to_products.rb +++ b/db/migrate/20210412104001_add_uuidchecking_to_products.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddUuidcheckingToProducts < ActiveRecord::Migration[6.1] +class AddUuidcheckingToProducts < ActiveRecord::Migration[7.1] def change change_column_null :products, :uuid, false end diff --git a/db/migrate/20210413203204_change_uuid_default_in_fields.rb b/db/migrate/20210413203204_change_uuid_default_in_fields.rb index 28e41b423..8ed49bbb6 100644 --- a/db/migrate/20210413203204_change_uuid_default_in_fields.rb +++ b/db/migrate/20210413203204_change_uuid_default_in_fields.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class ChangeUuidDefaultInFields < ActiveRecord::Migration[6.1] +class ChangeUuidDefaultInFields < ActiveRecord::Migration[7.1] enable_extension "pgcrypto" unless extension_enabled?("pgcrypto") def up diff --git a/db/migrate/20210413203226_change_uuid_default_in_calculators.rb b/db/migrate/20210413203226_change_uuid_default_in_calculators.rb index 6c12617f6..90cc7eefa 100644 --- a/db/migrate/20210413203226_change_uuid_default_in_calculators.rb +++ b/db/migrate/20210413203226_change_uuid_default_in_calculators.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class ChangeUuidDefaultInCalculators < ActiveRecord::Migration[6.1] +class ChangeUuidDefaultInCalculators < ActiveRecord::Migration[7.1] enable_extension "pgcrypto" unless extension_enabled?("pgcrypto") def up diff --git a/db/migrate/20210413203250_change_uuid_default_in_product_types.rb b/db/migrate/20210413203250_change_uuid_default_in_product_types.rb index 52e896bab..93ff91ad2 100644 --- a/db/migrate/20210413203250_change_uuid_default_in_product_types.rb +++ b/db/migrate/20210413203250_change_uuid_default_in_product_types.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class ChangeUuidDefaultInProductTypes < ActiveRecord::Migration[6.1] +class ChangeUuidDefaultInProductTypes < ActiveRecord::Migration[7.1] enable_extension "pgcrypto" unless extension_enabled?("pgcrypto") def up diff --git a/db/migrate/20210413203301_change_uuid_default_in_products.rb b/db/migrate/20210413203301_change_uuid_default_in_products.rb index 88c8a5ccf..7d40198fb 100644 --- a/db/migrate/20210413203301_change_uuid_default_in_products.rb +++ b/db/migrate/20210413203301_change_uuid_default_in_products.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class ChangeUuidDefaultInProducts < ActiveRecord::Migration[6.1] +class ChangeUuidDefaultInProducts < ActiveRecord::Migration[7.1] enable_extension "pgcrypto" unless extension_enabled?("pgcrypto") def up diff --git a/db/migrate/20210422194341_add_slug_to_calculators.rb b/db/migrate/20210422194341_add_slug_to_calculators.rb index 04fbef040..f8b32a981 100644 --- a/db/migrate/20210422194341_add_slug_to_calculators.rb +++ b/db/migrate/20210422194341_add_slug_to_calculators.rb @@ -1,4 +1,4 @@ -class AddSlugToCalculators < ActiveRecord::Migration[6.1] +class AddSlugToCalculators < ActiveRecord::Migration[7.1] def change add_column :calculators, :slug, :string add_index :calculators, :slug, unique: true diff --git a/db/migrate/20210426125453_devise_create_users.rb b/db/migrate/20210426125453_devise_create_users.rb index 1300082fa..e1584133a 100644 --- a/db/migrate/20210426125453_devise_create_users.rb +++ b/db/migrate/20210426125453_devise_create_users.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class DeviseCreateUsers < ActiveRecord::Migration[6.1] +class DeviseCreateUsers < ActiveRecord::Migration[7.1] def change create_table :users do |t| ## Database authenticatable diff --git a/db/migrate/20210426195530_remove_unit_from_fields.rb b/db/migrate/20210426195530_remove_unit_from_fields.rb index f95c748db..8d90fac72 100644 --- a/db/migrate/20210426195530_remove_unit_from_fields.rb +++ b/db/migrate/20210426195530_remove_unit_from_fields.rb @@ -1,4 +1,4 @@ -class RemoveUnitFromFields < ActiveRecord::Migration[6.1] +class RemoveUnitFromFields < ActiveRecord::Migration[7.1] def change remove_column :fields, :unit, :string end diff --git a/db/migrate/20210426195743_add_unit_to_fields.rb b/db/migrate/20210426195743_add_unit_to_fields.rb index 962e1c587..90b0d6984 100644 --- a/db/migrate/20210426195743_add_unit_to_fields.rb +++ b/db/migrate/20210426195743_add_unit_to_fields.rb @@ -1,4 +1,4 @@ -class AddUnitToFields < ActiveRecord::Migration[6.1] +class AddUnitToFields < ActiveRecord::Migration[7.1] def change add_column :fields, :unit, :integer, default: 0 end diff --git a/db/migrate/20210426201823_change_product_types.rb b/db/migrate/20210426201823_change_product_types.rb index 7723def9c..0cc3adb52 100644 --- a/db/migrate/20210426201823_change_product_types.rb +++ b/db/migrate/20210426201823_change_product_types.rb @@ -1,11 +1,18 @@ -class ChangeProductTypes < ActiveRecord::Migration[6.1] +class ChangeProductTypes < ActiveRecord::Migration[7.1] def up ProductType.create(title: "Diapers") ProductType.create(title: "Menstrual hygiene") end def down + create_table :prices do |t| + t.references :priceable, polymorphic: true + t.timestamps + end + ProductType.destroy_by(title: "Diapers") ProductType.destroy_by(title: "Menstrual hygiene") + + drop_table :prices end end diff --git a/db/migrate/20210428101446_change_products.rb b/db/migrate/20210428101446_change_products.rb index b3bbbc6ed..b689e8a81 100644 --- a/db/migrate/20210428101446_change_products.rb +++ b/db/migrate/20210428101446_change_products.rb @@ -1,9 +1,17 @@ -class ChangeProducts < ActiveRecord::Migration[6.1] +class ChangeProducts < ActiveRecord::Migration[7.1] def up ProductType.find_by(title: "Diapers").products.create([{ title: "Diapers" }, { title: "Reusable diapers" }]) end def down - ProductType.find_by(title: "Diapers").products.destroy_all + create_table :prices do |t| + t.references :priceable, polymorphic: true + t.timestamps + end + + products = ProductType.find_by(title: "Diapers") + products&.destroy_all + + drop_table :prices end end diff --git a/db/migrate/20210505150039_add_name_to_users.rb b/db/migrate/20210505150039_add_name_to_users.rb index b58d231b8..c076e8a6b 100644 --- a/db/migrate/20210505150039_add_name_to_users.rb +++ b/db/migrate/20210505150039_add_name_to_users.rb @@ -1,4 +1,4 @@ -class AddNameToUsers < ActiveRecord::Migration[6.1] +class AddNameToUsers < ActiveRecord::Migration[7.1] def change change_table :users, bulk: true do |t| t.string :first_name diff --git a/db/migrate/20210505150846_add_countries_to_users.rb b/db/migrate/20210505150846_add_countries_to_users.rb index 3a1d38e6a..b7818ec8e 100644 --- a/db/migrate/20210505150846_add_countries_to_users.rb +++ b/db/migrate/20210505150846_add_countries_to_users.rb @@ -1,4 +1,4 @@ -class AddCountriesToUsers < ActiveRecord::Migration[6.1] +class AddCountriesToUsers < ActiveRecord::Migration[7.1] def change add_column :users, :country, :string end diff --git a/db/migrate/20210510205349_add_last_visit_to_users.rb b/db/migrate/20210510205349_add_last_visit_to_users.rb index d05adb539..154f58520 100644 --- a/db/migrate/20210510205349_add_last_visit_to_users.rb +++ b/db/migrate/20210510205349_add_last_visit_to_users.rb @@ -1,4 +1,4 @@ -class AddLastVisitToUsers < ActiveRecord::Migration[6.1] +class AddLastVisitToUsers < ActiveRecord::Migration[7.1] def change change_table :users, bulk: true do |t| t.integer :sign_in_count, default: 0, null: false diff --git a/db/migrate/20210513165126_devise_create_admins.rb b/db/migrate/20210513165126_devise_create_admins.rb index 001fc8cd9..b07aa34b4 100644 --- a/db/migrate/20210513165126_devise_create_admins.rb +++ b/db/migrate/20210513165126_devise_create_admins.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class DeviseCreateAdmins < ActiveRecord::Migration[6.1] +class DeviseCreateAdmins < ActiveRecord::Migration[7.1] def change create_table :admins do |t| ## Database authenticatable diff --git a/db/migrate/20210524103702_change_calculators.rb b/db/migrate/20210524103702_change_calculators.rb index 122dfd473..d62d17ac9 100644 --- a/db/migrate/20210524103702_change_calculators.rb +++ b/db/migrate/20210524103702_change_calculators.rb @@ -1,2 +1,2 @@ -class ChangeCalculators < ActiveRecord::Migration[6.1] +class ChangeCalculators < ActiveRecord::Migration[7.1] end diff --git a/db/migrate/20210923171630_add_omniauth_to_users.rb b/db/migrate/20210923171630_add_omniauth_to_users.rb index ac7f980e3..e1fab82e8 100644 --- a/db/migrate/20210923171630_add_omniauth_to_users.rb +++ b/db/migrate/20210923171630_add_omniauth_to_users.rb @@ -1,4 +1,4 @@ -class AddOmniauthToUsers < ActiveRecord::Migration[6.1] +class AddOmniauthToUsers < ActiveRecord::Migration[7.1] def change change_table :users, bulk: true do |t| t.string :provider diff --git a/db/migrate/20211205153832_add_blocked_to_users.rb b/db/migrate/20211205153832_add_blocked_to_users.rb index 0b88ebadf..a83b7e588 100644 --- a/db/migrate/20211205153832_add_blocked_to_users.rb +++ b/db/migrate/20211205153832_add_blocked_to_users.rb @@ -1,4 +1,4 @@ -class AddBlockedToUsers < ActiveRecord::Migration[6.1] +class AddBlockedToUsers < ActiveRecord::Migration[7.1] def change add_column :users, :blocked, :boolean, default: false end diff --git a/db/migrate/20220103151017_remove_not_null_from_fields_label.rb b/db/migrate/20220103151017_remove_not_null_from_fields_label.rb index 4e06867b6..12555fa32 100644 --- a/db/migrate/20220103151017_remove_not_null_from_fields_label.rb +++ b/db/migrate/20220103151017_remove_not_null_from_fields_label.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class RemoveNotNullFromFieldsLabel < ActiveRecord::Migration[6.1] +class RemoveNotNullFromFieldsLabel < ActiveRecord::Migration[7.1] def change change_column_null :fields, :label, true end diff --git a/db/migrate/20220107214301_add_fields_to_calculators.rb b/db/migrate/20220107214301_add_fields_to_calculators.rb index f71226c0d..4d4661b9b 100644 --- a/db/migrate/20220107214301_add_fields_to_calculators.rb +++ b/db/migrate/20220107214301_add_fields_to_calculators.rb @@ -1,4 +1,4 @@ -class AddFieldsToCalculators < ActiveRecord::Migration[6.1] +class AddFieldsToCalculators < ActiveRecord::Migration[7.1] def change add_column :calculators, :preferable, :boolean, default: false end diff --git a/db/migrate/20220122174636_add_contact_form.rb b/db/migrate/20220122174636_add_contact_form.rb index 24a5c2b52..99db6f144 100644 --- a/db/migrate/20220122174636_add_contact_form.rb +++ b/db/migrate/20220122174636_add_contact_form.rb @@ -1,4 +1,4 @@ -class AddContactForm < ActiveRecord::Migration[6.1] +class AddContactForm < ActiveRecord::Migration[7.1] def change create_table :messages do |t| t.string :title, null: false diff --git a/db/migrate/20220123171234_add_object_changes_to_versions.rb b/db/migrate/20220123171234_add_object_changes_to_versions.rb index 5aaea5141..e2b92a6c0 100644 --- a/db/migrate/20220123171234_add_object_changes_to_versions.rb +++ b/db/migrate/20220123171234_add_object_changes_to_versions.rb @@ -1,4 +1,4 @@ -class AddObjectChangesToVersions < ActiveRecord::Migration[6.1] +class AddObjectChangesToVersions < ActiveRecord::Migration[7.1] def change add_column :versions, :object_changes, :text end diff --git a/db/migrate/20220427131142_drop_admin.rb b/db/migrate/20220427131142_drop_admin.rb index 3486832d4..f27dcdd4b 100644 --- a/db/migrate/20220427131142_drop_admin.rb +++ b/db/migrate/20220427131142_drop_admin.rb @@ -1,4 +1,4 @@ -class DropAdmin < ActiveRecord::Migration[6.1] +class DropAdmin < ActiveRecord::Migration[7.1] def change drop_table :admins do |t| t.string "email", default: "", null: false diff --git a/db/migrate/20220427131337_add_role_to_user.rb b/db/migrate/20220427131337_add_role_to_user.rb index ed5603c8b..d88f7d135 100644 --- a/db/migrate/20220427131337_add_role_to_user.rb +++ b/db/migrate/20220427131337_add_role_to_user.rb @@ -1,4 +1,4 @@ -class AddRoleToUser < ActiveRecord::Migration[6.1] +class AddRoleToUser < ActiveRecord::Migration[7.1] def change add_column :users, :role, :integer, default: 0 end diff --git a/db/migrate/20220512064155_create_app_config.rb b/db/migrate/20220512064155_create_app_config.rb index 847c24b93..bfcfbbd25 100644 --- a/db/migrate/20220512064155_create_app_config.rb +++ b/db/migrate/20220512064155_create_app_config.rb @@ -1,4 +1,4 @@ -class CreateAppConfig < ActiveRecord::Migration[6.1] +class CreateAppConfig < ActiveRecord::Migration[7.1] def change create_table :app_configs do |t| t.jsonb :diapers_calculator, default: {} diff --git a/db/migrate/20220512070236_init_app_config.rb b/db/migrate/20220512070236_init_app_config.rb index 763842035..1e6e989bb 100644 --- a/db/migrate/20220512070236_init_app_config.rb +++ b/db/migrate/20220512070236_init_app_config.rb @@ -1,42 +1,42 @@ -class InitAppConfig < ActiveRecord::Migration[6.1] +class InitAppConfig < ActiveRecord::Migration[7.1] def up - config = AppConfig.instance - config.diapers_calculator = { - (1..3) => { - amount: 10, - price: 4 - }, - (4..6) => { - amount: 8, - price: 4.5 - }, - (7..9) => { - amount: 6, - price: 5 - }, - (10..12) => { - amount: 6, - price: 5.5 - }, - (13..18) => { - amount: 4, - price: 5.5 - }, - (19..24) => { - amount: 4, - price: 6 - }, - (25..30) => { - amount: 2, - price: 6 - } - } - config.save + # config = AppConfig.instance + # config.diapers_calculator = { + # (1..3) => { + # amount: 10, + # price: 4 + # }, + # (4..6) => { + # amount: 8, + # price: 4.5 + # }, + # (7..9) => { + # amount: 6, + # price: 5 + # }, + # (10..12) => { + # amount: 6, + # price: 5.5 + # }, + # (13..18) => { + # amount: 4, + # price: 5.5 + # }, + # (19..24) => { + # amount: 4, + # price: 6 + # }, + # (25..30) => { + # amount: 2, + # price: 6 + # } + # } + # config.save end def down - config = AppConfig.instance - config.diapers_calculator = {} - config.save + # config = AppConfig.instance + # config.diapers_calculator = {} + # config.save end end diff --git a/db/migrate/20220728162718_create_product_prices.rb b/db/migrate/20220728162718_create_product_prices.rb index 61ba6ab21..2625ae952 100644 --- a/db/migrate/20220728162718_create_product_prices.rb +++ b/db/migrate/20220728162718_create_product_prices.rb @@ -1,4 +1,4 @@ -class CreateProductPrices < ActiveRecord::Migration[6.1] +class CreateProductPrices < ActiveRecord::Migration[7.1] def change create_table :product_prices do |t| t.uuid :uuid, default: -> { "gen_random_uuid()" }, null: false diff --git a/db/migrate/20220808110227_create_feature_flags.rb b/db/migrate/20220808110227_create_feature_flags.rb index ad9dddb51..0da57fe90 100644 --- a/db/migrate/20220808110227_create_feature_flags.rb +++ b/db/migrate/20220808110227_create_feature_flags.rb @@ -1,4 +1,4 @@ -class CreateFeatureFlags < ActiveRecord::Migration[6.1] +class CreateFeatureFlags < ActiveRecord::Migration[7.1] def change create_table :feature_flags do |t| t.string :name, null: false, index: { unique: true } diff --git a/db/migrate/20221024174044_fix_calculator_creation.rb b/db/migrate/20221024174044_fix_calculator_creation.rb index cef6974a5..94db0e5bd 100644 --- a/db/migrate/20221024174044_fix_calculator_creation.rb +++ b/db/migrate/20221024174044_fix_calculator_creation.rb @@ -1,4 +1,4 @@ -class FixCalculatorCreation < ActiveRecord::Migration[6.1] +class FixCalculatorCreation < ActiveRecord::Migration[7.1] def up Calculator.create(name: "Diapers Calculator") end diff --git a/db/migrate/20221026072654_fix_missed_column_receive_recomndations_to_users.rb b/db/migrate/20221026072654_fix_missed_column_receive_recomndations_to_users.rb index 5ee50a7dd..ddee19095 100644 --- a/db/migrate/20221026072654_fix_missed_column_receive_recomndations_to_users.rb +++ b/db/migrate/20221026072654_fix_missed_column_receive_recomndations_to_users.rb @@ -1,4 +1,4 @@ -class FixMissedColumnReceiveRecomndationsToUsers < ActiveRecord::Migration[6.1] +class FixMissedColumnReceiveRecomndationsToUsers < ActiveRecord::Migration[7.1] def change add_column :users, :receive_recomendations, :boolean, default: false end diff --git a/db/migrate/20221111144449_change_category_from_integer_to_string.rb b/db/migrate/20221111144449_change_category_from_integer_to_string.rb index 8b95f8a1a..cde124449 100644 --- a/db/migrate/20221111144449_change_category_from_integer_to_string.rb +++ b/db/migrate/20221111144449_change_category_from_integer_to_string.rb @@ -1,9 +1,9 @@ -class ChangeCategoryFromIntegerToString < ActiveRecord::Migration[6.1] +class ChangeCategoryFromIntegerToString < ActiveRecord::Migration[7.1] def up change_column :product_prices, :category, :string end def down - change_column :product_prices, :category, :integer + change_column :product_prices, :category, "integer USING CAST(category AS integer)" end end diff --git a/db/migrate/20221122164401_change_price_from_float_to_decimal.rb b/db/migrate/20221122164401_change_price_from_float_to_decimal.rb index 9d30bb73f..dba924deb 100644 --- a/db/migrate/20221122164401_change_price_from_float_to_decimal.rb +++ b/db/migrate/20221122164401_change_price_from_float_to_decimal.rb @@ -1,4 +1,4 @@ -class ChangePriceFromFloatToDecimal < ActiveRecord::Migration[6.1] +class ChangePriceFromFloatToDecimal < ActiveRecord::Migration[7.1] def up change_column :product_prices, :price, :decimal, precision: 8, scale: 2 end diff --git a/db/migrate/20221124165030_add_default_to_category.rb b/db/migrate/20221124165030_add_default_to_category.rb index 6ccdb0894..098c611f2 100644 --- a/db/migrate/20221124165030_add_default_to_category.rb +++ b/db/migrate/20221124165030_add_default_to_category.rb @@ -1,4 +1,4 @@ -class AddDefaultToCategory < ActiveRecord::Migration[6.1] +class AddDefaultToCategory < ActiveRecord::Migration[7.1] def up change_column :product_prices, :category, :string, null: false, default: "medium" end diff --git a/db/migrate/20221210110826_create_prices.rb b/db/migrate/20221210110826_create_prices.rb index 4f554e51f..0a0f342ae 100644 --- a/db/migrate/20221210110826_create_prices.rb +++ b/db/migrate/20221210110826_create_prices.rb @@ -1,4 +1,4 @@ -class CreatePrices < ActiveRecord::Migration[6.1] +class CreatePrices < ActiveRecord::Migration[7.1] def change create_table :prices do |t| t.decimal :sum, precision: 8, scale: 2 diff --git a/db/migrate/20221210112507_create_categories.rb b/db/migrate/20221210112507_create_categories.rb index c0aa1b676..3f8871af1 100644 --- a/db/migrate/20221210112507_create_categories.rb +++ b/db/migrate/20221210112507_create_categories.rb @@ -1,4 +1,4 @@ -class CreateCategories < ActiveRecord::Migration[6.1] +class CreateCategories < ActiveRecord::Migration[7.1] def change create_table :categories do |t| t.string :name diff --git a/db/migrate/20221210114001_drop_product_prices.rb b/db/migrate/20221210114001_drop_product_prices.rb index 5fb853ab6..3b77cfd53 100644 --- a/db/migrate/20221210114001_drop_product_prices.rb +++ b/db/migrate/20221210114001_drop_product_prices.rb @@ -1,4 +1,4 @@ -class DropProductPrices < ActiveRecord::Migration[6.1] +class DropProductPrices < ActiveRecord::Migration[7.1] def change drop_table :product_prices do |t| t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false diff --git a/db/migrate/20221210114531_create_join_table_category_categoryables.rb b/db/migrate/20221210114531_create_join_table_category_categoryables.rb index 3fe9977fc..9263ab8bc 100644 --- a/db/migrate/20221210114531_create_join_table_category_categoryables.rb +++ b/db/migrate/20221210114531_create_join_table_category_categoryables.rb @@ -1,4 +1,4 @@ -class CreateJoinTableCategoryCategoryables < ActiveRecord::Migration[6.1] +class CreateJoinTableCategoryCategoryables < ActiveRecord::Migration[7.1] def change create_table :category_categoryables do |t| t.references :category, index: true, foreign_key: true diff --git a/db/migrate/20221213215638_add_uniq_index_to_calculators_name.rb b/db/migrate/20221213215638_add_uniq_index_to_calculators_name.rb index 7acad541e..7f1ee18d1 100644 --- a/db/migrate/20221213215638_add_uniq_index_to_calculators_name.rb +++ b/db/migrate/20221213215638_add_uniq_index_to_calculators_name.rb @@ -1,4 +1,4 @@ -class AddUniqIndexToCalculatorsName < ActiveRecord::Migration[6.1] +class AddUniqIndexToCalculatorsName < ActiveRecord::Migration[7.1] def change add_index :calculators, :name, unique: true end diff --git a/db/migrate/20221218110600_add_index_for_price.rb b/db/migrate/20221218110600_add_index_for_price.rb index d89995480..1e25ca235 100644 --- a/db/migrate/20221218110600_add_index_for_price.rb +++ b/db/migrate/20221218110600_add_index_for_price.rb @@ -1,4 +1,4 @@ -class AddIndexForPrice < ActiveRecord::Migration[6.1] +class AddIndexForPrice < ActiveRecord::Migration[7.1] def change add_index :prices, [:category_id, :priceable_id, :priceable_type], unique: true end diff --git a/db/migrate/20221220124102_create_site_settings.rb b/db/migrate/20221220124102_create_site_settings.rb index 0554d176d..cf139ad15 100644 --- a/db/migrate/20221220124102_create_site_settings.rb +++ b/db/migrate/20221220124102_create_site_settings.rb @@ -1,4 +1,4 @@ -class CreateSiteSettings < ActiveRecord::Migration[6.1] +class CreateSiteSettings < ActiveRecord::Migration[7.1] def change create_table :site_settings do |t| t.string :title diff --git a/db/migrate/20230215195330_update_diapers_calculator_values_app_config.rb b/db/migrate/20230215195330_update_diapers_calculator_values_app_config.rb index cbd954e42..4a7793c2b 100644 --- a/db/migrate/20230215195330_update_diapers_calculator_values_app_config.rb +++ b/db/migrate/20230215195330_update_diapers_calculator_values_app_config.rb @@ -1,73 +1,73 @@ -class UpdateDiapersCalculatorValuesAppConfig < ActiveRecord::Migration[6.1] +class UpdateDiapersCalculatorValuesAppConfig < ActiveRecord::Migration[7.1] def up - AppConfig.instance.tap do |ac| - ac.diapers_calculator = { - (1..3) => { - amount: 10, - price: 7.81 - }, - (4..6) => { - amount: 8, - price: 9.09 - }, - (7..9) => { - amount: 6, - price: 8.8 - }, - (10..12) => { - amount: 6, - price: 10.47 - }, - (13..18) => { - amount: 4, - price: 10.47 - }, - (19..24) => { - amount: 4, - price: 12.06 - }, - (25..30) => { - amount: 2, - price: 12.06 - } - } - ac.save - end + # AppConfig.instance.tap do |ac| + # ac.diapers_calculator = { + # (1..3) => { + # amount: 10, + # price: 7.81 + # }, + # (4..6) => { + # amount: 8, + # price: 9.09 + # }, + # (7..9) => { + # amount: 6, + # price: 8.8 + # }, + # (10..12) => { + # amount: 6, + # price: 10.47 + # }, + # (13..18) => { + # amount: 4, + # price: 10.47 + # }, + # (19..24) => { + # amount: 4, + # price: 12.06 + # }, + # (25..30) => { + # amount: 2, + # price: 12.06 + # } + # } + # ac.save + # end end def down - AppConfig.instance.tap do |ac| - ac.diapers_calculator = { - (1..3) => { - amount: 10, - price: 4 - }, - (4..6) => { - amount: 8, - price: 4.5 - }, - (7..9) => { - amount: 6, - price: 5 - }, - (10..12) => { - amount: 6, - price: 5.5 - }, - (13..18) => { - amount: 4, - price: 5.5 - }, - (19..24) => { - amount: 4, - price: 6 - }, - (25..30) => { - amount: 2, - price: 6 - } - } - ac.save - end + # AppConfig.instance.tap do |ac| + # ac.diapers_calculator = { + # (1..3) => { + # amount: 10, + # price: 4 + # }, + # (4..6) => { + # amount: 8, + # price: 4.5 + # }, + # (7..9) => { + # amount: 6, + # price: 5 + # }, + # (10..12) => { + # amount: 6, + # price: 5.5 + # }, + # (13..18) => { + # amount: 4, + # price: 5.5 + # }, + # (19..24) => { + # amount: 4, + # price: 6 + # }, + # (25..30) => { + # amount: 2, + # price: 6 + # } + # } + # ac.save + # end end end diff --git a/db/migrate/20230224135125_add_priority_to_categories.rb b/db/migrate/20230224135125_add_priority_to_categories.rb new file mode 100644 index 000000000..f96027d6c --- /dev/null +++ b/db/migrate/20230224135125_add_priority_to_categories.rb @@ -0,0 +1,5 @@ +class AddPriorityToCategories < ActiveRecord::Migration[7.1] + def change + add_column :categories, :priority, :integer, default: 0, null: false + end +end diff --git a/db/migrate/20230410153510_create_flipper_tables.rb b/db/migrate/20230410153510_create_flipper_tables.rb new file mode 100644 index 000000000..d9eee6c66 --- /dev/null +++ b/db/migrate/20230410153510_create_flipper_tables.rb @@ -0,0 +1,23 @@ +class CreateFlipperTables < ActiveRecord::Migration[7.1] + def self.up + create_table :flipper_features do |t| + t.string :key, null: false, index: { unique: true } + t.timestamps null: false + t.text :en_description + t.text :uk_description + end + + create_table :flipper_gates do |t| + t.string :feature_key, null: false + t.string :key, null: false + t.string :value + t.timestamps null: false + end + add_index :flipper_gates, [:feature_key, :key, :value], unique: true + end + + def self.down + drop_table :flipper_gates + drop_table :flipper_features + end +end diff --git a/db/migrate/20230608072323_add_an_admin_user.rb b/db/migrate/20230608072323_add_an_admin_user.rb new file mode 100644 index 000000000..5c4b4d6de --- /dev/null +++ b/db/migrate/20230608072323_add_an_admin_user.rb @@ -0,0 +1,13 @@ +class AddAnAdminUser < ActiveRecord::Migration[7.1] + def change + User.create( + email: "admin@zw.com", + password: "ChangeMe1", + password_confirmation: "ChangeMe1", + first_name: "Admin", + last_name: "Admin", + confirmed_at: DateTime.current, + role: "admin" + ) + end +end diff --git a/db/migrate/20230710212500_add_default_title_to_site_settings.rb b/db/migrate/20230710212500_add_default_title_to_site_settings.rb new file mode 100644 index 000000000..45223d86f --- /dev/null +++ b/db/migrate/20230710212500_add_default_title_to_site_settings.rb @@ -0,0 +1,11 @@ +class AddDefaultTitleToSiteSettings < ActiveRecord::Migration[7.1] + def up + change_column_default :site_settings, :title, from: nil, to: "ZeroWaste" + change_column_null :site_settings, :title, false + end + + def down + change_column_default :site_settings, :title, from: "ZeroWaste", to: nil + change_column_null :site_settings, :title, true + end +end diff --git a/db/migrate/20230917082603_add_index_to_product.rb b/db/migrate/20230917082603_add_index_to_product.rb new file mode 100644 index 000000000..112e65911 --- /dev/null +++ b/db/migrate/20230917082603_add_index_to_product.rb @@ -0,0 +1,20 @@ +class AddIndexToProduct < ActiveRecord::Migration[6.1] + def up + duplicated_titles = Product + .select(:title) + .group(:title) + .having("count(title) > 1") + .pluck(:title) + + duplicated_titles.each do |dup_title| + products = Product.where(title: dup_title) + products.map { |product| product.update(title: "#{product.title}_#{product.uuid}") } + end + + add_index :products, :title, unique: true + end + + def down + remove_index :products, :title + end +end diff --git a/db/migrate/20231019194527_change_user_attributes_null.rb b/db/migrate/20231019194527_change_user_attributes_null.rb new file mode 100644 index 000000000..29d3240bd --- /dev/null +++ b/db/migrate/20231019194527_change_user_attributes_null.rb @@ -0,0 +1,21 @@ +class ChangeUserAttributesNull < ActiveRecord::Migration[7.1] + def up + User.where(first_name: nil).each do |user| + user.update(first_name: "Firstname") + user.save(validate: false) + end + + User.where(last_name: nil).each do |user| + user.update(last_name: "Lastname") + user.save(validate: false) + end + + change_column_null :users, :first_name, false + change_column_null :users, :last_name, false + end + + def down + change_column_null :users, :first_name, true + change_column_null :users, :last_name, true + end +end diff --git a/db/migrate/20240122225503_create_diapers_periods.rb b/db/migrate/20240122225503_create_diapers_periods.rb new file mode 100644 index 000000000..4d83f2f59 --- /dev/null +++ b/db/migrate/20240122225503_create_diapers_periods.rb @@ -0,0 +1,13 @@ +class CreateDiapersPeriods < ActiveRecord::Migration[7.1] + def change + create_table :diapers_periods do |t| + t.references :category, null: false, foreign_key: true + t.decimal :price, precision: 8, scale: 2, null: false + t.integer :period_start, null: false + t.integer :period_end, null: false + t.integer :usage_amount, null: false + + t.timestamps + end + end +end diff --git a/db/migrate/20240207143101_add_preferable_to_categories.rb b/db/migrate/20240207143101_add_preferable_to_categories.rb new file mode 100644 index 000000000..15f5cf84b --- /dev/null +++ b/db/migrate/20240207143101_add_preferable_to_categories.rb @@ -0,0 +1,5 @@ +class AddPreferableToCategories < ActiveRecord::Migration[7.1] + def change + add_column :categories, :preferable, :boolean, default: false, null: false + end +end diff --git a/db/migrate/20240207150024_add_index_to_categories_name.rb b/db/migrate/20240207150024_add_index_to_categories_name.rb new file mode 100644 index 000000000..7514f2ddd --- /dev/null +++ b/db/migrate/20240207150024_add_index_to_categories_name.rb @@ -0,0 +1,5 @@ +class AddIndexToCategoriesName < ActiveRecord::Migration[7.1] + def change + add_index :categories, "LOWER(name)", name: "index_categories_on_name", unique: true + end +end diff --git a/db/migrate/20240208154012_drop_app_configs.rb b/db/migrate/20240208154012_drop_app_configs.rb new file mode 100644 index 000000000..84e9ccfbc --- /dev/null +++ b/db/migrate/20240208154012_drop_app_configs.rb @@ -0,0 +1,13 @@ +class DropAppConfigs < ActiveRecord::Migration[7.1] + def up + drop_table :app_configs + end + + def down + create_table :app_configs do |t| + t.jsonb "diapers_calculator", default: {} + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 5fbe44a0c..7042f48cf 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,8 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2023_03_07_170020) do - +ActiveRecord::Schema[7.1].define(version: 2024_02_08_154012) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -21,7 +20,7 @@ t.string "record_type", null: false t.bigint "record_id", null: false t.bigint "blob_id", null: false - t.datetime "created_at", null: false + t.datetime "created_at", precision: nil, null: false t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true end @@ -34,7 +33,7 @@ t.string "service_name", null: false t.bigint "byte_size", null: false t.string "checksum", null: false - t.datetime "created_at", null: false + t.datetime "created_at", precision: nil, null: false t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true end @@ -44,17 +43,11 @@ t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true end - create_table "app_configs", force: :cascade do |t| - t.jsonb "diapers_calculator", default: {} - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false - end - create_table "calculators", force: :cascade do |t| t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false t.string "name" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.string "slug" t.boolean "preferable", default: false t.index ["name"], name: "index_calculators_on_name", unique: true @@ -64,27 +57,40 @@ create_table "categories", force: :cascade do |t| t.string "name" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.integer "priority", default: 0, null: false + t.boolean "preferable", default: false, null: false + t.index "lower((name)::text)", name: "index_categories_on_name", unique: true end create_table "category_categoryables", force: :cascade do |t| t.bigint "category_id" t.string "categoryable_type" t.bigint "categoryable_id" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.index ["category_id"], name: "index_category_categoryables_on_category_id" t.index ["categoryable_type", "categoryable_id", "category_id"], name: "unique_of_category_categoryables_index", unique: true t.index ["categoryable_type", "categoryable_id"], name: "index_category_categoryables_on_categoryable" end + create_table "diapers_periods", force: :cascade do |t| + t.bigint "category_id", null: false + t.decimal "price", precision: 8, scale: 2, null: false + t.integer "period_start", null: false + t.integer "period_end", null: false + t.integer "usage_amount", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["category_id"], name: "index_diapers_periods_on_category_id" + end + create_table "feature_flags", force: :cascade do |t| t.string "name", null: false t.boolean "enabled", default: false, null: false - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.index ["name"], name: "index_feature_flags_on_name", unique: true end @@ -99,19 +105,37 @@ t.integer "from" t.integer "to" t.integer "kind", null: false - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.integer "unit", default: 0 t.index ["calculator_id"], name: "index_fields_on_calculator_id" t.index ["uuid"], name: "index_fields_on_uuid", unique: true end + create_table "flipper_features", force: :cascade do |t| + t.string "key", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.text "en_description" + t.text "uk_description" + t.index ["key"], name: "index_flipper_features_on_key", unique: true + end + + create_table "flipper_gates", force: :cascade do |t| + t.string "feature_key", null: false + t.string "key", null: false + t.string "value" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["feature_key", "key", "value"], name: "index_flipper_gates_on_feature_key_and_key_and_value", unique: true + end + create_table "messages", force: :cascade do |t| t.string "title", null: false t.string "message", null: false t.string "email", null: false - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "prices", force: :cascade do |t| @@ -119,9 +143,9 @@ t.string "priceable_type" t.bigint "priceable_id" t.integer "category_id" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false - t.index ["category_id", "priceable_id", "priceable_type"], name: "index_prices_on_category_id_and_priceable_id_and_priceable_type", unique: true + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["category_id", "priceable_id", "priceable_type"], name: "idx_on_category_id_priceable_id_priceable_type_1fa9ce7f24", unique: true t.index ["category_id"], name: "index_prices_on_category_id" t.index ["priceable_type", "priceable_id"], name: "index_prices_on_priceable" end @@ -129,8 +153,8 @@ create_table "product_types", force: :cascade do |t| t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false t.string "title" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.index ["uuid"], name: "index_product_types_on_uuid", unique: true end @@ -138,16 +162,17 @@ t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false t.string "title" t.bigint "product_type_id" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.index ["product_type_id"], name: "index_products_on_product_type_id" + t.index ["title"], name: "index_products_on_title", unique: true t.index ["uuid"], name: "index_products_on_uuid", unique: true end create_table "site_settings", force: :cascade do |t| t.string "title", default: "ZeroWaste", null: false - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "users", force: :cascade do |t| @@ -162,10 +187,10 @@ t.integer "failed_attempts", default: 0, null: false t.string "unlock_token" t.datetime "locked_at" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false - t.string "first_name" - t.string "last_name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "first_name", null: false + t.string "last_name", null: false t.string "country" t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" @@ -182,7 +207,8 @@ end create_table "versions", force: :cascade do |t| - t.string "item_type", null: false + t.string "item_type" + t.string "{:null=>false}" t.bigint "item_id", null: false t.string "event", null: false t.string "whodunnit" @@ -195,4 +221,5 @@ add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" add_foreign_key "category_categoryables", "categories" + add_foreign_key "diapers_periods", "categories" end diff --git a/db/seeds.rb b/db/seeds.rb index 9b389a733..99495cd83 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,47 +1,32 @@ # frozen_string_literal: true -# This file should contain all the record creation needed to seed the database -# with its default values. -# The data can then be loaded with the bin/rails db:seed command (or created -# alongside the database with db:setup). -# -# Examples: -# -# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the -# Rings' }]) -# Character.create(name: 'Luke', movie: movies.first) +require "faker" +require "factory_bot_rails" # A regular user -User.create( - email: "user@zw.com", - password: "password", - password_confirmation: "password", - first_name: "John", - last_name: "User", - confirmed_at: DateTime.current, - role: "user" -) +unless User.exists?(email: "user@zw.com") + User.create( + email: "user@zw.com", + password: "password", + password_confirmation: "password", + first_name: "John", + last_name: "User", + confirmed_at: DateTime.current, + role: "user" + ) +end # An admin -User.create( - email: "admin@zw.com", - password: "ChangeMe1", - password_confirmation: "ChangeMe1", - first_name: "Admin", - last_name: "Admin", - confirmed_at: DateTime.current, - role: "admin" -) +unless User.exists?(email: "admin@zw.com") + User.create( + email: "admin@zw.com", + password: "ChangeMe1", + password_confirmation: "ChangeMe1", + first_name: "Admin", + last_name: "Admin", + confirmed_at: DateTime.current, + role: "admin" + ) +end -FactoryBot.create(:product_type, :hygiene) -FactoryBot.create(:product, :diaper) - -FeatureFlag.create!( - name: "feature_budget_category", - enabled: false -) - -FeatureFlag.create!( - name: "show_admin_menu", - enabled: false -) +FactoryBot.create(:product, :diaper) unless Product.exists?(title: "diaper") diff --git a/lib/inflector_extensions.rb b/lib/inflector_extensions.rb index df74d0bbd..569dabe42 100644 --- a/lib/inflector_extensions.rb +++ b/lib/inflector_extensions.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class String - def pluralize(count: nil, locale: :en) + def pluralize(count = nil, locale = :en) if count == 1 dup else diff --git a/lib/tasks/db_backup_task.rake b/lib/tasks/db_backup_task.rake new file mode 100644 index 000000000..776f00c2d --- /dev/null +++ b/lib/tasks/db_backup_task.rake @@ -0,0 +1,33 @@ +namespace :db do + namespace :backup do + desc "Create the database dump" + task :create, [:filename] => :environment do |t, args| + # pg_dump options: + # -F c - output file format custom + # -d DBNAME - database name to dump + # -f FILENAME - output file or directory name + cmd = "pg_dump -F c -d #{DatabaseBackupService.database_name} -f #{DatabaseBackupService.backup_full_path(args[:filename])}" + + puts system(cmd) ? "Database dump was created successfully" : "Error to create database dump!!!" + end + + desc "Restores the database dump" + task :restore, [:filename] => :environment do |t, args| + raise "You must specify a filename" unless args[:filename] + + backup_file_name = DatabaseBackupService.backup_full_path(args[:filename]) + # pg_restore options: + # -c - clean (drop) database objects before recreating + # -F c - output file format custom + # -d DBNAME - database name to dump + cmd = "pg_restore -c -F c -d #{DatabaseBackupService.database_name} #{backup_file_name}" + + puts system(cmd) ? "Database dump was restored successfully" : "Error to restore database from #{backup_file_name}!!!" + end + + desc "Show the existing database backups" + task list: :environment do + system "/bin/ls -ltR #{DatabaseBackupService.backup_dir}" + end + end +end diff --git a/package.json b/package.json deleted file mode 100644 index 450be1ca9..000000000 --- a/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "zero-waste", - "private": true, - "dependencies": { - "@babel/core": "^7.16.5", - "@babel/plugin-transform-runtime": "^7.16.5", - "@babel/preset-env": "^7.16.5", - "@fortawesome/fontawesome-free": "^5.15.4", - "@hotwired/stimulus": "^3.2.1", - "@hotwired/stimulus-webpack-helpers": "^1.0.1", - "@nathanvda/cocoon": "^1.2.14", - "@rails/actioncable": "^6.0.0", - "@rails/activestorage": "^6.0.0", - "@rails/ujs": "^6.0.0", - "@rails/webpacker": "5.4.3", - "@webpack-cli/serve": "^1.6", - "babel-loader": "^8.2.3", - "bootstrap": "^4.6.0", - "flatpickr": "^4.6.9", - "jquery": "^3.6.0", - "popper.js": "^1.16.1", - "turbolinks": "^5.2.0", - "webpack": "^4.46.0" - }, - "version": "0.1.0", - "devDependencies": { - "@babel/plugin-proposal-private-property-in-object": "^7.16.5", - "@webpack-cli/serve": "^1.6", - "webpack-cli": "^4.0", - "webpack-dev-server": "^4", - "yarn": "^1.22.17" - } -} diff --git a/public/about_us.html b/public/about_us.html deleted file mode 100644 index 080312480..000000000 --- a/public/about_us.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - ZeroWaste - - -
-

About us

-

Lorem ipsum dolor sit amet consectetur adipisicing elit. Beatae eaque vitae, placeat dignissimos odit laborum at atque! Vitae, doloribus sunt fuga assumenda, laudantium voluptates eum veritatis aut illum optio corrupti.

-
- - - - diff --git a/spec/controllers/account/app_configs_spec.rb b/spec/controllers/account/app_configs_spec.rb deleted file mode 100644 index 395b40905..000000000 --- a/spec/controllers/account/app_configs_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -require "rails_helper" - -RSpec.describe Account::AppConfigsController do - before do - @user = create(:user) - @admin = create(:user, :admin) - end - - context "GET edit" do - it "renders the edit template for admin" do - sign_in @admin - - get :edit - - expect(response).to render_template("edit") - end - it "redirects to homepage for user" do - sign_in @user - - get :edit - - expect(response).to have_http_status(:redirect) - end - end -end diff --git a/spec/controllers/calculators_spec.rb b/spec/controllers/calculators_spec.rb deleted file mode 100644 index 75fc319b7..000000000 --- a/spec/controllers/calculators_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -require "rails_helper" - -RSpec.describe CalculatorsController, type: :controller do - describe "GET /calculator" do - let!(:subject) { get :calculator } - - it "should return success response status" do - expect(subject).to have_http_status(200) - end - - it "shouldn`t create any instance" do - expect(subject).not_to be_a_new(Calculator) - end - end - - describe "POST /receive_recomendations" do - let!(:user) { create(:user) } - - before do - controller.stub(:current_user) { user } - end - - it "takes user with receive_recomendations:false" do - expect(user.receive_recomendations).to eq false - end - - it "doesn`t change user attribute unless user signed in" do - expect do - post :receive_recomendations - - user.reload - end.not_to change { user.receive_recomendations } - end - - # TODO: rewrite it to good spec - # it "changes user`s receive_recomendations to true" do - # post :receive_recomendations - - # expect(user.reload.receive_recomendations).to eq(true) - # end - end -end diff --git a/spec/controllers/diaper_calculators_spec.rb b/spec/controllers/diaper_calculators_spec.rb deleted file mode 100644 index 2f28e27f9..000000000 --- a/spec/controllers/diaper_calculators_spec.rb +++ /dev/null @@ -1,83 +0,0 @@ -# frozen_string_literal: true - -require "rails_helper" - -RSpec.describe Api::V1::DiaperCalculatorsController do - describe "#create" do - let(:values) do - [ - { name: "money_spent", result: 0 }, - { name: "money_will_be_spent", result: 0 }, - { name: "used_diapers_amount", result: 0 }, - { name: "to_be_used_diapers_amount", result: 0 } - ] - end - let(:expected) do - { result: values, - date: 0, - word_form_to_be_used: "diapers", - word_form_used: "diapers" } - end - - context "when default values" do - before do - get :create - end - - it "renders expected result" do - expect(response.body).to eq(expected.to_json) - end - end - end - - describe "sending params to create" do - let(:values) do - [ - { name: "money_spent", result: 12_718.5 }, - { name: "money_will_be_spent", result: 10_614.0 }, - { name: "used_diapers_amount", result: 2745.0 }, - { name: "to_be_used_diapers_amount", result: 1830.0 } - ] - end - let(:expected_result) do - { - result: values, - date: 12, - word_form_to_be_used: "diapers", - word_form_used: "diapers" - } - end - - context "when get awaited values" do - include_context :app_config_load - - it "got the expected result" do - post :create, params: { childs_age: 12 } - - expect(response.body).to eq(expected_result.to_json) - expect(response).to be_successful - end - end - - context "when get unawaited values" do - include_context :app_config_load - - let(:invalid_values) do - [ - { name: "money_spent", result: 42 }, - { name: "money_will_be_spent", result: 42 }, - { name: "used_diapers_amount", result: 42 }, - { name: "to_be_used_diapers_amount", result: 42 } - ] - end - - it "got the unexpected result" do - expected_result[:result] = invalid_values - post :create, params: { childs_age: 12 } - - expect(response.body).not_to eq(expected_result.to_json) - expect(response).to be_successful - end - end - end -end diff --git a/spec/factories/calculators.rb b/spec/factories/calculators.rb index c81ec1268..cad0fdd0d 100644 --- a/spec/factories/calculators.rb +++ b/spec/factories/calculators.rb @@ -14,6 +14,7 @@ # # Indexes # +# index_calculators_on_name (name) UNIQUE # index_calculators_on_slug (slug) UNIQUE # index_calculators_on_uuid (uuid) UNIQUE # diff --git a/spec/factories/categories.rb b/spec/factories/categories.rb index 479be1507..6b20e3332 100644 --- a/spec/factories/categories.rb +++ b/spec/factories/categories.rb @@ -1,11 +1,36 @@ +# == Schema Information +# +# Table name: categories +# +# id :bigint not null, primary key +# name :string +# priority :integer default(0), not null +# created_at :datetime not null +# updated_at :datetime not null +# FactoryBot.define do factory :category do + name { "name" } + trait :budgetary do name { "budgetary" } + + after(:create) do |category| + create(:diapers_period, category: category) + end end trait :medium do name { "medium" } + preferable { true } + + after(:create) do |category| + create(:diapers_period, category: category) + end + end + + trait :without_diapers_period do + name { "without-diapers-period" } end end end diff --git a/spec/factories/diapers_periods.rb b/spec/factories/diapers_periods.rb new file mode 100644 index 000000000..9b8c80d81 --- /dev/null +++ b/spec/factories/diapers_periods.rb @@ -0,0 +1,9 @@ +FactoryBot.define do + factory :diapers_period do + association :category, factory: :category + period_start { 1 } + period_end { 30 } + price { 10 } + usage_amount { 5 } + end +end diff --git a/spec/factories/diapers_services.rb b/spec/factories/diapers_services.rb deleted file mode 100644 index 67131027f..000000000 --- a/spec/factories/diapers_services.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -FactoryBot.define do - factory :diapers_service, class: Calculators::DiapersService do - initialize_with { new(8) } - used_diapers_amount { 0 } - used_diapers_price { 0 } - to_be_used_diapers_amount { 4575 } - to_be_used_diapers_price { 23_332.5 } - config do - { - "1..3" => { - "amount" => 10, - "price" => 4 - }, - "4..6" => { - "amount" => 8, - "price" => 4.5 - }, - "7..9" => { - "amount" => 6, - "price" => 5 - } - } - end - end -end diff --git a/spec/factories/feature_flags.rb b/spec/factories/feature_flags.rb index cfa6bdd60..56203e159 100644 --- a/spec/factories/feature_flags.rb +++ b/spec/factories/feature_flags.rb @@ -19,11 +19,11 @@ name { "FeatureFlag" } enabled { false } trait :show_admin_menu do - name { "show_admin_menu" } + name { "access_admin_menu" } enabled { true } end trait :hide_admin_menu do - name { "show_admin_menu" } + name { "access_admin_menu" } enabled { false } end end diff --git a/spec/factories/prices.rb b/spec/factories/prices.rb new file mode 100644 index 000000000..5a4fe0032 --- /dev/null +++ b/spec/factories/prices.rb @@ -0,0 +1,31 @@ +# == Schema Information +# +# Table name: prices +# +# id :bigint not null, primary key +# priceable_type :string +# sum :decimal(8, 2) +# created_at :datetime not null +# updated_at :datetime not null +# category_id :integer +# priceable_id :bigint +# +# Indexes +# +# index_prices_on_category_id (category_id) +# index_prices_on_category_id_and_priceable_id_and_priceable_type (category_id,priceable_id,priceable_type) UNIQUE +# index_prices_on_priceable (priceable_type,priceable_id) +# +FactoryBot.define do + factory :price do + association :priceable, factory: [:product, :diaper] + + trait :budgetary_price do + sum { 40.2 } + end + + trait :invalid_price do + sum { "" } + end + end +end diff --git a/spec/factories/products.rb b/spec/factories/products.rb index 50db65395..418b5a426 100644 --- a/spec/factories/products.rb +++ b/spec/factories/products.rb @@ -18,16 +18,20 @@ # FactoryBot.define do factory :product do - association :product_type - trait :diaper do - association :product_type, :hygiene - title { Product::DIAPER } + title { "diaper" } end trait :napkin do - association :product_type, :hygiene title { "napkin" } end + + trait :huggie do + title { "huggie" } + end + + trait :invalid do + title { "" } + end end end diff --git a/spec/factories/site_settings.rb b/spec/factories/site_settings.rb index 2c30bf38d..fdc3d8427 100644 --- a/spec/factories/site_settings.rb +++ b/spec/factories/site_settings.rb @@ -1,8 +1,19 @@ +# == Schema Information +# +# Table name: site_settings +# +# id :bigint not null, primary key +# title :string default("ZeroWaste"), not null +# created_at :datetime not null +# updated_at :datetime not null +# +IMAGE_TYPE = "image/png" + FactoryBot.define do factory :site_setting do trait :with_valid_site_setting do title { "ZeroWaste" } - favicon { Rack::Test::UploadedFile.new("spec/fixtures/files/logo_zerowaste.png", "image/png") } + favicon { Rack::Test::UploadedFile.new("app/assets/images/icons/favicon-48x48.png", IMAGE_TYPE) } end trait :invalid_site_setting do @@ -11,7 +22,17 @@ trait :new_title do title { "Test title" } - favicon { Rack::Test::UploadedFile.new("spec/fixtures/files/logo_zerowaste.png", "image/png") } + favicon { Rack::Test::UploadedFile.new("app/assets/images/icons/favicon-48x48.png", IMAGE_TYPE) } + end + + trait :invalid_favicon do + title { "ZeroWaste" } + favicon { Rack::Test::UploadedFile.new("spec/fixtures/icons/favicon-181x182.png", IMAGE_TYPE) } + end + + trait :custom_setting do + title { "Custom Waste" } + favicon { Rack::Test::UploadedFile.new("app/assets/images/user.png", IMAGE_TYPE) } end end end diff --git a/spec/factories/users.rb b/spec/factories/users.rb index 2aa9c3b3c..c6225356f 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -47,4 +47,12 @@ role { "admin" } end end + + sequence :first_name do |num| + if Rails.env.test? + "#{clear_special_characters(Faker::Name.first_name.strip)} #{num}" + else + Faker::Name.first_name + end + end end diff --git a/spec/features/account/calculators_spec.rb b/spec/features/account/calculators_spec.rb new file mode 100644 index 000000000..adb78be3b --- /dev/null +++ b/spec/features/account/calculators_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe "visit admin page", js: true do + let!(:diapers_calculator) { create(:calculator, name: "Diapers Calculator", slug: "diapers") } + let!(:napkin_calculator) { create(:calculator, name: "Napkin Calculator", slug: "napkin") } + + include_context :authorize_admin + + it "visits admin page" do + visit account_calculators_path + + expect(page).to have_content diapers_calculator.name + expect(page).to have_content napkin_calculator.name + end +end diff --git a/spec/features/account/categories_spec.rb b/spec/features/account/categories_spec.rb new file mode 100644 index 000000000..a2c113aad --- /dev/null +++ b/spec/features/account/categories_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe "visit admin page", js: true do + let!(:budgetary) { create(:category, :budgetary) } + let!(:medium) { create(:category, :medium) } + + include_context :authorize_admin + + it "visits admin page" do + visit account_categories_path + + expect(page).to have_content budgetary.name + expect(page).to have_content medium.name + end +end diff --git a/spec/features/account/create_calculator_spec.rb b/spec/features/account/create_calculator_spec.rb index e887af00e..0769e87d8 100644 --- a/spec/features/account/create_calculator_spec.rb +++ b/spec/features/account/create_calculator_spec.rb @@ -1,14 +1,15 @@ # frozen_string_literal: true require "rails_helper" + CREATE_CALCULATOR_BUTTON = "Create calculator" describe "Create Calculator Page", js: true do let(:calculator) { create(:calculator) } + include_context :authorize_admin + before do - @admin = create(:user, :admin) - sign_in @admin visit new_account_calculator_path end @@ -40,7 +41,7 @@ it "shows message that name is too short" do fill_in "Name", with: "i" click_button CREATE_CALCULATOR_BUTTON - expect(page).to have_content("is too short") + expect(page).to have_content("Name is too short (minimum is 2 characters)") end end @@ -48,7 +49,7 @@ it "shows message that name is invalid" do fill_in "Name", with: "i[]p" click_button CREATE_CALCULATOR_BUTTON - expect(page).to have_content("Name must contain only letters or numbers") + expect(page).to have_content("Name contains invalid characters") end end @@ -56,7 +57,7 @@ it "shows message that name can't be blank" do fill_in "Name", with: "" click_button CREATE_CALCULATOR_BUTTON - expect(page).to have_content("is too short") + expect(page).to have_content("Name can't be blank") end end end diff --git a/spec/features/account/histories_spec.rb b/spec/features/account/histories_spec.rb index 49311775a..eaf921c60 100644 --- a/spec/features/account/histories_spec.rb +++ b/spec/features/account/histories_spec.rb @@ -4,9 +4,9 @@ describe "visit admin page", js: true do context "signed in admin visit page" do + include_context :authorize_admin + before do - @admin = create(:user, :admin) - sign_in @admin visit account_histories_path end diff --git a/spec/features/account/products_spec.rb b/spec/features/account/products_spec.rb new file mode 100644 index 000000000..978a7e7e0 --- /dev/null +++ b/spec/features/account/products_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe "visit admin page", js: true do + let!(:diaper) { create(:product, :diaper) } + let!(:napkin) { create(:product, :napkin) } + + include_context :authorize_admin + + it "visits admin page" do + visit account_products_path + + expect(page).to have_content diaper.title + expect(page).to have_content napkin.title + end +end diff --git a/spec/features/account/update_calculator_spec.rb b/spec/features/account/update_calculator_spec.rb index 9d7d9fb86..ca6d7e3ee 100644 --- a/spec/features/account/update_calculator_spec.rb +++ b/spec/features/account/update_calculator_spec.rb @@ -6,9 +6,9 @@ describe "Update Calculator Page", js: true do let(:calculator) { create(:calculator) } + include_context :authorize_admin + before do - @admin = create(:user, :admin) - sign_in @admin visit edit_account_calculator_path(slug: calculator.id) end @@ -24,7 +24,7 @@ it "shows message that name is too short" do fill_in "Name", with: "o" click_button UPDATE_CALCULATOR_BUTTON - expect(page).to have_content("is too short") + expect(page).to have_content("Name is too short (minimum is 2 characters)") end end @@ -32,7 +32,7 @@ it "shows message that name is invalid" do fill_in "Name", with: '\[d]]p' click_button UPDATE_CALCULATOR_BUTTON - expect(page).to have_content("Name must contain only letters or numbers") + expect(page).to have_content("Name contains invalid characters") end end end diff --git a/spec/features/account/users_spec.rb b/spec/features/account/users_spec.rb index dfd66fca1..232320d42 100644 --- a/spec/features/account/users_spec.rb +++ b/spec/features/account/users_spec.rb @@ -3,16 +3,13 @@ require "rails_helper" describe "visit admin page", js: true do - let(:time_login) { Time.new(2020, 0o1, 0o1).utc } + let(:time_login) { Time.new(2020, 0o1, 0o1).in_time_zone("Kyiv") } let!(:another_user) do create(:user, email: "test1@gmail.com", password: "12345878", last_sign_in_at: time_login) end - before do - @admin = create(:user, :admin) - sign_in @admin - end + include_context :authorize_admin it "visits admin page" do visit account_users_path @@ -24,7 +21,7 @@ it "redirects to user info page" do visit account_users_path within(:css, "#user-info-#{another_user.id}") do - click_link(href: account_user_path(id: another_user.id)) + find(".fa-eye", visible: :all).click sleep 3 end expect(page).to have_current_path(account_user_path(id: another_user.id)) @@ -54,6 +51,37 @@ end end + context "when user clicks lock-open icon" do + it "shows the correct confirmation message for blocking" do + visit account_users_path + + within(:css, "#user-info-#{another_user.id}") do + find("svg.fa-lock-open").click + sleep 3 + end + + accept_confirm { "Are you sure you want to block this user?" } + expect(page).to have_current_path(account_user_path(id: another_user.id)) + expect(page).to have_content "Blocked" + end + end + + context "when user clicks lock icon" do + it "shows the correct confirmation message for unblocking" do + another_user.update(blocked: true) + visit account_users_path + + within(:css, "#user-info-#{another_user.id}") do + find("svg.fa-lock").click + sleep 3 + end + + accept_confirm { "Are you sure you want to unblock this user?" } + expect(page).to have_current_path(account_user_path(id: another_user.id)) + expect(page).to have_content "Unblocked" + end + end + context "when edit user`s info correctly" do it "redirects to user info page" do visit edit_account_user_path(id: another_user.id) @@ -81,17 +109,12 @@ find_button("commit").click expect(page).to have_content "First name is too short (minimum is 2 characters)" expect(page).to have_content "Last name is too short (minimum is 2 characters)" - expect(page).to have_content "Password is too short (minimum is 6 characters)" + expect(page).to have_content "Password is too short (minimum is 8 characters)" expect(page).to have_content "Re-password doesn't match Password" end end describe "user info page" do - before do - @admin = create(:user, :admin) - sign_in @admin - end - context "viewing non-existing user" do it "renders the 404 page" do visit account_user_path(id: 1355) diff --git a/spec/features/admin_login_spec.rb b/spec/features/admin_login_spec.rb index f7af7331c..b707d2d47 100644 --- a/spec/features/admin_login_spec.rb +++ b/spec/features/admin_login_spec.rb @@ -14,8 +14,10 @@ visit "/users/sign_in" fill_in "Email", with: user.email fill_in "Password", with: user.password - click_button "Log in" - expect(page).to have_content "Signed in successfully." + sleep 0.5 + click_button "Log In" + sleep 0.5 + expect(page).to have_content "Signed in successfully" end end @@ -24,7 +26,9 @@ visit "/users/sign_in" fill_in "Email", with: "wrong@email.com" fill_in "Password", with: "wrong password" - click_button "Log in" + sleep 0.5 + click_button "Log In" + sleep 0.5 expect(page).to have_content "Invalid Email or password" end end @@ -34,7 +38,9 @@ visit "/users/sign_in" fill_in "Email", with: user.email fill_in "Password", with: "wrong password" - click_button "Log in" + sleep 0.5 + click_button "Log In" + sleep 0.5 expect(page).to have_content "Invalid Email or password" end end @@ -44,7 +50,9 @@ visit "/users/sign_in" fill_in "Email", with: "wrong@email.com" fill_in "Password", with: user.password - click_button "Log in" + sleep 0.5 + click_button "Log In" + sleep 0.5 expect(page).to have_content "Invalid Email or password" end end @@ -52,46 +60,54 @@ context "with ukrainian locale" do context "when sign in with correct login and password" do - it "redirect to admin page" do + xit "redirect to admin page" do visit new_user_session_path - click_on LANG_BUTTON_TEXT + click_link LANG_BUTTON_TEXT fill_in "user_email", with: user.email fill_in "user_password", with: user.password + sleep 0.5 click_button "Увійти" - expect(page).to have_content "Ви увійшли в систему." + sleep 0.5 + expect(page).to have_content "Ви увійшли до системи" end end context "when sign in with wrong login and password" do it "redirect to admin login page" do visit new_user_session_path - click_on LANG_BUTTON_TEXT + click_link LANG_BUTTON_TEXT fill_in "user_email", with: "wrong@email.com" fill_in "user_password", with: "wrong password" + sleep 0.5 click_button "Увійти" - expect(page).to have_content "Невірний email чи пароль." + sleep 0.5 + expect(page).to have_content "Невірна електронна пошта чи пароль" end end context "when sign in with wrong password" do it "redirect to admin login page" do visit new_user_session_path - click_on LANG_BUTTON_TEXT + click_link LANG_BUTTON_TEXT fill_in "user_email", with: user.email fill_in "user_password", with: "wrong password" + sleep 0.5 click_button "Увійти" - expect(page).to have_content "Невірний email чи пароль." + sleep 0.5 + expect(page).to have_content "Невірна електронна пошта чи пароль" end end context "when sign in with wrong login" do it "redirect to admin login page" do visit new_user_session_path - click_on LANG_BUTTON_TEXT + click_link LANG_BUTTON_TEXT fill_in "user_email", with: "wrong@email.com" fill_in "user_password", with: user.password + sleep 0.5 click_button "Увійти" - expect(page).to have_content "Невірний email чи пароль." + sleep 0.5 + expect(page).to have_content "Невірна електронна пошта чи пароль" end end end diff --git a/spec/features/navigator_spec.rb b/spec/features/navigator_spec.rb index 12f3d016c..7d6bde298 100644 --- a/spec/features/navigator_spec.rb +++ b/spec/features/navigator_spec.rb @@ -5,36 +5,34 @@ describe "navigator", js: true do it "should style the navbar" do visit root_path + expect(page).to have_css(".page-header") - expect(page.body).to have_css(".tabs") + # expect(page).to have_link("Log In", href: user_session_path, visible: :all) + # expect(page).to have_link("Sign Up", href: new_user_registration_path, visible: :all) + expect(page).to have_link("Contact us", href: new_message_path, visible: :all) end - context "when feature show_admin_menu does not exist" do - it "should not consist tabs" do - visit root_path - expect(page).not_to have_content("SIGN UP") - expect(page).not_to have_content("LOG IN") - expect(page).not_to have_content("CONTACT US") - end - end + context "as an admin user" do + include_context :authorize_admin + + before { visit root_path } - context "when feature show_admin_menu is disabled" do - it "should not consist tabs" do - create(:feature_flag, :hide_admin_menu) - visit root_path - expect(page).not_to have_content("SIGN UP") - expect(page).not_to have_content("LOG IN") - expect(page).not_to have_content("CONTACT US") + it "should consist tabs" do + expect(page).to have_link("Log Out", href: destroy_user_session_path, visible: :all) + expect(page).to have_link("Contact us", href: new_message_path, visible: :all) + expect(page).to have_link("Admin", href: account_calculators_path, visible: :all) end end - context "when feature show_admin_menu is enabled" do + context "as an regular user" do + include_context :authorize_regular_user + + before { visit root_path } + it "should consist tabs" do - create(:feature_flag, :show_admin_menu) - visit root_path - expect(page).to have_content("SIGN UP") - expect(page).to have_content("LOG IN") - expect(page).to have_content("CONTACT US") + expect(page).to have_link("Log Out", href: destroy_user_session_path, visible: :all) + expect(page).to have_link("Contact us", href: new_message_path, visible: :all) + expect(page).to have_no_link("Admin", href: account_calculators_path, visible: :all) end end end diff --git a/spec/features/product_category_spec.rb b/spec/features/product_category_spec.rb index b17abb220..944e63e7e 100644 --- a/spec/features/product_category_spec.rb +++ b/spec/features/product_category_spec.rb @@ -2,26 +2,26 @@ require "rails_helper" -BUDGETARY_OPTION = "budgetary" -MEDIUM_OPTION = "medium" -PREMIUM_OPTION = "premium" - -describe "product category dropdown list", js: true do +describe "product category dropdown list in new design", js: true do let(:calculator) { create(:calculator) } + let!(:budgetary_category) { create(:category, :budgetary) } + let!(:preferable_category) { create(:category, :medium) } + + include_context :new_calculator_design before do - FeatureFlag.get("feature_budget_category").activate visit "/calculator" - find(:select, "product_category") - has_select?("product_category", with_options: [BUDGETARY_OPTION, MEDIUM_OPTION, PREMIUM_OPTION]) + + find(:select, "child_product_category") + has_select?("child_product_category", with_options: ["budgetary", "medium"]) end it "default product category" do - expect(page).to have_select("product_category", selected: MEDIUM_OPTION) + expect(page).to have_select("child_product_category", selected: "medium") end it "custom product category selected" do - select(BUDGETARY_OPTION, from: "product_category") - expect(page).to have_select("product_category", selected: BUDGETARY_OPTION) + select("budgetary", from: "child_product_category") + expect(page).to have_select("child_product_category", selected: "budgetary") end end diff --git a/spec/features/reset_month_value_spec.rb b/spec/features/reset_month_value_spec.rb new file mode 100644 index 000000000..51a8918c4 --- /dev/null +++ b/spec/features/reset_month_value_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe "Year changed", type: :feature do + let(:year_select) { find("#child_years") } + let(:month_select) { find("#child_months") } + + it "resets month value when year changes" do + visit calculator_path + + year_select.select("0") + expect(month_select.value).to eq("") + + year_select.select("1") + expect(month_select.value).to eq("") + + year_select.select("2") + expect(month_select.value).to eq("") + end +end diff --git a/spec/features/reset_password_spec.rb b/spec/features/reset_password_spec.rb index 40c345ce4..95330d9f2 100644 --- a/spec/features/reset_password_spec.rb +++ b/spec/features/reset_password_spec.rb @@ -3,7 +3,7 @@ require "rails_helper" PASSWORD_RESET_PATH = "/users/password/new" -describe "Password Reset Page", js: true do +xdescribe "Password Reset Page", js: true do let(:user) { create(:user) } context "when user clicks button Send me reset password instructions" do @@ -11,8 +11,8 @@ receive(:reset_password_instructions) .and_return(double(deliver: true)) visit PASSWORD_RESET_PATH - fill_in "Email", with: user.email - click_button "Send me reset password instructions" + fill_in "user_email", with: user.email + click_button "Reset" expect(page).to have_content("If your email address exists") end end @@ -20,16 +20,8 @@ context "when user clicks Log in link" do it "redirect to sign in page" do visit PASSWORD_RESET_PATH - click_link "Log in" + click_on "Log In" expect(page).to have_current_path(new_user_session_path) end end - - context "when user clicks Sign up link" do - it "redirect to sign up page" do - visit PASSWORD_RESET_PATH - click_link "Sign up" - expect(page).to have_current_path(new_user_registration_path) - end - end end diff --git a/spec/features/sign_out_spec.rb b/spec/features/sign_out_spec.rb index d5468955d..126146f3a 100644 --- a/spec/features/sign_out_spec.rb +++ b/spec/features/sign_out_spec.rb @@ -13,14 +13,15 @@ visit "/users/sign_in" fill_in "Email", with: user.email fill_in "Password", with: user.password - click_button "Log in" + click_on "Log In" + page.driver.browser.manage.window.resize_to(1920, 1080) Capybara.using_wait_time flash_message_disappear_time do - click_link "Log Out" + click_on "Log Out" sleep 3 end end - it "signs the user out" do + xit "signs the user out" do expect(page).to have_current_path("/calculators/#{calculator.slug}") expect(page).to have_content("LOG IN") end diff --git a/spec/features/sing_up_spec.rb b/spec/features/sing_up_spec.rb index 394aa7045..b3885f917 100644 --- a/spec/features/sing_up_spec.rb +++ b/spec/features/sing_up_spec.rb @@ -9,7 +9,7 @@ LASTNAME = "Last name" SIGN_UP_BUTTON_TEXT = I18n.t("layouts.navigation.sign_up") -describe "User Sign Up", js: true do +xdescribe "User Sign Up", js: true do context "when sign up with correct password and email" do it "shows a message about a confirmation link in the mail" do receive(:confirmation_instructions) @@ -38,7 +38,7 @@ click_button SIGN_UP_BUTTON_TEXT - expect(page).to have_content "Password is invalid" + expect(page).to have_content "Password can't be blank" end end @@ -63,7 +63,7 @@ click_button SIGN_UP_BUTTON_TEXT - expect(page).to have_content "Email is invalid" + expect(page).to have_content "Email can't be blank" end end @@ -78,8 +78,35 @@ expect(page).to have_content "First name is invalid" expect(page).to have_content "Last name can't be blank" + end + end + + context "when sign up with short first and last name" do + it "shows a message that first and last name is too short" do + visit new_user_registration_path + + fill_in FIRSTNAME, with: "A" + fill_in LASTNAME, with: "A" + + click_button SIGN_UP_BUTTON_TEXT + + expect(page).to have_content "First name is too short" expect(page).to have_content "Last name is too short" expect(page).to have_content "minimum is 2 characters" end end + + context "when sign up with blank first name" do + it "shows only one error message that first name can't be blank" do + visit new_user_registration_path + + fill_in FIRSTNAME, with: " " + + click_button SIGN_UP_BUTTON_TEXT + + expect(page).to have_content "First name can't be blank" + expect(page).not_to have_content "First name is too short" + expect(page).not_to have_content "First name is invalid" + end + end end diff --git a/spec/features/visit_calculator_spec.rb b/spec/features/visit_calculator_spec.rb index 205ec99c4..8934f5c11 100644 --- a/spec/features/visit_calculator_spec.rb +++ b/spec/features/visit_calculator_spec.rb @@ -7,16 +7,16 @@ let(:calculator) { create(:calculator) } it "visits calculator page" do - visit "/calculators/#{calculator.slug}" + visit "#{I18n.locale}/calculator" expect(page).to have_content "Child’s age" end - it "visits calculator page and open log_in page" do - create(:feature_flag, :show_admin_menu) - visit "/calculators/#{calculator.slug}" + xit "visits calculator page and open log_in page" do + visit "#{I18n.locale}/calculator" + page.driver.browser.manage.window.resize_to(1920, 1080) click_link("Log In") - sleep 3 + expect(page).to have_content "Forgot your password" end end diff --git a/spec/features/visit_login_spec.rb b/spec/features/visit_login_spec.rb index 6e619434d..ff358694c 100644 --- a/spec/features/visit_login_spec.rb +++ b/spec/features/visit_login_spec.rb @@ -16,8 +16,8 @@ visit "/users/sign_in" fill_in "Email", with: user.email fill_in "Password", with: user.password - click_button "Log in" + click_button "Log In" expect(page).to have_content("Signed in successfully") - expect(page).to have_content("LOG OUT") + expect(page).to have_link("Log Out", href: destroy_user_session_path, visible: :all) end end diff --git a/spec/fixtures/files/logo_zerowaste.png b/spec/fixtures/files/logo_zerowaste.png deleted file mode 100644 index ef976b99e..000000000 Binary files a/spec/fixtures/files/logo_zerowaste.png and /dev/null differ diff --git a/spec/fixtures/icons/favicon-181x182.png b/spec/fixtures/icons/favicon-181x182.png new file mode 100644 index 000000000..2b3e22d3d Binary files /dev/null and b/spec/fixtures/icons/favicon-181x182.png differ diff --git a/spec/helpers/account/users_helper_spec.rb b/spec/helpers/account/users_helper_spec.rb new file mode 100644 index 000000000..38c69fd79 --- /dev/null +++ b/spec/helpers/account/users_helper_spec.rb @@ -0,0 +1,45 @@ +# # frozen_string_literal: true + +require "rails_helper" + +RSpec.describe Account::UsersHelper, type: :helper do + let!(:user) { create(:user) } + + describe ".toggle_block_param" do + it "toggles the 'blocked' attribute" do + user.update(blocked: true) + + expect(helper.toggle_block_param(user)).to eq({ blocked: false }) + end + end + + describe ".toggle_confirm" do + it "returns '.confirm_unblock' if the user is blocked" do + user.update(blocked: true) + allow(helper).to receive(:t).with(".confirm_unblock").and_return(".confirm_unblock") + + expect(helper.toggle_confirm(user)).to eq(".confirm_unblock") + end + + it "returns '.confirm_block' if the user is unblocked" do + user.update(blocked: false) + allow(helper).to receive(:t).with(".confirm_block").and_return(".confirm_block") + + expect(helper.toggle_confirm(user)).to eq(".confirm_block") + end + end + + describe ".toggle_class" do + it "returns 'lock' if the user is blocked" do + user.update(blocked: true) + + expect(helper.toggle_class(user)).to eq("lock") + end + + it "returns 'lock-open' if the user is not blocked" do + user.update(blocked: false) + + expect(helper.toggle_class(user)).to eq("lock-open") + end + end +end diff --git a/spec/models/calculation_resolver_spec.rb b/spec/lib/calculation_resolver_spec.rb similarity index 96% rename from spec/models/calculation_resolver_spec.rb rename to spec/lib/calculation_resolver_spec.rb index 680cdd8c8..448eaddbb 100644 --- a/spec/models/calculation_resolver_spec.rb +++ b/spec/lib/calculation_resolver_spec.rb @@ -2,7 +2,7 @@ require "rails_helper" -RSpec.describe CalculationResolver, type: :model do +RSpec.describe CalculationResolver do subject { described_class } describe "#result" do diff --git a/spec/models/calculator_resolver_spec.rb b/spec/lib/calculator_resolver_spec.rb similarity index 97% rename from spec/models/calculator_resolver_spec.rb rename to spec/lib/calculator_resolver_spec.rb index 330ebd173..ab3af1d5e 100644 --- a/spec/models/calculator_resolver_spec.rb +++ b/spec/lib/calculator_resolver_spec.rb @@ -2,7 +2,7 @@ require "rails_helper" -RSpec.describe CalculatorResolver, type: :model do +RSpec.describe CalculatorResolver do subject { described_class } let(:calculator) { build(:calculator) } diff --git a/spec/lib/inflector_extensions_spec.rb b/spec/lib/inflector_extensions_spec.rb index 994df49f3..b8db61478 100644 --- a/spec/lib/inflector_extensions_spec.rb +++ b/spec/lib/inflector_extensions_spec.rb @@ -22,7 +22,7 @@ it "properly pluralizes all months" do months.each do |count, expected| - expect("місяць".pluralize(count: count, locale: :uk)).to eq(expected) + expect("місяць".pluralize(count, :uk)).to eq(expected) end end end @@ -38,7 +38,7 @@ it "properly pluralizes all years" do years.each do |count, expected| - expect("рік".pluralize(count: count, locale: :uk)).to eq(expected) + expect("рік".pluralize(count, :uk)).to eq(expected) end end end @@ -58,7 +58,7 @@ it "properly pluralizes all diapers" do diapers.each do |count, expected| - expect("підгузок".pluralize(count: count, locale: :uk)).to eq(expected) + expect("підгузок".pluralize(count, :uk)).to eq(expected) end end end @@ -74,29 +74,29 @@ end it "pluralizes properly with count parameter" do - expect("dog".pluralize(count: 10)).to eq("dogs") - expect("cat".pluralize(count: 1)).to eq("cat") - expect("alias".pluralize(count: 123)).to eq("aliases") - expect("buffalo".pluralize(count: 1, locale: :en)).to eq("buffalo") - expect("bus".pluralize(count: 0)).to eq("buses") + expect("dog".pluralize(10)).to eq("dogs") + expect("cat".pluralize(1)).to eq("cat") + expect("alias".pluralize(123)).to eq("aliases") + expect("buffalo".pluralize(1, :en)).to eq("buffalo") + expect("bus".pluralize(0)).to eq("buses") end it "pluralizes irregular words properly" do - expect("person".pluralize(count: 10)).to eq("people") - expect("man".pluralize(count: 1)).to eq("man") - expect("child".pluralize(count: 0)).to eq("children") + expect("person".pluralize(10)).to eq("people") + expect("man".pluralize(1)).to eq("man") + expect("child".pluralize(0)).to eq("children") expect("zombie".pluralize).to eq("zombies") - expect("sex".pluralize(count: 666)).to eq("sexes") + expect("sex".pluralize(666)).to eq("sexes") end end context "with words that cannot be plural" do it "does not pluralize uncountable words" do - expect("equipment".pluralize(count: 10)).to eq("equipment") + expect("equipment".pluralize(10)).to eq("equipment") expect("information".pluralize).to eq("information") - expect("rice".pluralize(count: 0)).to eq("rice") - expect("money".pluralize(count: 1)).to eq("money") - expect("fish".pluralize(count: 666)).to eq("fish") + expect("rice".pluralize(0)).to eq("rice") + expect("money".pluralize(1)).to eq("money") + expect("fish".pluralize(666)).to eq("fish") end end end diff --git a/spec/lib/users_csv_generator_spec.rb b/spec/lib/users_csv_generator_spec.rb index b80014554..a3b3da2f3 100644 --- a/spec/lib/users_csv_generator_spec.rb +++ b/spec/lib/users_csv_generator_spec.rb @@ -2,15 +2,26 @@ require "rails_helper" -RSpec.describe UsersCsvGenerator, type: :lib do - let(:time_login) { Time.new(2020, 0o1, 0o1).utc } +RSpec.describe UsersCsvGenerator do + let(:time_login) { Time.new(2020, 0o1, 0o1).in_time_zone("Kyiv") } + let(:users) do - [create(:user, email: "test@gmail.com", last_sign_in_at: time_login)] + [create(:user, email: "test@gmail.com", first_name: "Han", last_name: "Solo", last_sign_in_at: time_login)] + end + + let(:csv_content) do + result = "email,first_name,last_name,last_sign_in_at\n" + + users.each do |user| + result += "#{users.first.email},#{users.first.first_name},#{users.first.last_name},#{time_login}\n" + end + + result end it "export users" do expect(UsersCsvGenerator.call(users, - fields: ["email", "last_sign_in_at"])) - .to eq("email,last_sign_in_at\ntest@gmail.com,#{time_login}\n") + fields: ["email", "first_name", "last_name", "last_sign_in_at"])) + .to eq(csv_content) end end diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb index e69de29bb..494d2dffa 100644 --- a/spec/mailers/user_mailer_spec.rb +++ b/spec/mailers/user_mailer_spec.rb @@ -0,0 +1,19 @@ +require "rails_helper" + +RSpec.describe UserMailer, type: :mailer do + describe "welcome_email" do + let(:user) { create(:user) } + let(:mail) { UserMailer.welcome_email(user) } + + it "renders the headers" do + expect(mail.subject).to eq(I18n.t("mailer.welcome_mail.subject")) + expect(mail.to).to eq([user.email]) + expect(mail.from).to eq(["zerowastemailer@gmail.com"]) + end + + it "renders the body" do + expect(mail.html_part.body).to include(I18n.t("user_mailer.welcome_email.email", email: user.email)) + expect(mail.html_part.body).to include(I18n.t("user_mailer.welcome_email.password", password: user.password)) + end + end +end diff --git a/spec/models/app_config_spec.rb b/spec/models/app_config_spec.rb deleted file mode 100644 index 0d7a3c750..000000000 --- a/spec/models/app_config_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -# == Schema Information -# -# Table name: app_configs -# -# id :bigint not null, primary key -# diapers_calculator :jsonb -# created_at :datetime not null -# updated_at :datetime not null -# -require "rails_helper" - -RSpec.describe AppConfig, type: :model do - context "is a singleton model" do - it "should not allow using new method" do - expect { AppConfig.new }.to raise_error NoMethodError - end - it "should have instance method" do - expect(AppConfig.instance).to be_an AppConfig - end - end -end diff --git a/spec/models/calculator_spec.rb b/spec/models/calculator_spec.rb index 3bf4a1619..c3d4fd4ed 100644 --- a/spec/models/calculator_spec.rb +++ b/spec/models/calculator_spec.rb @@ -14,6 +14,7 @@ # # Indexes # +# index_calculators_on_name (name) UNIQUE # index_calculators_on_slug (slug) UNIQUE # index_calculators_on_uuid (uuid) UNIQUE # @@ -25,24 +26,42 @@ subject { build(:calculator) } describe "validations" do - it { - is_expected.to validate_presence_of(:name).with_message( - I18n.t("#{LOCAL_PREFIX_CALCULATOR}.name.too_short") - ) - } - it { - is_expected.to validate_length_of(:name).is_at_least(2).with_message( - I18n.t("#{LOCAL_PREFIX_CALCULATOR}.name.too_short") - ) - } - it { - is_expected.not_to allow_value("Hh@").for(:name).with_message( - I18n.t("#{LOCAL_PREFIX_CALCULATOR}.name.name_format_validation") - ) - } - it { + it "validates the name and message " do + is_expected.to validate_presence_of(:name) + .with_message(I18n.t("#{LOCAL_PREFIX_CALCULATOR}.name.blank")) + end + + it "validates the name's length and message" do + is_expected.to validate_length_of(:name).is_at_least(2) + .with_message(I18n.t("#{LOCAL_PREFIX_CALCULATOR}.name.too_short", count: 2)) + + is_expected.to validate_length_of(:name).is_at_most(30) + .with_message(I18n.t("#{LOCAL_PREFIX_CALCULATOR}.name.too_long", count: 30)) + end + + it "validates the name's uniqueness and message" do is_expected.to validate_uniqueness_of(:name) - } + .with_message(I18n.t("#{LOCAL_PREFIX_CALCULATOR}.name.taken")) + end + + context "validates the name format" do + let(:calculator) { build(:calculator) } + + it "with valid name" do + calculator.name = "Hedgehog і єнот з'їли 2 аґруси" + + expect(calculator).to be_valid + end + + it "with invalid name" do + ["#", "!", "@", "$", "%", "^", "&", "*", "(", ")", "?", "\"", "_"].each do |sym| + calculator.name = "Invalid Name #{sym}" + + expect(calculator).to_not be_valid + expect(calculator.errors.messages[:name]).to include(I18n.t("#{LOCAL_PREFIX_CALCULATOR}.name.invalid")) + end + end + end end describe "scope" do @@ -67,4 +86,14 @@ end end end + + describe "versioning", versioning: true do + let!(:calculator) { create(:calculator, name: "Calculator 1") } + + it "adds a version when the calculator is updated" do + calculator.update!(name: "Calculator 2") + + expect(calculator.versions.count).to eq(2) + end + end end diff --git a/spec/models/category_categoryable_spec.rb b/spec/models/category_categoryable_spec.rb index c9a8fed64..bfab4767b 100644 --- a/spec/models/category_categoryable_spec.rb +++ b/spec/models/category_categoryable_spec.rb @@ -1,62 +1,32 @@ # frozen_string_literal: true +# == Schema Information +# +# Table name: category_categoryables +# +# id :bigint not null, primary key +# categoryable_type :string +# created_at :datetime not null +# updated_at :datetime not null +# category_id :bigint +# categoryable_id :bigint +# +# Indexes +# +# index_category_categoryables_on_category_id (category_id) +# index_category_categoryables_on_categoryable (categoryable_type,categoryable_id) +# unique_of_category_categoryables_index (categoryable_type,categoryable_id,category_id) UNIQUE +# +# Foreign Keys +# +# fk_rails_... (category_id => categories.id) +# require "rails_helper" RSpec.describe CategoryCategoryable, type: :model do - describe "validations" do - let(:budgetary_category) { create(:category, :budgetary) } - let(:medium_category) { create(:category, :medium) } - let(:product_diaper) { build(:product, :diaper) } - let(:product_napkin) { build(:product, :napkin) } - # let(:resource) { build(:resource) } + describe "associations" do + it { is_expected.to belong_to(:categoryable) } - context "when a product(diaper) has one category" do - it "returns valid product" do - product_diaper.categories = [budgetary_category] - - expect(product_diaper.save).to eq true - end - end - - context "when a product(diaper) can have many different categories" do - it "returns valid product" do - product_diaper.categories = [budgetary_category, medium_category] - - expect(product_diaper.save).to eq true - end - end - - context "when a product(napkin) can have the same categories as a product(diaper)" do - it "returns valid product" do - product_diaper.categories = [budgetary_category, medium_category] - product_napkin.categories = [budgetary_category, medium_category] - - expect(product_diaper.save).to eq true - expect(product_napkin.save).to eq true - end - end - - skip "is skipped" do - context "when a resource model can have the same categories as a product model" do - it "returns valid product" do - product_diaper.categories = [budgetary_category, medium_category] - resource.categories = [budgetary_category, medium_category] - - expect(product_diaper.save).to eq true - expect(resource.save).to eq true - end - end - end - - context "when a product(diaper) cannot have two identical categories" do - it "returns invalid product" do - product_diaper.categories = [budgetary_category, budgetary_category] - - expect do - product_diaper.save! - end.to raise_error(ActiveRecord::RecordInvalid, - "Validation failed: Category has already been taken") - end - end + it { is_expected.to belong_to(:category) } end end diff --git a/spec/models/category_spec.rb b/spec/models/category_spec.rb new file mode 100644 index 000000000..6514a04b9 --- /dev/null +++ b/spec/models/category_spec.rb @@ -0,0 +1,38 @@ +# == Schema Information +# +# Table name: categories +# +# id :bigint not null, primary key +# name :string +# priority :integer default(0), not null +# created_at :datetime not null +# updated_at :datetime not null +# +require "rails_helper" + +LOCAL_PREFIX_CATEGORY = "activerecord.errors.models.category.attributes" + +RSpec.describe Category, type: :model do + subject { build(:category) } + + describe "associations" do + it { is_expected.to have_many(:category_categoryables).dependent(:restrict_with_exception) } + end + + describe "validations" do + it { is_expected.to validate_presence_of(:name) } + it { is_expected.to validate_length_of(:name).is_at_least(3).is_at_most(30) } + it { is_expected.to validate_uniqueness_of(:name).case_insensitive } + it { is_expected.to validate_numericality_of(:priority).is_greater_than_or_equal_to(0) } + end + + context "checking the number of errors" do + let(:category) { build(:category, name: "") } + + it "returns only one error message when field is blank" do + category.valid? + expect(category.errors.full_messages_for(:name).length).to eq 1 + expect(category.errors.full_messages_for(:name)).to include("Title can't be blank") + end + end +end diff --git a/spec/models/diapers_period_spec.rb b/spec/models/diapers_period_spec.rb new file mode 100644 index 000000000..2dd56f926 --- /dev/null +++ b/spec/models/diapers_period_spec.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: diapers_periods +# +# category_id :bigint null: false +# price :decimal precision: 8, scale: 2 +# period_start :integer null: false +# period_end :integer null: false +# usage_amount :integer null: false +# created_at :datetime null: false +# updated_at :datetime null: false +# index ["category_id"], name: "index_diapers_periods_on_category_id" + +require "rails_helper" + +RSpec.describe DiapersPeriod, type: :model do + let(:diapers_period) { FactoryBot.build :diapers_period } + + describe "associations" do + it { is_expected.to belong_to(:category) } + end + + context "validations" do + it { is_expected.to validate_presence_of(:price) } + it { is_expected.to validate_numericality_of(:price).is_greater_than_or_equal_to(0) } + + it { is_expected.to validate_presence_of(:period_start) } + it { is_expected.to validate_numericality_of(:period_start).is_greater_than_or_equal_to(1) } + + it { is_expected.to validate_presence_of(:period_end) } + + it "period end is greater than period start" do + expect(diapers_period.period_end).to be > diapers_period.period_start + end + + it "period end is less than 30" do + expect(diapers_period.period_end).to be <= 30 + end + + it { is_expected.to validate_presence_of(:usage_amount) } + it { is_expected.to validate_numericality_of(:usage_amount).is_greater_than_or_equal_to(0) } + end +end diff --git a/spec/models/feature_flag_spec.rb b/spec/models/feature_flag_spec.rb index f67643e17..382b7ea9d 100644 --- a/spec/models/feature_flag_spec.rb +++ b/spec/models/feature_flag_spec.rb @@ -25,7 +25,7 @@ end describe "#feature_exist?" do - it "reaturn true if feature is added to table" do + it "return true if feature is added to table" do expect(subject.create.feature_exist?).to be_truthy end end diff --git a/spec/models/price_spec.rb b/spec/models/price_spec.rb new file mode 100644 index 000000000..ea8d033e1 --- /dev/null +++ b/spec/models/price_spec.rb @@ -0,0 +1,39 @@ +# == Schema Information +# +# Table name: prices +# +# id :bigint not null, primary key +# priceable_type :string +# sum :decimal(8, 2) +# created_at :datetime not null +# updated_at :datetime not null +# category_id :integer +# priceable_id :bigint +# +# Indexes +# +# index_prices_on_category_id (category_id) +# index_prices_on_category_id_and_priceable_id_and_priceable_type (category_id,priceable_id,priceable_type) UNIQUE +# index_prices_on_priceable (priceable_type,priceable_id) +# +require "rails_helper" + +RSpec.describe Price, type: :model do + subject { create(:price, :budgetary_price) } + + describe "associations" do + it { is_expected.to belong_to(:priceable) } + + it { is_expected.to belong_to(:category).optional } + end + + describe "validations" do + it { is_expected.to validate_presence_of(:sum) } + + it { is_expected.to validate_numericality_of(:sum).is_greater_than_or_equal_to(0) } + + it { is_expected.to validate_numericality_of(:sum).is_less_than(1_000_000) } + + it { is_expected.to validate_uniqueness_of(:category_id).scoped_to(:priceable_id, :priceable_type) } + end +end diff --git a/spec/models/product_spec.rb b/spec/models/product_spec.rb index 00e9219f6..4129b61ff 100644 --- a/spec/models/product_spec.rb +++ b/spec/models/product_spec.rb @@ -23,18 +23,72 @@ RSpec.describe Product, type: :model do subject { build(:product) } + describe "associations" do + it { is_expected.to have_many(:prices).dependent(:destroy) } + + it { is_expected.to have_many(:categories_by_prices).through(:prices).source(:category) } + end + describe "validations" do - it { + it "validates the title and message " do is_expected.to validate_presence_of(:title) .with_message(I18n.t("#{LOCAL_PREFIX_PRODUCT}.title.blank")) - } - it { - is_expected.to validate_length_of(:title).is_at_least(2).with_message(I18n - .t("#{LOCAL_PREFIX_PRODUCT}.title.too_short")) - } - it { - is_expected.to validate_length_of(:title).is_at_most(50).with_message(I18n - .t("#{LOCAL_PREFIX_PRODUCT}.title.too_long")) - } + end + + it "validates the title's length and message" do + is_expected.to validate_length_of(:title).is_at_least(2) + .with_message(I18n.t("#{LOCAL_PREFIX_PRODUCT}.title.too_short", count: 2)) + + is_expected.to validate_length_of(:title).is_at_most(30) + .with_message(I18n.t("#{LOCAL_PREFIX_PRODUCT}.title.too_long", count: 30)) + end + + it "validates the title's uniqueness and message " do + is_expected.to validate_uniqueness_of(:title) + .with_message(I18n.t("#{LOCAL_PREFIX_PRODUCT}.title.taken")) + end + + context "validates the title format" do + let(:product) { build(:product) } + + it "with valid title" do + product.title = "Hedgehog і єнот з'їли 2 аґруси" + + expect(product).to be_valid + end + + it "with invalid title" do + ["#", "!", "@", "$", "%", "^", "&", "*", "(", ")", "?", "\"", "_"].each do |sym| + product.title = "Invalid Title #{sym}" + + expect(product).to_not be_valid + expect(product.errors.messages[:title]).to include(I18n.t("#{LOCAL_PREFIX_PRODUCT}.title.invalid")) + end + end + end + end + + describe "#find_or_build_price_for_category" do + let(:product) { create(:product, title: "Valid Title") } + let(:category) { create(:category, name: "Valid Name") } + let(:valid_sum) { 10.0 } + + context "when the product has a price for the category" do + let!(:existing_price) { create(:price, priceable: product, category: category, sum: valid_sum) } + + it "returns the existing price" do + expect(product.find_or_build_price_for_category(category)).to eq(existing_price) + end + end + + context "when the product does not have a price for the category" do + it "builds a new price for the category" do + expect(product.prices).to be_empty + + new_price = product.find_or_build_price_for_category(category) + expect(new_price.category).to eq(category) + expect(new_price).to be_a_new(Price) + end + end end end diff --git a/spec/models/product_type_spec.rb b/spec/models/product_type_spec.rb index a1f17b732..edd04fa84 100644 --- a/spec/models/product_type_spec.rb +++ b/spec/models/product_type_spec.rb @@ -21,6 +21,10 @@ RSpec.describe ProductType, type: :model do subject { build(:product_type) } + describe "associations" do + it { is_expected.to have_many(:products).dependent(:destroy) } + end + describe "validations" do it { is_expected.to validate_presence_of(:title).with_message(I18n diff --git a/spec/models/site_setting_spec.rb b/spec/models/site_setting_spec.rb index 7749a1653..0aa4f5d7a 100644 --- a/spec/models/site_setting_spec.rb +++ b/spec/models/site_setting_spec.rb @@ -12,48 +12,93 @@ end context "validates properly" do - before { site_setting.update(site_setting_params) } + subject { described_class.current } - let!(:site_setting) { SiteSetting.current } - let(:site_setting_params) { FactoryBot.attributes_for(:site_setting, :with_valid_site_setting) } + before { subject.update(site_setting_params) } + + let(:site_setting_params) { attributes_for(:site_setting, :with_valid_site_setting) } it "has a valid factory" do - expect(site_setting).to be_valid + is_expected.to be_valid end it "is valid with valid attributes" do - expect(site_setting).to be_valid + is_expected.to be_valid end it "is not valid without a title" do - site_setting.title = nil - expect(site_setting).not_to be_valid + is_expected.to validate_presence_of(:title) end - it "is not valid with a title longer than 20 characters" do - site_setting.title = "a" * 21 - expect(site_setting).not_to be_valid + it "is not valid with a title longer than 30 characters" do + is_expected.to validate_length_of(:title).is_at_least(3).is_at_most(30) end it "is not valid without a favicon" do - site_setting.favicon.purge - expect(site_setting).not_to be_valid + subject.favicon.purge + + is_expected.not_to be_valid + end + + context "with an invalid favicon type" do + let(:invalid_favicon_format) { "application/pdf" } + + before do + subject.favicon.content_type = invalid_favicon_format + end + + it "is not valid" do + is_expected.not_to be_valid + end + end + + context "with a valid favicon type" do + let(:valid_favicon_format) { "image/png" } + + before do + subject.favicon.content_type = valid_favicon_format + end + + it "is valid" do + is_expected.to be_valid + end end - it "is not valid with a favicon of invalid type" do - site_setting.favicon.content_type = "application/pdf" - expect(site_setting).not_to be_valid + context "with a favicon larger than 1 KB" do + let(:invalid_favicon_size) { 2.kilobytes } + + before do + subject.favicon.byte_size = invalid_favicon_size + end + + it "is not valid" do + is_expected.not_to be_valid + expect(subject.errors.messages[:favicon].join).to include( + I18n.t("errors.messages.file_size_out_of_range") + ) + end end - it "is valid with a favicon of valid type" do - site_setting.favicon.content_type = "image/png" - expect(site_setting).to be_valid + context "with a favicon larger than 180x180 pixels" do + let(:site_setting_params) { attributes_for(:site_setting, :invalid_favicon) } + + it "is not valid" do + is_expected.not_to be_valid + expect(subject.errors.messages[:favicon]).to include( + I18n.t("errors.messages.dimension_width_less_than_or_equal_to", length: 180) + ) + end end - it "is not valid with a favicon larger than 500 KB" do - site_setting.favicon.byte_size = 600.kilobytes - expect(site_setting).not_to be_valid - expect(site_setting.errors.messages[:favicon]).to include(I18n.t("account.site_settings.validations.size")) + context "with a favicon with not square acpect ratio" do + let(:site_setting_params) { attributes_for(:site_setting, :invalid_favicon) } + + it "is not valid" do + is_expected.not_to be_valid + expect(subject.errors.messages[:favicon]).to include( + I18n.t("errors.messages.aspect_ratio_not_square") + ) + end end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index f24f79d27..b20b510b5 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -38,6 +38,12 @@ require "rails_helper" RSpec.describe User, type: :model do + subject { build(:user) } + + describe "associations" do + it { is_expected.to have_one_attached(:avatar) } + end + describe "validations" do it { is_expected.to validate_presence_of(:email) } it { is_expected.to validate_uniqueness_of(:email).case_insensitive } @@ -50,13 +56,13 @@ it { is_expected.to validate_presence_of(:first_name).on(:create) } it { is_expected.to validate_presence_of(:first_name).on(:update) } - it { is_expected.to validate_length_of(:first_name).is_at_least(2).on(:create) } - it { is_expected.to validate_length_of(:first_name).is_at_least(2).on(:update) } + it { is_expected.to validate_length_of(:first_name).is_at_least(2).is_at_most(50).on(:create) } + it { is_expected.to validate_length_of(:first_name).is_at_least(2).is_at_most(50).on(:update) } it { is_expected.to validate_presence_of(:last_name).on(:create) } it { is_expected.to validate_presence_of(:last_name).on(:update) } - it { is_expected.to validate_length_of(:last_name).is_at_least(2).on(:create) } - it { is_expected.to validate_length_of(:last_name).is_at_least(2).on(:update) } + it { is_expected.to validate_length_of(:last_name).is_at_least(2).is_at_most(50).on(:create) } + it { is_expected.to validate_length_of(:last_name).is_at_least(2).is_at_most(50).on(:update) } it { is_expected.to allow_value("email@gmail.com").for(:email) } it { is_expected.not_to allow_value("email.factory-com").for(:email) } @@ -64,4 +70,63 @@ it { is_expected.to allow_value("P@$$w0rd!-_%^&*()_+|~={}[]:\";'<>?,./").for(:password) } it { is_expected.not_to allow_value("/asd").for(:password) } end + + describe "versioning", versioning: true do + let!(:user) { create(:user, first_name: "John", last_name: "Doe") } + + it "adds a version when the user is updated" do + user.update!(first_name: "Jane", last_name: "Doe") + + expect(user.versions.count).to eq(2) + end + end + + describe ".grouped_collection_by_role" do + let!(:admin) { create(:user, :admin) } + let!(:regular_user) { create(:user) } + + subject { described_class.grouped_collection_by_role.to_h } + + it "returns a hash with the users grouped by role" do + expect(subject.keys).to match_array(["admin", "user"]) + expect(subject.values.flatten).to match_array([admin, regular_user]) + end + end + + describe ".from_omniauth" do + context "when the user exists" do + let(:user) { create(:user) } + let(:access_token) do + double( + "access_token", + info: { + "email" => user.email + } + ) + end + + it "returns the user" do + expect(described_class.from_omniauth(access_token)).to eq(user) + end + end + + context "when the user does not exist" do + let(:access_token) do + double( + "access_token", + info: { + "first_name" => "John", + "last_name" => "Doe", + "email" => "example@mail.io" + } + ) + end + + it "creates a new user" do + expect do + described_class.from_omniauth(access_token) + end.to change(described_class, :count).by(1) + end + end + end end diff --git a/spec/requests/account/calculators_spec.rb b/spec/requests/account/calculators_spec.rb new file mode 100644 index 000000000..d1ad7f17a --- /dev/null +++ b/spec/requests/account/calculators_spec.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe "Account::CalculatorsController", type: :request do + include_context :authorize_admin + + let!(:calculator) { create(:calculator) } + + describe "DELETE #destroy" do + it "destroys the calculator and redirects" do + expect do + delete account_calculator_path(calculator) + end.to change(Calculator, :count).by(-1) + + expect(response).to redirect_to(account_calculators_path) + expect(flash[:notice]).to eq(I18n.t("notifications.calculator_deleted")) + end + end +end diff --git a/spec/requests/account/diapers_periods/categories_spec.rb b/spec/requests/account/diapers_periods/categories_spec.rb new file mode 100644 index 000000000..4426c38df --- /dev/null +++ b/spec/requests/account/diapers_periods/categories_spec.rb @@ -0,0 +1,49 @@ +require "rails_helper" + +RSpec.describe Account::DiapersPeriods::CategoriesController, type: :request do + include_context :authorize_admin + + let!(:diapers_period) { create :diapers_period } + let!(:category) { create :category, :budgetary } + + describe "GET #with_periods" do + it "is successful" do + get with_periods_account_diapers_periods_categories_path(format: :turbo_stream) + + expect(response).to be_successful + end + end + + describe "GET #available" do + it "is successful" do + get available_account_diapers_periods_categories_path(format: :turbo_stream) + + expect(response).to be_successful + end + end + + describe "DELETE #destroy" do + it "destroys all periods in the requested category" do + expect do + delete account_diapers_periods_category_path(id: category.id, format: :turbo_stream), + params: { category_id: category.id } + end.to change(category.diapers_periods, :count).to(0) + + expect(response).to have_http_status(:see_other) + expect(response).to have_rendered(:destroy) + expect(response.body).to include("action=\"remove\" target=\"category_#{category.id}\"") + end + + context "when destroy fails" do + it "returns a turbo stream response with a status" do + allow_any_instance_of(Category).to receive_message_chain(:diapers_periods, :destroy_all).and_return(false) + + delete account_diapers_periods_category_path(id: category.id, format: :turbo_stream), + params: { category_id: category.id } + + expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_rendered(:with_periods) + end + end + end +end diff --git a/spec/requests/account/diapers_periods_spec.rb b/spec/requests/account/diapers_periods_spec.rb new file mode 100644 index 000000000..a08a66627 --- /dev/null +++ b/spec/requests/account/diapers_periods_spec.rb @@ -0,0 +1,114 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe Account::DiapersPeriodsController, type: :request do + include_context :authorize_admin + + let!(:diapers_period) { create :diapers_period } + let(:valid_params) { attributes_for(:diapers_period, category_id: category.id) } + let(:invalid_params) { attributes_for(:diapers_period, usage_amount: "", category_id: category.id) } + let(:new_params) { attributes_for(:diapers_period, category_id: category.id, usage_amount: 7) } + let!(:category) { create :category, :budgetary } + + describe "GET #idex" do + it "is successful" do + get account_diapers_periods_path(category_id: category.id, format: :turbo_stream) + + expect(response).to be_successful + expect(response.body).to include(category.name) + end + end + + describe "GET #new" do + it "is successful" do + get new_account_diapers_period_path(category_id: category.id, format: :turbo_stream) + + expect(response).to be_successful + expect(response.body).to include(category.name) + end + end + + describe "GET #edit" do + it "is successful" do + get edit_account_diapers_period_path(diapers_period, category_id: category.id, format: :turbo_stream) + + expect(response).to be_successful + end + end + + describe "POST #create" do + context "with valid parameters" do + it "is successful" do + expect do + post account_diapers_periods_path(format: :turbo_stream), params: { diapers_period: valid_params } + end.to change(DiapersPeriod, :count).by(1) + + expect(response).to render_template(:create) + expect(response.body).to include(valid_params[:usage_amount].to_s) + end + end + + context "with invalid parameters" do + it "is not successful" do + expect do + post account_diapers_periods_path(format: :turbo_stream), params: { diapers_period: invalid_params } + end.not_to change(DiapersPeriod, :count) + + expect(response).to render_template(:new) + expect(response).to be_unprocessable + end + end + end + + describe "PATCH #update" do + context "with valid parameters" do + it "is successful" do + expect do + patch account_diapers_period_path(diapers_period, format: :turbo_stream), params: { diapers_period: new_params } + + diapers_period.reload + end.to change(diapers_period, :usage_amount).to(new_params[:usage_amount]) + + expect(response).to render_template(:update) + expect(response.body).to include(new_params[:usage_amount].to_s) + end + end + + context "with invalid parameters" do + it "is unprocessable" do + expect do + patch account_diapers_period_path(diapers_period, format: :turbo_stream), params: { diapers_period: invalid_params } + end.not_to change(diapers_period, :usage_amount) + + expect(response).to render_template(:edit) + expect(response).to be_unprocessable + end + end + end + + describe "DELETE #destroy" do + it "destroys the requested period" do + expect do + delete account_diapers_period_path(diapers_period, category_id: category.id, format: :turbo_stream) + end.to change(DiapersPeriod, :count).by(-1) + + expect(response).to have_http_status(:see_other) + expect(response).to have_rendered(:destroy) + expect(response.body).to include("action=\"remove\" target=\"diapers_period_#{diapers_period.id}\"") + end + + context "when destroy fails" do + it "returns a turbo stream response with a status" do + allow(DiapersPeriod).to receive(:find).and_return(diapers_period) + allow(diapers_period).to receive(:destroy).and_return(false) + + delete account_diapers_period_path(diapers_period, format: :turbo_stream), + params: { id: diapers_period.id, category_id: category.id } + + expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_rendered(:index) + end + end + end +end diff --git a/spec/requests/account/messages_spec.rb b/spec/requests/account/messages_spec.rb new file mode 100644 index 000000000..dcd3d902c --- /dev/null +++ b/spec/requests/account/messages_spec.rb @@ -0,0 +1,37 @@ +require "rails_helper" + +RSpec.describe Account::ProductsController, type: :request do + let!(:message) { create(:message, title: "Title") } + + include_context :authorize_admin + + describe "GET :index" do + it "is successful" do + get account_messages_path + + expect(response).to be_successful + expect(response).to render_template(:index) + expect(response.body).to include(message.title) + end + + it "returns the expected attributes" do + Message.ransackable_attributes.each do |attribute| + get account_messages_path(q: { s: "#{attribute} asc" }) + expect(response).to be_successful + + get account_messages_path(q: { s: "#{attribute} desc" }) + expect(response).to be_successful + end + end + end + + describe "GET :show" do + it "is successful" do + get account_message_path(message) + + expect(response).to be_successful + expect(response).to render_template(:show) + expect(response.body).to include(message.title) + end + end +end diff --git a/spec/requests/account/users_spec.rb b/spec/requests/account/users_spec.rb new file mode 100644 index 000000000..c5e744f84 --- /dev/null +++ b/spec/requests/account/users_spec.rb @@ -0,0 +1,128 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe "Account::UsersController", type: :request do + include_context :authorize_admin + + let!(:user) { create(:user, last_sign_in_at: Time.current) } + + describe "GET #index" do + it "returns a successful html response" do + get account_users_path + + expect(response).to be_successful + expect(response).to render_template(:index) + expect(response.body).to include(I18n.t("account.users.index.main_header")) + end + + it "returns a successful csv response" do + get account_users_path(format: "csv") + + csv_content = response.instance_variable_get(:@stream).instance_variable_get(:@buf).join + + expect(response.header["Content-Type"]).to include "application/octet-stream" + expect(csv_content).to match(user.email) + expect(csv_content).to match(user.first_name) + expect(csv_content).to match(user.last_name) + expect(csv_content).to include(user.last_sign_in_at.to_s) + end + + it "returns the expected attributes" do + User.ransackable_attributes.each do |attribute| + get account_users_path(q: { s: "#{attribute} asc" }) + expect(response).to be_successful + + get account_users_path(q: { s: "#{attribute} desc" }) + expect(response).to be_successful + end + end + end + + describe "GET #new" do + it "returns a successful response" do + get new_account_user_path + + expect(response).to be_successful + expect(response).to render_template(:new) + expect(response.body).to include(I18n.t("account.users.new.table.create_new_user")) + end + end + + describe "POST #create" do + let(:valid_params) { attributes_for(:user) } + + context "with valid parameters" do + it "creates a new user and redirects" do + expect do + post account_users_path, params: { user: valid_params } + end.to change(User, :count).by(1) + + expect(response).to redirect_to(account_user_path(User.last)) + expect(flash[:notice]).to eq(I18n.t("notifications.user_created")) + end + + it "creates a new user and sends an email" do + expect do + post account_users_path, params: { user: valid_params.merge(send_credentials_email: "1") } + end.to change { ActionMailer::Base.deliveries.count }.by(1) + end + + it "creates a new user and doesn`t send an email" do + expect do + post account_users_path, params: { user: valid_params.merge(send_credentials_email: "0") } + end.not_to change { ActionMailer::Base.deliveries.count } + end + end + + context "with invalid parameters" do + it "does not create a new user" do + expect do + post account_users_path, params: { user: { email: "" }} + end.not_to change(User, :count) + + expect(response).to be_unprocessable + expect(response).to render_template(:new) + end + end + end + + describe "PATCH #update" do + context "with valid parameters" do + it "updates the user" do + expect do + patch account_user_path(user), params: { user: { email: "new@example.com" }} + + user.reload + end.to change { user.email }.to("new@example.com") + + expect(response).to redirect_to(account_user_path(user)) + expect(flash[:notice]).to eq(I18n.t("notifications.user_updated")) + end + end + + context "with invalid parameters" do + it "does not update the user" do + expect do + patch account_user_path(user), params: { user: { email: "" }} + + user.reload + end.not_to change { user } + + expect(response).to be_unprocessable + expect(response).to render_template(:edit) + end + end + end + + describe "DELETE #destroy" do + it "destroys the user and redirects to index page" do + expect do + delete account_user_path(user) + end.to change(User, :count).by(-1) + + expect(response).to redirect_to(account_users_path) + expect(flash[:notice]).to eq(I18n.t("notifications.user_deleted")) + end + end +end diff --git a/spec/requests/calculators_spec.rb b/spec/requests/calculators_spec.rb index be424f158..648ea7f0f 100644 --- a/spec/requests/calculators_spec.rb +++ b/spec/requests/calculators_spec.rb @@ -37,22 +37,105 @@ end it "returns JSON" do - expect(response).to have_http_status(200) + expect(response).to be_successful + expect(response.content_type).to eq("application/json; charset=utf-8") + + expect(json_response).to include("result") + expect(json_response["result"][0]).to include("name", "result") end - it "JSON response contains `result` in the root" do + it "JSON response contains 'result' in the root" do expect(json_response["result"]).to be_truthy end - it "JSON response contains `name` and `result` attributes" do + it "JSON response contains 'name' and 'result' attributes" do expect(json_response["result"][0].keys).to contain_exactly( "name", "result" ) end - it "JSON response contains field `name` in snake case format" do + it "JSON response contains field 'name' in snake case format" do expect(json_response["result"][0]["name"]).to eq("first_result") end end + + describe "GET #index" do + context "when show_calculators_list feature is enabled" do + include_context :show_calculators_list + + it "renders the calculators index when show_calculators_list is enabled" do + get calculators_path + + expect(response).to be_successful + expect(response).to render_template(:index) + expect(assigns(:calculators)).not_to be_nil + end + end + + context "when show_calculators_list feature is disabled" do + include_context :hide_calculators_list + + it "returns a not found status" do + get calculators_path + expect(response).to have_http_status(:not_found) + expect(response.body).to be_blank + end + end + end + + describe "GET /calculator" do + context "new version" do + include_context :new_calculator_design + + it "renders the calculator template and new_calculator_design is on" do + get calculator_path + + expect(response).to be_successful + expect(response).to render_template(:new_calculator) + expect(response.body).to include("results") + end + end + + context "old version" do + include_context :old_calculator_design + + it "renders the calculator template and new_calculator_design is off" do + get calculator_path + + expect(response).to be_successful + expect(response).to render_template(:old_calculator) + expect(response.body).to include("results") + end + end + end + + describe "POST #create" do + include_context :authorize_admin + + let(:valid_attributes) { { name: "калькулятор", slug: "test" } } + let(:invalid_attributes) { { name: "$калькулятор", slug: "test" } } + + context "with valid attributes" do + it "creates a calculator" do + expect do + post account_calculators_path, params: { calculator: valid_attributes } + end.to change(Calculator, :count).by(1) + + expect(response).to redirect_to(account_calculators_path) + expect(flash[:notice]).to eq(I18n.t("notifications.calculator_created")) + end + end + + context "with invalid attributes" do + it "does not create a calculator" do + expect do + post account_calculators_path, params: { calculator: invalid_attributes } + end.not_to change(Calculator, :count) + + expect(response.body).to include(I18n.t("activerecord.errors.models.calculator.attributes.name.invalid")) + expect(response).to render_template(:new) + end + end + end end diff --git a/spec/requests/categories_spec.rb b/spec/requests/categories_spec.rb index 360cde08f..03456537b 100644 --- a/spec/requests/categories_spec.rb +++ b/spec/requests/categories_spec.rb @@ -14,6 +14,16 @@ expect(response).to be_successful end + + it "returns the expected attributes" do + Category.ransackable_attributes.each do |attribute| + get account_categories_path(q: { s: "#{attribute} asc" }) + expect(response).to be_successful + + get account_categories_path(q: { s: "#{attribute} desc" }) + expect(response).to be_successful + end + end end describe "GET :new" do @@ -40,7 +50,7 @@ end.to change(Category, :count).by(1) expect(response).to redirect_to(account_categories_path) - expect(flash[:notice]).to eq("Category was successfully created.") + expect(flash[:notice]).to eq("Category was successfully created") end end @@ -63,7 +73,7 @@ expect(category.name).to eq("premium") expect(response).to redirect_to(account_categories_path) - expect(flash[:notice]).to eq("Category was successfully updated.") + expect(flash[:notice]).to eq("Category was successfully updated") end end @@ -85,7 +95,7 @@ end.to change(Category, :count).by(-1) expect(response).to redirect_to(account_categories_path) - expect(flash[:notice]).to eq("Category was successfully destroyed.") + expect(flash[:notice]).to eq("Category was successfully deleted") end end end diff --git a/spec/requests/dashboard_request_spec.rb b/spec/requests/dashboard_request_spec.rb new file mode 100644 index 000000000..dca045566 --- /dev/null +++ b/spec/requests/dashboard_request_spec.rb @@ -0,0 +1,28 @@ +require "rails_helper" + +RSpec.describe Account::DashboardController, type: :request do + context "when the user is signed in" do + describe "GET :index" do + include_context :authorize_admin + + it "returns a success response" do + get account_root_path + + expect(response).to be_successful + expect(response).to render_template(:index) + expect(response.body).to include("hello #{current_user.full_name}") + end + end + end + + context "when the user is not signed in" do + describe "GET :index" do + it "redirects to the sign-in page" do + get account_root_path + + expect(response).to redirect_to(new_user_session_path) + expect(flash[:alert]).to eq("You need to sign in or sign up before continuing") + end + end + end +end diff --git a/spec/requests/diaper_calculators_spec.rb b/spec/requests/diaper_calculators_spec.rb new file mode 100644 index 000000000..75ba93f06 --- /dev/null +++ b/spec/requests/diaper_calculators_spec.rb @@ -0,0 +1,98 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe Api::V1::DiaperCalculatorsController, type: :request do + let(:values) do + { + money_spent: "18300.0", + money_will_be_spent: "27450.0", + used_diapers_amount: 1830.0, + to_be_used_diapers_amount: 2745.0, + used_diapers_amount_pluralize: I18n.t("calculators.old_calculator.bought_diapers", count: 1830), + to_be_diapers_amount_pluralize: I18n.t("calculators.old_calculator.will_buy_diapers", count: 2745) + } + end + let(:expected_result) do + { + result: values, + date: 12, + text_products_to_be_used: "#{values[:to_be_used_diapers_amount]} diapers to be used in the future", + text_products_used: "#{values[:used_diapers_amount]} diapers already used" + } + end + + describe "POST /diaper_calculators" do + context "when no year and no month values" do + let(:year_and_month_error) do + { + error: "Please, select years and months" + } + end + + it "renders year and month error" do + post api_v1_diaper_calculators_path + expect(response).to be_unprocessable + expect(response.body).to eq(year_and_month_error.to_json) + end + end + + context "when no year value" do + let(:year_error) do + { + error: "Please, select years" + } + end + + it "renders year error" do + post api_v1_diaper_calculators_path, params: { childs_months: 0 } + expect(response).to be_unprocessable + expect(response.body).to eq(year_error.to_json) + end + end + + context "when no month value" do + let(:month_error) do + { + error: "Please, select month" + } + end + + it "renders month error" do + post api_v1_diaper_calculators_path, params: { childs_years: 1 } + expect(response).to be_unprocessable + expect(response.body).to eq(month_error.to_json) + end + end + + context "when get awaited values" do + let!(:preferable_category) { create(:category, :medium) } + + it "got the expected result" do + post api_v1_diaper_calculators_path, params: { childs_years: 1, childs_months: 0 } + + expect(JSON.parse(response.body)).to eq(JSON.parse(expected_result.to_json)) + end + end + + context "when get unawaited values" do + let!(:preferable_category) { create(:category, :medium) } + + let(:invalid_values) do + { + money_spent: 42, + money_will_be_spent: 42, + used_diapers_amount: 42, + to_be_used_diapers_amount: 42 + } + end + + it "got the unexpected result" do + expected_result[:result] = invalid_values + post api_v1_diaper_calculators_path, params: { childs_years: 1, childs_months: 0 } + expect(response).to be_successful + expect(response.body).not_to eq(expected_result.to_json) + end + end + end +end diff --git a/spec/requests/feature_flags_spec.rb b/spec/requests/feature_flags_spec.rb new file mode 100644 index 000000000..cdbd10b57 --- /dev/null +++ b/spec/requests/feature_flags_spec.rb @@ -0,0 +1,22 @@ +require "rails_helper" + +RSpec.describe Account::FeatureFlagsController, type: :request, include_shared: true do + context "PATCH /account/feature_flags" do + include_context :authorize_admin + include_context :old_calculator_design + + before do + patch account_features_flags_path, params: { + feature_flags: { + new_calculator_design_enabled: "1" + } + } + end + + it "updates feature flags and redirects to edit_account_site_setting_path" do + expect(Flipper[:new_calculator_design].enabled?).to eq(true) + expect(response).to redirect_to(edit_account_site_setting_path) + expect(flash[:notice]).to eq(I18n.t("notifications.feature_flags_updated")) + end + end +end diff --git a/spec/requests/home_spec.rb b/spec/requests/home_spec.rb index 60a6b5dc0..98753832e 100644 --- a/spec/requests/home_spec.rb +++ b/spec/requests/home_spec.rb @@ -1,6 +1,6 @@ require "rails_helper" -RSpec.describe "HomeController", type: :request do +RSpec.describe HomeController, type: :request do describe "GET :index" do it "is successful" do get root_path @@ -38,4 +38,28 @@ end end end + + describe "GET :about" do + it "is successful" do + get about_path + + expect(response).to be_successful + expect(response).to render_template(:about) + end + end + + context "with locale switching" do + it "is successful" do + get about_path(locale: :uk) + + expect(response).to be_successful + expect(response.body).to include("Про нас") + + get about_path(locale: :en) + + expect(response).to be_successful + expect(response.body).to include("About Us") + expect(response).to render_template(:about) + end + end end diff --git a/spec/requests/products_spec.rb b/spec/requests/products_spec.rb new file mode 100644 index 000000000..a7d792ed6 --- /dev/null +++ b/spec/requests/products_spec.rb @@ -0,0 +1,141 @@ +require "rails_helper" + +RSpec.describe Account::ProductsController, type: :request do + let!(:product) { create(:product, title: "Huggies") } + + include_context :authorize_admin + + describe "GET :index" do + it "is successful" do + get account_products_path + + expect(response).to be_successful + expect(response).to render_template(:index) + expect(response.body).to include(product.title) + end + + it "returns the expected attributes" do + Product.ransackable_attributes.each do |attribute| + get account_products_path(q: { s: "#{attribute} asc" }) + expect(response).to be_successful + + get account_products_path(q: { s: "#{attribute} desc" }) + expect(response).to be_successful + end + end + end + + describe "GET :new" do + it "is successful" do + get new_account_product_path + + expect(response).to be_successful + expect(response).to render_template(:new) + end + end + + describe "GET :show" do + it "is successful" do + get account_product_path(product) + + expect(response).to be_successful + expect(response).to render_template(:show) + expect(response.body).to include(product.title) + end + end + + describe "GET :edit" do + let!(:category) { create(:category, :budgetary) } + + it "is successful" do + get edit_account_product_path(product) + + expect(response).to be_successful + expect(response).to render_template(:edit) + end + end + + describe "POST :create" do + let(:valid_product_attributes) { attributes_for(:product, title: "Libero") } + let(:invalid_product_attributes) { attributes_for(:product, :invalid) } + + context "with valid attributes" do + it "creates a product" do + expect do + post account_products_path, params: { product: valid_product_attributes } + end.to change(Product, :count).by(1) + + expect(response).to redirect_to(account_products_path) + expect(flash[:notice]).to eq(I18n.t("account.products.created")) + end + end + + context "with duplicated attributes" do + before { create(:product, valid_product_attributes) } + + it "doesn't create a duplicated product" do + expect do + post account_products_path, params: { product: valid_product_attributes } + end.not_to change(Product, :count) + + expect(response).to be_unprocessable + expect(response).to render_template(:new) + expect(response.body).to include(I18n.t("activerecord.errors.models.product.attributes.title.taken")) + end + end + + context "with invalid attributes" do + it "does not create a product" do + expect do + post account_products_path, params: { product: invalid_product_attributes } + end.not_to change(Product, :count) + + expect(response).to be_unprocessable + expect(response).to render_template(:new) + end + end + end + + describe "PATCH :update" do + let(:price) { create(:price, :budgetary_price) } + + let(:updated_product_attributes) { attributes_for(:product, :huggie) } + let(:invalid_product_attributes) { attributes_for(:product, :invalid) } + + context "with valid attributes" do + it "updates the product" do + expect do + patch account_product_path(id: price.priceable), params: { product: updated_product_attributes } + price.priceable.reload + end.to change(price.priceable, :title).from("diaper").to("huggie") + + expect(response).to redirect_to(account_products_path) + expect(flash[:notice]).to eq(I18n.t("account.products.updated")) + end + end + + context "with invalid attributes" do + it "does not update product" do + expect do + patch account_product_path(id: price.priceable), params: { product: invalid_product_attributes } + end.not_to change(price.priceable, :title) + + expect(response).to be_unprocessable + expect(response).to render_template(:edit) + end + end + end + + describe "DELETE :destroy" do + let!(:product) { create(:product, :diaper) } + + it "deletes the product" do + expect do + delete account_product_path(id: product) + end.to change(Product, :count).by(-1) + + expect(response).to redirect_to(account_products_path) + expect(flash[:notice]).to eq(I18n.t("account.products.deleted")) + end + end +end diff --git a/spec/requests/site_setting_spec.rb b/spec/requests/site_setting_spec.rb index 220696e3d..0a3c47013 100644 --- a/spec/requests/site_setting_spec.rb +++ b/spec/requests/site_setting_spec.rb @@ -1,12 +1,17 @@ require "rails_helper" RSpec.describe Account::SiteSettingsController, type: :request do - describe "GET edit" do - context "when user is authenticated" do - include_context :authorize_admin + let(:site_setting) { SiteSetting.current } + let(:site_setting_params) { attributes_for(:site_setting, :with_valid_site_setting) } + let(:site_setting_invalid_params) { attributes_for(:site_setting, :invalid_site_setting) } + let(:site_setting_params_new_title) { attributes_for(:site_setting, :new_title) } + + before { allow(SiteSetting).to receive(:current).and_return(site_setting) } - let(:site_setting_params) { FactoryBot.attributes_for(:site_setting, :with_valid_site_setting) } + include_context :authorize_admin + describe "GET #edit" do + context "when user is authenticated" do it "renders the edit template" do get edit_account_site_setting_path @@ -17,38 +22,62 @@ end end - describe "PATCH update" do - include_context :authorize_admin + describe "PATCH #update" do + before { site_setting.update(site_setting_params) } context "with valid params" do - let(:site_setting_params) { { site_setting: FactoryBot.attributes_for(:site_setting, :with_valid_site_setting) } } - let(:site_setting_params_new_title) { { site_setting: FactoryBot.attributes_for(:site_setting, :new_title) } } - it "updates site setting" do - patch account_site_setting_path, params: site_setting_params + patch account_site_setting_path, params: { site_setting: site_setting_params } expect(response).to redirect_to(edit_account_site_setting_path) expect(flash[:notice]).to eq(I18n.t("notifications.site_setting_updated")) - expect(SiteSetting.current).to be_valid - expect(SiteSetting.current.favicon.attached?).to be_truthy + expect(site_setting).to be_valid + expect(site_setting.favicon.attached?).to be_truthy end it "change title" do expect do - patch account_site_setting_path, params: site_setting_params_new_title - end.to change { SiteSetting.current.title }.from("ZeroWaste").to("Test title") + patch account_site_setting_path, params: { site_setting: site_setting_params_new_title } + end.to change { site_setting.title }.from("ZeroWaste").to("Test title") end end context "with invalid params" do - let(:site_setting) { SiteSetting.current } - let(:site_setting_params) { FactoryBot.attributes_for(:site_setting, :invalid_site_setting) } + it "renders edit page with error message" do + patch account_site_setting_path, params: { site_setting: site_setting_invalid_params } + + expect(response).to render_template(:edit) + expect(response).to be_unprocessable + end + end + end + + describe "PUT #revert" do + context "with valid params" do + before { site_setting.update(site_setting_params_new_title) } + + it "reverts site setting" do + put revert_account_site_setting_path + + expect(response).to redirect_to(edit_account_site_setting_path) + expect(flash[:notice]).to eq(I18n.t("notifications.site_setting_reverted")) + + expect(site_setting).to be_valid + expect(site_setting.favicon.attached?).to be_truthy + + expect(site_setting.title).to eq(site_setting_params[:title]) + expect(site_setting.favicon.filename).to eq(site_setting_params[:favicon].original_filename) + end + end + + context "with invalid params" do + before { allow(site_setting).to receive(:update).and_return(false) } it "renders edit page with error message" do - patch account_site_setting_path, params: { site_setting: site_setting_params } + put revert_account_site_setting_path expect(response).to render_template(:edit) - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to be_unprocessable end end end diff --git a/spec/requests/sitemap_spec.rb b/spec/requests/sitemap_spec.rb new file mode 100644 index 000000000..976d81974 --- /dev/null +++ b/spec/requests/sitemap_spec.rb @@ -0,0 +1,27 @@ +require "rails_helper" + +RSpec.describe SitemapController, type: :request do + describe "GET #index" do + it "is successful" do + get sitemap_path + + expect(response).to be_successful + expect(response.body).to include("Sitemap") + expect(response).to render_template(:index) + end + + it "renders the XML template" do + get sitemap_path(format: :xml) + + expect(response).to render_template(:index) + expect(response.content_type).to eq("application/xml; charset=utf-8") + end + + it "renders the HTML template" do + get sitemap_path(format: :html) + + expect(response).to render_template(:index) + expect(response.content_type).to eq("text/html; charset=utf-8") + end + end +end diff --git a/spec/services/calculators/diaper_usage_service_spec.rb b/spec/services/calculators/diaper_usage_service_spec.rb new file mode 100644 index 000000000..c63a7899b --- /dev/null +++ b/spec/services/calculators/diaper_usage_service_spec.rb @@ -0,0 +1,47 @@ +require "rails_helper" + +RSpec.describe Calculators::DiaperUsageService do + let(:category) { create(:category, :medium) } + let(:empty_category) { create(:category, :without_diapers_period) } + + describe "#calculate" do + context "when DiapersPeriod records exist" do + before do + create(:diapers_period, category: category, period_start: 1, period_end: 12, usage_amount: 8, price: 10) + create(:diapers_period, category: category, period_start: 13, period_end: 24, usage_amount: 6, price: 12) + end + + let!(:service) { described_class.new(1, 6, category.id) } + + before do + service.calculate + end + + let(:result) { service.result } + + it "calculates the correct values" do + expect(result[:used_diapers_amount]).to eq(6_771.0) + expect(result[:used_diapers_price]).to eq(69_906.0) + expect(result[:to_be_used_diapers_amount]).to eq(2_928.0) + expect(result[:to_be_used_diapers_price]).to eq(31_476.0) + end + end + + context "when there are no DiapersPeriod records" do + let(:service) { described_class.new(1, 6, empty_category.id) } + + before do + service.calculate + end + + let(:result) { service.result } + + it "returns zero values" do + expect(result[:used_diapers_amount]).to eq(0) + expect(result[:used_diapers_price]).to eq(0) + expect(result[:to_be_used_diapers_amount]).to eq(0) + expect(result[:to_be_used_diapers_price]).to eq(0) + end + end + end +end diff --git a/spec/services/calculators/diapers_spec.rb b/spec/services/calculators/diapers_spec.rb deleted file mode 100644 index 4655e853f..000000000 --- a/spec/services/calculators/diapers_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -# frozen_string_literal: true - -require "rails_helper" - -RSpec.describe Calculators::DiapersService, type: :service do - subject { described_class } - - before do - @service = build(:diapers_service).calculate! - end - - context "when age valid" do - it "calculates price and amount of diapers" do - expect(@service.used_diapers_amount).to eq 2013 - expect(@service.to_be_used_diapers_amount).to eq 2562 - expect(@service.used_diapers_price).to eq 8784 - expect(@service.to_be_used_diapers_price).to eq 14_548.5 - end - end -end diff --git a/spec/services/categories/preferable_service_spec.rb b/spec/services/categories/preferable_service_spec.rb new file mode 100644 index 000000000..6bd6ac4d3 --- /dev/null +++ b/spec/services/categories/preferable_service_spec.rb @@ -0,0 +1,28 @@ +require "rails_helper" + +RSpec.describe Categories::PreferableService do + describe "#call" do + let!(:become_preferable_category) { create(:category, :medium) } + let!(:category) { create(:category, name: "category") } + let!(:current_preferable_category) { create(:category, name: "current preferable category", preferable: true) } + let!(:service) { described_class.new(become_preferable_category) } + + context "when the category is preferable" do + it "sets the category to preferable" do + service.call + + category.reload + expect(category.preferable).to eq("not_preferable") + end + end + + context "when the category is preferable and another category is set to preferable" do + it "sets the other category to not preferable" do + service.call + + current_preferable_category.reload + expect(current_preferable_category.preferable).to eq("not_preferable") + end + end + end +end diff --git a/spec/services/database_backup_spec.rb b/spec/services/database_backup_spec.rb new file mode 100644 index 000000000..221c9648a --- /dev/null +++ b/spec/services/database_backup_spec.rb @@ -0,0 +1,121 @@ +require "rails_helper" + +RSpec.describe DatabaseBackupService do + let(:command_enable) { "rake 'db:backup:create[zero_waste_sandbox.dump]'" } + let(:command_disable) { "rake 'db:backup:restore[zero_waste_sandbox.dump]'" } + let(:backup_archive_dir) { DatabaseBackupService.backup_archive_dir } + let(:backup_file) { DatabaseBackupService.backup_full_path(DatabaseBackupService::BACKUP_SANDBOX_NAME) } + let(:new_file_name_regex) { Regexp.new("\\d{14}_zero_waste_test\\.dump") } + let(:new_file_path_regex) { Regexp.new("#{Regexp.escape(backup_archive_dir.to_s)}/\\d{14}_zero_waste_test\\.dump") } + let(:files) { ["older.dump", "newest.dump"] } + let(:file_name) { "test.dump" } + + describe ".database_name" do + it "returns the name of the current database" do + expect(DatabaseBackupService.database_name).to eq(ActiveRecord::Base.connection.current_database) + end + end + + describe ".backup_dir" do + it "returns the backup directory path" do + expect(DatabaseBackupService.backup_dir.to_s).to include("db/backups") + end + end + + describe ".backup_archive_dir" do + it "returns the backup archive directory path" do + expect(DatabaseBackupService.backup_archive_dir.to_s).to include("db/backups/archive") + end + end + + describe ".backup_full_path" do + context "when file name is provided" do + it "returns the full backup path with the provided file name" do + expect(DatabaseBackupService.backup_full_path(file_name)).to eq(File.join(DatabaseBackupService.backup_dir, file_name)) + end + end + end + + describe ".sandbox_enable" do + context "when dump_flag is true" do + it "runs dump command and returns true" do + expect(described_class.sandbox_enable(true)).to eq(true) + end + end + + context "when dump_flag is false" do + it "runs restore command, copies file to archive and returns false" do + expect(described_class.sandbox_enable(false)).to eq(false) + end + end + end + + describe ".sandbox_enabled?" do + it "checks if the backup file exists" do + expect(File).to receive(:exist?).with(described_class.backup_full_path(described_class::BACKUP_SANDBOX_NAME)).and_return(true) + expect(described_class.sandbox_enabled?).to be_truthy + end + end + + describe ".copy_to_archive" do + before do + allow(FileUtils).to receive(:mv) + end + + it "move the backup file to the archive directory" do + expect(FileUtils).to receive(:mv).with(backup_file, match(new_file_path_regex)) + + DatabaseBackupService.copy_to_archive(backup_file) + end + + it "calls prune_old_backups if archive directory exceeds max backups" do + allow(Dir).to receive(:glob).and_return(Array.new(11, "file.dump")) + expect(DatabaseBackupService).to receive(:prune_old_backups) + + DatabaseBackupService.copy_to_archive(backup_file) + end + end + + describe ".generate_backup_filename" do + it "generates a backup filename with the current timestamp and database name" do + expect(DatabaseBackupService.send(:generate_backup_filename)).to match(new_file_name_regex) + end + end + + describe ".prune_old_backups" do + before do + allow(Dir).to receive(:glob).with(File.join(backup_archive_dir, "*")).and_return(files) + allow(File).to receive(:file?).and_return(true) + allow(File).to receive(:mtime) + allow(FileUtils).to receive(:rm) + end + + it "removes the oldest backup file in the archive directory" do + expect(FileUtils).to receive(:rm).with("older.dump") + + DatabaseBackupService.send(:prune_old_backups) + end + end + + describe ".exceeds_backup_limit?" do + context "when the number of backup files is below the limit" do + it "returns false" do + expect(described_class.exceeds_backup_limit?).to be(false) + end + end + + context "when the number of backup files is at the limit" do + it "returns true" do + allow(Dir).to receive(:glob).with(File.join(backup_archive_dir, "*")).and_return(Array.new(10, "backup_file")) + expect(described_class.exceeds_backup_limit?).to be(true) + end + end + + context "when the number of backup files exceeds the limit" do + it "returns true" do + allow(Dir).to receive(:glob).with(File.join(backup_archive_dir, "*")).and_return(Array.new(11, "backup_file")) + expect(described_class.exceeds_backup_limit?).to be(true) + end + end + end +end diff --git a/spec/services/feature_flags_spec.rb b/spec/services/feature_flags_spec.rb new file mode 100644 index 000000000..fd4c9f001 --- /dev/null +++ b/spec/services/feature_flags_spec.rb @@ -0,0 +1,16 @@ +require "rails_helper" + +RSpec.describe UpdateFeatureFlagsService do + let(:params) { { "feature_1_enabled" => "1", "feature_2_enabled" => "0" } } + + describe "#call" do + it "updates feature flags based on params" do + allow(Flipper).to receive(:features).and_return([double(name: "feature_1"), double(name: "feature_2")]) + + expect(Flipper).to receive(:enable).with("feature_1") + expect(Flipper).to receive(:disable).with("feature_2") + + UpdateFeatureFlagsService.new(params).call + end + end +end diff --git a/spec/support/shared/context/app_config_context.rb b/spec/support/shared/context/app_config_context.rb deleted file mode 100644 index 57e467738..000000000 --- a/spec/support/shared/context/app_config_context.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -RSpec.shared_context :app_config_load do - before do - config = AppConfig.instance - - config.diapers_calculator = YAML.safe_load(file_fixture("app_config.yml").read, - permitted_classes: [Range]) - config.save - end -end diff --git a/spec/support/shared/context/feature_flags.rb b/spec/support/shared/context/feature_flags.rb new file mode 100644 index 000000000..a037cdaa9 --- /dev/null +++ b/spec/support/shared/context/feature_flags.rb @@ -0,0 +1,39 @@ +RSpec.shared_context :new_calculator_design do + before do + FeatureFlag.find_or_create_by!(name: "new_calculator_design") + Flipper.enable :new_calculator_design + end +end + +RSpec.shared_context :old_calculator_design do + before do + FeatureFlag.find_or_create_by!(name: "new_calculator_design") + Flipper.disable :new_calculator_design + end +end + +RSpec.shared_context :show_calculators_list do + before do + FeatureFlag.find_or_create_by!(name: "show_calculators_list") + Flipper.enable(:show_calculators_list) + end +end + +RSpec.shared_context :hide_calculators_list do + before do + FeatureFlag.find_or_create_by!(name: "show_calculators_list") + Flipper.disable(:show_calculators_list) + end +end + +def sandbox_mode_context(mode) + RSpec.shared_context :"sandbox_mode_#{mode}" do + before do + FeatureFlag.find_or_create_by!(name: "sandbox_mode") + Flipper.send(mode, :sandbox_mode) + end + end +end + +sandbox_mode_context(:enable) +sandbox_mode_context(:disable) diff --git a/spec/support/shared/context/session_context.rb b/spec/support/shared/context/session_context.rb index c026e7c85..c8dcd33be 100644 --- a/spec/support/shared/context/session_context.rb +++ b/spec/support/shared/context/session_context.rb @@ -3,3 +3,9 @@ before { sign_in current_user } end + +RSpec.shared_context :authorize_regular_user do + let(:current_user) { create(:user) } + + before { sign_in current_user } +end diff --git a/spec/views/calculators/calculator.html.slim_spec.rb b/spec/views/calculators/calculator.html.slim_spec.rb index 52acafe84..96d745ea1 100644 --- a/spec/views/calculators/calculator.html.slim_spec.rb +++ b/spec/views/calculators/calculator.html.slim_spec.rb @@ -5,11 +5,6 @@ allow(view).to receive(:user_signed_in?).and_return(true) end - xit "renders checkbox when user signed in" do - render - expect(rendered).to include("Yes, I want to receive email messages") - end - it "inhers the calculators path" do expect(controller.controller_path).to eq("calculators") end diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb deleted file mode 100644 index c05709aff..000000000 --- a/test/application_system_test_case.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class ApplicationSystemTestCase < ActionDispatch::SystemTestCase - driven_by :selenium, using: :chrome, screen_size: [1400, 1400] -end diff --git a/test/channels/application_cable/connection_test.rb b/test/channels/application_cable/connection_test.rb deleted file mode 100644 index 035cbc1d7..000000000 --- a/test/channels/application_cable/connection_test.rb +++ /dev/null @@ -1,20 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -# test "connects with cookies" do -# cookies.signed[:user_id] = 42 -# -# connect -# -# assert_equal connection.user_id, "42" -# end -class ApplicationCable::ConnectionTest < ActionCable::Connection::TestCase - # test "connects with cookies" do - # cookies.signed[:user_id] = 42 - # - # connect - # - # assert_equal connection.user_id, "42" - # end -end diff --git a/test/helpers/.keep b/test/helpers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/integration/.keep b/test/integration/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/mailers/.keep b/test/mailers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/models/.keep b/test/models/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/system/.keep b/test/system/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/test_helper.rb b/test/test_helper.rb deleted file mode 100644 index 2cd694316..000000000 --- a/test/test_helper.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -ENV["RAILS_ENV"] ||= "test" -require_relative "../config/environment" -require "rails/test_help" - -# Add more helper methods to be used by all tests here... -# Add more helper methods to be used by all tests here... -class ActiveSupport::TestCase - # Run tests in parallel with specified workers - parallelize(workers: :number_of_processors) - - # Setup all fixtures in test/fixtures/*.yml for all tests in - # alphabetical order. - fixtures :all - - # Add more helper methods to be used by all tests here... -end diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 819745a78..000000000 --- a/yarn.lock +++ /dev/null @@ -1,7835 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz" - integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== - dependencies: - "@babel/highlight" "^7.16.0" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4": - version "7.16.4" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz" - integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== - -"@babel/core@^7.15.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz" - integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helpers" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/core@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.5.tgz#924aa9e1ae56e1e55f7184c8bf073a50d8677f5c" - integrity sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.5" - "@babel/helper-compilation-targets" "^7.16.3" - "@babel/helper-module-transforms" "^7.16.5" - "@babel/helpers" "^7.16.5" - "@babel/parser" "^7.16.5" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.5" - "@babel/types" "^7.16.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz" - integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== - dependencies: - "@babel/types" "^7.16.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.5.tgz#26e1192eb8f78e0a3acaf3eede3c6fc96d22bedf" - integrity sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA== - dependencies: - "@babel/types" "^7.16.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz" - integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz" - integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz#a8429d064dce8207194b8bf05a70a9ea828746af" - integrity sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3": - version "7.16.3" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz" - integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== - dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz" - integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - -"@babel/helper-create-class-features-plugin@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz#5d1bcd096792c1ebec6249eebc6358eec55d0cad" - integrity sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-environment-visitor" "^7.16.5" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-member-expression-to-functions" "^7.16.5" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.5" - "@babel/helper-split-export-declaration" "^7.16.0" - -"@babel/helper-create-regexp-features-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz" - integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - regexpu-core "^4.7.1" - -"@babel/helper-define-polyfill-provider@^0.3.0": - version "0.3.0" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz" - integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz#f6a7f38b3c6d8b07c88faea083c46c09ef5451b8" - integrity sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-explode-assignable-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz" - integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-function-name@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz" - integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== - dependencies: - "@babel/helper-get-function-arity" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-get-function-arity@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz" - integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-hoist-variables@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz" - integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-member-expression-to-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz" - integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-member-expression-to-functions@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz#1bc9f7e87354e86f8879c67b316cb03d3dc2caab" - integrity sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz" - integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-module-transforms@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz" - integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-simple-access" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-module-transforms@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz#530ebf6ea87b500f60840578515adda2af470a29" - integrity sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ== - dependencies: - "@babel/helper-environment-visitor" "^7.16.5" - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-simple-access" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.5" - "@babel/types" "^7.16.0" - -"@babel/helper-optimise-call-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz" - integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-plugin-utils@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz#afe37a45f39fce44a3d50a7958129ea5b1a5c074" - integrity sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ== - -"@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": - version "7.16.4" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz" - integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-wrap-function" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-remap-async-to-generator@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.5.tgz#e706646dc4018942acb4b29f7e185bc246d65ac3" - integrity sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-wrap-function" "^7.16.5" - "@babel/types" "^7.16.0" - -"@babel/helper-replace-supers@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz" - integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-replace-supers@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz#96d3988bd0ab0a2d22c88c6198c3d3234ca25326" - integrity sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ== - dependencies: - "@babel/helper-environment-visitor" "^7.16.5" - "@babel/helper-member-expression-to-functions" "^7.16.5" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/traverse" "^7.16.5" - "@babel/types" "^7.16.0" - -"@babel/helper-simple-access@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz" - integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-split-export-declaration@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz" - integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helper-wrap-function@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz" - integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== - dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-wrap-function@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.5.tgz#0158fca6f6d0889c3fee8a6ed6e5e07b9b54e41f" - integrity sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA== - dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.5" - "@babel/types" "^7.16.0" - -"@babel/helpers@^7.16.0": - version "7.16.3" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz" - integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== - dependencies: - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.3" - "@babel/types" "^7.16.0" - -"@babel/helpers@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.5.tgz#29a052d4b827846dd76ece16f565b9634c554ebd" - integrity sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw== - dependencies: - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.5" - "@babel/types" "^7.16.0" - -"@babel/highlight@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz" - integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== - dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.16.0", "@babel/parser@^7.16.3": - version "7.16.4" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz" - integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== - -"@babel/parser@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.5.tgz#beb3af702e54d24796341ab9420fb329131ad658" - integrity sha512-+Ce7T5iPNWzfu9C1aB5tN3Lyafs5xb3Ic7vBWyZL2KXT3QSdD1dD3CvgOzPmQKoNNRt6uauc0XwNJTQtXC2/Mw== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": - version "7.16.2" - 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.16.2.tgz" - integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz" - integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.0" - -"@babel/plugin-proposal-async-generator-functions@^7.16.4": - version "7.16.4" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz" - integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.16.4" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-async-generator-functions@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.5.tgz#fd3bd7e0d98404a3d4cbca15a72d533f8c9a2f67" - integrity sha512-C/FX+3HNLV6sz7AqbTQqEo1L9/kfrKjxcVtgyBCmvIgOjvuBVUWooDoi7trsLxOzCEo5FccjRvKHkfDsJFZlfA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/helper-remap-async-to-generator" "^7.16.5" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.14.5", "@babel/plugin-proposal-class-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz" - integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-class-properties@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz#3269f44b89122110f6339806e05d43d84106468a" - integrity sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.5" - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-proposal-class-static-block@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz" - integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-class-static-block@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.5.tgz#df58ab015a7d3b0963aafc8f20792dcd834952a9" - integrity sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.5" - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz" - integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-dynamic-import@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz#2e0d19d5702db4dcb9bc846200ca02f2e9d60e9e" - integrity sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz" - integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz#3b4dd28378d1da2fea33e97b9f25d1c2f5bf1ac9" - integrity sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz" - integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.5.tgz#1e726930fca139caab6b084d232a9270d9d16f9c" - integrity sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz" - integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-logical-assignment-operators@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz#df1f2e4b5a0ec07abf061d2c18e53abc237d3ef5" - integrity sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz" - integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz#652555bfeeeee2d2104058c6225dc6f75e2d0f07" - integrity sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz" - integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-numeric-separator@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz#edcb6379b6cf4570be64c45965d8da7a2debf039" - integrity sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.14.7", "@babel/plugin-proposal-object-rest-spread@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz" - integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== - dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.0" - -"@babel/plugin-proposal-object-rest-spread@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.5.tgz#f30f80dacf7bc1404bf67f99c8d9c01665e830ad" - integrity sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-compilation-targets" "^7.16.3" - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.5" - -"@babel/plugin-proposal-optional-catch-binding@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz" - integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-catch-binding@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.5.tgz#1a5405765cf589a11a33a1fd75b2baef7d48b74e" - integrity sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz" - integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz#a5fa61056194d5059366c0009cb9a9e66ed75c1f" - integrity sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz" - integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-private-methods@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz#2086f7d78c1b0c712d49b5c3fbc2d1ca21a7ee12" - integrity sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.5" - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-proposal-private-property-in-object@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz" - integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-private-property-in-object@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz#a42d4b56005db3d405b12841309dbca647e7a21b" - integrity sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-create-class-features-plugin" "^7.16.5" - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz" - integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.5.tgz#35fe753afa7c572f322bd068ff3377bde0f37080" - integrity sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.16.5" - -"@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-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-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-transform-arrow-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz" - integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-arrow-functions@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.5.tgz#04c18944dd55397b521d9d7511e791acea7acf2d" - integrity sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-async-to-generator@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz" - integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.16.0" - -"@babel/plugin-transform-async-to-generator@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.5.tgz#89c9b501e65bb14c4579a6ce9563f859de9b34e4" - integrity sha512-TMXgfioJnkXU+XRoj7P2ED7rUm5jbnDWwlCuFVTpQboMfbSya5WrmubNBAMlk7KXvywpo8rd8WuYZkis1o2H8w== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/helper-remap-async-to-generator" "^7.16.5" - -"@babel/plugin-transform-block-scoped-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz" - integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-block-scoped-functions@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.5.tgz#af087494e1c387574260b7ee9b58cdb5a4e9b0b0" - integrity sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-block-scoping@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz" - integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-block-scoping@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.5.tgz#b91f254fe53e210eabe4dd0c40f71c0ed253c5e7" - integrity sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-classes@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz" - integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.5.tgz#6acf2ec7adb50fb2f3194dcd2909dbd056dcf216" - integrity sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-environment-visitor" "^7.16.5" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/helper-replace-supers" "^7.16.5" - "@babel/helper-split-export-declaration" "^7.16.0" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz" - integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-computed-properties@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.5.tgz#2af91ebf0cceccfcc701281ada7cfba40a9b322a" - integrity sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-destructuring@^7.14.7", "@babel/plugin-transform-destructuring@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz" - integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-destructuring@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.5.tgz#89ebc87499ac4a81b897af53bb5d3eed261bd568" - integrity sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz" - integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-dotall-regex@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.5.tgz#b40739c00b6686820653536d6d143e311de67936" - integrity sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-duplicate-keys@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz" - integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-duplicate-keys@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.5.tgz#2450f2742325412b746d7d005227f5e8973b512a" - integrity sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-exponentiation-operator@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz" - integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-exponentiation-operator@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.5.tgz#36e261fa1ab643cfaf30eeab38e00ed1a76081e2" - integrity sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.5" - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-for-of@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz" - integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-for-of@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.5.tgz#9b544059c6ca11d565457c0ff1f08e13ce225261" - integrity sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-function-name@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz" - integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== - dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-function-name@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.5.tgz#6896ebb6a5538a75d6a4086a277752f655a7bd15" - integrity sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ== - dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz" - integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-literals@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.5.tgz#af392b90e3edb2bd6dc316844cbfd6b9e009d320" - integrity sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-member-expression-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz" - integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-member-expression-literals@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.5.tgz#4bd6ecdc11932361631097b779ca5c7570146dd5" - integrity sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-modules-amd@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz" - integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-amd@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.5.tgz#92c0a3e83f642cb7e75fada9ab497c12c2616527" - integrity sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ== - dependencies: - "@babel/helper-module-transforms" "^7.16.5" - "@babel/helper-plugin-utils" "^7.16.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz" - integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.16.0" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz#4ee03b089536f076b2773196529d27c32b9d7bde" - integrity sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ== - dependencies: - "@babel/helper-module-transforms" "^7.16.5" - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/helper-simple-access" "^7.16.0" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz" - integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== - dependencies: - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.15.7" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.5.tgz#07078ba2e3cc94fbdd06836e355c246e98ad006b" - integrity sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA== - dependencies: - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.5" - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/helper-validator-identifier" "^7.15.7" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz" - integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-modules-umd@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.5.tgz#caa9c53d636fb4e3c99fd35a4c9ba5e5cd7e002e" - integrity sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw== - dependencies: - "@babel/helper-module-transforms" "^7.16.5" - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz" - integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.5.tgz#4afd8cdee377ce3568f4e8a9ee67539b69886a3c" - integrity sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - -"@babel/plugin-transform-new-target@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz" - integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-new-target@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.5.tgz#759ea9d6fbbc20796056a5d89d13977626384416" - integrity sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-object-super@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz" - integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.16.0" - -"@babel/plugin-transform-object-super@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.5.tgz#8ccd9a1bcd3e7732ff8aa1702d067d8cd70ce380" - integrity sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/helper-replace-supers" "^7.16.5" - -"@babel/plugin-transform-parameters@^7.16.0", "@babel/plugin-transform-parameters@^7.16.3": - version "7.16.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz" - integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-parameters@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.5.tgz#4fc74b18a89638bd90aeec44a11793ecbe031dde" - integrity sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-property-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz" - integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.5.tgz#58f1465a7202a2bb2e6b003905212dd7a79abe3f" - integrity sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-regenerator@^7.14.5", "@babel/plugin-transform-regenerator@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz" - integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-regenerator@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz#704cc6d8dd3dd4758267621ab7b36375238cef13" - integrity sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz" - integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-reserved-words@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.5.tgz#db95e98799675e193dc2b47d3e72a7c0651d0c30" - integrity sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-runtime@^7.15.0": - version "7.16.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz" - integrity sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.4.0" - babel-plugin-polyfill-regenerator "^0.3.0" - semver "^6.3.0" - -"@babel/plugin-transform-runtime@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.5.tgz#0cc3f01d69f299d5a42cd9ec43b92ea7a777b8db" - integrity sha512-gxpfS8XQWDbQ8oP5NcmpXxtEgCJkbO+W9VhZlOhr0xPyVaRjAQPOv7ZDj9fg0d5s9+NiVvMCE6gbkEkcsxwGRw== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.16.5" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.4.0" - babel-plugin-polyfill-regenerator "^0.3.0" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz" - integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-shorthand-properties@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.5.tgz#ccb60b1a23b799f5b9a14d97c5bc81025ffd96d7" - integrity sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-spread@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz" - integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - -"@babel/plugin-transform-spread@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.5.tgz#912b06cff482c233025d3e69cf56d3e8fa166c29" - integrity sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - -"@babel/plugin-transform-sticky-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz" - integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-sticky-regex@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.5.tgz#593579bb2b5a8adfbe02cb43823275d9098f75f9" - integrity sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-template-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz" - integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-template-literals@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.5.tgz#343651385fd9923f5aa2275ca352c5d9183e1773" - integrity sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-typeof-symbol@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz" - integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typeof-symbol@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.5.tgz#a1d1bf2c71573fe30965d0e4cd6a3291202e20ed" - integrity sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-unicode-escapes@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz" - integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-escapes@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.5.tgz#80507c225af49b4f4ee647e2a0ce53d2eeff9e85" - integrity sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/plugin-transform-unicode-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz" - integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-regex@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.5.tgz#ac84d6a1def947d71ffb832426aa53b83d7ed49e" - integrity sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.16.5" - -"@babel/preset-env@^7.15.0": - version "7.16.4" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz" - integrity sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-compilation-targets" "^7.16.3" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-async-generator-functions" "^7.16.4" - "@babel/plugin-proposal-class-properties" "^7.16.0" - "@babel/plugin-proposal-class-static-block" "^7.16.0" - "@babel/plugin-proposal-dynamic-import" "^7.16.0" - "@babel/plugin-proposal-export-namespace-from" "^7.16.0" - "@babel/plugin-proposal-json-strings" "^7.16.0" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" - "@babel/plugin-proposal-numeric-separator" "^7.16.0" - "@babel/plugin-proposal-object-rest-spread" "^7.16.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-private-methods" "^7.16.0" - "@babel/plugin-proposal-private-property-in-object" "^7.16.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" - "@babel/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-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-transform-arrow-functions" "^7.16.0" - "@babel/plugin-transform-async-to-generator" "^7.16.0" - "@babel/plugin-transform-block-scoped-functions" "^7.16.0" - "@babel/plugin-transform-block-scoping" "^7.16.0" - "@babel/plugin-transform-classes" "^7.16.0" - "@babel/plugin-transform-computed-properties" "^7.16.0" - "@babel/plugin-transform-destructuring" "^7.16.0" - "@babel/plugin-transform-dotall-regex" "^7.16.0" - "@babel/plugin-transform-duplicate-keys" "^7.16.0" - "@babel/plugin-transform-exponentiation-operator" "^7.16.0" - "@babel/plugin-transform-for-of" "^7.16.0" - "@babel/plugin-transform-function-name" "^7.16.0" - "@babel/plugin-transform-literals" "^7.16.0" - "@babel/plugin-transform-member-expression-literals" "^7.16.0" - "@babel/plugin-transform-modules-amd" "^7.16.0" - "@babel/plugin-transform-modules-commonjs" "^7.16.0" - "@babel/plugin-transform-modules-systemjs" "^7.16.0" - "@babel/plugin-transform-modules-umd" "^7.16.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" - "@babel/plugin-transform-new-target" "^7.16.0" - "@babel/plugin-transform-object-super" "^7.16.0" - "@babel/plugin-transform-parameters" "^7.16.3" - "@babel/plugin-transform-property-literals" "^7.16.0" - "@babel/plugin-transform-regenerator" "^7.16.0" - "@babel/plugin-transform-reserved-words" "^7.16.0" - "@babel/plugin-transform-shorthand-properties" "^7.16.0" - "@babel/plugin-transform-spread" "^7.16.0" - "@babel/plugin-transform-sticky-regex" "^7.16.0" - "@babel/plugin-transform-template-literals" "^7.16.0" - "@babel/plugin-transform-typeof-symbol" "^7.16.0" - "@babel/plugin-transform-unicode-escapes" "^7.16.0" - "@babel/plugin-transform-unicode-regex" "^7.16.0" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.0" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.4.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.19.1" - semver "^6.3.0" - -"@babel/preset-env@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.5.tgz#2e94d922f4a890979af04ffeb6a6b4e44ba90847" - integrity sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-compilation-targets" "^7.16.3" - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-async-generator-functions" "^7.16.5" - "@babel/plugin-proposal-class-properties" "^7.16.5" - "@babel/plugin-proposal-class-static-block" "^7.16.5" - "@babel/plugin-proposal-dynamic-import" "^7.16.5" - "@babel/plugin-proposal-export-namespace-from" "^7.16.5" - "@babel/plugin-proposal-json-strings" "^7.16.5" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.5" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.5" - "@babel/plugin-proposal-numeric-separator" "^7.16.5" - "@babel/plugin-proposal-object-rest-spread" "^7.16.5" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.5" - "@babel/plugin-proposal-optional-chaining" "^7.16.5" - "@babel/plugin-proposal-private-methods" "^7.16.5" - "@babel/plugin-proposal-private-property-in-object" "^7.16.5" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.5" - "@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-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-transform-arrow-functions" "^7.16.5" - "@babel/plugin-transform-async-to-generator" "^7.16.5" - "@babel/plugin-transform-block-scoped-functions" "^7.16.5" - "@babel/plugin-transform-block-scoping" "^7.16.5" - "@babel/plugin-transform-classes" "^7.16.5" - "@babel/plugin-transform-computed-properties" "^7.16.5" - "@babel/plugin-transform-destructuring" "^7.16.5" - "@babel/plugin-transform-dotall-regex" "^7.16.5" - "@babel/plugin-transform-duplicate-keys" "^7.16.5" - "@babel/plugin-transform-exponentiation-operator" "^7.16.5" - "@babel/plugin-transform-for-of" "^7.16.5" - "@babel/plugin-transform-function-name" "^7.16.5" - "@babel/plugin-transform-literals" "^7.16.5" - "@babel/plugin-transform-member-expression-literals" "^7.16.5" - "@babel/plugin-transform-modules-amd" "^7.16.5" - "@babel/plugin-transform-modules-commonjs" "^7.16.5" - "@babel/plugin-transform-modules-systemjs" "^7.16.5" - "@babel/plugin-transform-modules-umd" "^7.16.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.5" - "@babel/plugin-transform-new-target" "^7.16.5" - "@babel/plugin-transform-object-super" "^7.16.5" - "@babel/plugin-transform-parameters" "^7.16.5" - "@babel/plugin-transform-property-literals" "^7.16.5" - "@babel/plugin-transform-regenerator" "^7.16.5" - "@babel/plugin-transform-reserved-words" "^7.16.5" - "@babel/plugin-transform-shorthand-properties" "^7.16.5" - "@babel/plugin-transform-spread" "^7.16.5" - "@babel/plugin-transform-sticky-regex" "^7.16.5" - "@babel/plugin-transform-template-literals" "^7.16.5" - "@babel/plugin-transform-typeof-symbol" "^7.16.5" - "@babel/plugin-transform-unicode-escapes" "^7.16.5" - "@babel/plugin-transform-unicode-regex" "^7.16.5" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.0" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.4.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.19.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - 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/runtime@^7.15.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": - version "7.16.3" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz" - integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.16.0": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz" - integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3": - version "7.16.3" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz" - integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.3" - "@babel/types" "^7.16.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.16.5": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.5.tgz#d7d400a8229c714a59b87624fc67b0f1fbd4b2b3" - integrity sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.5" - "@babel/helper-environment-visitor" "^7.16.5" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.5" - "@babel/types" "^7.16.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.16.0", "@babel/types@^7.4.4": - version "7.16.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz" - integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== - dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - to-fast-properties "^2.0.0" - -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz" - integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.6" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz" - integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== - -"@fortawesome/fontawesome-free@^5.15.4": - version "5.15.4" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" - integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== - -"@gar/promisify@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz" - integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== - -"@hotwired/stimulus-webpack-helpers@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@hotwired/stimulus-webpack-helpers/-/stimulus-webpack-helpers-1.0.1.tgz#4cd74487adeca576c9865ac2b9fe5cb20cef16dd" - integrity sha512-wa/zupVG0eWxRYJjC1IiPBdt3Lruv0RqGN+/DTMmUWUyMAEB27KXmVY6a8YpUVTM7QwVuaLNGW4EqDgrS2upXQ== - -"@hotwired/stimulus@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.1.tgz#e3de23623b0c52c247aba4cd5d530d257008676b" - integrity sha512-HGlzDcf9vv/EQrMJ5ZG6VWNs8Z/xMN+1o2OhV1gKiSG6CqZt5MCBB1gRg5ILiN3U0jEAxuDTNPRfBcnZBDmupQ== - -"@nathanvda/cocoon@^1.2.14": - version "1.2.14" - resolved "https://registry.yarnpkg.com/@nathanvda/cocoon/-/cocoon-1.2.14.tgz#aaea910e4b9c0d28d5bdcb7f3743617db46b09af" - integrity sha512-WcEt2vVp50de2i7rkD4O+96O1iMtMIcTBNGPocrHfcmHDujKOngoLHFF8Ektgoh8PjwFAJMxx8WyGv0BtKTjxQ== - dependencies: - jquery "^3.3.1" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@npmcli/fs@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz" - integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ== - dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" - -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@rails/actioncable@^6.0.0": - version "6.1.4" - resolved "https://registry.npmjs.org/@rails/actioncable/-/actioncable-6.1.4.tgz" - integrity sha512-0LmSKJTuo2dL6BQ+9xxLnS9lbkyfz2mBGeBnQ2J7o9Bn0l0q+ZC6VuoZMZZXPvABI4QT7Nfknv5WhfKYL+boew== - -"@rails/activestorage@^6.0.0": - version "6.1.4" - resolved "https://registry.npmjs.org/@rails/activestorage/-/activestorage-6.1.4.tgz" - integrity sha512-1Tm8uaVBhLTDEG4YaFPvqguhjbUGSPVItm0CfkRpIFZIkybWzFAxatIrk4YVOOxB8ZdXS7GdeYa1qVwjdiDkgQ== - dependencies: - spark-md5 "^3.0.0" - -"@rails/ujs@^6.0.0": - version "6.1.4" - resolved "https://registry.npmjs.org/@rails/ujs/-/ujs-6.1.4.tgz" - integrity sha512-O3lEzL5DYbxppMdsFSw36e4BHIlfz/xusynwXGv3l2lhSlvah41qviRpsoAlKXxl37nZAqK+UUF5cnGGK45Mfw== - -"@rails/webpacker@5.4.3": - version "5.4.3" - resolved "https://registry.npmjs.org/@rails/webpacker/-/webpacker-5.4.3.tgz" - integrity sha512-tEM8tpUtfx6FxKwcuQ9+v6pzgqM5LeAdhT6IJ4Te3BPKFO1xrGrXugqeRuZ+gE8ASDZRTOK6yuQkapOpuX5JdA== - dependencies: - "@babel/core" "^7.15.0" - "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.14.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.14.7" - "@babel/plugin-transform-regenerator" "^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" - babel-plugin-dynamic-import-node "^2.3.3" - babel-plugin-macros "^2.8.0" - case-sensitive-paths-webpack-plugin "^2.4.0" - compression-webpack-plugin "^4.0.1" - core-js "^3.16.2" - css-loader "^3.6.0" - file-loader "^6.2.0" - flatted "^3.2.2" - glob "^7.1.7" - js-yaml "^3.14.1" - mini-css-extract-plugin "^0.9.0" - optimize-css-assets-webpack-plugin "^5.0.8" - path-complete-extname "^1.0.0" - pnp-webpack-plugin "^1.7.0" - postcss-flexbugs-fixes "^4.2.1" - postcss-import "^12.0.1" - postcss-loader "^3.0.0" - postcss-preset-env "^6.7.0" - postcss-safe-parser "^4.0.2" - regenerator-runtime "^0.13.9" - sass "^1.38.0" - sass-loader "10.1.1" - style-loader "^1.3.0" - terser-webpack-plugin "^4.2.3" - webpack "^4.46.0" - webpack-assets-manifest "^3.1.1" - webpack-cli "^3.3.12" - webpack-sources "^1.4.3" - -"@types/http-proxy@^1.17.5": - version "1.17.7" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" - integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== - dependencies: - "@types/node" "*" - -"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== - -"@types/node@*": - version "16.11.12" - resolved "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz" - integrity sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw== - -"@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/q@^1.5.1": - version "1.5.5" - resolved "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz" - integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== - -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== - -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== - dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== - -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== - -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz" - integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg== - -"@webpack-cli/info@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz" - integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw== - dependencies: - envinfo "^7.7.3" - -"@webpack-cli/serve@^1.6", "@webpack-cli/serve@^1.6.0": - version "1.6.0" - resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz" - integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA== - -"@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== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn@^6.4.1: - version "6.4.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, 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.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: - 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, ajv@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" - integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.0, 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" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -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" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -async@^2.6.2: - version "2.6.3" - resolved "https://registry.npmjs.org/async/-/async-2.6.3.tgz" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -autoprefixer@^9.6.1: - 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" - -babel-loader@^8.2.2, babel-loader@^8.2.3: - version "8.2.3" - resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz" - integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^1.4.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-macros@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz" - integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.0" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz" - integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.0" - core-js-compat "^3.18.0" - -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz" - integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.0" - -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== - -base64-js@^1.0.2: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -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== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -bootstrap@^4.6.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.1.tgz#bc25380c2c14192374e8dec07cf01b2742d222a2" - integrity sha512-0dj+VgI9Ecom+rvvpNZ4MUZJz8dcX7WCX+eTID9+/8HgOkv3dsRzi8BGeZJCQU6flWQVYxwTQnEZFrmJSEO7og== - -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" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.6.4: - version "4.18.1" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz" - integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== - dependencies: - caniuse-lite "^1.0.30001280" - electron-to-chromium "^1.3.896" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - -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== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^15.0.5: - version "15.3.0" - resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -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" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -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@^5.0.0, 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-api@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001280: - version "1.0.30001429" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz" - integrity sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg== - -case-sensitive-paths-webpack-plugin@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz" - integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== - -chalk@^2.0, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: - 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" - -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1, chokidar@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -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== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -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" - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0, color-convert@^1.9.3: - 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-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.6.0: - version "1.9.0" - resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz" - integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.0.0: - version "3.2.1" - resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -colorette@^2.0.10, colorette@^2.0.14: - version "2.0.16" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== - -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== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression-webpack-plugin@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-4.0.1.tgz" - integrity sha512-0mg6PgwTsUe5LEcUrOu3ob32vraDx2VdbMGAT1PARcOV+UJWDYZFdkSo6RbHoGQ061mmmkC7XpRKOlvwm/gzJQ== - dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - schema-utils "^2.7.0" - serialize-javascript "^4.0.0" - webpack-sources "^1.4.3" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js-compat@^3.18.0, core-js-compat@^3.19.1: - version "3.19.3" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.3.tgz" - integrity sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA== - dependencies: - browserslist "^4.18.1" - semver "7.0.0" - -core-js@^3.16.2: - version "3.19.3" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz" - integrity sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^5.0.0: - version "5.2.1" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -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-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-blank-pseudo@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz" - integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== - dependencies: - postcss "^7.0.5" - -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" - -css-has-pseudo@^0.10.0: - version "0.10.0" - resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz" - integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^5.0.0-rc.4" - -css-loader@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz" - integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== - dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.0" - semver "^6.3.0" - -css-prefers-color-scheme@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz" - integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== - dependencies: - postcss "^7.0.5" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-tree@^1.1.2: - version "1.1.3" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== - -cssdb@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz" - integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== - -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== - -cssnano-preset-default@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz" - integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.3" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== - -cssnano@^4.1.10: - version "4.1.11" - resolved "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz" - integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.8" - is-resolvable "^1.0.0" - postcss "^7.0.0" - -csso@^4.0.2: - version "4.2.0" - resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.1.1: - 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.1.0, debug@^4.1.1: - version "4.3.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" - integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= - dependencies: - buffer-indexof "^1.0.0" - -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" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -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.2.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== - -domutils@^1.7.0: - 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" - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.3.896: - version "1.4.14" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.14.tgz" - integrity sha512-RsGkAN9JEAYMObS72kzUsPPcPGMqX1rBqGuXi9aa4TBKLzICoLf+DAAtd0fVFzrniJqYzpby47gthCUoObfs0Q== - -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -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== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -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== - -errno@^0.1.3, errno@~0.1.7: - version "0.1.8" - resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -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.17.2, es-abstract@^1.19.1: - version "1.19.1" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -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" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -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 sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -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== - -esrecurse@^4.1.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.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -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== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - -express@^4.17.1: - version "4.17.1" - resolved "https://registry.npmjs.org/express/-/express-4.17.1.tgz" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -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.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - 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: - 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== - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -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@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.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" - -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -flatpickr@^4.6.9: - version "4.6.9" - resolved "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz" - integrity sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw== - -flatted@^3.2.2: - version "3.2.4" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz" - integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -follow-redirects@^1.0.0: - version "1.14.6" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz" - integrity sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-monkey@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - 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== - -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-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -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-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.1.2, 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@^7.1.3, glob@^7.1.4, glob@^7.1.7: - version "7.2.0" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^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@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -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== - -globby@^11.0.1: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6: - version "4.2.8" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -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-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -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-value@^0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.0, 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" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - -html-entities@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" - integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-parser-js@>=0.5.1: - version "0.5.5" - resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz" - integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== - -http-proxy-middleware@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" - integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== - dependencies: - "@types/http-proxy" "^1.17.5" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" - -ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -ignore@^5.1.4: - version "5.1.9" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" - integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== - -immutable@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz" - integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== - -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= - dependencies: - import-from "^2.1.0" - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.1.0: - 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-from@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= - dependencies: - resolve-from "^3.0.0" - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -import-local@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz" - integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== - 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 sha1-khi5srkoojixPcT7a21XbyMUU+o= - -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== - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -infer-owner@^1.0.3, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.4, 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: - version "1.0.3" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -interpret@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -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== - -ip@^1.1.0: - version "1.1.5" - resolved "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - 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-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -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-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -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@^1.1.5: - version "1.1.6" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - -is-core-module@^2.2.0: - version "2.8.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - 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-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - 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-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -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@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.3, 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.0.4, 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-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== - -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-weakref@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz" - integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== - dependencies: - call-bind "^1.0.0" - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -jest-worker@^26.5.0: - 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" - -jquery@^3.3.1, jquery@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" - integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== - -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, js-yaml@^3.14.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" - -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 sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - 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.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - 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.4: - version "2.0.5" - resolved "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== - -last-call-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz" - integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.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@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -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" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash.get@^4.0: - version "4.4.2" - resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash.has@^4.0: - version "4.5.2" - resolved "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz" - integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash@^4.17.14, lodash@^4.17.5: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -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" - -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -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-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -memfs@^3.2.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.0.tgz#8bc12062b973be6b295d4340595736a656f0a257" - integrity sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA== - dependencies: - fs-monkey "1.0.3" - -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -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: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": - version "1.51.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mini-css-extract-plugin@^0.9.0: - version "0.9.0" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz" - integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A== - dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.6" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== - dependencies: - yallist "^4.0.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -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== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -nan@^2.12.1: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -neo-async@^2.5.0, neo-async@^2.6.1, 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== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.11.1" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz" - integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA== - -object-is@^1.0.1: - 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.0.12, 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-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.1.0: - version "2.1.3" - resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz" - integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.0: - version "1.1.5" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.0.9: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -optimize-css-assets-webpack-plugin@^5.0.8: - version "5.0.8" - resolved "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz" - integrity sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q== - dependencies: - cssnano "^4.1.10" - last-call-webpack-plugin "^3.0.0" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -p-limit@^2.0.0, 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-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^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-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^4.5.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" - integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== - dependencies: - "@types/retry" "^0.12.0" - retry "^0.13.1" - -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== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -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-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -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" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -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-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -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 sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.0.0, 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.6: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -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== - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -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.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -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" - -popper.js@^1.16.1: - version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - -portfinder@^1.0.28: - version "1.0.28" - resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-attribute-case-insensitive@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz" - integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^6.0.2" - -postcss-calc@^7.0.1: - version "7.0.5" - resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz" - integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== - dependencies: - postcss "^7.0.27" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" - -postcss-color-functional-notation@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz" - integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-gray@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz" - integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-color-hex-alpha@^5.0.3: - version "5.0.3" - resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz" - integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== - dependencies: - postcss "^7.0.14" - postcss-values-parser "^2.0.1" - -postcss-color-mod-function@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz" - integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-rebeccapurple@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz" - integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== - dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-custom-media@^7.0.8: - version "7.0.8" - resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz" - integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== - dependencies: - postcss "^7.0.14" - -postcss-custom-properties@^8.0.11: - version "8.0.11" - resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz" - integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== - dependencies: - postcss "^7.0.17" - postcss-values-parser "^2.0.1" - -postcss-custom-selectors@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz" - integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-dir-pseudo-class@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz" - integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" - -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" - -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" - -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" - -postcss-double-position-gradients@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz" - integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== - dependencies: - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-env-function@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz" - integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-flexbugs-fixes@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz" - integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== - dependencies: - postcss "^7.0.26" - -postcss-focus-visible@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz" - integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== - dependencies: - postcss "^7.0.2" - -postcss-focus-within@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz" - integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== - dependencies: - postcss "^7.0.2" - -postcss-font-variant@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz" - integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== - dependencies: - postcss "^7.0.2" - -postcss-gap-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz" - integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== - dependencies: - postcss "^7.0.2" - -postcss-image-set-function@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz" - integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-import@^12.0.1: - version "12.0.1" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz" - integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== - dependencies: - postcss "^7.0.1" - postcss-value-parser "^3.2.3" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-initial@^3.0.0: - version "3.0.4" - resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz" - integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== - dependencies: - postcss "^7.0.2" - -postcss-lab-function@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz" - integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-load-config@^2.0.0: - version "2.1.2" - resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz" - integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== - dependencies: - cosmiconfig "^5.0.0" - import-cwd "^2.0.0" - -postcss-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== - dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" - -postcss-logical@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz" - integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== - dependencies: - postcss "^7.0.2" - -postcss-media-minmax@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz" - integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== - dependencies: - postcss "^7.0.2" - -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== - dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" - -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" - -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== - dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" - -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== - dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" - -postcss-modules-local-by-default@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== - dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" - -postcss-nesting@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz" - integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== - dependencies: - postcss "^7.0.2" - -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== - dependencies: - postcss "^7.0.0" - -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== - dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== - dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== - dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-overflow-shorthand@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz" - integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== - dependencies: - postcss "^7.0.2" - -postcss-page-break@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz" - integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== - dependencies: - postcss "^7.0.2" - -postcss-place@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz" - integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-preset-env@^6.7.0: - version "6.7.0" - resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz" - integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== - dependencies: - autoprefixer "^9.6.1" - browserslist "^4.6.4" - caniuse-lite "^1.0.30000981" - css-blank-pseudo "^0.1.4" - css-has-pseudo "^0.10.0" - css-prefers-color-scheme "^3.1.1" - cssdb "^4.4.0" - postcss "^7.0.17" - postcss-attribute-case-insensitive "^4.0.1" - postcss-color-functional-notation "^2.0.1" - postcss-color-gray "^5.0.0" - postcss-color-hex-alpha "^5.0.3" - postcss-color-mod-function "^3.0.3" - postcss-color-rebeccapurple "^4.0.1" - postcss-custom-media "^7.0.8" - postcss-custom-properties "^8.0.11" - postcss-custom-selectors "^5.1.2" - postcss-dir-pseudo-class "^5.0.0" - postcss-double-position-gradients "^1.0.0" - postcss-env-function "^2.0.2" - postcss-focus-visible "^4.0.0" - postcss-focus-within "^3.0.0" - postcss-font-variant "^4.0.0" - postcss-gap-properties "^2.0.0" - postcss-image-set-function "^3.0.1" - postcss-initial "^3.0.0" - postcss-lab-function "^2.0.1" - postcss-logical "^3.0.0" - postcss-media-minmax "^4.0.0" - postcss-nesting "^7.0.0" - postcss-overflow-shorthand "^2.0.0" - postcss-page-break "^2.0.0" - postcss-place "^4.0.1" - postcss-pseudo-class-any-link "^6.0.0" - postcss-replace-overflow-wrap "^3.0.0" - postcss-selector-matches "^4.0.0" - postcss-selector-not "^4.0.0" - -postcss-pseudo-class-any-link@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz" - integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== - dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-replace-overflow-wrap@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz" - integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== - dependencies: - postcss "^7.0.2" - -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-selector-matches@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz" - integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-not@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz" - integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-parser@^3.0.0: - version "3.1.2" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz" - integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== - dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== - dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.7" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz" - integrity sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-svgo@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz" - integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" - -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== - dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3: - version "3.3.1" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.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-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz" - integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, 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" - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -proxy-addr@~2.0.5: - version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, 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" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" - integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= - dependencies: - pify "^2.3.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.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" - -regenerate-unicode-properties@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz" - integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== - 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.4, regenerator-runtime@^0.13.9: - version "0.13.9" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.2.0: - version "1.3.1" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz" - integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -regexpu-core@^4.7.1: - version "4.8.0" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz" - integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^9.0.0" - regjsgen "^0.5.2" - regjsparser "^0.7.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regjsgen@^0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== - -regjsparser@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz" - integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -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-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -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-url@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.1.7, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.9.0: - version "1.20.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= - -rimraf@^2.5.4, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -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" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - 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@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sass-loader@10.1.1: - version "10.1.1" - resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz" - integrity sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw== - dependencies: - klona "^2.0.4" - loader-utils "^2.0.0" - neo-async "^2.6.2" - schema-utils "^3.0.0" - semver "^7.3.2" - -sass@^1.38.0: - version "1.44.0" - resolved "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz" - integrity sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw== - dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" - -sax@~1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -schema-utils@^2.6.5, schema-utils@^2.7.0: - 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.0: - version "3.1.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= - -selfsigned@^1.10.11: - version "1.10.11" - resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz" - integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== - dependencies: - node-forge "^0.10.0" - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.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.3.2, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -send@0.17.1: - version "0.17.1" - resolved "https://registry.npmjs.org/send/-/send-0.17.1.tgz" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -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@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -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@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -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@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -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.3: - version "3.0.6" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz" - integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sockjs@^0.3.21: - version "0.3.24" - resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.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-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.12, 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-url@^0.4.0: - version "0.4.1" - resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -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.7.2: - version "0.7.3" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -spark-md5@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz" - integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string_decoder@^1.0.0, 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_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -style-loader@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz" - integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.7.0" - -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -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@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - 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" - -svgo@^1.0.0: - version "1.3.2" - resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tar@^6.0.2: - version "6.1.11" - resolved "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser-webpack-plugin@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz" - integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== - dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - jest-worker "^26.5.0" - p-limit "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - source-map "^0.6.1" - terser "^5.3.4" - webpack-sources "^1.4.3" - -terser@^4.1.2: - version "4.8.0" - resolved "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -terser@^5.3.4: - version "5.10.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz" - integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -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 sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -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" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -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== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -turbolinks@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/turbolinks/-/turbolinks-5.2.0.tgz" - integrity sha512-pMiez3tyBo6uRHFNNZoYMmrES/IaGgMhQQM+VFF36keryjb5ms0XkVpmKHkfW/4Vy96qiGW3K9bz0tF5sK9bBw== - -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - 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.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -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" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.npmjs.org/util/-/util-0.11.1.tgz" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache@^2.1.1: - 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== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.7.4: - version "1.7.5" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -webpack-assets-manifest@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/webpack-assets-manifest/-/webpack-assets-manifest-3.1.1.tgz" - integrity sha512-JV9V2QKc5wEWQptdIjvXDUL1ucbPLH2f27toAY3SNdGZp+xSaStAgpoMcvMZmqtFrBc9a5pTS1058vxyMPOzRQ== - dependencies: - chalk "^2.0" - lodash.get "^4.0" - lodash.has "^4.0" - mkdirp "^0.5" - schema-utils "^1.0.0" - tapable "^1.0.0" - webpack-sources "^1.0.0" - -webpack-cli@^3.3.12: - version "3.3.12" - resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz" - integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== - dependencies: - chalk "^2.4.2" - cross-spawn "^6.0.5" - enhanced-resolve "^4.1.1" - findup-sync "^3.0.0" - global-modules "^2.0.0" - import-local "^2.0.0" - interpret "^1.4.0" - loader-utils "^1.4.0" - supports-color "^6.1.0" - v8-compile-cache "^2.1.1" - yargs "^13.3.2" - -webpack-cli@^4.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.1.tgz#b64be825e2d1b130f285c314caa3b1ba9a4632b3" - integrity sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.1.0" - "@webpack-cli/info" "^1.4.0" - "@webpack-cli/serve" "^1.6.0" - colorette "^2.0.14" - commander "^7.0.0" - execa "^5.0.0" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" - webpack-merge "^5.7.3" - -webpack-dev-middleware@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz#eb5193faa5479ca1086b9f7bed68b89c731bff62" - integrity sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w== - dependencies: - colorette "^2.0.10" - memfs "^3.2.2" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4: - version "4.6.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz#e8648601c440172d9b6f248d28db98bed335315a" - integrity sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg== - dependencies: - ansi-html-community "^0.0.8" - bonjour "^3.5.0" - chokidar "^3.5.2" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - default-gateway "^6.0.3" - del "^6.0.0" - express "^4.17.1" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.0" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - portfinder "^1.0.28" - schema-utils "^4.0.0" - selfsigned "^1.10.11" - serve-index "^1.9.1" - sockjs "^0.3.21" - spdy "^4.0.2" - strip-ansi "^7.0.0" - url "^0.11.0" - webpack-dev-middleware "^5.2.1" - ws "^8.1.0" - -webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^1.0.0, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, 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@^4.46.0: - version "4.46.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz" - integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.5.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -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-module@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.14, which@^1.2.9, 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.0" - resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -ws@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.3.0.tgz#7185e252c8973a60d57170175ff55fdbd116070d" - integrity sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw== - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -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.7.2: - version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yarn@^1.22.17: - version "1.22.17" - resolved "https://registry.npmjs.org/yarn/-/yarn-1.22.17.tgz" - integrity sha512-H0p241BXaH0UN9IeH//RT82tl5PfNraVpSpEoW+ET7lmopNC61eZ+A+IDvU8FM6Go5vx162SncDL8J1ZjRBriQ== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==