From 75abfaf828ee11695740158952e0d9420bdbb2f3 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Mon, 16 Nov 2020 15:02:11 -0800 Subject: [PATCH 001/208] created new rails project --- .browserslistrc | 1 + .gitignore | 36 + .ruby-version | 1 + Gemfile | 78 + Gemfile.lock | 298 + Guardfile | 9 + Rakefile | 6 + app/assets/config/manifest.js | 2 + app/assets/images/.keep | 0 app/assets/stylesheets/application.scss | 18 + app/channels/application_cable/channel.rb | 4 + app/channels/application_cable/connection.rb | 4 + app/controllers/application_controller.rb | 2 + app/controllers/concerns/.keep | 0 app/helpers/application_helper.rb | 2 + app/javascript/channels/consumer.js | 6 + app/javascript/channels/index.js | 5 + app/javascript/packs/application.js | 19 + app/jobs/application_job.rb | 7 + app/mailers/application_mailer.rb | 4 + app/models/application_record.rb | 3 + app/models/concerns/.keep | 0 app/views/layouts/application.html.erb | 15 + app/views/layouts/mailer.html.erb | 13 + app/views/layouts/mailer.text.erb | 1 + babel.config.js | 72 + bin/bundle | 114 + bin/rails | 9 + bin/rake | 9 + bin/setup | 36 + bin/spring | 17 + bin/webpack | 18 + bin/webpack-dev-server | 18 + bin/yarn | 11 + config.ru | 5 + config/application.rb | 23 + config/boot.rb | 4 + config/cable.yml | 10 + config/credentials.yml.enc | 1 + config/database.yml | 85 + config/environment.rb | 5 + config/environments/development.rb | 62 + config/environments/production.rb | 112 + config/environments/test.rb | 49 + config/initializers/action_view.rb | 1 + .../application_controller_renderer.rb | 8 + config/initializers/assets.rb | 14 + config/initializers/backtrace_silencers.rb | 7 + .../initializers/content_security_policy.rb | 30 + config/initializers/cookies_serializer.rb | 5 + .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 + config/initializers/mime_types.rb | 4 + config/initializers/wrap_parameters.rb | 14 + config/locales/en.yml | 33 + config/puma.rb | 38 + config/routes.rb | 3 + config/spring.rb | 6 + config/storage.yml | 34 + config/webpack/development.js | 5 + config/webpack/environment.js | 13 + config/webpack/production.js | 5 + config/webpack/test.js | 5 + config/webpacker.yml | 96 + db/seeds.rb | 7 + lib/assets/.keep | 0 lib/tasks/.keep | 0 log/.keep | 0 package.json | 18 + postcss.config.js | 12 + public/404.html | 67 + public/422.html | 67 + public/500.html | 66 + public/apple-touch-icon-precomposed.png | 0 public/apple-touch-icon.png | 0 public/favicon.ico | 0 public/robots.txt | 1 + storage/.keep | 0 test/application_system_test_case.rb | 5 + .../application_cable/connection_test.rb | 11 + test/controllers/.keep | 0 test/fixtures/.keep | 0 test/fixtures/files/.keep | 0 test/helpers/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/system/.keep | 0 test/test_helper.rb | 21 + tmp/.keep | 0 tmp/pids/.keep | 0 vendor/.keep | 0 yarn.lock | 7638 +++++++++++++++++ 93 files changed, 9448 insertions(+) create mode 100644 .browserslistrc create mode 100644 .gitignore create mode 100644 .ruby-version create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Guardfile create mode 100644 Rakefile create mode 100644 app/assets/config/manifest.js create mode 100644 app/assets/images/.keep create mode 100644 app/assets/stylesheets/application.scss create mode 100644 app/channels/application_cable/channel.rb create mode 100644 app/channels/application_cable/connection.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/helpers/application_helper.rb create mode 100644 app/javascript/channels/consumer.js create mode 100644 app/javascript/channels/index.js create mode 100644 app/javascript/packs/application.js create mode 100644 app/jobs/application_job.rb create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/models/application_record.rb create mode 100644 app/models/concerns/.keep create mode 100644 app/views/layouts/application.html.erb create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100644 babel.config.js create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100755 bin/webpack create mode 100755 bin/webpack-dev-server create mode 100755 bin/yarn create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/credentials.yml.enc create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/action_view.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/assets.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/content_security_policy.rb create mode 100644 config/initializers/cookies_serializer.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/spring.rb create mode 100644 config/storage.yml create mode 100644 config/webpack/development.js create mode 100644 config/webpack/environment.js create mode 100644 config/webpack/production.js create mode 100644 config/webpack/test.js create mode 100644 config/webpacker.yml create mode 100644 db/seeds.rb create mode 100644 lib/assets/.keep create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/apple-touch-icon-precomposed.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100644 storage/.keep create mode 100644 test/application_system_test_case.rb create mode 100644 test/channels/application_cable/connection_test.rb create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/fixtures/files/.keep create mode 100644 test/helpers/.keep create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/system/.keep create mode 100644 test/test_helper.rb create mode 100644 tmp/.keep create mode 100644 tmp/pids/.keep create mode 100644 vendor/.keep create mode 100644 yarn.lock diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000000..e94f8140cc --- /dev/null +++ b/.browserslistrc @@ -0,0 +1 @@ +defaults diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..f22dd34725 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore pidfiles, but keep the directory. +/tmp/pids/* +!/tmp/pids/ +!/tmp/pids/.keep + +# Ignore uploaded files in development. +/storage/* +!/storage/.keep + +/public/assets +.byebug_history + +# Ignore master key for decrypting credentials and more. +/config/master.key + +/public/packs +/public/packs-test +/node_modules +/yarn-error.log +yarn-debug.log* +.yarn-integrity diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000000..57cf282ebb --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.6.5 diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..48cdee19cb --- /dev/null +++ b/Gemfile @@ -0,0 +1,78 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.6.5' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 6.0.3', '>= 6.0.3.4' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# Use Puma as the app server +gem 'puma', '~> 4.1' +# Use SCSS for stylesheets +gem 'sass-rails', '>= 6' +# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker +gem 'webpacker', '~> 4.0' +# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks +gem 'turbolinks', '~> 5' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.7' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use Active Model has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use Active Storage variant +# gem 'image_processing', '~> 1.2' + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.4.2', require: false + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] +end + +group :development do + # Access an interactive console on exception pages or by calling 'console' anywhere in the code. + gem 'web-console', '>= 3.3.0' + gem 'listen', '~> 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + +group :test do + # Adds support for Capybara system testing and selenium driver + gem 'capybara', '>= 2.15' + gem 'selenium-webdriver' + # Easy installation and use of web drivers to run system tests with browsers + gem 'webdrivers' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +gem 'jquery-rails' +gem 'jquery-turbolinks' +gem 'bootstrap' +group :development, :test do + gem 'pry-rails' +end + +group :development do + gem 'guard' + gem 'guard-minitest' + gem 'debase', '>= 0.2.4.1' + gem 'ruby-debug-ide', '>= 0.7.0' +end + +group :development do + gem 'better_errors' + gem 'binding_of_caller' +end + +group :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..5c056fcc4c --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,298 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (6.0.3.4) + actionpack (= 6.0.3.4) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailbox (6.0.3.4) + actionpack (= 6.0.3.4) + activejob (= 6.0.3.4) + activerecord (= 6.0.3.4) + activestorage (= 6.0.3.4) + activesupport (= 6.0.3.4) + mail (>= 2.7.1) + actionmailer (6.0.3.4) + actionpack (= 6.0.3.4) + actionview (= 6.0.3.4) + activejob (= 6.0.3.4) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (6.0.3.4) + actionview (= 6.0.3.4) + activesupport (= 6.0.3.4) + rack (~> 2.0, >= 2.0.8) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.2.0) + actiontext (6.0.3.4) + actionpack (= 6.0.3.4) + activerecord (= 6.0.3.4) + activestorage (= 6.0.3.4) + activesupport (= 6.0.3.4) + nokogiri (>= 1.8.5) + actionview (6.0.3.4) + activesupport (= 6.0.3.4) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.1, >= 1.2.0) + activejob (6.0.3.4) + activesupport (= 6.0.3.4) + globalid (>= 0.3.6) + activemodel (6.0.3.4) + activesupport (= 6.0.3.4) + activerecord (6.0.3.4) + activemodel (= 6.0.3.4) + activesupport (= 6.0.3.4) + activestorage (6.0.3.4) + actionpack (= 6.0.3.4) + activejob (= 6.0.3.4) + activerecord (= 6.0.3.4) + marcel (~> 0.3.1) + activesupport (6.0.3.4) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + zeitwerk (~> 2.2, >= 2.2.2) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + ansi (1.5.0) + autoprefixer-rails (10.0.2.0) + execjs + better_errors (2.9.1) + coderay (>= 1.0.0) + erubi (>= 1.0.0) + rack (>= 0.9.0) + bindex (0.8.1) + binding_of_caller (0.8.0) + debug_inspector (>= 0.0.1) + bootsnap (1.5.1) + msgpack (~> 1.0) + bootstrap (4.5.3) + autoprefixer-rails (>= 9.1.0) + popper_js (>= 1.14.3, < 2) + sassc-rails (>= 2.0.0) + builder (3.2.4) + byebug (11.1.3) + capybara (3.33.0) + addressable + mini_mime (>= 0.1.3) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (~> 1.5) + xpath (~> 3.2) + childprocess (3.0.0) + coderay (1.1.3) + concurrent-ruby (1.1.7) + crass (1.0.6) + debase (0.2.4.1) + debase-ruby_core_source (>= 0.10.2) + debase-ruby_core_source (0.10.11) + debug_inspector (0.0.3) + erubi (1.10.0) + execjs (2.7.0) + ffi (1.13.1) + formatador (0.2.5) + globalid (0.4.2) + activesupport (>= 4.2.0) + guard (2.16.2) + formatador (>= 0.2.4) + listen (>= 2.7, < 4.0) + lumberjack (>= 1.0.12, < 2.0) + nenv (~> 0.1) + notiffany (~> 0.0) + pry (>= 0.9.12) + shellany (~> 0.0) + thor (>= 0.18.1) + guard-compat (1.2.1) + guard-minitest (2.4.6) + guard-compat (~> 1.2) + minitest (>= 3.0) + i18n (1.8.5) + concurrent-ruby (~> 1.0) + jbuilder (2.10.1) + activesupport (>= 5.0.0) + jquery-rails (4.4.0) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + jquery-turbolinks (2.1.0) + railties (>= 3.1.0) + turbolinks + listen (3.3.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + loofah (2.7.0) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + lumberjack (1.2.8) + mail (2.7.1) + mini_mime (>= 0.1.1) + marcel (0.3.3) + mimemagic (~> 0.3.2) + method_source (1.0.0) + mimemagic (0.3.5) + mini_mime (1.0.2) + mini_portile2 (2.4.0) + minitest (5.14.2) + minitest-rails (6.0.1) + minitest (~> 5.10) + railties (~> 6.0.0) + minitest-reporters (1.4.2) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + msgpack (1.3.3) + nenv (0.3.0) + nio4r (2.5.4) + nokogiri (1.10.10) + mini_portile2 (~> 2.4.0) + notiffany (0.1.3) + nenv (~> 0.1) + shellany (~> 0.0) + pg (1.2.3) + popper_js (1.16.0) + pry (0.13.1) + coderay (~> 1.1) + method_source (~> 1.0) + pry-rails (0.3.9) + pry (>= 0.10.4) + public_suffix (4.0.6) + puma (4.3.6) + nio4r (~> 2.0) + rack (2.2.3) + rack-proxy (0.6.5) + rack + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (6.0.3.4) + actioncable (= 6.0.3.4) + actionmailbox (= 6.0.3.4) + actionmailer (= 6.0.3.4) + actionpack (= 6.0.3.4) + actiontext (= 6.0.3.4) + actionview (= 6.0.3.4) + activejob (= 6.0.3.4) + activemodel (= 6.0.3.4) + activerecord (= 6.0.3.4) + activestorage (= 6.0.3.4) + activesupport (= 6.0.3.4) + bundler (>= 1.3.0) + railties (= 6.0.3.4) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.3.0) + loofah (~> 2.3) + railties (6.0.3.4) + actionpack (= 6.0.3.4) + activesupport (= 6.0.3.4) + method_source + rake (>= 0.8.7) + thor (>= 0.20.3, < 2.0) + rake (13.0.1) + rb-fsevent (0.10.4) + rb-inotify (0.10.1) + ffi (~> 1.0) + regexp_parser (1.8.2) + ruby-debug-ide (0.7.2) + rake (>= 0.8.1) + ruby-progressbar (1.10.1) + rubyzip (2.3.0) + sass-rails (6.0.0) + sassc-rails (~> 2.1, >= 2.1.1) + sassc (2.4.0) + ffi (~> 1.9) + sassc-rails (2.1.2) + railties (>= 4.0.0) + sassc (>= 2.0) + sprockets (> 3.0) + sprockets-rails + tilt + selenium-webdriver (3.142.7) + childprocess (>= 0.5, < 4.0) + rubyzip (>= 1.2.2) + shellany (0.0.1) + spring (2.1.1) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (4.0.2) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.2) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (1.0.1) + thread_safe (0.3.6) + tilt (2.0.10) + turbolinks (5.2.1) + turbolinks-source (~> 5.2) + turbolinks-source (5.2.0) + tzinfo (1.2.8) + thread_safe (~> 0.1) + web-console (4.1.0) + actionview (>= 6.0.0) + activemodel (>= 6.0.0) + bindex (>= 0.4.0) + railties (>= 6.0.0) + webdrivers (4.4.1) + nokogiri (~> 1.6) + rubyzip (>= 1.3.0) + selenium-webdriver (>= 3.0, < 4.0) + webpacker (4.3.0) + activesupport (>= 4.2) + rack-proxy (>= 0.6.1) + railties (>= 4.2) + websocket-driver (0.7.3) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + xpath (3.2.0) + nokogiri (~> 1.8) + zeitwerk (2.4.1) + +PLATFORMS + ruby + +DEPENDENCIES + better_errors + binding_of_caller + bootsnap (>= 1.4.2) + bootstrap + byebug + capybara (>= 2.15) + debase (>= 0.2.4.1) + guard + guard-minitest + jbuilder (~> 2.7) + jquery-rails + jquery-turbolinks + listen (~> 3.2) + minitest-rails + minitest-reporters + pg (>= 0.18, < 2.0) + pry-rails + puma (~> 4.1) + rails (~> 6.0.3, >= 6.0.3.4) + ruby-debug-ide (>= 0.7.0) + sass-rails (>= 6) + selenium-webdriver + spring + spring-watcher-listen (~> 2.0.0) + turbolinks (~> 5) + tzinfo-data + web-console (>= 3.3.0) + webdrivers + webpacker (~> 4.0) + +RUBY VERSION + ruby 2.6.5p114 + +BUNDLED WITH + 2.1.4 diff --git a/Guardfile b/Guardfile new file mode 100644 index 0000000000..e34f706f4a --- /dev/null +++ b/Guardfile @@ -0,0 +1,9 @@ +guard :minitest, autorun: false, spring: true do + watch(%r{^app/(.+).rb$}) { |m| "test/#{m[1]}_test.rb" } + watch(%r{^app/controllers/application_controller.rb$}) { 'test/controllers' } + watch(%r{^app/controllers/(.+)_controller.rb$}) { |m| "test/integration/#{m[1]}_test.rb" } + watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" } + watch(%r{^lib/(.+).rb$}) { |m| "test/lib/#{m[1]}_test.rb" } + watch(%r{^test/.+_test.rb$}) + watch(%r{^test/test_helper.rb$}) { 'test' } +end diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000000..e85f913914 --- /dev/null +++ b/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js new file mode 100644 index 0000000000..591819335f --- /dev/null +++ b/app/assets/config/manifest.js @@ -0,0 +1,2 @@ +//= link_tree ../images +//= link_directory ../stylesheets .css diff --git a/app/assets/images/.keep b/app/assets/images/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss new file mode 100644 index 0000000000..17320fb11e --- /dev/null +++ b/app/assets/stylesheets/application.scss @@ -0,0 +1,18 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + */ + +/* Custom bootstrap variables must be set or imported *before* bootstrap. */ +@import "bootstrap"; + +@import "**/*"; diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 0000000000..d672697283 --- /dev/null +++ b/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb new file mode 100644 index 0000000000..0ff5442f47 --- /dev/null +++ b/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000000..09705d12ab --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < ActionController::Base +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000000..de6be7945c --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/javascript/channels/consumer.js b/app/javascript/channels/consumer.js new file mode 100644 index 0000000000..0eceb59b18 --- /dev/null +++ b/app/javascript/channels/consumer.js @@ -0,0 +1,6 @@ +// Action Cable provides the framework to deal with WebSockets in Rails. +// You can generate new channels where WebSocket features live using the `rails generate channel` command. + +import { createConsumer } from "@rails/actioncable" + +export default createConsumer() diff --git a/app/javascript/channels/index.js b/app/javascript/channels/index.js new file mode 100644 index 0000000000..0cfcf74919 --- /dev/null +++ b/app/javascript/channels/index.js @@ -0,0 +1,5 @@ +// 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) diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js new file mode 100644 index 0000000000..529f85b082 --- /dev/null +++ b/app/javascript/packs/application.js @@ -0,0 +1,19 @@ +// 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. + +require("@rails/ujs").start() +require("turbolinks").start() +require("@rails/activestorage").start() +require("channels") + +import "bootstrap" + + +// Uncomment to copy all static images under ../images to the output folder and reference +// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>) +// or the `imagePath` JavaScript helper below. +// +// const images = require.context('../images', true) +// const imagePath = (name) => images(name, true) diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 0000000000..d394c3d106 --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,7 @@ +class ApplicationJob < ActiveJob::Base + # Automatically retry jobs that encountered a deadlock + # retry_on ActiveRecord::Deadlocked + + # Most jobs are safe to ignore if the underlying records are no longer available + # discard_on ActiveJob::DeserializationError +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 0000000000..286b2239d1 --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 0000000000..10a4cba84d --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000000..74961e61a4 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,15 @@ + + + + Betsy + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000000..cbd34d2e9d --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 0000000000..37f0bddbd7 --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000000..12f98da5af --- /dev/null +++ b/babel.config.js @@ -0,0 +1,72 @@ +module.exports = function(api) { + var validEnv = ['development', 'test', 'production'] + var currentEnv = api.env() + var isDevelopmentEnv = api.env('development') + var isProductionEnv = api.env('production') + var isTestEnv = api.env('test') + + if (!validEnv.includes(currentEnv)) { + throw new Error( + 'Please specify a valid `NODE_ENV` or ' + + '`BABEL_ENV` environment variables. Valid values are "development", ' + + '"test", and "production". Instead, received: ' + + JSON.stringify(currentEnv) + + '.' + ) + } + + return { + presets: [ + isTestEnv && [ + '@babel/preset-env', + { + targets: { + node: 'current' + } + } + ], + (isProductionEnv || isDevelopmentEnv) && [ + '@babel/preset-env', + { + forceAllTransforms: true, + useBuiltIns: 'entry', + corejs: 3, + modules: false, + exclude: ['transform-typeof-symbol'] + } + ] + ].filter(Boolean), + plugins: [ + 'babel-plugin-macros', + '@babel/plugin-syntax-dynamic-import', + isTestEnv && 'babel-plugin-dynamic-import-node', + '@babel/plugin-transform-destructuring', + [ + '@babel/plugin-proposal-class-properties', + { + loose: true + } + ], + [ + '@babel/plugin-proposal-object-rest-spread', + { + useBuiltIns: true + } + ], + [ + '@babel/plugin-transform-runtime', + { + helpers: false, + regenerator: true, + corejs: false + } + ], + [ + '@babel/plugin-transform-regenerator', + { + async: false + } + ] + ].filter(Boolean) + } +} diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 0000000000..a71368e323 --- /dev/null +++ b/bin/bundle @@ -0,0 +1,114 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'bundle' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require "rubygems" + +m = Module.new do + module_function + + def invoked_as_script? + File.expand_path($0) == File.expand_path(__FILE__) + end + + def env_var_version + ENV["BUNDLER_VERSION"] + end + + def cli_arg_version + return unless invoked_as_script? # don't want to hijack other binstubs + return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` + bundler_version = nil + update_index = nil + ARGV.each_with_index do |a, i| + if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN + bundler_version = a + end + next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ + bundler_version = $1 + update_index = i + end + bundler_version + end + + def gemfile + gemfile = ENV["BUNDLE_GEMFILE"] + return gemfile if gemfile && !gemfile.empty? + + File.expand_path("../../Gemfile", __FILE__) + end + + def lockfile + lockfile = + case File.basename(gemfile) + when "gems.rb" then gemfile.sub(/\.rb$/, gemfile) + else "#{gemfile}.lock" + end + File.expand_path(lockfile) + end + + def lockfile_version + return unless File.file?(lockfile) + lockfile_contents = File.read(lockfile) + return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/ + Regexp.last_match(1) + end + + def bundler_version + @bundler_version ||= + env_var_version || cli_arg_version || + lockfile_version + end + + def bundler_requirement + return "#{Gem::Requirement.default}.a" unless bundler_version + + bundler_gem_version = Gem::Version.new(bundler_version) + + requirement = bundler_gem_version.approximate_recommendation + + return requirement unless Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0") + + requirement += ".a" if bundler_gem_version.prerelease? + + requirement + end + + def load_bundler! + ENV["BUNDLE_GEMFILE"] ||= gemfile + + activate_bundler + end + + def activate_bundler + gem_error = activation_error_handling do + gem "bundler", bundler_requirement + end + return if gem_error.nil? + require_error = activation_error_handling do + require "bundler/version" + end + return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION)) + warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`" + exit 42 + end + + def activation_error_handling + yield + nil + rescue StandardError, LoadError => e + e + end +end + +m.load_bundler! + +if m.invoked_as_script? + load Gem.bin_path("bundler", "bundle") +end diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000000..5badb2fde0 --- /dev/null +++ b/bin/rails @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake new file mode 100755 index 0000000000..d87d5f5781 --- /dev/null +++ b/bin/rake @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000000..5853b5ea87 --- /dev/null +++ b/bin/setup @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +require 'fileutils' + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +FileUtils.chdir APP_ROOT do + # This script is a way to setup or update your development environment automatically. + # This script is idempotent, so that you can run it at anytime and get an expectable outcome. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies + # system('bin/yarn') + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # FileUtils.cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:prepare' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/spring b/bin/spring new file mode 100755 index 0000000000..d89ee495fa --- /dev/null +++ b/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads Spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == 'spring' } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/bin/webpack b/bin/webpack new file mode 100755 index 0000000000..1031168d01 --- /dev/null +++ b/bin/webpack @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby + +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 new file mode 100755 index 0000000000..dd9662737a --- /dev/null +++ b/bin/webpack-dev-server @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby + +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/bin/yarn b/bin/yarn new file mode 100755 index 0000000000..460dd565b4 --- /dev/null +++ b/bin/yarn @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +APP_ROOT = File.expand_path('..', __dir__) +Dir.chdir(APP_ROOT) do + begin + exec "yarnpkg", *ARGV + rescue Errno::ENOENT + $stderr.puts "Yarn executable was not detected in the system." + $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + exit 1 + end +end diff --git a/config.ru b/config.ru new file mode 100644 index 0000000000..f7ba0b527b --- /dev/null +++ b/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000000..39167e2e9a --- /dev/null +++ b/config/application.rb @@ -0,0 +1,23 @@ +require_relative 'boot' + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module Betsy + class Application < Rails::Application + config.generators do |g| + # Force new test files to be generated in the minitest-spec style + g.test_framework :minitest, spec: true + end + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 6.0 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration can go into files in config/initializers + # -- all .rb files in that directory are automatically loaded after loading + # the framework and any gems in your application. + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000000..b9e460cef3 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,4 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. +require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 0000000000..f2a452f546 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: test + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: betsy_production diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc new file mode 100644 index 0000000000..555517b8fd --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +hJRqmoVMvS6TT26F6Evg3h+XcFQeiBT5H9P6Hh1fjLtwBl324CVD3IvUgw/4ODF8I0iDZDyyXEpn6dZcdsAMJHd8Or+J9YJ2Cva53bPKhWILN4CQJAnicvpkafMHs5YVfwNAYyL+2JZqBi9jQ2DFZaarNa35oSgqNvyDuYxZCNHd/6KDtCpnQmEhgv07y2Cqe9qdalhdS7D1b5e8N9lZVJ1Sy2zoBUwNYekYQm9wEolr7iP4/GZxgAFVKmirEk+7nHv4yoSZKaZFwKWmtAESZuNm5xU6/rSrsPm0ddNALU8TaRBKVJh4koZyaxo8zKt0J/5MFD3hTVZuXARLghUaBlyjU2R8kA6j291yPr94AtQFrzGWO6Rljo83YMwz88t1RQQWjohQtjmhItIMNq9IEQvQ7ccYwxpH9VMi--hZiSKoJ7mzaVowah--JxXnlx8ZnAzmQ9/Ocbgsyg== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000000..8b9bc23f0c --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.3 and up are supported. +# +# Install the pg driver: +# gem install pg +# On macOS with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On macOS with MacPorts: +# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem 'pg' +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # https://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: betsy_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: betsy + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: betsy_test + +# As with config/credentials.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password as a unix environment variable when you boot +# the app. Read https://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full rundown on how to provide these environment variables in a +# production deployment. +# +# On Heroku and other platform providers, you may have a full connection URL +# available as an environment variable. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# You can use this database configuration with: +# +# production: +# url: <%= ENV['DATABASE_URL'] %> +# +production: + <<: *default + database: betsy_production + username: betsy + password: <%= ENV['BETSY_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000000..426333bb46 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000000..66df51f6fc --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,62 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + # Run rails dev:cache to toggle caching. + if Rails.root.join('tmp', 'caching-dev.txt').exist? + config.action_controller.perform_caching = true + config.action_controller.enable_fragment_cache_logging = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + # 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 + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations. + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000000..cd0d255545 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,112 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] + # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + 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 + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local + + # Mount Action Cable outside main process or domain. + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment). + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "betsy_production" + + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false + + # Inserts middleware to perform automatic connection switching. + # The `database_selector` hash is used to pass options to the DatabaseSelector + # middleware. The `delay` is used to determine how long to wait after a write + # to send a subsequent read to the primary. + # + # The `database_resolver` class is used by the middleware to determine which + # database is appropriate to use based on the time delay. + # + # The `database_resolver_context` class is used by the middleware to set + # timestamps for the last write to the primary. The resolver uses the context + # class timestamps to determine how long to wait before reading from the + # replica. + # + # By default Rails will store a last write timestamp in the session. The + # DatabaseSelector middleware is designed as such you can define your own + # strategy for connection switching and pass that into the middleware through + # these configuration options. + # config.active_record.database_selector = { delay: 2.seconds } + # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver + # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000000..0cb24249b5 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,49 @@ +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + config.cache_classes = false + config.action_view.cache_template_loading = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + config.cache_store = :null_store + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory. + config.active_storage.service = :test + + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations. + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/action_view.rb b/config/initializers/action_view.rb new file mode 100644 index 0000000000..142d382f87 --- /dev/null +++ b/config/initializers/action_view.rb @@ -0,0 +1 @@ +Rails.application.config.action_view.form_with_generates_remote_forms = false diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 0000000000..89d2efab2b --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 0000000000..4b828e80cb --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') + +# 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 ) diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000000..59385cdf37 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb new file mode 100644 index 0000000000..35d0f26fcd --- /dev/null +++ b/config/initializers/content_security_policy.rb @@ -0,0 +1,30 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy +# For further information see the following documentation +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy + +# Rails.application.config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https +# policy.style_src :self, :https +# # If you are using webpack-dev-server then specify webpack-dev-server host +# policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development? + +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end + +# If you are using UJS then enable automatic nonce generation +# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } + +# Set the nonce only to specific directives +# Rails.application.config.content_security_policy_nonce_directives = %w(script-src) + +# Report CSP violations to a specified URI +# For further information see the following documentation: +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only +# Rails.application.config.content_security_policy_report_only = true diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000000..5a6a32d371 --- /dev/null +++ b/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000000..4a994e1e7b --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000000..ac033bf9dc --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 0000000000..dc1899682b --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000000..bbfc3961bf --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000000..cf9b342d0a --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# +# To learn more, please read the Rails Internationalization guide +# available at https://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 0000000000..5ed4437744 --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,38 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } +threads min_threads_count, max_threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the `pidfile` that Puma will use. +pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked web server processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. +# +# preload_app! + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000000..c06383a172 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html +end diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 0000000000..db5bf1307a --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +Spring.watch( + ".ruby-version", + ".rbenv-vars", + "tmp/restart.txt", + "tmp/caching-dev.txt" +) diff --git a/config/storage.yml b/config/storage.yml new file mode 100644 index 0000000000..d32f76e8fb --- /dev/null +++ b/config/storage.yml @@ -0,0 +1,34 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket + +# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] diff --git a/config/webpack/development.js b/config/webpack/development.js new file mode 100644 index 0000000000..c5edff94ad --- /dev/null +++ b/config/webpack/development.js @@ -0,0 +1,5 @@ +process.env.NODE_ENV = process.env.NODE_ENV || 'development' + +const environment = require('./environment') + +module.exports = environment.toWebpackConfig() diff --git a/config/webpack/environment.js b/config/webpack/environment.js new file mode 100644 index 0000000000..1a4f73eecb --- /dev/null +++ b/config/webpack/environment.js @@ -0,0 +1,13 @@ +const { environment } = require('@rails/webpacker') + +module.exports = environment + +const webpack = require('webpack') +environment.plugins.append( + 'Provide', + new webpack.ProvidePlugin({ + $: 'jquery', + jQuery: 'jquery', + Popper: ['popper.js', 'default'] + }) +) diff --git a/config/webpack/production.js b/config/webpack/production.js new file mode 100644 index 0000000000..be0f53aacf --- /dev/null +++ b/config/webpack/production.js @@ -0,0 +1,5 @@ +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 new file mode 100644 index 0000000000..c5edff94ad --- /dev/null +++ b/config/webpack/test.js @@ -0,0 +1,5 @@ +process.env.NODE_ENV = process.env.NODE_ENV || 'development' + +const environment = require('./environment') + +module.exports = environment.toWebpackConfig() diff --git a/config/webpacker.yml b/config/webpacker.yml new file mode 100644 index 0000000000..8581ac0472 --- /dev/null +++ b/config/webpacker.yml @@ -0,0 +1,96 @@ +# 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 + check_yarn_integrity: false + webpack_compile_output: true + + # Additional paths webpack should lookup modules + # ['app/assets', 'engine/foo/app/assets'] + resolved_paths: [] + + # 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 + + # Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules + check_yarn_integrity: 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/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000000..1beea2accd --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,7 @@ +# 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 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) diff --git a/lib/assets/.keep b/lib/assets/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/log/.keep b/log/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package.json b/package.json new file mode 100644 index 0000000000..1d56e43d97 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "betsy", + "private": true, + "dependencies": { + "@rails/actioncable": "^6.0.0", + "@rails/activestorage": "^6.0.0", + "@rails/ujs": "^6.0.0", + "@rails/webpacker": "4.3.0", + "bootstrap": "^4.5.3", + "jquery": "^3.5.1", + "popper.js": "^1.16.1", + "turbolinks": "^5.2.0" + }, + "version": "0.1.0", + "devDependencies": { + "webpack-dev-server": "^3.11.0" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000000..aa5998a809 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,12 @@ +module.exports = { + plugins: [ + require('postcss-import'), + require('postcss-flexbugs-fixes'), + require('postcss-preset-env')({ + autoprefixer: { + flexbox: 'no-2009' + }, + stage: 3 + }) + ] +} diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000000..2be3af26fc --- /dev/null +++ b/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000000..c08eac0d1d --- /dev/null +++ b/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000000..78a030af22 --- /dev/null +++ b/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000000..c19f78ab68 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/storage/.keep b/storage/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb new file mode 100644 index 0000000000..d19212abd5 --- /dev/null +++ b/test/application_system_test_case.rb @@ -0,0 +1,5 @@ +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 new file mode 100644 index 0000000000..800405f15e --- /dev/null +++ b/test/channels/application_cable/connection_test.rb @@ -0,0 +1,11 @@ +require "test_helper" + +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/controllers/.keep b/test/controllers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/helpers/.keep b/test/helpers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/system/.keep b/test/system/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000000..b19af0d5bd --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,21 @@ +ENV['RAILS_ENV'] ||= 'test' +require_relative '../config/environment' +require 'rails/test_help' +require "minitest/rails" +require "minitest/reporters" # for Colorized output +# For colorful output! +Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter +) + +class ActiveSupport::TestCase + # Run tests in parallel with specified workers + # parallelize(workers: :number_of_processors) # causes out of order output. + + # 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/tmp/.keep b/tmp/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tmp/pids/.keep b/tmp/pids/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000000..d8487b4546 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7638 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.5.tgz#f56db0c4bb1bbbf221b4e81345aab4141e7cb0e9" + integrity sha512-DTsS7cxrsH3by8nqQSpFSyjSfSYl57D6Cf4q8dW3LK83tBKBDCkfcay1nYkXq1nIHXnpX8WMMb/O25HOy3h1zg== + +"@babel/core@^7.7.2": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" + integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.1" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.1" + "@babel/parser" "^7.12.3" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.12.1", "@babel/generator@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" + integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== + dependencies: + "@babel/types" "^7.12.5" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-compilation-targets@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" + integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw== + dependencies: + "@babel/compat-data" "^7.12.5" + "@babel/helper-validator-option" "^7.12.1" + browserslist "^4.14.5" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" + integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-create-regexp-features-plugin@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz#18b1302d4677f9dc4740fe8c9ed96680e29d37e8" + integrity sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + regexpu-core "^4.7.1" + +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" + +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" + integrity sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" + integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-module-imports@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== + dependencies: + "@babel/types" "^7.12.5" + +"@babel/helper-module-transforms@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" + integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-simple-access" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/helper-validator-identifier" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-regex@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" + integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== + dependencies: + lodash "^4.17.19" + +"@babel/helper-remap-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" + integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/types" "^7.12.1" + +"@babel/helper-replace-supers@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" + integrity sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" + +"@babel/helper-simple-access@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" + integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helper-validator-option@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" + integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== + +"@babel/helper-wrap-function@^7.10.4": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" + integrity sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helpers@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.10.4", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" + integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ== + +"@babel/plugin-proposal-async-generator-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz#dc6c1170e27d8aca99ff65f4925bd06b1c90550e" + integrity sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.7.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-dynamic-import@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" + integrity sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-export-namespace-from@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" + integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" + integrity sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" + integrity sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.5.tgz#b1ce757156d40ed79d59d467cb2b154a5c4149ba" + integrity sha512-UiAnkKuOrCyjZ3sYNHlRlfuZJbBHknMQ9VMwVeX97Ofwx7RpD6gS2HfqTCh8KNUQgcOm8IKt103oR4KIjh7Q8g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.6.2": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-optional-catch-binding@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" + integrity sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz#cce122203fc8a32794296fc377c6dedaf4363797" + integrity sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" + integrity sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" + integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" + integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + 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.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + 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.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + 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.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" + integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-arrow-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" + integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" + integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + +"@babel/plugin-transform-block-scoped-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" + integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-block-scoping@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" + integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-classes@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" + integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" + integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.6.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" + integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" + integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-duplicate-keys@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" + integrity sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-exponentiation-operator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" + integrity sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-for-of@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" + integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-function-name@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" + integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" + integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" + integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-modules-amd@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" + integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" + integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.12.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" + integrity sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q== + dependencies: + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-identifier" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" + integrity sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" + integrity sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + +"@babel/plugin-transform-new-target@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" + integrity sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-object-super@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" + integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + +"@babel/plugin-transform-parameters@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" + integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-property-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" + integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.7.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" + integrity sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" + integrity sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-runtime@^7.6.2": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" + integrity sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" + integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-spread@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" + integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz#5c24cf50de396d30e99afc8d1c700e8bce0f5caf" + integrity sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + +"@babel/plugin-transform-template-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" + integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typeof-symbol@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz#9ca6be343d42512fbc2e68236a82ae64bc7af78a" + integrity sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-escapes@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" + integrity sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" + integrity sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/preset-env@^7.7.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.1.tgz#9c7e5ca82a19efc865384bb4989148d2ee5d7ac2" + integrity sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg== + dependencies: + "@babel/compat-data" "^7.12.1" + "@babel/helper-compilation-targets" "^7.12.1" + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-option" "^7.12.1" + "@babel/plugin-proposal-async-generator-functions" "^7.12.1" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-dynamic-import" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.1" + "@babel/plugin-proposal-json-strings" "^7.12.1" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-numeric-separator" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.1" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.1" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-block-scoped-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.1" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-computed-properties" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-dotall-regex" "^7.12.1" + "@babel/plugin-transform-duplicate-keys" "^7.12.1" + "@babel/plugin-transform-exponentiation-operator" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-function-name" "^7.12.1" + "@babel/plugin-transform-literals" "^7.12.1" + "@babel/plugin-transform-member-expression-literals" "^7.12.1" + "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-modules-systemjs" "^7.12.1" + "@babel/plugin-transform-modules-umd" "^7.12.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" + "@babel/plugin-transform-new-target" "^7.12.1" + "@babel/plugin-transform-object-super" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-property-literals" "^7.12.1" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/plugin-transform-reserved-words" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-sticky-regex" "^7.12.1" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/plugin-transform-typeof-symbol" "^7.12.1" + "@babel/plugin-transform-unicode-escapes" "^7.12.1" + "@babel/plugin-transform-unicode-regex" "^7.12.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.1" + core-js-compat "^3.6.2" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + 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.7.2", "@babel/runtime@^7.8.4": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.5.tgz#78a0c68c8e8a35e4cacfd31db8bb303d5606f095" + integrity sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.12.5" + "@babel/types" "^7.12.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.4.4": + version "7.12.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" + integrity sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@npmcli/move-file@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464" + integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw== + dependencies: + mkdirp "^1.0.4" + +"@rails/actioncable@^6.0.0": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.0.3.tgz#722b4b639936129307ddbab3a390f6bcacf3e7bc" + integrity sha512-I01hgqxxnOgOtJTGlq0ZsGJYiTEEiSGVEGQn3vimZSqEP1HqzyFNbzGTq14Xdyeow2yGJjygjoFF1pmtE+SQaw== + +"@rails/activestorage@^6.0.0": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@rails/activestorage/-/activestorage-6.0.3.tgz#401d2a28ecb7167cdb5e830ffddaa17c308c31aa" + integrity sha512-YdNwyfryHlcKj7Ruix89wZ2aiN3KTYULdW1Y/hNlHJlrY2/PXjT2YBTzZiVd+dcjrwHBsXV2rExdy+Z/lsrlEg== + dependencies: + spark-md5 "^3.0.0" + +"@rails/ujs@^6.0.0": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.0.3.tgz#e68a03278e30daea6a110aac5dfa33c60c53055d" + integrity sha512-CM9OEvoN9eXkaX7PXEnbsQLULJ97b9rVmwliZbz/iBOERLJ68Rk3ClJe+fQEMKU4CBZfky2lIRnfslOdUs9SLQ== + +"@rails/webpacker@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@rails/webpacker/-/webpacker-4.3.0.tgz#3793b3aed08ed0b661f1bed9de0739abacb6a834" + integrity sha512-DmKGjKugLeeytT1TO9fUBBjdA3YwQ19zoWK5JDL8V1rM0bf6WRf1n9DZTiVmuf0WO1gp5ej5pJ9b3NjZwfAz4Q== + dependencies: + "@babel/core" "^7.7.2" + "@babel/plugin-proposal-class-properties" "^7.7.0" + "@babel/plugin-proposal-object-rest-spread" "^7.6.2" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.6.0" + "@babel/plugin-transform-regenerator" "^7.7.0" + "@babel/plugin-transform-runtime" "^7.6.2" + "@babel/preset-env" "^7.7.1" + "@babel/runtime" "^7.7.2" + babel-loader "^8.0.6" + babel-plugin-dynamic-import-node "^2.3.0" + babel-plugin-macros "^2.6.1" + case-sensitive-paths-webpack-plugin "^2.2.0" + compression-webpack-plugin "^4.0.0" + core-js "^3.4.0" + css-loader "^3.2.0" + file-loader "^4.2.0" + flatted "^2.0.1" + glob "^7.1.6" + js-yaml "^3.13.1" + mini-css-extract-plugin "^0.8.0" + node-sass "^4.13.0" + optimize-css-assets-webpack-plugin "^5.0.3" + path-complete-extname "^1.0.0" + pnp-webpack-plugin "^1.5.0" + postcss-flexbugs-fixes "^4.1.0" + postcss-import "^12.0.1" + postcss-loader "^3.0.0" + postcss-preset-env "^6.7.0" + postcss-safe-parser "^4.0.1" + regenerator-runtime "^0.13.3" + sass-loader "7.3.1" + style-loader "^1.0.0" + terser-webpack-plugin "^2.2.1" + webpack "^4.41.2" + webpack-assets-manifest "^3.1.1" + webpack-cli "^3.3.10" + webpack-sources "^1.4.3" + +"@types/glob@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/json-schema@^7.0.5": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "14.14.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.7.tgz#8ea1e8f8eae2430cf440564b98c6dfce1ec5945d" + integrity sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + 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.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + 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.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + 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.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + 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.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + 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.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + 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.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + 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.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + 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.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + 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.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + 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.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + 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.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + 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" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + 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.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + 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" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + 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.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.6.1: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +babel-loader@^8.0.6: + version "8.2.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.1.tgz#e53313254677e86f27536f5071d807e01d24ec00" + integrity sha512-dMF8sb2KQ8kJl21GUjkW1HWmcsL39GOV5vnzjqrCzEPNY0S0UfMLnumidiwIajDSBmKhYf5iRW+HXaM4cvCKBw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + make-dir "^2.1.0" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.0, babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-macros@^2.6.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + 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.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + +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" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + 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.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + 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.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +bootstrap@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.3.tgz#c6a72b355aaf323920be800246a6e4ef30997fe6" + integrity sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + 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.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + 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.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + 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.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + 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.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + 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.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + 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.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + 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.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.14.6, browserslist@^4.6.4: + version "4.14.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.7.tgz#c071c1b3622c1c2e790799a37bb09473a4351cb6" + integrity sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ== + dependencies: + caniuse-lite "^1.0.30001157" + colorette "^1.2.1" + electron-to-chromium "^1.3.591" + escalade "^3.1.1" + node-releases "^1.1.66" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + 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.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + 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@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + +cacache@^15.0.5: + version "15.0.5" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" + integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== + dependencies: + "@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.0" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + 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: + version "1.0.0" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + 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.30001157: + version "1.0.30001158" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001158.tgz#fce86d321369603c2bc855ee0e901a7f49f8310b" + integrity sha512-s5loVYY+yKpuVA3HyW8BarzrtJvwHReuzugQXlv1iR3LKSReoFXRm86mT6hT7PEF5RxW+XQZg+6nYjlywYzQ+g== + +case-sensitive-paths-webpack-plugin@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + 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@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + 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" + +chokidar@^3.4.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.1, chownr@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + 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.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + 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.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + 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.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + 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.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + 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.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" + integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" + integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.4" + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression-webpack-plugin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-4.0.1.tgz#33eda97f1170dd38c5556771de10f34245aa0274" + 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.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + 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.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + 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.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + 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.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2: + version "3.7.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.7.0.tgz#8479c5d3d672d83f1f5ab94cf353e57113e065ed" + integrity sha512-V8yBI3+ZLDVomoWICO6kq/CD28Y4r1M7CWeO4AGpMdMfseu8bkSubBmUPySMGKRTS+su4XQ07zUkAsiu9FCWTg== + dependencies: + browserslist "^4.14.6" + semver "7.0.0" + +core-js@^3.4.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.7.0.tgz#b0a761a02488577afbf97179e4681bf49568520f" + integrity sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + 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.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + 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.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + 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.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + 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.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + 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@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + 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" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + 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.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + 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.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + 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.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@^3.2.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" + 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.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + 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.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + 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.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.1.tgz#7726678dfe2a57993a018d9dce519bf1760e3b6d" + integrity sha512-WroX+2MvsYcRGP8QA0p+rxzOniT/zpAoQ/DTKDSJzh5T3IQKUkFHeIIfgIapm2uaP178GWY3Mime1qbk8GO/tA== + dependencies: + mdn-data "2.0.12" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + 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.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.1.1.tgz#e0cb02d6eb3af1df719222048e4359efd662af13" + integrity sha512-Rvq+e1e0TFB8E8X+8MQjHSY6vtol45s5gxtLI/018UsAn2IBMmwNEZRM/h+HVnAJRHjasLIKKUO3uvoMM28LvA== + dependencies: + css-tree "^1.0.0" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.1, debug@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + +decamelize@^1.1.2, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + 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@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + 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.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + 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.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + 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.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" + integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA== + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + 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.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.591: + version "1.3.596" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.596.tgz#c7ed98512c7ff36ddcbfed9e54e6355335c35257" + integrity sha512-nLO2Wd2yU42eSoNJVQKNf89CcEGqeFZd++QsnN2XIgje1s/19AgctfjLIbPORlvcCO8sYjLwX4iUgDdusOY8Sg== + +elliptic@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.1.1, enhanced-resolve@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + 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.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + 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.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + 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.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + 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.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + 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.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + 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" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +file-loader@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.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.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + 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.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + 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.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + 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.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + 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.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +flatted@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + 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.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + 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.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + 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.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" + integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + 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.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + 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.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + 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.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + 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.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" + integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.2: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + 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.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + 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.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + 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.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + 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.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + 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.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + 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.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + 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.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-entities@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" + integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + 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.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + 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.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + 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.2" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" + integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" + integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +in-publish@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" + integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + 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.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + 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.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" + integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + 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.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + 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.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + 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.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + 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.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + 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.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jest-worker@^25.4.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jquery@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" + integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== + +js-base64@^2.1.8: + version "2.6.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + 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.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@^1.0.1, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + 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.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + 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.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + 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.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.get@^4.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.has@^4.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" + integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.5, lodash@~4.17.10: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +loglevel@^1.6.8: + version "1.7.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" + integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + 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.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + 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.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.12.tgz#bbb658d08b38f574bbb88f7b83703defdcc46844" + integrity sha512-ULbAlgzVb8IqZ0Hsxm6hHSlQl3Jckst2YEQS7fODu9ilNWy2LvcoSY7TRFIktABP2mdppBioc66va90T+NUs8Q== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + 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.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + 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" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +"mime-db@>= 1.43.0 < 2": + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== + +mini-css-extract-plugin@^0.8.0: + version "0.8.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz#a875e169beb27c88af77dd962771c9eedc3da161" + integrity sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw== + 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.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + 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.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + 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.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +"mkdirp@>=0.5 0", mkdirp@^0.5, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + 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.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + 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.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nan@^2.12.1, nan@^2.13.2: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + 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.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + 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@^1.1.66: + version "1.1.66" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.66.tgz#609bd0dc069381015cd982300bae51ab4f1b1814" + integrity sha512-JHEQ1iWPGK+38VLB2H9ef2otU4l8s3yAMt9Xf934r6+ojCYDMHPMqvCc9TnzfeFSP1QEOeU6YZEd3+De0LTCgg== + +node-sass@^4.13.0: + version "4.14.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" + integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.15" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "2.2.5" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + 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.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + 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.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + +object-is@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81" + integrity sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + 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.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + 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.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" + integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + 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.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + 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.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + 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.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + 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@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + 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.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-complete-extname@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-complete-extname/-/path-complete-extname-1.0.0.tgz#f889985dc91000c815515c0bfed06c5acda0752b" + integrity sha512-CVjiWcMRdGU8ubs08YQVzhutOR5DEfO97ipRIlOGMK5Bek5nQySknBpuxVAVJ36hseTNs+vdIcv57ZrWxH7zvg== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + 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" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pnp-webpack-plugin@^1.5.0: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + 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.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + 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.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + 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.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + 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.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + 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.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + 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.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + 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.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + 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.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + 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.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + 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.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + 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.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + 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.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + 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.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + 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.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + 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.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + 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.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-flexbugs-fixes@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" + integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== + dependencies: + postcss "^7.0.26" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + 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.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + 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.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" + 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.2" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" + integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + 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.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + 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.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + 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.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + 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.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + 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.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + 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.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + 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.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + 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.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + 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.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + 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.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + 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.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + 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.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + 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.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + 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.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + 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.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + 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.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + 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.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + 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.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + 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.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + 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.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + 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.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + 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.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + 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.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + 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.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + 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.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + 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.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + 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.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-safe-parser@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" + 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.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" + integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + 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.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + 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.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + 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.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + 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.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + 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.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + 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.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + 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.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + 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.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + 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.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + 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.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + 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.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + 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.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, 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.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + 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.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + 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.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + 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.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + 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.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request@^2.87.0, request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + 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.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.8.1: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + 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.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + 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.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + 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.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-graph@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" + integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^13.3.2" + +sass-loader@7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.3.1.tgz#a5bf68a04bcea1c13ff842d747150f7ab7d0d23f" + integrity sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.0.1" + neo-async "^2.5.0" + pify "^4.0.1" + semver "^6.3.0" + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + 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.5.0, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.7: + version "1.10.8" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" + integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== + dependencies: + node-forge "^0.10.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + 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.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + 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.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + 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, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + 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.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + 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.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + 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.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + 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-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.20: + version "0.3.20" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.4.0" + websocket-driver "0.6.5" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + 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: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + 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.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spark-md5@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.1.tgz#83a0e255734f2ab4e5c466e5a2cfc9ba2aa2124d" + integrity sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" + integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + 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.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + 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.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + 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.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + +ssri@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808" + integrity sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + 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.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + dependencies: + readable-stream "^2.0.1" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + 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.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + 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.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + 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.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + 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.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" + integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +string.prototype.trimstart@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" + integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + 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.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +style-loader@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" + 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.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + 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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + 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.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + +tar@^6.0.2: + version "6.0.5" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f" + integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg== + 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.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + 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@^2.2.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" + integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.3.1" + jest-worker "^25.4.0" + p-limit "^2.3.0" + schema-utils "^2.6.6" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.6.12" + webpack-sources "^1.4.3" + +terser@^4.1.2, terser@^4.6.12: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + 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.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + 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.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + 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.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + 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.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + dependencies: + glob "^7.1.2" + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +turbolinks@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/turbolinks/-/turbolinks-5.2.0.tgz#e6877a55ea5c1cb3bb225f0a4ae303d6d32ff77c" + integrity sha512-pMiez3tyBo6uRHFNNZoYMmrES/IaGgMhQQM+VFF36keryjb5ms0XkVpmKHkfW/4Vy96qiGW3K9bz0tF5sK9bBw== + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + 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.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + 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.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + 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.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse@^1.4.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + 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.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + 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.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + 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.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + 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.yarnpkg.com/webpack-assets-manifest/-/webpack-assets-manifest-3.1.1.tgz#39bbc3bf2ee57fcd8ba07cda51c9ba4a3c6ae1de" + 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.10: + version "3.3.12" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" + 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-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@^3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.20" + sockjs-client "1.4.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +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.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.41.2: + version "4.44.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== + 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.3.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.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= + dependencies: + websocket-extensions ">=0.1.1" + +websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + 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.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + 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.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.7.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + 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.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + 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" From e5342b72ba1648cbb935792f1098b595958bf0aa Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 17 Nov 2020 12:08:50 -0800 Subject: [PATCH 002/208] generated controller and model for product --- app/assets/stylesheets/products.scss | 3 ++ app/controllers/products_controller.rb | 13 +++++++++ app/helpers/products_helper.rb | 2 ++ app/models/product.rb | 2 ++ app/views/products/edit.html.erb | 2 ++ app/views/products/index.html.erb | 2 ++ app/views/products/new.html.erb | 2 ++ app/views/products/show.html.erb | 2 ++ config/routes.rb | 4 +++ db/migrate/20201117200741_create_products.rb | 14 ++++++++++ db/schema.rb | 29 ++++++++++++++++++++ test/controllers/products_controller_test.rb | 24 ++++++++++++++++ test/models/product_test.rb | 7 +++++ 13 files changed, 106 insertions(+) create mode 100644 app/assets/stylesheets/products.scss create mode 100644 app/controllers/products_controller.rb create mode 100644 app/helpers/products_helper.rb create mode 100644 app/models/product.rb create mode 100644 app/views/products/edit.html.erb create mode 100644 app/views/products/index.html.erb create mode 100644 app/views/products/new.html.erb create mode 100644 app/views/products/show.html.erb create mode 100644 db/migrate/20201117200741_create_products.rb create mode 100644 db/schema.rb create mode 100644 test/controllers/products_controller_test.rb create mode 100644 test/models/product_test.rb diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss new file mode 100644 index 0000000000..8f0ca888eb --- /dev/null +++ b/app/assets/stylesheets/products.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Products controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb new file mode 100644 index 0000000000..2a87d76cdf --- /dev/null +++ b/app/controllers/products_controller.rb @@ -0,0 +1,13 @@ +class ProductsController < ApplicationController + def index + end + + def show + end + + def new + end + + def edit + end +end diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb new file mode 100644 index 0000000000..ab5c42b325 --- /dev/null +++ b/app/helpers/products_helper.rb @@ -0,0 +1,2 @@ +module ProductsHelper +end diff --git a/app/models/product.rb b/app/models/product.rb new file mode 100644 index 0000000000..35a85acab3 --- /dev/null +++ b/app/models/product.rb @@ -0,0 +1,2 @@ +class Product < ApplicationRecord +end diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb new file mode 100644 index 0000000000..279b066f30 --- /dev/null +++ b/app/views/products/edit.html.erb @@ -0,0 +1,2 @@ +

Products#edit

+

Find me in app/views/products/edit.html.erb

diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb new file mode 100644 index 0000000000..f8eeb82674 --- /dev/null +++ b/app/views/products/index.html.erb @@ -0,0 +1,2 @@ +

Products#index

+

Find me in app/views/products/index.html.erb

diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb new file mode 100644 index 0000000000..a14e0d91b6 --- /dev/null +++ b/app/views/products/new.html.erb @@ -0,0 +1,2 @@ +

Products#new

+

Find me in app/views/products/new.html.erb

diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb new file mode 100644 index 0000000000..5f44ec44d2 --- /dev/null +++ b/app/views/products/show.html.erb @@ -0,0 +1,2 @@ +

Products#show

+

Find me in app/views/products/show.html.erb

diff --git a/config/routes.rb b/config/routes.rb index c06383a172..3e517d9529 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,7 @@ Rails.application.routes.draw do + get 'products/index' + get 'products/show' + get 'products/new' + get 'products/edit' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html end diff --git a/db/migrate/20201117200741_create_products.rb b/db/migrate/20201117200741_create_products.rb new file mode 100644 index 0000000000..ce71f4e524 --- /dev/null +++ b/db/migrate/20201117200741_create_products.rb @@ -0,0 +1,14 @@ +class CreateProducts < ActiveRecord::Migration[6.0] + def change + create_table :products do |t| + t.string :name + t.integer :stock + t.integer :price + t.string :description + t.integer :user_id + t.string :photo_url + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..82e94fd54c --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,29 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# This file is the source Rails uses to define your schema when running `rails +# db:schema:load`. When creating a new database, `rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 2020_11_17_200741) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "products", force: :cascade do |t| + t.string "name" + t.integer "stock" + t.integer "price" + t.string "description" + t.integer "user_id" + t.string "photo_url" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + +end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb new file mode 100644 index 0000000000..361fd4fa20 --- /dev/null +++ b/test/controllers/products_controller_test.rb @@ -0,0 +1,24 @@ +require "test_helper" + +describe ProductsController do + it "must get index" do + get products_index_url + must_respond_with :success + end + + it "must get show" do + get products_show_url + must_respond_with :success + end + + it "must get new" do + get products_new_url + must_respond_with :success + end + + it "must get edit" do + get products_edit_url + must_respond_with :success + end + +end diff --git a/test/models/product_test.rb b/test/models/product_test.rb new file mode 100644 index 0000000000..6977718e14 --- /dev/null +++ b/test/models/product_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Product do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 7e2e37ce9b9e26fdeae84628ba36532ad6806085 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 17 Nov 2020 12:11:54 -0800 Subject: [PATCH 003/208] created user controller and model --- app/assets/stylesheets/users.scss | 3 +++ app/controllers/users_controller.rb | 10 ++++++++++ app/helpers/users_helper.rb | 2 ++ app/models/user.rb | 2 ++ app/views/users/edit.html.erb | 2 ++ app/views/users/index.html.erb | 2 ++ app/views/users/show.html.erb | 2 ++ config/routes.rb | 3 +++ db/migrate/20201117201100_create_users.rb | 13 +++++++++++++ db/schema.rb | 12 +++++++++++- test/controllers/users_controller_test.rb | 19 +++++++++++++++++++ test/models/user_test.rb | 7 +++++++ 12 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 app/assets/stylesheets/users.scss create mode 100644 app/controllers/users_controller.rb create mode 100644 app/helpers/users_helper.rb create mode 100644 app/models/user.rb create mode 100644 app/views/users/edit.html.erb create mode 100644 app/views/users/index.html.erb create mode 100644 app/views/users/show.html.erb create mode 100644 db/migrate/20201117201100_create_users.rb create mode 100644 test/controllers/users_controller_test.rb create mode 100644 test/models/user_test.rb diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss new file mode 100644 index 0000000000..efc25261dd --- /dev/null +++ b/app/assets/stylesheets/users.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Users controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 0000000000..583982578a --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,10 @@ +class UsersController < ApplicationController + def index + end + + def show + end + + def edit + end +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 0000000000..2310a240d7 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,2 @@ +module UsersHelper +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000000..379658a509 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,2 @@ +class User < ApplicationRecord +end diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb new file mode 100644 index 0000000000..1881fbdba0 --- /dev/null +++ b/app/views/users/edit.html.erb @@ -0,0 +1,2 @@ +

Users#edit

+

Find me in app/views/users/edit.html.erb

diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb new file mode 100644 index 0000000000..51968c88d2 --- /dev/null +++ b/app/views/users/index.html.erb @@ -0,0 +1,2 @@ +

Users#index

+

Find me in app/views/users/index.html.erb

diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb new file mode 100644 index 0000000000..e5fa3adf14 --- /dev/null +++ b/app/views/users/show.html.erb @@ -0,0 +1,2 @@ +

Users#show

+

Find me in app/views/users/show.html.erb

diff --git a/config/routes.rb b/config/routes.rb index 3e517d9529..f96d118e05 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,7 @@ Rails.application.routes.draw do + get 'users/index' + get 'users/show' + get 'users/edit' get 'products/index' get 'products/show' get 'products/new' diff --git a/db/migrate/20201117201100_create_users.rb b/db/migrate/20201117201100_create_users.rb new file mode 100644 index 0000000000..257fa32bea --- /dev/null +++ b/db/migrate/20201117201100_create_users.rb @@ -0,0 +1,13 @@ +class CreateUsers < ActiveRecord::Migration[6.0] + def change + create_table :users do |t| + t.string :name + t.string :description + t.string :uid + t.string :provider + t.string :email + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 82e94fd54c..5aeb6ddc57 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_11_17_200741) do +ActiveRecord::Schema.define(version: 2020_11_17_201100) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -26,4 +26,14 @@ t.datetime "updated_at", precision: 6, null: false end + create_table "users", force: :cascade do |t| + t.string "name" + t.string "description" + t.string "uid" + t.string "provider" + t.string "email" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + end diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb new file mode 100644 index 0000000000..27d6c481e0 --- /dev/null +++ b/test/controllers/users_controller_test.rb @@ -0,0 +1,19 @@ +require "test_helper" + +describe UsersController do + it "must get index" do + get users_index_url + must_respond_with :success + end + + it "must get show" do + get users_show_url + must_respond_with :success + end + + it "must get edit" do + get users_edit_url + must_respond_with :success + end + +end diff --git a/test/models/user_test.rb b/test/models/user_test.rb new file mode 100644 index 0000000000..0ea72906d4 --- /dev/null +++ b/test/models/user_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe User do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 7d28eb13b5e31d4cf225493d02398c108aee024e Mon Sep 17 00:00:00 2001 From: Marj E Date: Tue, 17 Nov 2020 13:08:56 -0800 Subject: [PATCH 004/208] added simplecov test code --- .gitignore | 7 +++++++ Gemfile | 4 ++++ Gemfile.lock | 6 ++++++ app/controllers/products_controller.rb | 2 ++ test/test_helper.rb | 9 +++++++++ 5 files changed, 28 insertions(+) diff --git a/.gitignore b/.gitignore index f22dd34725..8a24e82fd1 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,10 @@ /yarn-error.log yarn-debug.log* .yarn-integrity + +# Ignore auto generated files +.generators +.idea/ + +# Ignore simplecov +coverage/* \ No newline at end of file diff --git a/Gemfile b/Gemfile index 48cdee19cb..f2c4b20be3 100644 --- a/Gemfile +++ b/Gemfile @@ -76,3 +76,7 @@ group :test do gem 'minitest-rails' gem 'minitest-reporters' end + +group :test do + gem 'simplecov', require: false +end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 5c056fcc4c..cd207daedf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -92,6 +92,7 @@ GEM debase-ruby_core_source (>= 0.10.2) debase-ruby_core_source (0.10.11) debug_inspector (0.0.3) + docile (1.3.2) erubi (1.10.0) execjs (2.7.0) ffi (1.13.1) @@ -218,6 +219,10 @@ GEM childprocess (>= 0.5, < 4.0) rubyzip (>= 1.2.2) shellany (0.0.1) + simplecov (0.19.0) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov-html (0.12.3) spring (2.1.1) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) @@ -283,6 +288,7 @@ DEPENDENCIES ruby-debug-ide (>= 0.7.0) sass-rails (>= 6) selenium-webdriver + simplecov spring spring-watcher-listen (~> 2.0.0) turbolinks (~> 5) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 2a87d76cdf..a42f26f2c4 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,8 +1,10 @@ class ProductsController < ApplicationController def index + @products = Product.all end def show + @product = Product.find_by(id: params[:id]) end def new diff --git a/test/test_helper.rb b/test/test_helper.rb index b19af0d5bd..a37c21a297 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,6 +4,15 @@ require "minitest/rails" require "minitest/reporters" # for Colorized output # For colorful output! +require 'simplecov' +SimpleCov.start 'rails' do + add_filter '/bin/' + add_filter '/db/' + add_filter '/spec/' # for rspec + add_filter '/test/' # for minitest +end + + Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, ENV, From 3858fd0e6b6d7f099343fe87204bbfa12cf0c55e Mon Sep 17 00:00:00 2001 From: Marj E Date: Tue, 17 Nov 2020 14:35:41 -0800 Subject: [PATCH 005/208] added index view code --- app/views/products/index.html.erb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index f8eeb82674..6061903bba 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,2 +1,6 @@ -

Products#index

-

Find me in app/views/products/index.html.erb

+
+ <% @products.each do |product| %> + <%= image_tag "rails.png" %> + <%= product.price %> + <% end %> +
From 95c535ca046c4226135b1eea42436be5a9743f89 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 17 Nov 2020 15:47:50 -0800 Subject: [PATCH 006/208] created new and create methods for product --- app/controllers/products_controller.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 2a87d76cdf..9056891b8f 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,4 +1,6 @@ class ProductsController < ApplicationController + before_action :find_product, only [:show, :edit, :update] + def index end @@ -6,8 +8,31 @@ def show end def new + @product = Product.new + end + + def create + @product = Product.new(product_params) + if @product.save + flash[:success = "Product has been successfully added" + redirect_to product_path(@product.id) + else + flash[:error] = "Product has not been added" + render :new, status: :bad_request + return + end end def edit end + + private + + def find_product + @product = Product.find_by_id(params[:id]) + end + + def product_params + return params.require(:product).permit(:name, :stock, :price, :description, :photo_url, :user_id) + end end From 738f705ed211c11acb09961e54bffb0de461ee3e Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 17 Nov 2020 16:04:01 -0800 Subject: [PATCH 007/208] revise routes to include destroy action --- config/routes.rb | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index f96d118e05..a66b4e5de9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,10 +1,5 @@ Rails.application.routes.draw do - get 'users/index' - get 'users/show' - get 'users/edit' - get 'products/index' - get 'products/show' - get 'products/new' - get 'products/edit' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + resources :users, except: [:new] + resources :products end From 10fd3e7a6772b42c8f64d9fe560b7801171e5ce6 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 17 Nov 2020 16:04:31 -0800 Subject: [PATCH 008/208] add destroy method for product --- app/controllers/products_controller.rb | 27 +++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 2a87d76cdf..d289022461 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -10,4 +10,29 @@ def new def edit end -end + + def destroy + if @product.nil? + render :file => "#{Rails.root}/public/404.html", layout: false, status: :not_found + return + end + + if session[:user_id].nil? + flash[:error] = "You must be logged in to delete this item" + # need to clarify which path to redirect + redirect_to login_path + return + elsif session[:user_id] == @product.user_id + @product.destroy + flash[:success] = "Successfully destroyed #{ @product.name }" + # need to clarify which path to redirect + redirect_to root_path + return + else + flash[:error] = "Only the product merchant can delete the product." + # need to clarify which path to redirect + redirect_to root_path + return + end + end +end \ No newline at end of file From 2015c316f2cc195a9e3fe5c75291c60fc52ec57e Mon Sep 17 00:00:00 2001 From: Marj E Date: Tue, 17 Nov 2020 16:13:32 -0800 Subject: [PATCH 009/208] updated show method --- app/controllers/products_controller.rb | 5 ++-- test/controllers/products_controller_test.rb | 24 +++++++++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index efdb23d4f3..c98ec92497 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,12 +1,11 @@ class ProductsController < ApplicationController - before_action :find_product, only [:show, :edit, :update] + before_action :find_product, only: [:show, :edit, :update] def index @products = Product.all end def show - @product = Product.find_by(id: params[:id]) end def new @@ -16,7 +15,7 @@ def new def create @product = Product.new(product_params) if @product.save - flash[:success = "Product has been successfully added" + flash[:success] = "Product has been successfully added" redirect_to product_path(@product.id) else flash[:error] = "Product has not been added" diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 361fd4fa20..615baf7b2b 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,9 +1,27 @@ require "test_helper" describe ProductsController do - it "must get index" do - get products_index_url - must_respond_with :success + # let (:product) { + # Product.create name: "sample product" + # } + describe "index" do + it "must get index" do + get products_index_url + must_respond_with :success + end + + # it "responds with success when there are many products saved" do + # product + # get products_path + # expect(Product.count).must_equal 1 + # must_respond_with :success + # end + # + # it "responds with success when there are no products saved" do + # get products_path + # expect(Product.count).must_equal 0 + # must_respond_with :success + # end end it "must get show" do From 3adb6314049bce00bafdcc5ddb8ba207b0cf1435 Mon Sep 17 00:00:00 2001 From: Marj E Date: Tue, 17 Nov 2020 16:33:57 -0800 Subject: [PATCH 010/208] fixed index --- test/controllers/products_controller_test.rb | 30 ++++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 615baf7b2b..8f7073dd5e 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,27 +1,27 @@ require "test_helper" describe ProductsController do - # let (:product) { - # Product.create name: "sample product" - # } + let (:product) { + Product.create name: "sample product" + } describe "index" do it "must get index" do get products_index_url must_respond_with :success end - # it "responds with success when there are many products saved" do - # product - # get products_path - # expect(Product.count).must_equal 1 - # must_respond_with :success - # end - # - # it "responds with success when there are no products saved" do - # get products_path - # expect(Product.count).must_equal 0 - # must_respond_with :success - # end + it "responds with success when there are many products saved" do + product + get products_index_url + expect(Product.count).must_equal 1 + must_respond_with :success + end + + it "responds with success when there are no products saved" do + get products_index_url + expect(Product.count).must_equal 0 + must_respond_with :success + end end it "must get show" do From cfffc095bb3cff6331023cefad2fa47a9bc74e71 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 17 Nov 2020 16:34:21 -0800 Subject: [PATCH 011/208] added tests for new and create products and routes for products and users --- config/routes.rb | 11 +--- test/controllers/products_controller_test.rb | 64 ++++++++++++++++++++ 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index f96d118e05..77a0240403 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,10 +1,5 @@ Rails.application.routes.draw do - get 'users/index' - get 'users/show' - get 'users/edit' - get 'products/index' - get 'products/show' - get 'products/new' - get 'products/edit' - # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + resources :products + + resources :users end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 615baf7b2b..3f1c597b72 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -39,4 +39,68 @@ must_respond_with :success end + describe "new" do + it "responds with success" do + # Act + get new_product_path + + # Assert + must_respond_with :success + + end + end + + describe "create" do + it "can create a new product with valid information accurately, and redirect" do + # Arrange + # Set up the form data + product_hash = { + product: { + name: 'Artists Potion', + stock: 2, + price: 1400, + description: 'Turns you into Bob Ross', + } + } + + # Act-Assert + # Ensure that there is a change of 1 in product.count + expect { + post products_path, params: product_hash + }.must_change "Product.count", 1 + + # Assert + # Find the newly created product, and check that all its attributes match what was given in the form data + # Check that the controller redirected the user + new_product = Product.find_by(name: product_hash[:product][:name]) + expect(new_product.price).must_equal product_hash[:product][:price] + expect(new_product.stock).must_equal product_hash[:product][:stock] + expect(new_product.description).must_equal product_hash[:product][:description] + + must_respond_with :redirect + must_redirect_to product_path(new_product.id) + + end + + it "does not create a product if the form data violates product validations" do + # Note: This will not pass until ActiveRecord Validations lesson + # Arrange + # Set up the form data so that it violates product validations + product_hash = { + product: { + category: '', + title: '', + creator: 'test author', + publication_year: '1984', + decription: 'this is a test' + } + } + # Act-Assert + expect { + post products_path, params: product_hash + }.wont_differ "Product.count" + + end + end + end From 48b931e2e2227954fa95ba141d8782ba95fda055 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 17 Nov 2020 16:43:22 -0800 Subject: [PATCH 012/208] added view for new and created form for products --- app/views/products/_form.html.erb | 25 +++++++++++++++++++++++++ app/views/products/new.html.erb | 16 ++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 app/views/products/_form.html.erb diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb new file mode 100644 index 0000000000..90c63b2f0d --- /dev/null +++ b/app/views/products/_form.html.erb @@ -0,0 +1,25 @@ +<%= form_with model: @product do |f| %> +
+ <%= f.label :name %> + <%= f.text_field :name%> +
+
+ <%= f.label :stock %> + <%= f.text_field :stock %> +
+
+ <%= f.label :price %> + <%= f.text_field :price %> +
+
+ <%= f.label :photo_url %> + <%= f.text_field :photo_url %> +
+
+ <%= f.label :description %> + <%= f.text_area :description %> +
+
+ <%= f.submit action_name %> +
+<% end %> \ No newline at end of file diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index a14e0d91b6..21a5c107dc 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -1,2 +1,14 @@ -

Products#new

-

Find me in app/views/products/new.html.erb

+<% if @product.errors.any? %> +
    + <% @product.errors.each do |column, message| %> +
  • + <%= column.capitalize %> <%= message %> +
  • + <% end %> +
+<% end %> + +

Add a new product

+ + +<%= render partial: "form", locals: { action_name: "Add Product"} %> From 5c58077db2f1a4d22d35ba15c818a8808a13ec20 Mon Sep 17 00:00:00 2001 From: Marj E Date: Tue, 17 Nov 2020 16:44:19 -0800 Subject: [PATCH 013/208] removed non-existing image from index view image tag --- app/views/products/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 6061903bba..da04a0d7a1 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,6 +1,6 @@
<% @products.each do |product| %> - <%= image_tag "rails.png" %> + <%= image_tag "", alt: "filler" %> <%= product.price %> <% end %>
From e0c269b76a51eeb0f1a3261ca9d147d6be6df715 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 17 Nov 2020 17:11:25 -0800 Subject: [PATCH 014/208] draft tests for product destroy action --- app/controllers/products_controller.rb | 10 +-- test/controllers/products_controller_test.rb | 76 +++++++++++++++----- test/fixtures/products.yml | 7 ++ test/fixtures/users.yml | 10 +++ 4 files changed, 82 insertions(+), 21 deletions(-) create mode 100644 test/fixtures/products.yml create mode 100644 test/fixtures/users.yml diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index ece5bb80e6..3e1b4eb4c4 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,5 +1,5 @@ class ProductsController < ApplicationController - before_action :find_product, only [:show, :edit, :update] + before_action :find_product, only: [:show, :edit, :update] def index @products = Product.all @@ -16,7 +16,7 @@ def new def create @product = Product.new(product_params) if @product.save - flash[:success = "Product has been successfully added" + flash[:success] = "Product has been successfully added" redirect_to product_path(@product.id) else flash[:error] = "Product has not been added" @@ -43,16 +43,16 @@ def destroy @product.destroy flash[:success] = "Successfully destroyed #{ @product.name }" # need to clarify which path to redirect - redirect_to root_path + redirect_to user_path(session[:user_id]) return else - flash[:error] = "Only the product merchant can delete the product." + flash[:error] = "Only the product Seller can delete the product." # need to clarify which path to redirect redirect_to root_path return end end -end + private def find_product diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 361fd4fa20..252c75f15a 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,24 +1,68 @@ require "test_helper" describe ProductsController do - it "must get index" do - get products_index_url - must_respond_with :success - end + describe "not destroy" do + it "must get index" do + skip + get products_index_url + must_respond_with :success + end - it "must get show" do - get products_show_url - must_respond_with :success - end + it "must get show" do + skip + get products_show_url + must_respond_with :success + end - it "must get new" do - get products_new_url - must_respond_with :success - end + it "must get new" do + skip + get products_new_url + must_respond_with :success + end - it "must get edit" do - get products_edit_url - must_respond_with :success - end + it "must get edit" do + skip + get products_edit_url + must_respond_with :success + end + end + + describe "destroy" do + it "can destroy product when the user is merchant" do + # Arrange + skip + valid_user = users(:ada) + valid_product = products(:confidence) + + # Act-Assert + expect { + delete product_path(valid_product) + }.must_differ "Product.count", 1 + + expect(valid_product.user_id).must_equal valid_user.id + must_redirect_to user_path(valid_user.id) + end + it "cannot destroy product without user login" do + skip + # Arrange + # Need @current_user + valid_product = products(:confidence) + + # Act-Assert + expect { + delete product_path(valid_product) + }.wont_change "Product.count" + + # Assert + + # Check later! + must_redirect_to login_path + end + + it "cannot delete product when the user is not its seller" do + skip + # Leave it to user site? + end + end end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml new file mode 100644 index 0000000000..9b7f1c16fb --- /dev/null +++ b/test/fixtures/products.yml @@ -0,0 +1,7 @@ +confidence: + name: brand new confidence + stock: 100 + price: 5 + user_id: 1 + description: You will have confidence + photo_url: https://en.wikipedia.org/wiki/Confidence \ No newline at end of file diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml new file mode 100644 index 0000000000..e71e0a60f1 --- /dev/null +++ b/test/fixtures/users.yml @@ -0,0 +1,10 @@ +ada: + provider: github + uid: 12345 + email: ada@adadevelopersacademy.org + name: countess_ada +grace: + provider: github + uid: 13371337 + email: grace@hooper.net + name: graceful_hopps \ No newline at end of file From 9b86ed8f97382b58138ad792a909379c3fe4eb12 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 17 Nov 2020 17:33:54 -0800 Subject: [PATCH 015/208] add index and show action for user --- app/controllers/users_controller.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 583982578a..0e724d7670 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,8 +1,14 @@ class UsersController < ApplicationController def index + @users = User.all end - + def show + @user = User.find_by(id: params[:id]) + + if @user.nil? + render :file => "#{Rails.root}/public/404.html", layout: false, status: :not_found + end end def edit From 5cd9fb94d2d51a6b905001d0dcbffec72ae23da0 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 17 Nov 2020 17:55:44 -0800 Subject: [PATCH 016/208] remove index action and revise show action for user to include the feature that user cannot view other user --- app/controllers/users_controller.rb | 9 +++++---- config/routes.rb | 9 ++------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 0e724d7670..42453403cd 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,13 +1,14 @@ class UsersController < ApplicationController - def index - @users = User.all - end - def show @user = User.find_by(id: params[:id]) if @user.nil? render :file => "#{Rails.root}/public/404.html", layout: false, status: :not_found + elsif session[:id] != @user.id # May need to change to current user + flash[:error] = "You cannot see other users' information." + # need to clarify which path to redirect + redirect_to user_path(@user) + return end end diff --git a/config/routes.rb b/config/routes.rb index f96d118e05..783103e77b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,10 +1,5 @@ Rails.application.routes.draw do - get 'users/index' - get 'users/show' - get 'users/edit' - get 'products/index' - get 'products/show' - get 'products/new' - get 'products/edit' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + resources :users, except: [:new, :index] + resources :products end From 67e84377e787e4af2ed5d5ab38011e76b234c434 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 17 Nov 2020 18:08:59 -0800 Subject: [PATCH 017/208] draft tests for user show action --- test/controllers/users_controller_test.rb | 50 +++++++++++++++++++---- test/fixtures/users.yml | 10 +++++ 2 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 test/fixtures/users.yml diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 27d6c481e0..a01876a414 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -1,17 +1,51 @@ require "test_helper" describe UsersController do - it "must get index" do - get users_index_url - must_respond_with :success - end - it "must get show" do - get users_show_url - must_respond_with :success - end + describe "show" do + it "responds with success when showing user its own info" do + # Arrange + skip + # need login_data + + # Act + get "/users/#{ valid_user.id }" + + # Assert + expect(valid_user).wont_be_nil + expect(session[:user_id]).must_equal valid_user.id + must_respond_with :success + end + + it "responds with 404 with an invalid passenger id" do + # Arrange + invalid_user_id = -1 + + # Act + get "/users/#{ invalid_user_id }" + + # Assert + must_respond_with :not_found + end + + it "responds with redirect when user wants to see other users' info" do + # Arrange + skip + # need login_data + user = users(grace) + session[:user_id] = user.id + invalid_view = users(:ada) + + # Act + get "/users/#{ invalid_view.id }" + + # Assert + must_redirect_to user_path(user.id) + end + end it "must get edit" do + skip get users_edit_url must_respond_with :success end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml new file mode 100644 index 0000000000..6ba038f8da --- /dev/null +++ b/test/fixtures/users.yml @@ -0,0 +1,10 @@ +ada: + provider: github + uid: 12345 + email: ada@adadevelopersacademy.org + name: countess_ada +grace: + provider: github + uid: 13371337 + email: grace@hooper.net + name: graceful_hopps \ No newline at end of file From c3edce4267739f86a362fefa7c604983274717e0 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 17 Nov 2020 18:31:37 -0800 Subject: [PATCH 018/208] draft the show view for user --- app/views/users/show.html.erb | 52 +++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index e5fa3adf14..23b2ed3dc3 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -1,2 +1,50 @@ -

Users#show

-

Find me in app/views/users/show.html.erb

+
+

<%= @user.name %>

+
    +
  • User ID: <%= @user.id %>
  • +
  • User email: <%= @user.email %>
  • +
+
+ +
+

Your Product

+ + + + + + + + + + <% @user.products.each do |product| %> + + + + + + + + + <% end %> +
Product IDProduct NameProduct PriceStockDescriptionPhoto
<%= product.id %><%= product.name %><%= product.price %><%= product.stock %><%= product.description %><%= product.photo_url %>
+
+ +
+

Your order

+ + + + + + + <% @user.orders.each do |order| %> + + + + + + <% end %> +
Order IDTotal PriceOrder date
<%= link_to order.id, order_path(order) %><%= order.created_at %><%= order.price %>
+
+ From 4694beb79b0ff19cd1de5321f944a8a4f77ce929 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 17 Nov 2020 18:52:58 -0800 Subject: [PATCH 019/208] added edit and update methods for user --- app/controllers/users_controller.rb | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 583982578a..68d81f3f2a 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,4 +1,6 @@ class UsersController < ApplicationController + before_action :find_user, only: [:show, :edit, :update] + def index end @@ -6,5 +8,37 @@ def show end def edit + if @user.nil? + flash[:error] = "User not found" + redirect_to users_path + return + end + end + + def update + if @user.nil? + flash[:error] = "User not found" + redirect_to users_path + return + elsif @user.update(user_params) + flash[:success] = "User updated successfully" + redirect_to user_path + return + else + flash.now[:error] = "Something happened. User not updated." + render :edit, status: :bad_request + return + end + end + + + private + + def find_user + @user = User.find_by_id(params[:id]) + end + + def user_params + return params.require(:user).permit(:name, :description, :uid, :provider, :email) end end From f8bea2b759094c254639daeac525f9afc12aa93d Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 17 Nov 2020 18:58:41 -0800 Subject: [PATCH 020/208] edited routes for root_path --- config/routes.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index 77a0240403..4f9ad46d39 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,8 @@ Rails.application.routes.draw do + root to: 'products#index' + resources :products resources :users + end From 2dc1c514d4c2bd418cb8aa4e9b3815e1c0be6528 Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Tue, 17 Nov 2020 19:08:51 -0800 Subject: [PATCH 021/208] edit update product and view --- .generators | 8 ++ .idea/.gitignore | 6 + .idea/betsy.iml | 134 +++++++++++++++++++ .idea/inspectionProfiles/Project_Default.xml | 6 + .idea/misc.xml | 4 + .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 + app/controllers/products_controller.rb | 31 +++++ app/views/products/edit.html.erb | 43 +++++- 9 files changed, 244 insertions(+), 2 deletions(-) create mode 100644 .generators create mode 100644 .idea/.gitignore create mode 100644 .idea/betsy.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.generators b/.generators new file mode 100644 index 0000000000..1618976692 --- /dev/null +++ b/.generators @@ -0,0 +1,8 @@ + + diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..8bf4d45d6e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,6 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/betsy.iml b/.idea/betsy.iml new file mode 100644 index 0000000000..515b391dc7 --- /dev/null +++ b/.idea/betsy.iml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000000..b0db9b0fca --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000..510e7fcc8f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..c8f8be844a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..94a25f7f4c --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 2a87d76cdf..fa95175de5 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -9,5 +9,36 @@ def new end def edit + @product = Product.find_by(id: params[:id]) + driver_id = params[:id] + + begin + @product = Product.find(driver_id) + rescue ActiveRecord::RecordNotFound + @product = nil + end + + if @product.nil? + head :not_found + return + end + end + + def update + @product = Product.find_by(id: params[:id]) + if @product.nil? + head :not_found + return + elsif @product.update( + name: params[:product][:name], + vin: params[:product][:vin], + available: params[:product][:available] + ) + redirect_to driver_path # go to the product details page + return + else # save failed + render :edit, status: :bad_request # show the new product form view again + return + end end end diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb index 279b066f30..2eee086f26 100644 --- a/app/views/products/edit.html.erb +++ b/app/views/products/edit.html.erb @@ -1,2 +1,41 @@ -

Products#edit

-

Find me in app/views/products/edit.html.erb

+ + + +

Product edit page

+ +<%= form_with model: @product, class: 'edit-product' do |f| %> +

Please make changes:

+ +
+ <%= f.label :name %> + <%= f.text_field :name %> +
+ +
+ <%= f.label :stock %> + <%= f.text_field :stock %> +
+ +
+ <%= f.label :price %> + <%= f.text_field :price %> +
+ +
+ <%= f.label :description %> + <%= f.text_field :description %> +
+ +
+ <%= f.label :user_id %> + <%= f.text_field :user_id %> +
+ +
+ <%= f.label :photo_url %> + <%= f.text_field :photo_url %> +
+ + <%= f.submit "Save Edit", class: "product-button" %> +<% end %> + From 65c8d21371213d5b95e3f69e79af7338bb91b6c9 Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Tue, 17 Nov 2020 19:33:00 -0800 Subject: [PATCH 022/208] used strong params for product controllers and added flash messages --- .gitignore | 2 ++ .idea/betsy.iml | 3 +++ app/controllers/products_controller.rb | 20 ++++---------------- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 8a24e82fd1..08fafee44b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ # Ignore bundler config. /.bundle +.idea + # Ignore all logfiles and tempfiles. /log/* /tmp/* diff --git a/.idea/betsy.iml b/.idea/betsy.iml index 515b391dc7..b80292a636 100644 --- a/.idea/betsy.iml +++ b/.idea/betsy.iml @@ -57,6 +57,7 @@ + @@ -109,6 +110,8 @@ + + diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index e85ea3938b..a80a4ecab0 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -26,13 +26,6 @@ def create def edit @product = Product.find_by(id: params[:id]) - driver_id = params[:id] - - begin - @product = Product.find(driver_id) - rescue ActiveRecord::RecordNotFound - @product = nil - end if @product.nil? head :not_found @@ -42,17 +35,12 @@ def edit def update @product = Product.find_by(id: params[:id]) - if @product.nil? - head :not_found - return - elsif @product.update( - name: params[:product][:name], - vin: params[:product][:vin], - available: params[:product][:available] - ) - redirect_to driver_path # go to the product details page + if @product.update(product_params) + flash[:success] = "Product has been successfully updated" + redirect_to product_path # go to the product details page return else # save failed + flash[:error] = "Product has not been updated" render :edit, status: :bad_request # show the new product form view again return end From dd31e9e265b8468e5ca4d5203794d5718bce7edd Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Tue, 17 Nov 2020 19:45:59 -0800 Subject: [PATCH 023/208] added a flash error to the product edit method --- app/controllers/products_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index a80a4ecab0..dcb8042f4e 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -28,7 +28,7 @@ def edit @product = Product.find_by(id: params[:id]) if @product.nil? - head :not_found + flash[:error] = "Product not found" return end end From 32e4cd1fd6cf3022c846e441d98c94029e0ec8ed Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 17 Nov 2020 19:49:40 -0800 Subject: [PATCH 024/208] changed edit method for user --- app/controllers/users_controller.rb | 5 ++++- config/routes.rb | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 68d81f3f2a..3dd98eaf49 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -10,8 +10,11 @@ def show def edit if @user.nil? flash[:error] = "User not found" - redirect_to users_path + redirect_to root_path return + elsif @user.id != session[:user_id] + flash[:error] = "You must log in as this user." + redirect_to root_path end end diff --git a/config/routes.rb b/config/routes.rb index 4f9ad46d39..251eff691b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,5 +4,5 @@ resources :products resources :users - + end From b000657ef6d72a6f710ca28fb5e87334a0ad3adc Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 17 Nov 2020 20:27:38 -0800 Subject: [PATCH 025/208] added retired column to product and .env&oauth gems --- Gemfile | 9 +++++- Gemfile.lock | 29 +++++++++++++++++++ ...0201118041752_add_retiredto_to_products.rb | 5 ++++ db/schema.rb | 3 +- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20201118041752_add_retiredto_to_products.rb diff --git a/Gemfile b/Gemfile index f2c4b20be3..dee205f00c 100644 --- a/Gemfile +++ b/Gemfile @@ -79,4 +79,11 @@ end group :test do gem 'simplecov', require: false -end \ No newline at end of file +end + +group :development do + gem 'dotenv-rails' +end + +gem "omniauth" +gem "omniauth-github" \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index cd207daedf..399bc4da68 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -93,8 +93,14 @@ GEM debase-ruby_core_source (0.10.11) debug_inspector (0.0.3) docile (1.3.2) + dotenv (2.7.5) + dotenv-rails (2.7.5) + dotenv (= 2.7.5) + railties (>= 3.2, < 6.1) erubi (1.10.0) execjs (2.7.0) + faraday (1.0.1) + multipart-post (>= 1.2, < 3) ffi (1.13.1) formatador (0.2.5) globalid (0.4.2) @@ -112,6 +118,7 @@ GEM guard-minitest (2.4.6) guard-compat (~> 1.2) minitest (>= 3.0) + hashie (4.1.0) i18n (1.8.5) concurrent-ruby (~> 1.0) jbuilder (2.10.1) @@ -123,6 +130,7 @@ GEM jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks + jwt (2.2.1) listen (3.3.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) @@ -148,6 +156,9 @@ GEM minitest (>= 5.0) ruby-progressbar msgpack (1.3.3) + multi_json (1.14.1) + multi_xml (0.6.0) + multipart-post (2.1.1) nenv (0.3.0) nio4r (2.5.4) nokogiri (1.10.10) @@ -155,6 +166,21 @@ GEM notiffany (0.1.3) nenv (~> 0.1) shellany (~> 0.0) + oauth2 (1.4.4) + faraday (>= 0.8, < 2.0) + jwt (>= 1.0, < 3.0) + multi_json (~> 1.3) + multi_xml (~> 0.5) + rack (>= 1.2, < 3) + omniauth (1.9.1) + hashie (>= 3.4.6) + rack (>= 1.6.2, < 3) + omniauth-github (1.4.0) + omniauth (~> 1.5) + omniauth-oauth2 (>= 1.4.0, < 2.0) + omniauth-oauth2 (1.6.0) + oauth2 (~> 1.1) + omniauth (~> 1.9) pg (1.2.3) popper_js (1.16.0) pry (0.13.1) @@ -273,6 +299,7 @@ DEPENDENCIES byebug capybara (>= 2.15) debase (>= 0.2.4.1) + dotenv-rails guard guard-minitest jbuilder (~> 2.7) @@ -281,6 +308,8 @@ DEPENDENCIES listen (~> 3.2) minitest-rails minitest-reporters + omniauth + omniauth-github pg (>= 0.18, < 2.0) pry-rails puma (~> 4.1) diff --git a/db/migrate/20201118041752_add_retiredto_to_products.rb b/db/migrate/20201118041752_add_retiredto_to_products.rb new file mode 100644 index 0000000000..b45250f46e --- /dev/null +++ b/db/migrate/20201118041752_add_retiredto_to_products.rb @@ -0,0 +1,5 @@ +class AddRetiredtoToProducts < ActiveRecord::Migration[6.0] + def change + add_column :products, :retired, :boolean, default: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 5aeb6ddc57..2975ebbf1c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_11_17_201100) do +ActiveRecord::Schema.define(version: 2020_11_18_041752) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -24,6 +24,7 @@ t.string "photo_url" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.boolean "retired", default: false end create_table "users", force: :cascade do |t| From cf9ef4d67f3b73e1a7efca5e482c03d075c61d21 Mon Sep 17 00:00:00 2001 From: Marj E Date: Tue, 17 Nov 2020 20:34:11 -0800 Subject: [PATCH 026/208] added show method logic, and views" --- app/controllers/products_controller.rb | 5 +++++ app/views/products/show.html.erb | 12 ++++++++++-- test/controllers/products_controller_test.rb | 20 +++++++++++++++++--- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index c98ec92497..e6b92e24b7 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -6,6 +6,11 @@ def index end def show + #review test with group + # if @product.nil? + # head :not_found + # return + # end end def new diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 5f44ec44d2..0b50b7fef5 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,2 +1,10 @@ -

Products#show

-

Find me in app/views/products/show.html.erb

+
+
+ <%= image_tag "", alt: "filler" %> +
+
+

Product Title<%#= @product.name %>

+

Product Price<%#= @product.price %>

+ <%#= button_to "Add to cart", orderitem_path(@product.id) %> +
+
\ No newline at end of file diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 8f7073dd5e..00b1908379 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -24,11 +24,25 @@ end end - it "must get show" do - get products_show_url - must_respond_with :success + describe "show" do + it "must get show" do + product + get products_show_url(product.id) + must_respond_with :success + end + + # it 'should respond with 404 with an invalid product id' do + # get products_show_url(-1) + # must_respond_with :not_found + # end end + + # it "must get show" do + # get products_show_url + # must_respond_with :success + # end + it "must get new" do get products_new_url must_respond_with :success From 52b748a9a6bf60016fe2ed4991b9ca3bd2467d8a Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 17 Nov 2020 21:10:38 -0800 Subject: [PATCH 027/208] fixed stuff with Matt --- .idea/betsy.iml | 15 +++++++++++++++ app/controllers/products_controller.rb | 11 ++++------- app/controllers/users_controller.rb | 2 +- app/views/users/show.html.erb | 6 +++--- test/controllers/products_controller_test.rb | 17 +++++++---------- 5 files changed, 30 insertions(+), 21 deletions(-) diff --git a/.idea/betsy.iml b/.idea/betsy.iml index b80292a636..9ba3c28843 100644 --- a/.idea/betsy.iml +++ b/.idea/betsy.iml @@ -41,6 +41,7 @@ + @@ -58,17 +59,24 @@ + + + + + + + @@ -81,10 +89,17 @@ + + + + + + + diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 4c5380f864..6b410a3769 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,5 +1,5 @@ class ProductsController < ApplicationController - before_action :find_product, only: [:show, :edit, :update] + before_action :find_product, only: [:show, :edit, :update, :destroy] def index @products = Product.all @@ -25,8 +25,6 @@ def create end def edit - @product = Product.find_by(id: params[:id]) - if @product.nil? flash[:error] = "Product not found" return @@ -34,7 +32,6 @@ def edit end def update - @product = Product.find_by(id: params[:id]) if @product.update(product_params) flash[:success] = "Product has been successfully updated" redirect_to product_path # go to the product details page @@ -55,18 +52,18 @@ def destroy if session[:user_id].nil? flash[:error] = "You must be logged in to delete this item" # need to clarify which path to redirect - redirect_to login_path + redirect_to products_path return elsif session[:user_id] == @product.user_id @product.destroy flash[:success] = "Successfully destroyed #{ @product.name }" # need to clarify which path to redirect - redirect_to user_path(session[:user_id]) + redirect_to products_path return else flash[:error] = "Only the product Seller can delete the product." # need to clarify which path to redirect - redirect_to root_path + redirect_to products_path return end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index cde0753aa4..9e982b84ec 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -13,7 +13,7 @@ def show elsif session[:id] != @user.id # May need to change to current user flash[:error] = "You cannot see other users' information." # need to clarify which path to redirect - redirect_to user_path(@user) + redirect_to root_path return end end diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index 23b2ed3dc3..f66b592d12 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -23,10 +23,10 @@ <%= product.name %> <%= product.price %> <%= product.stock %> - <%= product.description %> - <%= product.photo_url %> + <%= product.description %> + <%= product.photo_url %> - <% end %> + <% end %> diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 1e215374dd..28b93418ff 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -6,7 +6,7 @@ } describe "index" do it "must get index" do - get products_index_url + get products_path must_respond_with :success end @@ -28,20 +28,17 @@ end it "must get show" do - skip - get products_show_url + get product_path must_respond_with :success end it "must get new" do - skip - get products_new_url + get new_product_path must_respond_with :success end it "must get edit" do - skip - get products_edit_url + get edit_product_path must_respond_with :success end @@ -49,7 +46,6 @@ describe "destroy" do it "can destroy product when the user is merchant" do # Arrange - skip valid_user = users(:ada) valid_product = products(:confidence) @@ -63,11 +59,12 @@ end it "cannot destroy product without user login" do - skip + # Arrange # Need @current_user valid_product = products(:confidence) + # Act-Assert expect { delete product_path(valid_product) @@ -76,7 +73,7 @@ # Assert # Check later! - must_redirect_to login_path + must_respond_with :redirect end it "cannot delete product when the user is not its seller" do From 949ee8dbc7c42d1dd10f0d02ce25c0daaa789480 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 18 Nov 2020 03:53:38 -0800 Subject: [PATCH 028/208] created edit user view and tests --- app/views/users/edit.html.erb | 19 +++++- test/controllers/users_controller_test.rb | 78 +++++++++++++++++++++-- 2 files changed, 90 insertions(+), 7 deletions(-) diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 1881fbdba0..41c146936f 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -1,2 +1,17 @@ -

Users#edit

-

Find me in app/views/users/edit.html.erb

+<%= form_with model: @user do |f| %> +
+ <%= f.label :name %> + <%= f.text_field :name%> +
+
+ <%= f.label :email %> + <%= f.text_field :email %> +
+
+ <%= f.label :description %> + <%= f.text_area :description %> +
+
+ <%= f.submit "Save Edit", class: "btn btn-primary" %> +
+<% end %> \ No newline at end of file diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index a01876a414..22b1d20219 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -42,12 +42,80 @@ # Assert must_redirect_to user_path(user.id) end - end + end + + + describe "edit" do + it "responds with success when getting the edit page for an existing, valid user" do + # Arrange + # Ensure there is an existing user saved + skip + # Act + get edit_user_path(@user.id) + + # Assert + must_respond_with :success + + end + + it "responds with redirect when getting the edit page for a non-existing user" do + # Arrange + skip + # Act + get edit_user_path(-1) + + # Assert + must_respond_with :redirect + + end + end + + describe "update" do + it "can update an existing user with valid information accurately, and redirect" do + skip + # Arrange + id = @user.id + # Set up the form data + user_hash = { + user: { + name: 'new_name' + } + } + + # Act-Assert + expect { + patch user_path(id), params: user_hash + }.wont_differ "User.count" + + # Assert + must_respond_with :redirect + must_redirect_to user_path(id) + + end + + it "does not update any user if given an invalid id, and responds with a 404" do + # Arrange + skip + # Set up the form data + id = -1 + user_hash = { + user: { + name: 'new_name' + } + } + + # Act-Assert + # Ensure that there is no change in user.count + expect { + patch user_path(id), params: user_hash + }.wont_change "User.count" + + # Assert + # Check that the controller gave back a 404 + must_respond_with :redirect + + end - it "must get edit" do - skip - get users_edit_url - must_respond_with :success end end From 508da641ef4fe4c3407151e8e23f7698ece2e97d Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 18 Nov 2020 09:32:14 -0800 Subject: [PATCH 029/208] add product retired action --- app/controllers/products_controller.rb | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 6b410a3769..7bb6645a2c 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -68,6 +68,38 @@ def destroy end end + def retired + if @product.nil? + render :file => "#{Rails.root}/public/404.html", layout: false, status: :not_found + return + end + + if session[:user_id].nil? + flash[:error] = "You must be logged in to retire this item" + # need to clarify which path to redirect + redirect_to products_path + return + elsif session[:user_id] == @product.user_id + if @product.retired + @task.update_attribute(:retired, false) + # need to clarify which path to redirect + redirect_to products_path + return + else + @task.update_attribute(:retired, true) + flash[:success] = "Successfully retired #{ @product.name }" + # need to clarify which path to redirect + redirect_to products_path + return + end + else + flash[:error] = "Only the product Seller can delete the product." + # need to clarify which path to redirect + redirect_to products_path + return + end + end + private def find_product From 434e2f09628c5f56f6eb2295388fdb2f0b7c7f8a Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 18 Nov 2020 09:32:37 -0800 Subject: [PATCH 030/208] revised product destroy tests --- test/controllers/products_controller_test.rb | 124 +++++++++++-------- test/fixtures/users.yml | 2 + 2 files changed, 71 insertions(+), 55 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 28b93418ff..82cabdbb57 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -27,61 +27,6 @@ end end - it "must get show" do - get product_path - must_respond_with :success - end - - it "must get new" do - get new_product_path - must_respond_with :success - end - - it "must get edit" do - get edit_product_path - must_respond_with :success - end - - - describe "destroy" do - it "can destroy product when the user is merchant" do - # Arrange - valid_user = users(:ada) - valid_product = products(:confidence) - - # Act-Assert - expect { - delete product_path(valid_product) - }.must_differ "Product.count", 1 - - expect(valid_product.user_id).must_equal valid_user.id - must_redirect_to user_path(valid_user.id) - end - - it "cannot destroy product without user login" do - - # Arrange - # Need @current_user - valid_product = products(:confidence) - - - # Act-Assert - expect { - delete product_path(valid_product) - }.wont_change "Product.count" - - # Assert - - # Check later! - must_respond_with :redirect - end - - it "cannot delete product when the user is not its seller" do - skip - # Leave it to user site? - end - end - describe "new" do it "responds with success" do # Act @@ -146,4 +91,73 @@ end end + it "must get edit" do + get edit_product_path + must_respond_with :success + end + + describe "destroy" do + it "can destroy product when the user is merchant" do + # Arrange + # Need to check session[:user_id] + valid_product = products(:confidence) + + # Act-Assert + expect { + delete product_path(valid_product) + }.must_differ "Product.count", -1 + + expect(valid_product.user_id).must_equal valid_user.id + must_respond_with :redirect + end + + it "cannot destroy product without user login" do + # Arrange + # Need to check session[:user_id] + valid_product = products(:confidence) + + # Act-Assert + expect { + delete product_path(valid_product) + }.wont_change "Product.count" + + # Assert + + # Check later! + must_respond_with :redirect + end + + it "cannot delete product when the user is not its seller" do + # Arrange + # Need to check session[:user_id] + user = User.create(id: 3, provider: "github", uid: 1234509, email: "test@adadevelopersacademy.org", name: "test") + invalid_user = users(:ada) + invalid_user.id = user.id + valid_product = products(:confidence) + + # Act-Assert + expect { + delete product_path(valid_product) + }.wont_change "Product.count" + + # Assert + + # Check later! + must_respond_with :redirect + end + + it "cannot destroy a product if it's invalid" do + # Arrange + # Need to check session[:user_id] + valid_product = products(:confidence) + + # Act-Assert + expect { + delete product_path(valid_product) + }.must_differ "Product.count", -1 + + expect(valid_product.user_id).must_equal valid_user.id + must_respond_with :redirect + end + end end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 825095374e..06281c5bad 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -1,9 +1,11 @@ ada: + id: 1 provider: github uid: 12345 email: ada@adadevelopersacademy.org name: countess_ada grace: + id: 2 provider: github uid: 13371337 email: grace@hooper.net From 61fad824ea4bd56aef24402ff95b0a7fae4c9fef Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 18 Nov 2020 10:25:06 -0800 Subject: [PATCH 031/208] add .env to gitignore --- .gitignore | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 08fafee44b..32a70eb65e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,6 @@ # Ignore bundler config. /.bundle -.idea - # Ignore all logfiles and tempfiles. /log/* /tmp/* @@ -42,4 +40,7 @@ yarn-debug.log* .idea/ # Ignore simplecov -coverage/* \ No newline at end of file +coverage/* + +# Ignore .evn +.env \ No newline at end of file From 685ab45fd3420b22bd460c78db27956ee1f90062 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 18 Nov 2020 10:57:59 -0800 Subject: [PATCH 032/208] draft tests for retired for product and add the routes --- config/routes.rb | 9 ++-- test/controllers/products_controller_test.rb | 52 +++++++++++++------- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index ea754f5358..fe2f37200b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,14 +1,11 @@ Rails.application.routes.draw do - # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html - resources :users, except: [:new] - resources :products - - # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html root to: 'products#index' - resources :users, except: [:new, :index] resources :products + # Costomerized actions + patch 'products/:id/retired', to: 'products#retired', as: 'retired_product' + end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 82cabdbb57..54cf60ad7e 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -97,10 +97,13 @@ end describe "destroy" do - it "can destroy product when the user is merchant" do + it "can destroy product when the user is the owner" do # Arrange - # Need to check session[:user_id] + # Need to check session[:user_id] == user.id valid_product = products(:confidence) + p valid_product.user_id + p "#########" + p session[:user_id] # this one is nil now, need log in process # Act-Assert expect { @@ -108,12 +111,12 @@ }.must_differ "Product.count", -1 expect(valid_product.user_id).must_equal valid_user.id + # Check later, to redirect to the final path must_respond_with :redirect end it "cannot destroy product without user login" do # Arrange - # Need to check session[:user_id] valid_product = products(:confidence) # Act-Assert @@ -121,15 +124,13 @@ delete product_path(valid_product) }.wont_change "Product.count" - # Assert - - # Check later! + expect(session[:user_id]).must_be_nil must_respond_with :redirect end - it "cannot delete product when the user is not its seller" do + it "cannot delete product when the user is not the owner" do # Arrange - # Need to check session[:user_id] + # Need to check session[:user_id] != user.id user = User.create(id: 3, provider: "github", uid: 1234509, email: "test@adadevelopersacademy.org", name: "test") invalid_user = users(:ada) invalid_user.id = user.id @@ -140,24 +141,41 @@ delete product_path(valid_product) }.wont_change "Product.count" - # Assert - - # Check later! + # Check later, to redirect to the final path must_respond_with :redirect end it "cannot destroy a product if it's invalid" do # Arrange - # Need to check session[:user_id] - valid_product = products(:confidence) + # Give a user/guest + invalid_product = -1 # Act-Assert expect { - delete product_path(valid_product) - }.must_differ "Product.count", -1 + delete product_path(-1) + }.wont_change "Product.count" - expect(valid_product.user_id).must_equal valid_user.id - must_respond_with :redirect + must_respond_with :not_found + end + end + + describe "retired" do + it "can retire a product when the user is the owner" do + + end + + it "cannot retire a product without user login" do + + end + + it "cannot retire product when the user is not the owner" do + + end + + it "cannot retire a product if it's invalid" do + patch retired_product_path(-1) + + must_respond_with :not_found end end end From 15a679c76d09a67ed3fedbff672947f8aa911f00 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 18 Nov 2020 12:59:51 -0800 Subject: [PATCH 033/208] add retired-to-false in destroy action for product --- app/controllers/products_controller.rb | 1 + test/controllers/products_controller_test.rb | 1 + 2 files changed, 2 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 7bb6645a2c..a8dd450b35 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -56,6 +56,7 @@ def destroy return elsif session[:user_id] == @product.user_id @product.destroy + @task.update_attribute(:retired, false) flash[:success] = "Successfully destroyed #{ @product.name }" # need to clarify which path to redirect redirect_to products_path diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 54cf60ad7e..ba4ff0fea2 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -113,6 +113,7 @@ expect(valid_product.user_id).must_equal valid_user.id # Check later, to redirect to the final path must_respond_with :redirect + # add retired == false end it "cannot destroy product without user login" do From cefcc5f7528e11a612d825e02614ec0e30260528 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 18 Nov 2020 15:11:17 -0800 Subject: [PATCH 034/208] added .env to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 08fafee44b..29cef06a55 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ /.bundle .idea +.env # Ignore all logfiles and tempfiles. /log/* From ca5c8851060eaa346e7fc6cc592c244052c15034 Mon Sep 17 00:00:00 2001 From: Marj E Date: Wed, 18 Nov 2020 15:36:48 -0800 Subject: [PATCH 035/208] fixed products index test --- test/controllers/products_controller_test.rb | 7 +++---- test/fixtures/products.yml | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 28b93418ff..18b815a9d5 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,9 +1,6 @@ require "test_helper" describe ProductsController do - let (:product) { - Product.create name: "sample product" - } describe "index" do it "must get index" do get products_path @@ -11,7 +8,6 @@ end it "responds with success when there are many products saved" do - product get products_path expect(Product.count).must_equal 1 @@ -20,6 +16,9 @@ it "responds with success when there are no products saved" do + #ask team about this test! It's kind of weird... + products(:confidence).destroy + get products_path expect(Product.count).must_equal 0 diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 9b7f1c16fb..66f1da21e0 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -1,4 +1,5 @@ confidence: + id: 1 name: brand new confidence stock: 100 price: 5 From 3824910f24a81ba26cf083c9d2acd1c046ebd968 Mon Sep 17 00:00:00 2001 From: Marj E Date: Wed, 18 Nov 2020 17:02:17 -0800 Subject: [PATCH 036/208] added oauth --- .gitignore | 4 +++- app/controllers/users_controller.rb | 21 +++++++++++++++++++++ app/models/user.rb | 10 ++++++++++ app/views/layouts/application.html.erb | 19 ++++++++++++++++++- config/initializers/omniauth.rb | 4 ++++ config/routes.rb | 9 +++------ 6 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 config/initializers/omniauth.rb diff --git a/.gitignore b/.gitignore index 08fafee44b..4943f93720 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,6 @@ yarn-debug.log* .idea/ # Ignore simplecov -coverage/* \ No newline at end of file +coverage/* + +.env \ No newline at end of file diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9e982b84ec..d36ea372b4 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -18,6 +18,27 @@ def show end end + def create + auth_hash = request.env["omniauth.auth"] + + user = User.find_by(uid: auth_hash[:uid], provider: "github") + if user + flash[:success] = "Logged in as returning user #{user.name}" + else + user = User.build_from_github(auth_hash) + + if user.save + flash[:success] = "Logged in as new user #{user.name}" + else + flash[:error] = "Could not create new user account: #{user.errors.messages}" + return redirect_to root_path + end + end + + session[:user_id] = user.id + return redirect_to root_path + end + def edit if @user.nil? flash[:error] = "User not found" diff --git a/app/models/user.rb b/app/models/user.rb index 379658a509..3c8d98d907 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,2 +1,12 @@ class User < ApplicationRecord + def self.build_from_github(auth_hash) + user = User.new + user.uid = auth_hash[:uid] + user.provider = "github" + user.name = auth_hash["info"]["name"] + user.email = auth_hash["info"]["email"] + + return user + end + end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 74961e61a4..bfaa31064e 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,6 +10,23 @@ - <%= yield %> +
+ +
+
+
+ <% flash.each do |name, message| %> + + <%= message %> + + <% end %> +
+ <%= yield %> +
diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb new file mode 100644 index 0000000000..aab6482b4b --- /dev/null +++ b/config/initializers/omniauth.rb @@ -0,0 +1,4 @@ +# config/initializers/omniauth.rb +Rails.application.config.middleware.use OmniAuth::Builder do + provider :github, ENV["GITHUB_CLIENT_ID"], ENV["GITHUB_CLIENT_SECRET"], scope: "user:email" +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index ea754f5358..db7158d872 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,13 +1,10 @@ Rails.application.routes.draw do - # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html - resources :users, except: [:new] - resources :products - - # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html root to: 'products#index' - + get "/auth/github", as: "github_login" + get "/auth/:provider/callback", to: "users#create" + resources :users, except: [:new, :index] resources :products From 2f9b15ad6488c7038f6811dcf1d160964014e644 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 18 Nov 2020 17:08:37 -0800 Subject: [PATCH 037/208] added logout method and route --- app/controllers/users_controller.rb | 7 +++++++ config/routes.rb | 1 + 2 files changed, 8 insertions(+) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9e982b84ec..42b29eb45e 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -45,6 +45,13 @@ def update end end + def destroy + session[:user_id] = nil + flash[:success] = "Successfully logged out!" + + redirect_to root_path + end + private diff --git a/config/routes.rb b/config/routes.rb index ea754f5358..66442fb174 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,6 +4,7 @@ resources :users, except: [:new] resources :products + delete "/logout", to: "users#destroy", as: "logout" # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html root to: 'products#index' From 40db06c2b1ab7ac0046330f57fbb23e3f6f33c6a Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 18 Nov 2020 17:26:17 -0800 Subject: [PATCH 038/208] edited logout route and view --- app/views/layouts/application.html.erb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index bfaa31064e..f76464199c 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -13,7 +13,11 @@
From 96ba012980ecfa4ad237d7cac015ad087460b2c0 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 18 Nov 2020 17:27:24 -0800 Subject: [PATCH 039/208] changed header --- app/views/layouts/application.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f76464199c..d215a144aa 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,7 +1,7 @@ - Betsy + Mama Jeti's Apothecary <%= csrf_meta_tags %> <%= csp_meta_tag %> From 9e7291769eb1842ee7a4346d6c3d886cc3245cf3 Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Wed, 18 Nov 2020 17:53:01 -0800 Subject: [PATCH 040/208] update product controller test --- .gitignore | 1 + .idea/betsy.iml | 15 ++++++ app/controllers/products_controller.rb | 16 ++++-- app/views/products/edit.html.erb | 49 ++++------------- test/controllers/products_controller_test.rb | 55 ++++++++++++++++++-- 5 files changed, 90 insertions(+), 46 deletions(-) diff --git a/.gitignore b/.gitignore index 08fafee44b..fcb4efbed2 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ yarn-debug.log* # Ignore auto generated files .generators .idea/ +.env # Ignore simplecov coverage/* \ No newline at end of file diff --git a/.idea/betsy.iml b/.idea/betsy.iml index b80292a636..9ba3c28843 100644 --- a/.idea/betsy.iml +++ b/.idea/betsy.iml @@ -41,6 +41,7 @@ + @@ -58,17 +59,24 @@ + + + + + + + @@ -81,10 +89,17 @@ + + + + + + + diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 4c5380f864..1990242e84 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -29,20 +29,26 @@ def edit if @product.nil? flash[:error] = "Product not found" + redirect_to products_path return + end end def update - @product = Product.find_by(id: params[:id]) - if @product.update(product_params) + if @product.nil? + flash[:error] = "Product not found" + redirect_to products_path + return + + elsif @product.update(product_params) flash[:success] = "Product has been successfully updated" redirect_to product_path # go to the product details page return else # save failed - flash[:error] = "Product has not been updated" - render :edit, status: :bad_request # show the new product form view again - return + flash.now[:error] = "Product has not been updated" + render :edit, status: :bad_request # show the new product form view again + return end end diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb index 2eee086f26..8d4d6828e3 100644 --- a/app/views/products/edit.html.erb +++ b/app/views/products/edit.html.erb @@ -1,41 +1,14 @@ - - - -

Product edit page

- -<%= form_with model: @product, class: 'edit-product' do |f| %> -

Please make changes:

- -
- <%= f.label :name %> - <%= f.text_field :name %> -
- -
- <%= f.label :stock %> - <%= f.text_field :stock %> -
- -
- <%= f.label :price %> - <%= f.text_field :price %> -
- -
- <%= f.label :description %> - <%= f.text_field :description %> -
- -
- <%= f.label :user_id %> - <%= f.text_field :user_id %> -
+<% if @product.errors.any? %> +
    + <% @product.errors.each do |column, message| %> +
  • + <%= column.capitalize %> <%= message %> +
  • + <% end %> +
+<% end %> -
- <%= f.label :photo_url %> - <%= f.text_field :photo_url %> -
+

Edit product

- <%= f.submit "Save Edit", class: "product-button" %> -<% end %> +<%= render partial: "form", locals: { action_name: "Edit Product"} %> \ No newline at end of file diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 1e215374dd..550f7982eb 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -39,12 +39,61 @@ must_respond_with :success end - it "must get edit" do - skip - get products_edit_url + describe "Edit" do + it "must get edit page for existing product" do + #Act + product = Product.create(name: 'Python', description: 'Gain Python skills') + get edit_product_path(product.id) + + # Assert must_respond_with :success end + it "will respond with not_found when a product does not exist" do + # Act + get edit_product_path(-1) + + # Assert + must_respond_with :redirect + end + end + + describe "Update" do + it "must get update for existing product" do + product = products(:confidence) + + updated_product = { + product: { + name: "Public Speaking", + description: "Level 1", + price: 45, + } + } + expect { + patch product_path(product.id), params: updated_product + }.wont_change "Product.count" + + must_redirect_to product_path + + product = Product.find_by(id: product.id) + expect(product.name).must_equal updated_product[:product][:name] + end + + it "will respond with not found given an invalid id" do + updated_product = { + product: { + name: "Public Speaking", + description: "Level 1", + price: 45, + } + } + expect { + patch product_path(-1), params: updated_product + }.wont_change "Product.count" + + must_respond_with :redirect + end + end describe "destroy" do it "can destroy product when the user is merchant" do From 94bafee607db38f8bcbe5ba128a6d86661fe6960 Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Wed, 18 Nov 2020 19:02:32 -0800 Subject: [PATCH 041/208] generated starter data and created a seed.rb file --- .gitignore | 1 - .idea/betsy.iml | 3 +++ Gemfile | 3 +++ Gemfile.lock | 7 +++++++ db/generate_starter_data.rb | 27 +++++++++++++++++++++++++ db/seed_data/products_seeds.csv | 26 ++++++++++++++++++++++++ db/seeds.rb | 35 +++++++++++++++++++++++++++++++++ 7 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 db/generate_starter_data.rb create mode 100644 db/seed_data/products_seeds.csv diff --git a/.gitignore b/.gitignore index c4f7e1aaf0..4edb601454 100644 --- a/.gitignore +++ b/.gitignore @@ -43,4 +43,3 @@ yarn-debug.log* # Ignore simplecov coverage/* -.env \ No newline at end of file diff --git a/.idea/betsy.iml b/.idea/betsy.iml index 9ba3c28843..b4be0bb9c5 100644 --- a/.idea/betsy.iml +++ b/.idea/betsy.iml @@ -55,6 +55,8 @@ + + @@ -63,6 +65,7 @@ + diff --git a/Gemfile b/Gemfile index dee205f00c..c4fd3ebe6a 100644 --- a/Gemfile +++ b/Gemfile @@ -21,6 +21,9 @@ gem 'jbuilder', '~> 2.7' # gem 'redis', '~> 4.0' # Use Active Model has_secure_password # gem 'bcrypt', '~> 3.1.7' +gem "faker" +gem "date" +gem "csv" # Use Active Storage variant # gem 'image_processing', '~> 1.2' diff --git a/Gemfile.lock b/Gemfile.lock index 399bc4da68..437d138d65 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -88,6 +88,8 @@ GEM coderay (1.1.3) concurrent-ruby (1.1.7) crass (1.0.6) + csv (3.1.8) + date (3.0.1) debase (0.2.4.1) debase-ruby_core_source (>= 0.10.2) debase-ruby_core_source (0.10.11) @@ -99,6 +101,8 @@ GEM railties (>= 3.2, < 6.1) erubi (1.10.0) execjs (2.7.0) + faker (2.14.0) + i18n (>= 1.6, < 2) faraday (1.0.1) multipart-post (>= 1.2, < 3) ffi (1.13.1) @@ -298,8 +302,11 @@ DEPENDENCIES bootstrap byebug capybara (>= 2.15) + csv + date debase (>= 0.2.4.1) dotenv-rails + faker guard guard-minitest jbuilder (~> 2.7) diff --git a/db/generate_starter_data.rb b/db/generate_starter_data.rb new file mode 100644 index 0000000000..b86eaacffc --- /dev/null +++ b/db/generate_starter_data.rb @@ -0,0 +1,27 @@ +require "faker" +require "date" +require "csv" + +# we already provide a filled out works_seeds.csv file, but feel free to +# run this script in order to replace it and generate a new one +# run using the command: +# $ ruby db/generate_seeds.rb +# if satisfied with this new works_seeds.csv file, recreate the db with: +# $ rails db:reset +# doesn't currently check for if titles are unique against each other + +CSV.open("db/seed_data/products_seeds.csv", "w", :write_headers => true, + :headers => ["name", "stock", "price", "description", "user_id", "photo_url", "retired"]) do |csv| + 25.times do + name = Faker::Name.name + stock = rand(0..500) + price = rand(100..100000) + description = Faker::Lorem.sentence + user_id = rand(0..10) + photo_url = Faker::Avatar.image + retired = %w(true false).sample + + csv << [name, stock, price, description, user_id, photo_url, retired] + end +end + diff --git a/db/seed_data/products_seeds.csv b/db/seed_data/products_seeds.csv new file mode 100644 index 0000000000..3a155c42a8 --- /dev/null +++ b/db/seed_data/products_seeds.csv @@ -0,0 +1,26 @@ +name,stock,price,description,user_id,photo_url,retired +Julius Friesen,192,913501071182,Quis facilis accusamus accusantium.,1,https://robohash.org/illorepellateligendi.png?size=300x300&set=set1,true +Carin Ortiz,390,367869092311,Suscipit et ut vitae.,10,https://robohash.org/beataererumaut.png?size=300x300&set=set1,false +Dorsey McGlynn,443,764905909803,Labore nobis est nostrum.,7,https://robohash.org/namquianemo.png?size=300x300&set=set1,false +Lawerence McCullough,449,40941521829,Iusto est necessitatibus veritatis.,6,https://robohash.org/atatqueeveniet.png?size=300x300&set=set1,false +Ossie Abernathy Esq.,491,582810284148,Quisquam ut ratione rerum.,6,https://robohash.org/occaecatiestatque.png?size=300x300&set=set1,true +Reda Feeney,126,881839580535,Quos rerum adipisci hic.,8,https://robohash.org/consequunturconsequaturest.png?size=300x300&set=set1,false +Darwin Jacobs LLD,180,755946633813,Quidem molestiae eligendi accusantium.,8,https://robohash.org/aliasdelenitipossimus.png?size=300x300&set=set1,false +Pres. Joella Abbott,79,409074102417,Quo odit minus nam.,1,https://robohash.org/inciduntillumdolor.png?size=300x300&set=set1,false +Amb. Merrill Blick,90,869457888456,Qui cupiditate commodi animi.,4,https://robohash.org/voluptasreiciendissed.png?size=300x300&set=set1,true +Rosario Koelpin,293,472661401518,Quaerat at ut pariatur.,4,https://robohash.org/atillolaboriosam.png?size=300x300&set=set1,true +Ghislaine Effertz,258,841553900787,Sint dolor iste tempore.,5,https://robohash.org/quienimid.png?size=300x300&set=set1,true +Herman Donnelly,264,109618246860,Maxime numquam similique reprehenderit.,3,https://robohash.org/perspiciatisautvoluptatem.png?size=300x300&set=set1,true +Seth Bode,52,170262879222,Officia accusamus laudantium recusandae.,5,https://robohash.org/voluptatevoluptatempariatur.png?size=300x300&set=set1,true +Aura Champlin,463,294099803116,Assumenda dolor sequi occaecati.,3,https://robohash.org/etinincidunt.png?size=300x300&set=set1,false +The Hon. Junita Deckow,342,466216090639,Rerum ipsa quam iusto.,5,https://robohash.org/doloremquealiquidfuga.png?size=300x300&set=set1,true +Rossana Swaniawski,53,443220518303,Nisi dolores sit autem.,9,https://robohash.org/veniamteneturet.png?size=300x300&set=set1,false +Ruth Legros,162,730703844100,Est aut voluptate optio.,5,https://robohash.org/voluptassimiliquequidem.png?size=300x300&set=set1,false +Ms. Miranda Hahn,262,523839303781,Qui aut rerum perspiciatis.,3,https://robohash.org/rerumvelitautem.png?size=300x300&set=set1,true +Yahaira Beatty,81,765447218732,Id similique assumenda consectetur.,0,https://robohash.org/dolorequohic.png?size=300x300&set=set1,false +Ms. Krysten Stark,334,599934852588,Incidunt laborum recusandae perspiciatis.,10,https://robohash.org/exvitaeconsequatur.png?size=300x300&set=set1,false +Enoch Heathcote IV,436,207666242330,Pariatur atque recusandae odio.,0,https://robohash.org/quibusdamcumqui.png?size=300x300&set=set1,true +Sen. Shawanda Cruickshank,237,73785575918,Adipisci similique sunt voluptatem.,1,https://robohash.org/omnisquiaexcepturi.png?size=300x300&set=set1,false +Lesley Emmerich,348,164450266410,Enim facilis illum laborum.,1,https://robohash.org/minimainoccaecati.png?size=300x300&set=set1,true +Robbie Halvorson,408,117555986512,Est nostrum fugiat quo.,9,https://robohash.org/utexea.png?size=300x300&set=set1,false +Mr. Evan Murray,495,188889565593,Ducimus ab et deserunt.,5,https://robohash.org/eaquecupiditateveniam.png?size=300x300&set=set1,true diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2accd..febb58ca32 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,3 +1,4 @@ +require "csv" # 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 rails db:seed command (or created alongside the database with db:setup). # @@ -5,3 +6,37 @@ # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) +PRODUCT_FILE = Rails.root.join('db', 'seed_data', 'products_seeds.csv') +puts "Loading raw product data from #{PRODUCT_FILE}" + +product_failures = [] +CSV.foreach(PRODUCT_FILE, :headers => true) do |row| + product = Product.new + product.name = row['name'] + product.stock = row['stock'] + product.price = row['price'] + product.description = row['description'] + product.user_id = row['user_id'] + product.photo_url = row['photo_url'] + product.retired = row['retired'] + successful = product.save + if !successful + product_failures << product + puts "Failed to save product: #{product.inspect}" + else + puts "Created product: #{product.inspect}" + end +end + +puts "Added #{Product.count} product records" +puts "#{product_failures.length} products failed to save" + +# Since we set the primary key (the ID) manually on each of the +# tables, we've got to tell postgres to reload the latest ID +# values. Otherwise when we create a new record it will try +# to start at ID 1, which will be a conflict. +puts "Manually resetting PK sequence on each table" +ActiveRecord::Base.connection.tables.each do |t| + ActiveRecord::Base.connection.reset_pk_sequence!(t) +end +puts "done" \ No newline at end of file From 28185d14fa3e895507a507e8e2193e849b363df2 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 18 Nov 2020 19:14:20 -0800 Subject: [PATCH 042/208] faker works --- db/generate_starter_data.rb | 2 +- db/seed_data/products_seeds.csv | 50 ++++++++++++++++----------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/db/generate_starter_data.rb b/db/generate_starter_data.rb index b86eaacffc..71718a05e1 100644 --- a/db/generate_starter_data.rb +++ b/db/generate_starter_data.rb @@ -15,7 +15,7 @@ 25.times do name = Faker::Name.name stock = rand(0..500) - price = rand(100..100000) + price = rand(100..10000) description = Faker::Lorem.sentence user_id = rand(0..10) photo_url = Faker::Avatar.image diff --git a/db/seed_data/products_seeds.csv b/db/seed_data/products_seeds.csv index 3a155c42a8..bddb425cbc 100644 --- a/db/seed_data/products_seeds.csv +++ b/db/seed_data/products_seeds.csv @@ -1,26 +1,26 @@ name,stock,price,description,user_id,photo_url,retired -Julius Friesen,192,913501071182,Quis facilis accusamus accusantium.,1,https://robohash.org/illorepellateligendi.png?size=300x300&set=set1,true -Carin Ortiz,390,367869092311,Suscipit et ut vitae.,10,https://robohash.org/beataererumaut.png?size=300x300&set=set1,false -Dorsey McGlynn,443,764905909803,Labore nobis est nostrum.,7,https://robohash.org/namquianemo.png?size=300x300&set=set1,false -Lawerence McCullough,449,40941521829,Iusto est necessitatibus veritatis.,6,https://robohash.org/atatqueeveniet.png?size=300x300&set=set1,false -Ossie Abernathy Esq.,491,582810284148,Quisquam ut ratione rerum.,6,https://robohash.org/occaecatiestatque.png?size=300x300&set=set1,true -Reda Feeney,126,881839580535,Quos rerum adipisci hic.,8,https://robohash.org/consequunturconsequaturest.png?size=300x300&set=set1,false -Darwin Jacobs LLD,180,755946633813,Quidem molestiae eligendi accusantium.,8,https://robohash.org/aliasdelenitipossimus.png?size=300x300&set=set1,false -Pres. Joella Abbott,79,409074102417,Quo odit minus nam.,1,https://robohash.org/inciduntillumdolor.png?size=300x300&set=set1,false -Amb. Merrill Blick,90,869457888456,Qui cupiditate commodi animi.,4,https://robohash.org/voluptasreiciendissed.png?size=300x300&set=set1,true -Rosario Koelpin,293,472661401518,Quaerat at ut pariatur.,4,https://robohash.org/atillolaboriosam.png?size=300x300&set=set1,true -Ghislaine Effertz,258,841553900787,Sint dolor iste tempore.,5,https://robohash.org/quienimid.png?size=300x300&set=set1,true -Herman Donnelly,264,109618246860,Maxime numquam similique reprehenderit.,3,https://robohash.org/perspiciatisautvoluptatem.png?size=300x300&set=set1,true -Seth Bode,52,170262879222,Officia accusamus laudantium recusandae.,5,https://robohash.org/voluptatevoluptatempariatur.png?size=300x300&set=set1,true -Aura Champlin,463,294099803116,Assumenda dolor sequi occaecati.,3,https://robohash.org/etinincidunt.png?size=300x300&set=set1,false -The Hon. Junita Deckow,342,466216090639,Rerum ipsa quam iusto.,5,https://robohash.org/doloremquealiquidfuga.png?size=300x300&set=set1,true -Rossana Swaniawski,53,443220518303,Nisi dolores sit autem.,9,https://robohash.org/veniamteneturet.png?size=300x300&set=set1,false -Ruth Legros,162,730703844100,Est aut voluptate optio.,5,https://robohash.org/voluptassimiliquequidem.png?size=300x300&set=set1,false -Ms. Miranda Hahn,262,523839303781,Qui aut rerum perspiciatis.,3,https://robohash.org/rerumvelitautem.png?size=300x300&set=set1,true -Yahaira Beatty,81,765447218732,Id similique assumenda consectetur.,0,https://robohash.org/dolorequohic.png?size=300x300&set=set1,false -Ms. Krysten Stark,334,599934852588,Incidunt laborum recusandae perspiciatis.,10,https://robohash.org/exvitaeconsequatur.png?size=300x300&set=set1,false -Enoch Heathcote IV,436,207666242330,Pariatur atque recusandae odio.,0,https://robohash.org/quibusdamcumqui.png?size=300x300&set=set1,true -Sen. Shawanda Cruickshank,237,73785575918,Adipisci similique sunt voluptatem.,1,https://robohash.org/omnisquiaexcepturi.png?size=300x300&set=set1,false -Lesley Emmerich,348,164450266410,Enim facilis illum laborum.,1,https://robohash.org/minimainoccaecati.png?size=300x300&set=set1,true -Robbie Halvorson,408,117555986512,Est nostrum fugiat quo.,9,https://robohash.org/utexea.png?size=300x300&set=set1,false -Mr. Evan Murray,495,188889565593,Ducimus ab et deserunt.,5,https://robohash.org/eaquecupiditateveniam.png?size=300x300&set=set1,true +Rory Lehner,432,8829,Non ea dicta cumque.,7,https://robohash.org/eaquaeest.png?size=300x300&set=set1,true +Ira Quitzon,488,1671,Amet vel quidem est.,10,https://robohash.org/doloremquequiaaperiam.png?size=300x300&set=set1,true +Bari Reilly,248,1518,Nemo id eos velit.,5,https://robohash.org/veritatissitasperiores.png?size=300x300&set=set1,false +Migdalia Deckow,428,5388,Sit qui reiciendis laudantium.,9,https://robohash.org/dolorumaspernaturnulla.png?size=300x300&set=set1,false +Nicolas Treutel,81,8290,Magnam suscipit sed minima.,7,https://robohash.org/cumquesequiveniam.png?size=300x300&set=set1,false +Art Davis,328,3779,Eum nesciunt officiis et.,7,https://robohash.org/deseruntfugiatmolestias.png?size=300x300&set=set1,true +Rev. Wilson Hegmann,86,6848,Enim debitis perspiciatis et.,4,https://robohash.org/modiaccusantiumperferendis.png?size=300x300&set=set1,true +Ross Shields,211,8802,Quam nihil accusantium iure.,6,https://robohash.org/impeditquout.png?size=300x300&set=set1,true +Corazon Douglas MD,130,2285,Beatae voluptatum vel est.,0,https://robohash.org/nobisautdeserunt.png?size=300x300&set=set1,false +Sebastian Witting,96,1766,Saepe officia molestiae aut.,1,https://robohash.org/nihilipsamvoluptas.png?size=300x300&set=set1,true +Jamison Tromp,26,2425,Qui possimus aut aut.,9,https://robohash.org/indelectusrepudiandae.png?size=300x300&set=set1,false +Mayme Huel,356,6954,Natus nobis consequuntur dicta.,10,https://robohash.org/omnisquaerataut.png?size=300x300&set=set1,true +The Hon. Chang Weber,90,9600,Veniam sequi molestiae iusto.,2,https://robohash.org/abnumquamminima.png?size=300x300&set=set1,true +Huey Kautzer,101,2876,Et quia sint illum.,3,https://robohash.org/cumiurenihil.png?size=300x300&set=set1,true +Miss Julian Gulgowski,223,9279,Ut non quae omnis.,5,https://robohash.org/nobistemporepariatur.png?size=300x300&set=set1,false +Eleonor Stark JD,239,5857,Ut laudantium numquam ad.,8,https://robohash.org/autnonsaepe.png?size=300x300&set=set1,false +Iona Mohr Jr.,407,6583,Facere ea illo hic.,6,https://robohash.org/quidemenimad.png?size=300x300&set=set1,false +Chadwick Glover DC,389,969,Sed debitis aspernatur consectetur.,8,https://robohash.org/abmaioresipsa.png?size=300x300&set=set1,true +Arlette Shanahan,477,464,Cumque voluptates nisi maxime.,3,https://robohash.org/laudantiumisteaut.png?size=300x300&set=set1,true +Gregorio Hansen,47,1433,Possimus maxime ut unde.,2,https://robohash.org/earumperferendisnecessitatibus.png?size=300x300&set=set1,true +Ona King Esq.,106,4622,Qui beatae repudiandae quaerat.,5,https://robohash.org/autemestquas.png?size=300x300&set=set1,true +Kathline O'Kon,4,1829,Dolorem debitis impedit aut.,5,https://robohash.org/officiaeligendipossimus.png?size=300x300&set=set1,false +Raymundo Legros,106,2432,Iure debitis voluptas omnis.,5,https://robohash.org/deleniticommodireiciendis.png?size=300x300&set=set1,false +Mrs. Angel Thiel,14,6553,Dolorem illum voluptas totam.,3,https://robohash.org/atiuredebitis.png?size=300x300&set=set1,false +Tona Wiza,147,2888,Eveniet illo doloremque et.,0,https://robohash.org/oditautconsectetur.png?size=300x300&set=set1,true From b6160d945a54470555f6464a5edc8c6efd62d9ac Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 18 Nov 2020 19:18:12 -0800 Subject: [PATCH 043/208] update product index with images --- app/views/products/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index da04a0d7a1..f49f67224e 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,6 +1,6 @@
<% @products.each do |product| %> - <%= image_tag "", alt: "filler" %> + <%= image_tag "#{product.photo_url}", alt: "filler" %> <%= product.price %> <% end %>
From f47d999e74c1ba7de6ceb97ab7ba42dc6d6dea1e Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 18 Nov 2020 19:39:33 -0800 Subject: [PATCH 044/208] created order and orderitem controllers and models --- app/assets/stylesheets/order_items.scss | 3 +++ app/assets/stylesheets/orders.scss | 3 +++ app/controllers/order_items_controller.rb | 2 ++ app/controllers/orders_controller.rb | 2 ++ app/helpers/order_items_helper.rb | 2 ++ app/helpers/orders_helper.rb | 2 ++ app/models/order.rb | 2 ++ app/models/orderitem.rb | 2 ++ db/migrate/20201119033716_create_orders.rb | 16 +++++++++++++ .../20201119033822_create_orderitems.rb | 12 ++++++++++ db/schema.rb | 24 ++++++++++++++++++- .../order_items_controller_test.rb | 7 ++++++ test/controllers/orders_controller_test.rb | 7 ++++++ test/models/order_test.rb | 7 ++++++ test/models/orderitem_test.rb | 7 ++++++ 15 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 app/assets/stylesheets/order_items.scss create mode 100644 app/assets/stylesheets/orders.scss create mode 100644 app/controllers/order_items_controller.rb create mode 100644 app/controllers/orders_controller.rb create mode 100644 app/helpers/order_items_helper.rb create mode 100644 app/helpers/orders_helper.rb create mode 100644 app/models/order.rb create mode 100644 app/models/orderitem.rb create mode 100644 db/migrate/20201119033716_create_orders.rb create mode 100644 db/migrate/20201119033822_create_orderitems.rb create mode 100644 test/controllers/order_items_controller_test.rb create mode 100644 test/controllers/orders_controller_test.rb create mode 100644 test/models/order_test.rb create mode 100644 test/models/orderitem_test.rb diff --git a/app/assets/stylesheets/order_items.scss b/app/assets/stylesheets/order_items.scss new file mode 100644 index 0000000000..4bb17c4250 --- /dev/null +++ b/app/assets/stylesheets/order_items.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the OrderItems controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss new file mode 100644 index 0000000000..e8c23c2250 --- /dev/null +++ b/app/assets/stylesheets/orders.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Orders controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb new file mode 100644 index 0000000000..357e7f5c80 --- /dev/null +++ b/app/controllers/order_items_controller.rb @@ -0,0 +1,2 @@ +class OrderItemsController < ApplicationController +end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb new file mode 100644 index 0000000000..8a0e3659ae --- /dev/null +++ b/app/controllers/orders_controller.rb @@ -0,0 +1,2 @@ +class OrdersController < ApplicationController +end diff --git a/app/helpers/order_items_helper.rb b/app/helpers/order_items_helper.rb new file mode 100644 index 0000000000..e197528ae1 --- /dev/null +++ b/app/helpers/order_items_helper.rb @@ -0,0 +1,2 @@ +module OrderItemsHelper +end diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb new file mode 100644 index 0000000000..443227fd48 --- /dev/null +++ b/app/helpers/orders_helper.rb @@ -0,0 +1,2 @@ +module OrdersHelper +end diff --git a/app/models/order.rb b/app/models/order.rb new file mode 100644 index 0000000000..10281b3450 --- /dev/null +++ b/app/models/order.rb @@ -0,0 +1,2 @@ +class Order < ApplicationRecord +end diff --git a/app/models/orderitem.rb b/app/models/orderitem.rb new file mode 100644 index 0000000000..ebe5c835d9 --- /dev/null +++ b/app/models/orderitem.rb @@ -0,0 +1,2 @@ +class Orderitem < ApplicationRecord +end diff --git a/db/migrate/20201119033716_create_orders.rb b/db/migrate/20201119033716_create_orders.rb new file mode 100644 index 0000000000..5e9e1ee751 --- /dev/null +++ b/db/migrate/20201119033716_create_orders.rb @@ -0,0 +1,16 @@ +class CreateOrders < ActiveRecord::Migration[6.0] + def change + create_table :orders do |t| + t.integer :order_item_id + t.string :name + t.string :email + t.string :mailing_address + t.string :cc_name + t.bigint :cc_number + t.string :cc_exp_date + t.integer :billing_zip_code + + t.timestamps + end + end +end diff --git a/db/migrate/20201119033822_create_orderitems.rb b/db/migrate/20201119033822_create_orderitems.rb new file mode 100644 index 0000000000..3928831788 --- /dev/null +++ b/db/migrate/20201119033822_create_orderitems.rb @@ -0,0 +1,12 @@ +class CreateOrderitems < ActiveRecord::Migration[6.0] + def change + create_table :orderitems do |t| + t.integer :order_id + t.integer :product_id + t.integer :quantity + t.integer :price + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 2975ebbf1c..d1be635de5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,11 +10,33 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_11_18_041752) do +ActiveRecord::Schema.define(version: 2020_11_19_033822) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "orderitems", force: :cascade do |t| + t.integer "order_id" + t.integer "product_id" + t.integer "quantity" + t.integer "price" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + + create_table "orders", force: :cascade do |t| + t.integer "order_item_id" + t.string "name" + t.string "email" + t.string "mailing_address" + t.string "cc_name" + t.bigint "cc_number" + t.string "cc_exp_date" + t.integer "billing_zip_code" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + create_table "products", force: :cascade do |t| t.string "name" t.integer "stock" diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb new file mode 100644 index 0000000000..17457ab944 --- /dev/null +++ b/test/controllers/order_items_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe OrderItemsController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb new file mode 100644 index 0000000000..4b01cc1988 --- /dev/null +++ b/test/controllers/orders_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe OrdersController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end diff --git a/test/models/order_test.rb b/test/models/order_test.rb new file mode 100644 index 0000000000..59ceb9a253 --- /dev/null +++ b/test/models/order_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Order do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end diff --git a/test/models/orderitem_test.rb b/test/models/orderitem_test.rb new file mode 100644 index 0000000000..48dc4d1fbd --- /dev/null +++ b/test/models/orderitem_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Orderitem do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 23ab603670a62db3c8a049a6e59fac7b2ed083e3 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 18 Nov 2020 20:02:18 -0800 Subject: [PATCH 045/208] add relations for all models --- app/models/order.rb | 2 ++ app/models/orderitem.rb | 3 +++ app/models/product.rb | 4 ++++ app/models/user.rb | 4 ++++ 4 files changed, 13 insertions(+) diff --git a/app/models/order.rb b/app/models/order.rb index 10281b3450..9534535c69 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,2 +1,4 @@ class Order < ApplicationRecord + has_many :orderitems + has_many :products, through :orderitems end diff --git a/app/models/orderitem.rb b/app/models/orderitem.rb index ebe5c835d9..8d1676d9cd 100644 --- a/app/models/orderitem.rb +++ b/app/models/orderitem.rb @@ -1,2 +1,5 @@ class Orderitem < ApplicationRecord + belongs_to :product + belongs_to :order + belongs_to :user, through :product end diff --git a/app/models/product.rb b/app/models/product.rb index 35a85acab3..a335354cc2 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,2 +1,6 @@ class Product < ApplicationRecord + belongs_to :user + has_many :orderitems + has_and_belongs_to_many :categories + end diff --git a/app/models/user.rb b/app/models/user.rb index 3c8d98d907..0fdea082be 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,4 +1,8 @@ class User < ApplicationRecord + has_many :products + has_many :orderitems, through :products + has_many :categories, through :products + def self.build_from_github(auth_hash) user = User.new user.uid = auth_hash[:uid] From e1cac76a91acf098f99bfc40720d85db938a0880 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Thu, 19 Nov 2020 00:16:20 -0800 Subject: [PATCH 046/208] draft order show action --- app/controllers/application_controller.rb | 11 ++++++++ app/controllers/orders_controller.rb | 31 +++++++++++++++++++++++ app/controllers/users_controller.rb | 3 ++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 09705d12ab..70e73c9860 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,2 +1,13 @@ class ApplicationController < ActionController::Base + protect_from_forgery with: :exception + before_action :order_cart + + def order_cart + cart = Order.find_by(id: session[:order_id]) + if cart + order_cart = cart + end + order_cart = Order.create + session[:order_id] = order_cart.id + end end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 8a0e3659ae..70e13f2c74 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,2 +1,33 @@ class OrdersController < ApplicationController + before_action :order_cart, only: [:create, :destroy] + + def show + # May need different order status, order = true is ordered invoice, order = false is shopping cart, or add cart model & controller + @order = Order.find_by(id: params[:id]) + @current_order = order_cart + + # For invoce + if @order.nil? + render :file => "#{Rails.root}/public/404.html", layout: false, status: :not_found + return + elsif session[:user_id] != @order.user_id # Need to add user_id in orders table + flash[:success] = "You cannot see other users' order." + # need to clarify which path to redirect + redirect_to products_path + return + else + @order_show = @order + redirect_to order_path(@order.id) + return + end + + # for shopping cart + @order_show = @current_order + end + + + private + def order_params + return params.require(:order).permit(:order_item_id, :name, :email, :mailing_address, :cc_name, :cc_number, :cc_exp_date, billing_zip_code) + end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 6d27449b4f..4a50e5e652 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -10,7 +10,8 @@ def show if @user.nil? render :file => "#{Rails.root}/public/404.html", layout: false, status: :not_found - elsif session[:id] != @user.id # May need to change to current user + return + elsif session[:user_id] != @user.id # May need to change to current user flash[:error] = "You cannot see other users' information." # need to clarify which path to redirect redirect_to root_path From ea1295f4068d10ac32b9050ae869e3b819480023 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Thu, 19 Nov 2020 00:52:34 -0800 Subject: [PATCH 047/208] add comment for clarity --- app/controllers/application_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 70e73c9860..fc7824ad20 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,4 +1,5 @@ class ApplicationController < ActionController::Base + # Prevent CSRF attacks by raising an exception. protect_from_forgery with: :exception before_action :order_cart From 2b5c99830b0e531fb2a0f43d6e36e7905b646f98 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Thu, 19 Nov 2020 01:09:31 -0800 Subject: [PATCH 048/208] draft create action for order_item --- app/controllers/order_items_controller.rb | 31 +++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 357e7f5c80..4a515cde96 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,2 +1,33 @@ class OrderItemsController < ApplicationController + def create + chosen_product = Product.find(params[:product_id]) + if chosen_product.nil? + flash[:error] = "Product not found" + redirect_to products_path + return + end + + # current shopping cart + current_cart = order_cart + if current_cart.products.include?(chosen_product) + @order_item = current_cart.order_items.find_by(product_id: chosen_product.id) + @order_item.quantity += 1 + # we can access the price from product, may not need "price" in order_item + @order_item.price *= @order_item.quantity + else + @order_item = OrderItem.new + @order_item.order_id = current_cart + @order_item.product_id = chosen_product.id + @order_item.quantity = 1 + @order_item.price = chosen_product.price + end + + @order_item.save + redirect_to cart_path(current_cart) + end + + private + def order_item_params + params.require(:order_item).permit(:quantity, :price, :product_id, :order_id) + end end From f719e9cb3c8c7f7b80cfb8c3a85469450e05d3ed Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Thu, 19 Nov 2020 04:48:20 -0800 Subject: [PATCH 049/208] added html/css and corrected through relationships --- app/assets/stylesheets/application.scss | 107 +++++++++++++++++++++++- app/models/order.rb | 2 +- app/models/orderitem.rb | 2 +- app/models/user.rb | 4 +- app/views/layouts/application.html.erb | 55 +++++++++--- app/views/products/_form.html.erb | 50 +++++------ 6 files changed, 178 insertions(+), 42 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 17320fb11e..c804c81f96 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -14,5 +14,110 @@ /* Custom bootstrap variables must be set or imported *before* bootstrap. */ @import "bootstrap"; +@import "products"; +@import "users"; + +$primary-font: 'Raleway', sans-serif; +$primary-grey: #9a8c98; +$dark-grey: #4a4e69; +$secondary-color: #c9ada7; +$gold: #f2e9e4; +$navy: #22223b; + +$default-border: 2px solid; + +body, h1, h2, h3, h4, h5 { + font-family: $primary-font +} + +h1, h2, h3, h4, h5 { + font-weight: bold; +} + +a, h2, h3 { + color: $primary-grey; +} + +a:hover { + color: $dark-grey; + text-decoration: none; +} + +// BOOTSTRAP OVERRIDES + +.alert { + margin: 0; +} + +.btn-primary { + background-color: $primary-grey; + color: white; + border-color: $primary-grey; +} + +.btn:hover { + background-color: $dark-grey; + color: white; +} + +.table td { + vertical-align: middle; +} + +// --- + +.app-header__nav { + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.app-header__nav_item { + margin-top: 1rem; +} + +.app-header__nav_item .nav-link { + color: $dark-grey; +} + +.app-header__site-nav-container .app-header__nav_item { + margin-right: 2rem; +} + +.app-header__user-nav-container .nav-item { + margin-left: 2rem; +} + +.list-group-item { + border: none; +} + +.app-header__header { + max-width: 100%; + background-color: $secondary-color; + margin-bottom: 0.5rem; + padding: 2rem 1rem 0.5rem 1rem; + h1 { + text-align: center; + margin: 25px auto 40px auto; + a { + color: $gold; + padding-right: 25px; + margin-right: 15px; + } + } + p { + margin-bottom: 5px; + } +} + +.alert__container { + margin: 2rem 0 1rem 0; +} + + + +main { + padding: 2rem; +} -@import "**/*"; diff --git a/app/models/order.rb b/app/models/order.rb index 9534535c69..b34f63e944 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,4 +1,4 @@ class Order < ApplicationRecord has_many :orderitems - has_many :products, through :orderitems + has_many :products, through: :orderitems end diff --git a/app/models/orderitem.rb b/app/models/orderitem.rb index 8d1676d9cd..3a678c93a8 100644 --- a/app/models/orderitem.rb +++ b/app/models/orderitem.rb @@ -1,5 +1,5 @@ class Orderitem < ApplicationRecord belongs_to :product belongs_to :order - belongs_to :user, through :product + belongs_to :user, through: :product end diff --git a/app/models/user.rb b/app/models/user.rb index 0fdea082be..333b909e07 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,7 +1,7 @@ class User < ApplicationRecord has_many :products - has_many :orderitems, through :products - has_many :categories, through :products + has_many :orderitems, through: :products + has_many :categories, through: :products def self.build_from_github(auth_hash) user = User.new diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index d215a144aa..aebf104018 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -5,31 +5,60 @@ <%= csrf_meta_tags %> <%= csp_meta_tag %> + <%= stylesheet_link_tag 'application', "https://fonts.googleapis.com/css2?family=Raleway&display=swap" %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> -
-
<% if flash[:result_text] or flash[:messages] %> diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index ce4c2a542b..e6d1f91f9a 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -4,10 +4,14 @@ User ID User Email + Description + Edit <%= @user.id %> <%= @user.email %> + <%= @user.description %> + <%= button_to "Edit", edit_user_path(@user), method: :get, class: "btn btn-primary" %> @@ -22,8 +26,11 @@ Stock Description Photo + Edit + Hide the product + Delete - <% @user.products.each do |product| %> + <% @user.products.order(id: :asc).each do |product| %> <%= product.id %> <%= product.name %> @@ -31,13 +38,20 @@ <%= product.stock %> <%= product.description %> <%= product.photo_url %> + <%= button_to "Edit", edit_product_path(product), method: :get, class: "btn btn-primary" %> + <% if product.retired %> + <%= button_to "Unretired", retired_product_path(product), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-primary", rel: "nofollow" %> + <% else %> + <%= button_to "Retired", retired_product_path(product), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-primary", rel: "nofollow" %> + <% end %> + <%= button_to "Delete", product_path(product), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> <% end %>
-

Your order fulfillments

+

Your Order Fulfillments

Summary

@@ -45,23 +59,20 @@ - - - - - - + + + + -
Pending Paid CompletedCancelled Total
Total Revenue<%= @user.total_revenue_by_status("pending") %><%= @user.total_revenue_by_status("paid") %><%= @user.total_revenue_by_status("completed") %><%= @user.total_revenue_by_status("cancelled") %><%= @user.total_revenue %>$ <%= @user.total_revenue_by_status("pending") %>$ <%= @user.total_revenue_by_status("paid") %>$ <%= @user.total_revenue_by_status("completed") %>$ <%= @user.total_revenue %>
Total Number of Orders <%= @user.total_orders_by_status("pending") %> <%= @user.total_orders_by_status("paid") %> <%= @user.total_orders_by_status("completed") %><%= @user.total_orders_by_status("cancelled") %> <%= @user.total_orders %>
@@ -76,16 +87,18 @@ Subtotal Price Order Date Shipped? + Cancel Order - <% @user.orderitems.each do |orderitem| %> + <% @user.orderitems.order(id: :asc).each do |order_item| %> - <%= link_to orderitem.order_id, order_path(orderitem.order_id) %> - <%= Order.find_by(id: orderitem.order_id).order_status %> - <%= link_to Product.find_by(id: orderitem.product_id).name, product_path(orderitem.product_id) %> - <%= orderitem.quantity %> - <%= orderitem.price %> - <%= Time.parse("#{Order.find_by(id: orderitem.order_id).created_at}") %> - Haven't had a shipped column for order item + <%= link_to order_item.order_id, order_path(order_item.order_id) %> + <%= order_item.order_status %> + <%= link_to Product.find_by(id: order_item.product_id).name, product_path(order_item.product_id) %> + <%= order_item.quantity %> + $ <%= order_item.price %> + <%= Time.parse("#{Order.find_by(id: order_item.order_id).created_at}") %> + <%= button_to "Shipped", shipped_order_item_path(order_item), method: :patch, class: "btn btn-primary", rel: "nofollow" %> + <%= button_to "Cancel", cancelled_order_item_path(order_item), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> <% end %> From 052aeb68adde3e86469fdefec7f0467f9dcba4ae Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Thu, 19 Nov 2020 22:12:13 -0800 Subject: [PATCH 066/208] revise show action for order which only for confirmed order --- app/controllers/orders_controller.rb | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index d7329a489a..a09c51032d 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -4,28 +4,22 @@ class OrdersController < ApplicationController def cart end - def show - # May need different order status, order = true is ordered invoice, order = false is shopping cart, or add cart model & controller + def order_show @order = Order.find_by(id: params[:id]) - @current_order = order_cart # For invoce if @order.nil? render :file => "#{Rails.root}/public/404.html", layout: false, status: :not_found return - elsif session[:user_id] != @order.user_id # Need to add user_id in orders table + elsif @order.products.where(user_id: session[:user_id]).empty? flash[:success] = "You cannot see other users' order." # need to clarify which path to redirect redirect_to products_path - return + return else - @order_show = @order redirect_to order_path(@order.id) - return + return end - - # for shopping cart - @order_show = @current_order end From bc4e8e859b23200a000733643ab72548ba598104 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Thu, 19 Nov 2020 23:48:31 -0800 Subject: [PATCH 067/208] working tests for destroy and retired action of products --- app/controllers/products_controller.rb | 4 +- config/routes.rb | 2 +- test/controllers/products_controller_test.rb | 122 ++++++++++++++++--- test/fixtures/products.yml | 3 +- test/test_helper.rb | 19 +++ 5 files changed, 127 insertions(+), 23 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index ec5be09e64..6aa83a9a84 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -67,8 +67,8 @@ def destroy redirect_to products_path return elsif session[:user_id] == @product.user_id - @product.destroy @product.update_attribute(:retired, false) + @product.destroy flash[:success] = "Successfully destroyed #{ @product.name }" # need to clarify which path to redirect redirect_back(fallback_location: root_path) @@ -76,7 +76,7 @@ def destroy else flash[:error] = "Only the product Seller can delete the product." # need to clarify which path to redirect - redirect_to products_path + redirect_to root_path return end end diff --git a/config/routes.rb b/config/routes.rb index 6f598411ec..cdd7a7e053 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,7 +12,7 @@ #login and logout routes get "/auth/github", as: "github_login" - get "/auth/:provider/callback", to: "users#create" + get "/auth/:provider/callback", to: "users#create", as: "omniauth_callback" delete "/logout", to: "users#destroy", as: "logout" # Customized actions diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 534ce5b88f..8579c316f3 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -163,26 +163,28 @@ describe "destroy" do - it "can destroy product when the user is the owner" do + it "can delete a product when the logged-in user is also the product merchant" do # Arrange - # Need to check session[:user_id] == user.id + # Affect by categories, need to check again when category is added! + valid_user = users(:ada) valid_product = products(:confidence) - p valid_product.user_id - p "#########" - p session[:user_id] # this one is nil now, need log in process + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(valid_user)) + get omniauth_callback_path(:github) # Act-Assert expect { delete product_path(valid_product) }.must_differ "Product.count", -1 + expect(session[:user_id]).must_equal valid_user.id expect(valid_product.user_id).must_equal valid_user.id - # Check later, to redirect to the final path + expect(valid_product.retired).must_equal false must_respond_with :redirect - # add retired == false end - it "cannot destroy product without user login" do + it "cannot delete product without user login" do # Arrange valid_product = products(:confidence) @@ -195,24 +197,27 @@ must_respond_with :redirect end - it "cannot delete product when the user is not the owner" do + it "cannot delete product when the logged-in user is not the product merchant" do # Arrange - # Need to check session[:user_id] != user.id - user = User.create(id: 3, provider: "github", uid: 1234509, email: "test@adadevelopersacademy.org", name: "test") - invalid_user = users(:ada) - invalid_user.id = user.id + # Affect by categories, need to check again when category is added! + invalid_user = users(:grace) valid_product = products(:confidence) + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(invalid_user)) + get omniauth_callback_path(:github) # Act-Assert expect { delete product_path(valid_product) }.wont_change "Product.count" - # Check later, to redirect to the final path - must_respond_with :redirect + expect(session[:user_id]).must_equal invalid_user.id + expect(valid_product.user_id).wont_equal invalid_user.id + must_redirect_to root_path end - it "cannot destroy a product if it's invalid" do + it "cannot delete a product if it's invalid and will redirect to 404" do # Arrange # Give a user/guest invalid_product = -1 @@ -227,20 +232,99 @@ end describe "retired" do - it "can retire a product when the user is the owner" do + it "can retire a product when the logged-in user is also the product merchant" do + # Arrange + # Affect by categories, need to check again when category is added! + valid_user = users(:ada) + valid_product = products(:confidence) + valid_product.retired = false + valid_product.save + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(valid_user)) + get omniauth_callback_path(:github) + # Act-Assert + expect { + patch retired_product_path(valid_product) + }.wont_change 'Product.count' + + expect(session[:user_id]).must_equal valid_user.id + expect(valid_product.user_id).must_equal valid_user.id + + valid_product.reload + expect(valid_product.retired).must_equal true + must_respond_with :redirect end - it "cannot retire a product without user login" do + it "can unretire a product when the logged-in user is also the product merchant" do + # Arrange + # Affect by categories, need to check again when category is added! + valid_user = users(:ada) + valid_product = products(:confidence) + valid_product.retired = true + valid_product.save + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(valid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + expect { + patch retired_product_path(valid_product) + }.wont_change 'Product.count' + + expect(session[:user_id]).must_equal valid_user.id + expect(valid_product.user_id).must_equal valid_user.id + valid_product.reload + expect(valid_product.retired).must_equal false + must_respond_with :redirect + end + + it "cannot retire a product without user login" do + # Arrange + valid_product = products(:confidence) + retired_status = valid_product.retired + + # Act-Assert + expect { + patch retired_product_path(valid_product) + }.wont_change "Product.count" + + valid_product.reload + expect(session[:user_id]).must_be_nil + expect(valid_product.retired).must_equal retired_status + must_redirect_to root_path end it "cannot retire product when the user is not the owner" do + # Arrange + # Affect by categories, need to check again when category is added! + invalid_user = users(:grace) + valid_product = products(:confidence) + retired_status = valid_product.retired + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(invalid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + expect { + patch retired_product_path(valid_product) + }.wont_change "Product.count" + + valid_product.reload + expect(session[:user_id]).must_equal invalid_user.id + expect(valid_product.user_id).wont_equal invalid_user.id + expect(valid_product.retired).must_equal retired_status + must_respond_with :redirect end it "cannot retire a product if it's invalid" do - patch retired_product_path(-1) + expect { + patch retired_product_path(-1) + }.wont_change "Product.count" must_respond_with :not_found end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 66f1da21e0..45b85f0924 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -5,4 +5,5 @@ confidence: price: 5 user_id: 1 description: You will have confidence - photo_url: https://en.wikipedia.org/wiki/Confidence \ No newline at end of file + photo_url: https://en.wikipedia.org/wiki/Confidence + retired: false \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index a37c21a297..e793e2e64c 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -27,4 +27,23 @@ class ActiveSupport::TestCase fixtures :all # Add more helper methods to be used by all tests here... + + # Mocking OAuth + def setup + # Once you have enabled test mode, all requests + # to OmniAuth will be short circuited to use the mock authentication hash. + # A request to /auth/provider will redirect immediately to /auth/provider/callback. + OmniAuth.config.test_mode = true + end + + def mock_auth_hash(user) + return { + provider: user.provider, + uid: user.uid, + info: { + email: user.email, + nickname: user.name + } + } + end end From 02e586c088254ed825ed60dd62fd42bc0d8686b6 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Fri, 20 Nov 2020 00:33:20 -0800 Subject: [PATCH 068/208] add working tests for shipped and cancelled for order_items --- .../order_items_controller_test.rb | 294 +++++++++++++++++- test/fixtures/orderitems.yml | 18 ++ test/fixtures/orders.yml | 19 ++ 3 files changed, 328 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/orderitems.yml create mode 100644 test/fixtures/orders.yml diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 17457ab944..c11e10a277 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -1,7 +1,295 @@ require "test_helper" describe OrderItemsController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe "shipped" do + it "can mark an order item as shipped when the logged-in user is also the product merchant" do + # Arrange + valid_user = users(:ada) + # user1 is product1's merchant + valid_order_item = orderitems(:orderitem1) + valid_order_item.shipped = false + valid_order_item.order_status = "paid" + valid_order_item.save + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(valid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + expect { + patch shipped_order_item_path(valid_order_item) + }.wont_change 'Orderitem.count' + + expect(session[:user_id]).must_equal valid_user.id + + product_merchant = Product.find_by(id: valid_order_item.product_id) + expect(product_merchant.user_id).must_equal valid_user.id + + valid_order_item.reload + expect(valid_order_item.shipped).must_equal true + expect(valid_order_item.order_status).must_equal "completed" + must_respond_with :redirect + end + + it "cannot unmark a shipped order item when the logged-in user is also the product merchant" do + # Arrange + valid_user = users(:ada) + # user1 is product1's merchant + shipped_order_item = orderitems(:orderitem1) + shipped_order_item.shipped = true + shipped_order_item.order_status = "completed" + shipped_order_item.save + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(valid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + expect { + patch shipped_order_item_path(shipped_order_item) + }.wont_change 'Orderitem.count' + + expect(session[:user_id]).must_equal valid_user.id + + product_merchant = Product.find_by(id: shipped_order_item.product_id) + expect(product_merchant.user_id).must_equal valid_user.id + + shipped_order_item.reload + expect(shipped_order_item.shipped).must_equal true + expect(shipped_order_item.order_status).must_equal "completed" + must_respond_with :redirect + end + + it "cannot mark an order item as shipped when the order status is not paid" do + # Arrange + valid_user = users(:ada) + # user1 is product1's merchant + invalid_order_item = orderitems(:orderitem1) + invalid_order_item.shipped = false + invalid_order_item.order_status = "pending" + invalid_order_item.save + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(valid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + expect { + patch shipped_order_item_path(invalid_order_item) + }.wont_change 'Orderitem.count' + + expect(session[:user_id]).must_equal valid_user.id + + product_merchant = Product.find_by(id: invalid_order_item.product_id) + expect(product_merchant.user_id).must_equal valid_user.id + + invalid_order_item.reload + expect(invalid_order_item.shipped).must_equal false + expect(invalid_order_item.order_status).must_equal "pending" + must_respond_with :redirect + end + + it "cannot mark an order item as shipped without user login" do + # Arrange + # user1 is product1's merchant + valid_order_item = orderitems(:orderitem1) + valid_order_item.shipped = false + valid_order_item.order_status = "paid" + valid_order_item.save + + # Act-Assert + expect { + patch shipped_order_item_path(valid_order_item) + }.wont_change 'Orderitem.count' + + valid_order_item.reload + expect(session[:user_id]).must_be_nil + expect(valid_order_item.shipped).must_equal false + expect(valid_order_item.order_status).must_equal "paid" + must_redirect_to root_path + end + + it "cannot mark an order item as shipped when the user is not the owner" do + # Arrange + invalid_user = users(:grace) + # user1 is product1's merchant + valid_order_item = orderitems(:orderitem1) + valid_order_item.shipped = false + valid_order_item.order_status = "paid" + valid_order_item.save + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(invalid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + expect { + patch shipped_order_item_path(valid_order_item) + }.wont_change 'Orderitem.count' + + expect(session[:user_id]).must_equal invalid_user.id + + product_merchant = Product.find_by(id: valid_order_item.product_id) + expect(product_merchant.user_id).wont_equal invalid_user.id + + valid_order_item.reload + expect(valid_order_item.shipped).must_equal false + expect(valid_order_item.order_status).must_equal "paid" + must_respond_with :redirect + end + + it "cannot mark an order item as shipped if it's invalid and redirect to 404" do + expect { + patch shipped_order_item_path(-1) + }.wont_change 'Orderitem.count' + + must_respond_with :not_found + end + end + + describe "cancelled" do + it "can mark an order item as cancelled when the logged-in user is also the product merchant" do + # Arrange + valid_user = users(:ada) + # user1 is product1's merchant + valid_order_item = orderitems(:orderitem1) + valid_order_item.cancelled = false + valid_order_item.order_status = "paid" + valid_order_item.save + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(valid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + expect { + patch cancelled_order_item_path(valid_order_item) + }.wont_change 'Orderitem.count' + + expect(session[:user_id]).must_equal valid_user.id + + product_merchant = Product.find_by(id: valid_order_item.product_id) + expect(product_merchant.user_id).must_equal valid_user.id + + valid_order_item.reload + expect(valid_order_item.cancelled).must_equal true + expect(valid_order_item.order_status).must_equal "cancelled" + must_respond_with :redirect + end + + it "cannot unmark a cancelled order item when the logged-in user is also the product merchant" do + # Arrange + valid_user = users(:ada) + # user1 is product1's merchant + cancelled_order_item = orderitems(:orderitem1) + cancelled_order_item.cancelled = true + cancelled_order_item.order_status = "cancelled" + cancelled_order_item.save + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(valid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + expect { + patch cancelled_order_item_path(cancelled_order_item) + }.wont_change 'Orderitem.count' + + expect(session[:user_id]).must_equal valid_user.id + + product_merchant = Product.find_by(id: cancelled_order_item.product_id) + expect(product_merchant.user_id).must_equal valid_user.id + + cancelled_order_item.reload + expect(cancelled_order_item.cancelled).must_equal true + expect(cancelled_order_item.order_status).must_equal "cancelled" + must_respond_with :redirect + end + + it "cannot mark an order item as cancelled when the order status is not paid" do + # Arrange + valid_user = users(:ada) + # user1 is product1's merchant + invalid_order_item = orderitems(:orderitem1) + invalid_order_item.cancelled = false + invalid_order_item.order_status = "pending" + invalid_order_item.save + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(valid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + expect { + patch cancelled_order_item_path(invalid_order_item) + }.wont_change 'Orderitem.count' + + expect(session[:user_id]).must_equal valid_user.id + + product_merchant = Product.find_by(id: invalid_order_item.product_id) + expect(product_merchant.user_id).must_equal valid_user.id + + invalid_order_item.reload + expect(invalid_order_item.cancelled).must_equal false + expect(invalid_order_item.order_status).must_equal "pending" + must_respond_with :redirect + end + + it "cannot mark an order item as cancelled without user login" do + # Arrange + # user1 is product1's merchant + valid_order_item = orderitems(:orderitem1) + valid_order_item.cancelled = false + valid_order_item.order_status = "paid" + valid_order_item.save + + # Act-Assert + expect { + patch cancelled_order_item_path(valid_order_item) + }.wont_change 'Orderitem.count' + + valid_order_item.reload + expect(session[:user_id]).must_be_nil + expect(valid_order_item.cancelled).must_equal false + expect(valid_order_item.order_status).must_equal "paid" + must_redirect_to root_path + end + + it "cannot mark an order item as cancelled when the user is not the owner" do + # Arrange + invalid_user = users(:grace) + # user1 is product1's merchant + valid_order_item = orderitems(:orderitem1) + valid_order_item.cancelled = false + valid_order_item.order_status = "paid" + valid_order_item.save + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(invalid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + expect { + patch cancelled_order_item_path(valid_order_item) + }.wont_change 'Orderitem.count' + + expect(session[:user_id]).must_equal invalid_user.id + + product_merchant = Product.find_by(id: valid_order_item.product_id) + expect(product_merchant.user_id).wont_equal invalid_user.id + + valid_order_item.reload + expect(valid_order_item.cancelled).must_equal false + expect(valid_order_item.order_status).must_equal "paid" + must_respond_with :redirect + end + + it "cannot mark an order item as cancelled if it's invalid and redirect to 404" do + expect { + patch cancelled_order_item_path(-1) + }.wont_change 'Orderitem.count' + + must_respond_with :not_found + end + end end diff --git a/test/fixtures/orderitems.yml b/test/fixtures/orderitems.yml new file mode 100644 index 0000000000..64f4f55ebe --- /dev/null +++ b/test/fixtures/orderitems.yml @@ -0,0 +1,18 @@ +orderitem1: + id: 1 + order_id: 1 + product_id: 1 + quantity: 1 + price: 100 + order_status: "pending" + shipped: false + cancelled: false +orderitem2: + id: 2 + order_id: 2 + product_id: 1 + quantity: 3 + price: 300 + order_status: "paid" + shipped: false + cancelled: false \ No newline at end of file diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml new file mode 100644 index 0000000000..c92e369c76 --- /dev/null +++ b/test/fixtures/orders.yml @@ -0,0 +1,19 @@ +order1: + id: 1 + name: Ada + email: xxx + mailing_address: 123 WA + cc_name: Ada + cc_number: 1111 + cc_exp_date: May 23, 2022 + billing_zip_code: 98136 +order2: + id: 2 + name: Grace + email: xxxx + mailing_address: 1234 WA + cc_name: Grace + cc_number: 2222 + cc_exp_date: Feb 23, 2022 + billing_zip_code: 98128 + \ No newline at end of file From 8b1a3fd1b45eeb0af69b64e314961f8f671001b9 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Fri, 20 Nov 2020 01:41:07 -0800 Subject: [PATCH 069/208] edited cart view and method --- app/controllers/application_controller.rb | 10 ++++------ app/controllers/orders_controller.rb | 6 ++++++ app/views/orders/cart.html.erb | 5 +++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1612f7fb85..0cb8e49e9f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,18 +1,16 @@ class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. protect_from_forgery with: :exception - before_action :order_cart + before_action :order_cart before_action :find_user def order_cart @cart = Order.find_by(id: session[:order_id]) - if @cart - order_cart = @cart - else - order_cart = Order.create + if @cart.nil? + @cart = Order.create end - session[:order_id] = order_cart.id + session[:order_id] = @cart.id end def render_404 diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index d7329a489a..62864780b9 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -2,6 +2,12 @@ class OrdersController < ApplicationController before_action :order_cart, only: [:create, :destroy] def cart + @cart = Order.find_by(id: session[:order_id]) + if @cart.nil? + @cart = Order.create + end + + session[:order_id] = @cart.id end def show diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index b1457ea7de..efa222ce7a 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -1 +1,6 @@

Shopping Cart

+
    +<% @cart.orderitems.each do |item| %> +
  • <%= link_to item.product.name, product_path(item.product.id) %>
  • +<% end %> +
> \ No newline at end of file From e036aa34121d3b80879c6d2fe1465e895fe750d0 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Fri, 20 Nov 2020 01:44:18 -0800 Subject: [PATCH 070/208] changed route formatting --- config/routes.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index da7e8c6d16..ebb1e76534 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,8 +7,6 @@ resources :products resources :orders resources :order_items - - get "/cart", to: "orders#cart", as: "cart" #login and logout routes get "/auth/github", as: "github_login" @@ -16,6 +14,7 @@ delete "/logout", to: "users#destroy", as: "logout" # Customized actions + get "/cart", to: "orders#cart", as: "cart" patch 'products/:id/retired', to: 'products#retired', as: 'retired_product' end From ad318cc08ae26e40ba28f52811bae6f72dd8486a Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Fri, 20 Nov 2020 02:44:58 -0800 Subject: [PATCH 071/208] created removed orderitem column from orders and created new fake data for users --- app/controllers/order_items_controller.rb | 9 ++--- app/controllers/products_controller.rb | 1 + app/models/product.rb | 2 +- app/views/products/show.html.erb | 11 +++++-- db/generate_starter_data.rb | 13 ++++++++ ...01120102845_remove_order_i_dfrom_orders.rb | 5 +++ db/schema.rb | 3 +- db/seed_data/users_seeds.csv | 11 +++++++ db/seeds.rb | 33 +++++++++++++++++++ 9 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 db/migrate/20201120102845_remove_order_i_dfrom_orders.rb create mode 100644 db/seed_data/users_seeds.csv diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 4a515cde96..9111e491f8 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,6 +1,7 @@ class OrderItemsController < ApplicationController def create - chosen_product = Product.find(params[:product_id]) + raise + chosen_product = Product.find_by(id: :product_id) if chosen_product.nil? flash[:error] = "Product not found" redirect_to products_path @@ -8,17 +9,17 @@ def create end # current shopping cart - current_cart = order_cart + current_cart = order_cart if current_cart.products.include?(chosen_product) @order_item = current_cart.order_items.find_by(product_id: chosen_product.id) - @order_item.quantity += 1 + @order_item.quantity += 1 #we can add more than one quantity at a time # we can access the price from product, may not need "price" in order_item @order_item.price *= @order_item.quantity else @order_item = OrderItem.new @order_item.order_id = current_cart @order_item.product_id = chosen_product.id - @order_item.quantity = 1 + @order_item.quantity = 1 #here as well, we should read the quantity from the form @order_item.price = chosen_product.price end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 637a3249a4..b3f863f56a 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -19,6 +19,7 @@ def new def create @product = Product.new(product_params) + @product.user_id = session[:user_id] if @product.save flash[:success] = "Product has been successfully added" redirect_to product_path(@product.id) diff --git a/app/models/product.rb b/app/models/product.rb index a335354cc2..2bd095483a 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,5 +1,5 @@ class Product < ApplicationRecord - belongs_to :user + # belongs_to :user has_many :orderitems has_and_belongs_to_many :categories diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index e61c85b30d..3440bcc4b5 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -5,8 +5,15 @@

<%= @product.name %>

$<%= @product.price %>

- <%= select_tag(:quantity, options_for_select([[1],[2], [3], [4], [5], [6], [7], [8], [9], [10]])) %> - <%= button_to "Add to cart", new_order_item_path, class: "btn btn-primary"%> + <%= form_with model: @orderitem, class: 'create-orderitem' do |f| %> +
+ <%= f.label :quantity %> + <%= f.select :quantity, [1, 2, 3] %> +
+ + <%#= select_tag(:quantity, options_for_select([[1],[2], [3], [4], [5], [6], [7], [8], [9], [10]])) %> + <%= f.submit "Add to cart", class: "btn btn-primary"%> + <% end %>

Description:

<%= @product.description %>

diff --git a/db/generate_starter_data.rb b/db/generate_starter_data.rb index 71718a05e1..1428b2a507 100644 --- a/db/generate_starter_data.rb +++ b/db/generate_starter_data.rb @@ -25,3 +25,16 @@ end end +CSV.open("db/seed_data/users_seeds.csv", "w", :write_headers => true, + :headers => ["name", "description", "uid", "provider", "email"]) do |csv| + 10.times do + name = Faker::Name.name + description = Faker::Lorem.sentence + uid = "#{rand(10000000..99999999)}" + provider = "github" + email = Faker::Internet.email + + csv << [name, description, uid, provider, email] + end +end + diff --git a/db/migrate/20201120102845_remove_order_i_dfrom_orders.rb b/db/migrate/20201120102845_remove_order_i_dfrom_orders.rb new file mode 100644 index 0000000000..0b568e4e75 --- /dev/null +++ b/db/migrate/20201120102845_remove_order_i_dfrom_orders.rb @@ -0,0 +1,5 @@ +class RemoveOrderIDfromOrders < ActiveRecord::Migration[6.0] + def change + remove_column :orders, :order_item_id + end +end diff --git a/db/schema.rb b/db/schema.rb index 71be72db36..60df4b3816 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_11_19_232340) do +ActiveRecord::Schema.define(version: 2020_11_20_102845) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -25,7 +25,6 @@ end create_table "orders", force: :cascade do |t| - t.integer "order_item_id" t.string "name" t.string "email" t.string "mailing_address" diff --git a/db/seed_data/users_seeds.csv b/db/seed_data/users_seeds.csv new file mode 100644 index 0000000000..4bd9cb1a27 --- /dev/null +++ b/db/seed_data/users_seeds.csv @@ -0,0 +1,11 @@ +name,description,uid,provider,email +Rosalba Von,A ut est error.,45627850,github,gilbert_collier@gulgowski-klocko.net +Nick Casper,Aut qui non delectus.,79850702,github,omar_stehr@buckridge.name +Iliana Labadie,Molestias voluptas eum numquam.,39069559,github,madelyn@keeling.net +Jose Oberbrunner DC,Veniam est fuga eius.,21843833,github,minna@pouros.org +Delmer Kuhic,Laboriosam minima rerum molestiae.,38425216,github,leoma.okuneva@kulas.io +Vicenta Reilly,Voluptatem alias accusantium id.,89917054,github,tuan@veum-hermann.com +Abbie Mayer,Omnis voluptate eum at.,48446233,github,gertha_schowalter@donnelly-lakin.io +Mirtha Crooks,Expedita et odio odit.,85950627,github,cammy@prohaska-lang.co +Kacey Ziemann,Laborum et distinctio voluptate.,20754948,github,florance@mcclure.com +Belinda Osinski,Atque assumenda illum omnis.,54258700,github,clifford.pollich@hamill.co diff --git a/db/seeds.rb b/db/seeds.rb index febb58ca32..65f885c489 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -31,6 +31,39 @@ puts "Added #{Product.count} product records" puts "#{product_failures.length} products failed to save" +# Since we set the primary key (the ID) manually on each of the +# tables, we've got to tell postgres to reload the latest ID +# values. Otherwise when we create a new record it will try +# to start at ID 1, which will be a conflict. +puts "Manually resetting PK sequence on each table" +ActiveRecord::Base.connection.tables.each do |t| + ActiveRecord::Base.connection.reset_pk_sequence!(t) +end +puts "done" + +USER_FILE = Rails.root.join('db', 'seed_data', 'users_seeds.csv') +puts "Loading raw product data from #{USER_FILE}" + +user_failures = [] +CSV.foreach(USER_FILE, :headers => true) do |row| + user = User.new + user.name = row['name'] + user.description = row['description'] + user.uid = row['uid'] + user.provider = row['provider'] + user.email = row['email'] + successful = user.save + if !successful + user_failures << user + puts "Failed to save user: #{user.inspect}" + else + puts "Created user: #{user.inspect}" + end +end + +puts "Added #{User.count} user records" +puts "#{user_failures.length} users failed to save" + # Since we set the primary key (the ID) manually on each of the # tables, we've got to tell postgres to reload the latest ID # values. Otherwise when we create a new record it will try From 2c241ed36f4bd4b091d71c1fbc02a2eec6078251 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Fri, 20 Nov 2020 03:15:13 -0800 Subject: [PATCH 072/208] changed seed data for products --- app/controllers/order_items_controller.rb | 1 - app/models/product.rb | 2 +- app/views/orders/cart.html.erb | 4 +- db/generate_starter_data.rb | 2 +- db/seed_data/products_seeds.csv | 50 +++++++++---------- db/seeds.rb | 58 ++++++++++------------- 6 files changed, 55 insertions(+), 62 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 9111e491f8..650732a840 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,6 +1,5 @@ class OrderItemsController < ApplicationController def create - raise chosen_product = Product.find_by(id: :product_id) if chosen_product.nil? flash[:error] = "Product not found" diff --git a/app/models/product.rb b/app/models/product.rb index 2bd095483a..a335354cc2 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,5 +1,5 @@ class Product < ApplicationRecord - # belongs_to :user + belongs_to :user has_many :orderitems has_and_belongs_to_many :categories diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index efa222ce7a..c729850fa3 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -3,4 +3,6 @@ <% @cart.orderitems.each do |item| %>
  • <%= link_to item.product.name, product_path(item.product.id) %>
  • <% end %> -> \ No newline at end of file + + +<%= button_to "Proceed to Checkout", class: "btn btn-primary" %> \ No newline at end of file diff --git a/db/generate_starter_data.rb b/db/generate_starter_data.rb index 1428b2a507..25aff001dd 100644 --- a/db/generate_starter_data.rb +++ b/db/generate_starter_data.rb @@ -17,7 +17,7 @@ stock = rand(0..500) price = rand(100..10000) description = Faker::Lorem.sentence - user_id = rand(0..10) + user_id = rand(1..10) photo_url = Faker::Avatar.image retired = %w(true false).sample diff --git a/db/seed_data/products_seeds.csv b/db/seed_data/products_seeds.csv index bddb425cbc..a25ee8f45d 100644 --- a/db/seed_data/products_seeds.csv +++ b/db/seed_data/products_seeds.csv @@ -1,26 +1,26 @@ name,stock,price,description,user_id,photo_url,retired -Rory Lehner,432,8829,Non ea dicta cumque.,7,https://robohash.org/eaquaeest.png?size=300x300&set=set1,true -Ira Quitzon,488,1671,Amet vel quidem est.,10,https://robohash.org/doloremquequiaaperiam.png?size=300x300&set=set1,true -Bari Reilly,248,1518,Nemo id eos velit.,5,https://robohash.org/veritatissitasperiores.png?size=300x300&set=set1,false -Migdalia Deckow,428,5388,Sit qui reiciendis laudantium.,9,https://robohash.org/dolorumaspernaturnulla.png?size=300x300&set=set1,false -Nicolas Treutel,81,8290,Magnam suscipit sed minima.,7,https://robohash.org/cumquesequiveniam.png?size=300x300&set=set1,false -Art Davis,328,3779,Eum nesciunt officiis et.,7,https://robohash.org/deseruntfugiatmolestias.png?size=300x300&set=set1,true -Rev. Wilson Hegmann,86,6848,Enim debitis perspiciatis et.,4,https://robohash.org/modiaccusantiumperferendis.png?size=300x300&set=set1,true -Ross Shields,211,8802,Quam nihil accusantium iure.,6,https://robohash.org/impeditquout.png?size=300x300&set=set1,true -Corazon Douglas MD,130,2285,Beatae voluptatum vel est.,0,https://robohash.org/nobisautdeserunt.png?size=300x300&set=set1,false -Sebastian Witting,96,1766,Saepe officia molestiae aut.,1,https://robohash.org/nihilipsamvoluptas.png?size=300x300&set=set1,true -Jamison Tromp,26,2425,Qui possimus aut aut.,9,https://robohash.org/indelectusrepudiandae.png?size=300x300&set=set1,false -Mayme Huel,356,6954,Natus nobis consequuntur dicta.,10,https://robohash.org/omnisquaerataut.png?size=300x300&set=set1,true -The Hon. Chang Weber,90,9600,Veniam sequi molestiae iusto.,2,https://robohash.org/abnumquamminima.png?size=300x300&set=set1,true -Huey Kautzer,101,2876,Et quia sint illum.,3,https://robohash.org/cumiurenihil.png?size=300x300&set=set1,true -Miss Julian Gulgowski,223,9279,Ut non quae omnis.,5,https://robohash.org/nobistemporepariatur.png?size=300x300&set=set1,false -Eleonor Stark JD,239,5857,Ut laudantium numquam ad.,8,https://robohash.org/autnonsaepe.png?size=300x300&set=set1,false -Iona Mohr Jr.,407,6583,Facere ea illo hic.,6,https://robohash.org/quidemenimad.png?size=300x300&set=set1,false -Chadwick Glover DC,389,969,Sed debitis aspernatur consectetur.,8,https://robohash.org/abmaioresipsa.png?size=300x300&set=set1,true -Arlette Shanahan,477,464,Cumque voluptates nisi maxime.,3,https://robohash.org/laudantiumisteaut.png?size=300x300&set=set1,true -Gregorio Hansen,47,1433,Possimus maxime ut unde.,2,https://robohash.org/earumperferendisnecessitatibus.png?size=300x300&set=set1,true -Ona King Esq.,106,4622,Qui beatae repudiandae quaerat.,5,https://robohash.org/autemestquas.png?size=300x300&set=set1,true -Kathline O'Kon,4,1829,Dolorem debitis impedit aut.,5,https://robohash.org/officiaeligendipossimus.png?size=300x300&set=set1,false -Raymundo Legros,106,2432,Iure debitis voluptas omnis.,5,https://robohash.org/deleniticommodireiciendis.png?size=300x300&set=set1,false -Mrs. Angel Thiel,14,6553,Dolorem illum voluptas totam.,3,https://robohash.org/atiuredebitis.png?size=300x300&set=set1,false -Tona Wiza,147,2888,Eveniet illo doloremque et.,0,https://robohash.org/oditautconsectetur.png?size=300x300&set=set1,true +Titus McKenzie,2,544,Maxime deleniti sint ut.,2,https://robohash.org/placeateumquam.png?size=300x300&set=set1,true +Forest Jast,397,9786,Et aut delectus consequatur.,7,https://robohash.org/delenitieosquo.png?size=300x300&set=set1,false +Tomeka Mills,24,441,Illo aut inventore voluptates.,2,https://robohash.org/impeditporroaut.png?size=300x300&set=set1,true +Yuk Johnston V,422,3899,Sunt ab est nesciunt.,6,https://robohash.org/consequaturenimillo.png?size=300x300&set=set1,true +Trudie Heathcote,103,2653,Deserunt nemo dolores delectus.,2,https://robohash.org/quibusdamexplicabofuga.png?size=300x300&set=set1,true +Dena Crona,96,8100,Nulla odio accusantium ipsum.,2,https://robohash.org/auteoset.png?size=300x300&set=set1,true +Mckenzie Hermiston,342,8458,Nobis dolores temporibus omnis.,5,https://robohash.org/inciduntsaepevoluptates.png?size=300x300&set=set1,false +Raleigh Durgan,21,7341,Provident et a quo.,2,https://robohash.org/teneturquoesse.png?size=300x300&set=set1,true +Dewey Swift V,185,760,Aut ipsum sint fuga.,4,https://robohash.org/isteutaut.png?size=300x300&set=set1,false +Prof. Garfield Renner,497,7400,Ut unde nostrum quas.,8,https://robohash.org/veritatisexnobis.png?size=300x300&set=set1,true +Reginia Gerhold VM,361,9308,Assumenda vero cupiditate quos.,3,https://robohash.org/rerumeligendiab.png?size=300x300&set=set1,true +Tori Stanton,215,4628,Iure maiores dolorem aperiam.,7,https://robohash.org/minusutducimus.png?size=300x300&set=set1,false +Ezequiel Toy,297,5150,Voluptatibus dolore quia a.,6,https://robohash.org/blanditiisreprehenderitculpa.png?size=300x300&set=set1,true +Maynard Rau,320,6304,Occaecati consequatur distinctio eum.,10,https://robohash.org/utvelitvoluptas.png?size=300x300&set=set1,false +Palmer Schmitt DDS,160,1764,Eius voluptatem explicabo ipsum.,8,https://robohash.org/undeculpased.png?size=300x300&set=set1,true +Mohamed Lubowitz,236,8869,Veritatis incidunt illum occaecati.,1,https://robohash.org/etfuganecessitatibus.png?size=300x300&set=set1,true +Merilyn Wehner,469,875,Quae ex molestias molestiae.,8,https://robohash.org/placeatmodiimpedit.png?size=300x300&set=set1,true +Hortensia Walker,414,590,Voluptatem deserunt animi quod.,7,https://robohash.org/voluptatemsitfacere.png?size=300x300&set=set1,true +Miss Tami Mertz,441,3995,Unde quia accusamus aliquam.,8,https://robohash.org/perspiciatisdoloreset.png?size=300x300&set=set1,false +Joan O'Kon,400,4171,Asperiores aut voluptatem repellendus.,9,https://robohash.org/sitdoloremqueaut.png?size=300x300&set=set1,false +Megan Schultz,483,763,Asperiores enim eveniet voluptatem.,1,https://robohash.org/asperioresullamquasi.png?size=300x300&set=set1,true +Tracy Kohler,114,4798,Rem magni enim ipsam.,5,https://robohash.org/veniamaccusantiumdeserunt.png?size=300x300&set=set1,true +Orpha Glover,258,158,A vitae voluptate quia.,7,https://robohash.org/veniaminventoreatque.png?size=300x300&set=set1,true +Gertrudis Nienow,330,3016,Fugit aut quis velit.,7,https://robohash.org/insolutaquidem.png?size=300x300&set=set1,true +Isa Beahan,360,9222,Non ad quasi quia.,6,https://robohash.org/minimamollitiabeatae.png?size=300x300&set=set1,false diff --git a/db/seeds.rb b/db/seeds.rb index 65f885c489..8d26bbfb98 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -6,6 +6,28 @@ # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) +USER_FILE = Rails.root.join('db', 'seed_data', 'users_seeds.csv') +puts "Loading raw product data from #{USER_FILE}" + +user_failures = [] +CSV.foreach(USER_FILE, :headers => true) do |row| + user = User.new + user.name = row['name'] + user.description = row['description'] + user.uid = row['uid'] + user.provider = row['provider'] + user.email = row['email'] + successful = user.save + if !successful + user_failures << user + puts "Failed to save user: #{user.inspect}" + else + puts "Created user: #{user.inspect}" + end +end + + + PRODUCT_FILE = Rails.root.join('db', 'seed_data', 'products_seeds.csv') puts "Loading raw product data from #{PRODUCT_FILE}" @@ -28,6 +50,9 @@ end end +puts "Added #{User.count} user records" +puts "#{user_failures.length} users failed to save" + puts "Added #{Product.count} product records" puts "#{product_failures.length} products failed to save" @@ -40,36 +65,3 @@ ActiveRecord::Base.connection.reset_pk_sequence!(t) end puts "done" - -USER_FILE = Rails.root.join('db', 'seed_data', 'users_seeds.csv') -puts "Loading raw product data from #{USER_FILE}" - -user_failures = [] -CSV.foreach(USER_FILE, :headers => true) do |row| - user = User.new - user.name = row['name'] - user.description = row['description'] - user.uid = row['uid'] - user.provider = row['provider'] - user.email = row['email'] - successful = user.save - if !successful - user_failures << user - puts "Failed to save user: #{user.inspect}" - else - puts "Created user: #{user.inspect}" - end -end - -puts "Added #{User.count} user records" -puts "#{user_failures.length} users failed to save" - -# Since we set the primary key (the ID) manually on each of the -# tables, we've got to tell postgres to reload the latest ID -# values. Otherwise when we create a new record it will try -# to start at ID 1, which will be a conflict. -puts "Manually resetting PK sequence on each table" -ActiveRecord::Base.connection.tables.each do |t| - ActiveRecord::Base.connection.reset_pk_sequence!(t) -end -puts "done" \ No newline at end of file From d72fe998a930a4c618c867a175d14d50bffdcec7 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Fri, 20 Nov 2020 03:47:35 -0800 Subject: [PATCH 073/208] edited tests for product create and user edit --- app/controllers/orders_controller.rb | 7 ------- test/controllers/products_controller_test.rb | 4 ++++ test/controllers/users_controller_test.rb | 21 +++++++++++--------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 62864780b9..05838a10e9 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,13 +1,6 @@ class OrdersController < ApplicationController - before_action :order_cart, only: [:create, :destroy] def cart - @cart = Order.find_by(id: session[:order_id]) - if @cart.nil? - @cart = Order.create - end - - session[:order_id] = @cart.id end def show diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 534ce5b88f..61e043bfc3 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -52,11 +52,15 @@ describe "create" do it "can create a new product with valid information accurately, and redirect" do + #maybe failing because of sessions[:user_id] ? + skip # Arrange + user = users(:ada) # Set up the form data product_hash = { product: { name: 'Artists Potion', + user_id: user.id, stock: 2, price: 1400, description: 'Turns you into Bob Ross', diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 15ad29516a..5199138f32 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -47,11 +47,14 @@ describe "edit" do + #need to figure out how to test edit since it's only visible to the session[:user_id] it "responds with success when getting the edit page for an existing, valid user" do + skip # Arrange + user = users(:ada) # Ensure there is an existing user saved # Act - get edit_user_path(@user.id) + get edit_user_path(user.id) # Assert must_respond_with :success @@ -71,35 +74,35 @@ describe "update" do it "can update an existing user with valid information accurately, and redirect" do - skip # Arrange - id = @user.id + user = users(:ada) # Set up the form data user_hash = { user: { - name: 'new_name' + name: 'new_name', + email: 'test@gmail.com' } } # Act-Assert expect { - patch user_path(id), params: user_hash + patch user_path(user.id), params: user_hash }.wont_differ "User.count" # Assert must_respond_with :redirect - must_redirect_to user_path(id) + must_redirect_to user_path(user.id) end - it "does not update any user if given an invalid id, and responds with a 404" do + it "does not update any user if given an invalid id, and responds with a redirect" do # Arrange - skip # Set up the form data id = -1 user_hash = { user: { - name: 'new_name' + name: 'new_name', + email: 'email@test.com' } } From 0413bd3a3d6b765be4841839cd38d8b8337cd99a Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Fri, 20 Nov 2020 03:49:01 -0800 Subject: [PATCH 074/208] changed user info to merchant dashboard --- app/views/layouts/application.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a7dedecff9..1f92e7b103 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -28,7 +28,7 @@ <%= link_to "Add New Product", new_product_path, class: "nav-link" %> <% end %> <% if session[:user_id] %> From 7cb16b25aa01bfd880ead8b0577265675fa6cf8c Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Fri, 20 Nov 2020 09:07:43 -0800 Subject: [PATCH 075/208] update costom methods and views for user show --- app/models/user.rb | 16 ++-------------- app/views/users/show.html.erb | 22 +++++++++++++++++++--- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index eab4992f44..6f8758e9e6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -10,13 +10,7 @@ def total_revenue def total_revenue_by_status(status) - total_revenue_status = 0 - self.orderitems.each do |order_item| - if order_item.order_status == status - total_revenue_status += order_item.price - end - end - return total_revenue_status + return total_revenue_status = self.orderitems.where(order_status: status).sum { |order_item| order_item.price } end # Does this mean how many Orders? Or how many quantity of total order_items? @@ -25,13 +19,7 @@ def total_orders end def total_orders_by_status(status) - total_orders_status = 0 - self.orderitems.each do |order_item| - if order_item.order_status == status - total_orders_status += 1 - end - end - return total_orders_status + return self.orderitems.where(order_status: status).count end def self.build_from_github(auth_hash) diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index e6d1f91f9a..614f495a6b 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -92,13 +92,29 @@ <% @user.orderitems.order(id: :asc).each do |order_item| %> <%= link_to order_item.order_id, order_path(order_item.order_id) %> - <%= order_item.order_status %> + <%= order_item.order_status.capitalize %> <%= link_to Product.find_by(id: order_item.product_id).name, product_path(order_item.product_id) %> <%= order_item.quantity %> $ <%= order_item.price %> <%= Time.parse("#{Order.find_by(id: order_item.order_id).created_at}") %> - <%= button_to "Shipped", shipped_order_item_path(order_item), method: :patch, class: "btn btn-primary", rel: "nofollow" %> - <%= button_to "Cancel", cancelled_order_item_path(order_item), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> + + <% if order_item.shipped %> + Shipped + <% elsif order_item.cancelled %> + Order Cancelled + <% else %> + <%= button_to "Shipped", shipped_order_item_path(order_item), method: :patch, class: "btn btn-primary", rel: "nofollow" %> + <% end %> + + + <% if order_item.cancelled %> + Cancelled + <% elsif order_item.shipped %> + Order Completed + <% else %> + <%= button_to "Cancel", cancelled_order_item_path(order_item), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> + <% end %> + <% end %> From 16b8c37787e73ae642970af6a77ee85d1b96245d Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Fri, 20 Nov 2020 10:28:46 -0800 Subject: [PATCH 076/208] draft tests for custom methods in User model --- test/fixtures/products.yml | 9 +++++++++ test/models/user_test.rb | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 45b85f0924..1d0e903eb0 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -6,4 +6,13 @@ confidence: user_id: 1 description: You will have confidence photo_url: https://en.wikipedia.org/wiki/Confidence + retired: false +python: + id: 2 + name: data analysis + stock: 1000 + price: 10 + user_id: 1 + description: Get big data power + photo_url: https://en.wikipedia.org/wiki/Confidence retired: false \ No newline at end of file diff --git a/test/models/user_test.rb b/test/models/user_test.rb index 0ea72906d4..8bd54bdb5a 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -1,7 +1,39 @@ require "test_helper" describe User do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe "validations" do + it 'is valid when all fields are present' do + end + end + + describe "relaitons" do + describe "products" do + it "can set the product using a Product" do + # Arrange & Act + user1 = users(:ada) + product1 = products(:confidence) + + # Assert + connect = user1.products.find_by(id: product1.id) + expect(connect).must_equal product1 + end + + it "can have many products" do + # Arrange & Act + user1 = users(:ada) + + # Assert + expect(user1.products.count).must_equal 2 + end + end + + describe "orderitems" do + end + + describe "categories" do + end + end + + describe "custom methods" do + end end From 89d21ba76b881b5c4982eccaa10c9a221ca1827c Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Fri, 20 Nov 2020 11:59:45 -0800 Subject: [PATCH 077/208] merge on 11202020 morning --- db/schema.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index 82bc1fe5db..0f87588e66 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,9 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema.define(version: 2020_11_20_050820) do - +ActiveRecord::Schema.define(version: 2020_11_20_102845) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" From ab1be590aa6f333d0a0e54f311ffd54322d4cb6b Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Fri, 20 Nov 2020 12:30:13 -0800 Subject: [PATCH 078/208] fixed add product to order_items table --- app/controllers/order_items_controller.rb | 13 ++++++++----- app/controllers/products_controller.rb | 2 +- app/views/products/show.html.erb | 4 ++-- config/routes.rb | 5 ++++- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index b50046c9bb..ab11ae884a 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,6 +1,6 @@ class OrderItemsController < ApplicationController def create - chosen_product = Product.find_by(id: :product_id) + chosen_product = Product.find_by(id: params[:product_id]) if chosen_product.nil? flash[:error] = "Product not found" redirect_to products_path @@ -8,22 +8,25 @@ def create end # current shopping cart - current_cart = order_cart - if current_cart.products.include?(chosen_product) - @order_item = current_cart.order_items.find_by(product_id: chosen_product.id) + current_cart = order_cart # order_card return order_id + @cart = Orderitem.where(order_id: current_cart) + if @cart.include?(chosen_product) + @order_item = @cart.order_items.find_by(product_id: chosen_product.id) @order_item.quantity += 1 #we can add more than one quantity at a time # we can access the price from product, may not need "price" in order_item @order_item.price *= @order_item.quantity + flash[:success] = "Successfully added the quantity to this item in your cart!" else @order_item = Orderitem.new @order_item.order_id = current_cart @order_item.product_id = chosen_product.id @order_item.quantity = 1 #here as well, we should read the quantity from the form @order_item.price = chosen_product.price + flash[:success] = "Successfully added this item to your cart!" end @order_item.save - redirect_to cart_path(current_cart) + redirect_to cart_path(@cart) end def shipped diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index dcf156454e..9b2946000a 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -114,7 +114,7 @@ def retired private def find_product - @product = Product.find_by_id(params[:id]) + @product = Product.find_by(id: params[:id]) end def product_params diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 3440bcc4b5..1fa1083574 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -5,14 +5,14 @@

    <%= @product.name %>

    $<%= @product.price %>

    - <%= form_with model: @orderitem, class: 'create-orderitem' do |f| %> + <%= form_with model: @orderitem, class: 'create-orderitem', url: product_order_items_path(@product) do |f| %>
    <%= f.label :quantity %> <%= f.select :quantity, [1, 2, 3] %>
    <%#= select_tag(:quantity, options_for_select([[1],[2], [3], [4], [5], [6], [7], [8], [9], [10]])) %> - <%= f.submit "Add to cart", class: "btn btn-primary"%> + <%= f.submit "Add to cart", class: "btn btn-primary" %> <% end %>

    Description:

    diff --git a/config/routes.rb b/config/routes.rb index b1c9e39dfb..4d53a0ba25 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,7 +4,10 @@ root to: 'products#index' resources :users, except: [:new, :index] - resources :products + resources :products do + resources :order_items, only: [:create] + end + resources :orders resources :order_items From 1d635a547add0c46ae38b14f61af6a3d8b182ddb Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Fri, 20 Nov 2020 12:58:30 -0800 Subject: [PATCH 079/208] fixed create action for order_item --- app/controllers/order_items_controller.rb | 42 +++++++++++++++-------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index ab11ae884a..d9be32dcab 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -7,26 +7,38 @@ def create return end - # current shopping cart - current_cart = order_cart # order_card return order_id - @cart = Orderitem.where(order_id: current_cart) - if @cart.include?(chosen_product) - @order_item = @cart.order_items.find_by(product_id: chosen_product.id) - @order_item.quantity += 1 #we can add more than one quantity at a time - # we can access the price from product, may not need "price" in order_item - @order_item.price *= @order_item.quantity - flash[:success] = "Successfully added the quantity to this item in your cart!" - else + # current shopping cart & order_card return order_id + current_cart = order_cart + + @order_item = Orderitem.where(order_id: current_cart, product_id: params[:product_id]).first + if @order_item.nil? @order_item = Orderitem.new @order_item.order_id = current_cart @order_item.product_id = chosen_product.id - @order_item.quantity = 1 #here as well, we should read the quantity from the form + @order_item.quantity = params[:quantity].to_i @order_item.price = chosen_product.price - flash[:success] = "Successfully added this item to your cart!" + if @order_item.save + flash[:success] = "Successfully added this item to your cart!" + redirect_back(fallback_location: root_path) + return + else + flash[:error] = "Something went wrong, please try again!" + redirect_back(fallback_location: root_path) + return + end + else + @order_item.quantity = params[:quantity].to_i + @order_item.price *= @order_item.quantity + if @order_item.save + flash[:success] = "Successfully updated this item in your cart!" + redirect_back(fallback_location: root_path) + return + else + flash[:error] = "Something went wrong, please try again!" + redirect_back(fallback_location: root_path) + return + end end - - @order_item.save - redirect_to cart_path(@cart) end def shipped From 0bcd7007f0d57015da39a5e7ca2704b6aa2e79cc Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Fri, 20 Nov 2020 13:54:32 -0800 Subject: [PATCH 080/208] revised quantity calculation and stock for product --- app/controllers/order_items_controller.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index d9be32dcab..60993e35c7 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -17,7 +17,8 @@ def create @order_item.product_id = chosen_product.id @order_item.quantity = params[:quantity].to_i @order_item.price = chosen_product.price - if @order_item.save + chosen_product.stock -= params[:quantity].to_i + if @order_item.save && chosen_product.stock >= 0 && chosen_product.save flash[:success] = "Successfully added this item to your cart!" redirect_back(fallback_location: root_path) return @@ -27,9 +28,10 @@ def create return end else - @order_item.quantity = params[:quantity].to_i + @order_item.quantity += params[:quantity].to_i @order_item.price *= @order_item.quantity - if @order_item.save + chosen_product.stock -= params[:quantity].to_i + if @order_item.save && chosen_product.stock >= 0 && chosen_product.save flash[:success] = "Successfully updated this item in your cart!" redirect_back(fallback_location: root_path) return From 9cbdd2704e1df3469b3ea4b365e08f10928f3278 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Fri, 20 Nov 2020 14:02:49 -0800 Subject: [PATCH 081/208] edited cart view --- app/views/orders/cart.html.erb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index c729850fa3..30b2ef5075 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -1,7 +1,8 @@

    Shopping Cart

      <% @cart.orderitems.each do |item| %> -
    • <%= link_to item.product.name, product_path(item.product.id) %>
    • +
    • <%= link_to item.product.name, product_path(item.product.id) %> | + <%= item.quantity %> | $<%= item.price %>
    • <% end %>
    From 72cc9ecaa0dbd8d2bc3f27a5e282d2ae261ac034 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Fri, 20 Nov 2020 14:28:17 -0800 Subject: [PATCH 082/208] removed stock calculation in create action for orderitem --- app/controllers/order_items_controller.rb | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 60993e35c7..4d33e4de02 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -13,11 +13,8 @@ def create @order_item = Orderitem.where(order_id: current_cart, product_id: params[:product_id]).first if @order_item.nil? @order_item = Orderitem.new - @order_item.order_id = current_cart - @order_item.product_id = chosen_product.id - @order_item.quantity = params[:quantity].to_i - @order_item.price = chosen_product.price - chosen_product.stock -= params[:quantity].to_i + @order_item.update(order_id: current_cart, product_id: chosen_product.id, quantity: params[:quantity].to_i, price: (chosen_product.price * params[:quantity].to_i)) + if @order_item.save && chosen_product.stock >= 0 && chosen_product.save flash[:success] = "Successfully added this item to your cart!" redirect_back(fallback_location: root_path) @@ -29,8 +26,8 @@ def create end else @order_item.quantity += params[:quantity].to_i - @order_item.price *= @order_item.quantity - chosen_product.stock -= params[:quantity].to_i + @order_item.price += chosen_product.price * params[:quantity].to_i + if @order_item.save && chosen_product.stock >= 0 && chosen_product.save flash[:success] = "Successfully updated this item in your cart!" redirect_back(fallback_location: root_path) From 0b99fcb606633eb3e09e7c49fafe35aaf0f127b7 Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Fri, 20 Nov 2020 14:42:32 -0800 Subject: [PATCH 083/208] schema update --- db/schema.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index 82bc1fe5db..0f87588e66 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,9 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema.define(version: 2020_11_20_050820) do - +ActiveRecord::Schema.define(version: 2020_11_20_102845) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" From cef6f7e67c2078edd45f6eba789eace6fdc810ac Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Fri, 20 Nov 2020 15:15:01 -0800 Subject: [PATCH 084/208] changed order date to updated_at from order --- app/views/users/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index 614f495a6b..619c7ccc61 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -96,7 +96,7 @@ <%= link_to Product.find_by(id: order_item.product_id).name, product_path(order_item.product_id) %> <%= order_item.quantity %> $ <%= order_item.price %> - <%= Time.parse("#{Order.find_by(id: order_item.order_id).created_at}") %> + <%= Time.parse("#{Order.find_by(id: order_item.order_id).updated_at}") %> <% if order_item.shipped %> Shipped From 4f7ba405287955cf99d21c96d3a76b41af325fd7 Mon Sep 17 00:00:00 2001 From: Marj E Date: Fri, 20 Nov 2020 15:17:15 -0800 Subject: [PATCH 085/208] added before action for chosen product, update and destroy in controller --- app/controllers/order_items_controller.rb | 86 +++++++++++++++++++---- 1 file changed, 73 insertions(+), 13 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index ab11ae884a..1e7f435b8f 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,15 +1,20 @@ class OrderItemsController < ApplicationController + before_action :find_order_item, only: [:shipped, :cancelled, :update, :destroy] + before_action :chosen_product, only: [:create, :update] + def create - chosen_product = Product.find_by(id: params[:product_id]) - if chosen_product.nil? - flash[:error] = "Product not found" - redirect_to products_path - return - end - + #DELETE + # chosen_product = Product.find_by(id: params[:product_id]) + # if chosen_product.nil? + # flash[:error] = "Product not found" + # redirect_to products_path + # return + # end + #DELETE # current shopping cart - current_cart = order_cart # order_card return order_id - @cart = Orderitem.where(order_id: current_cart) + # current_cart = order_cart # order_card return order_id + + @cart = Orderitem.where(order_id: order_cart) if @cart.include?(chosen_product) @order_item = @cart.order_items.find_by(product_id: chosen_product.id) @order_item.quantity += 1 #we can add more than one quantity at a time @@ -18,7 +23,7 @@ def create flash[:success] = "Successfully added the quantity to this item in your cart!" else @order_item = Orderitem.new - @order_item.order_id = current_cart + @order_item.order_id = session[:order_id] @order_item.product_id = chosen_product.id @order_item.quantity = 1 #here as well, we should read the quantity from the form @order_item.price = chosen_product.price @@ -26,11 +31,37 @@ def create end @order_item.save - redirect_to cart_path(@cart) + redirect_to cart_path + end + + def update + #DELETE + # chosen_product = Product.find_by(id: params[:product_id]) + # if chosen_product.nil? + # flash[:error] = "Product not found" + # redirect_to products_path + # return + # end + + current_cart = order_cart + @cart = Orderitem.where(order_id: current_cart) + @order_item = @cart.order_items.find_by(product_id: chosen_product.id) + + if @order_item.nil? + flash[:error] = "Could not find this product" + else + @order_item.update( + order_id: session[:order_id], + product_id: chosen_prodect.id, + quantity: params[:quantity].to_i, + price: (chosen_product.price * params[:quantity].to_i) + ) + redirect_to cart_path + end end def shipped - @order_item = Orderitem.find_by(id: params[:id]) + # @order_item = Orderitem.find_by(id: params[:id]) if @order_item.nil? render :file => "#{Rails.root}/public/404.html", layout: false, status: :not_found @@ -60,7 +91,7 @@ def shipped end def cancelled - @order_item = Orderitem.find_by(id: params[:id]) + # @order_item = Orderitem.find_by(id: params[:id]) if @order_item.nil? render :file => "#{Rails.root}/public/404.html", layout: false, status: :not_found @@ -88,8 +119,37 @@ def cancelled return end end + + def destroy + item_name = @order_item.product.name + + if @order_item.nil? + flash[:error] = "Could not remove #{item_name} Order." + redirect_to cart_path + else + @order_item.destroy + flash[:success] = "Order Item #{item_name} was successfully deleted." + redirect_to cart_path + end + end private + + def find_order_item + @order_item = Orderitem.find_by(id: params[:id]) + end + + def chosen_product + chosen_product = Product.find_by(id: params[:product_id]) + if chosen_product.nil? + flash[:error] = "Product not found" + redirect_to products_path + return + else + return chosen_product + end + end + def order_item_params params.require(:order_item).permit(:quantity, :price, :product_id, :order_id, :order_status, :shipped, :cancelled) end From d261cf87a55861a5706210a0336db16bd00ec061 Mon Sep 17 00:00:00 2001 From: Marj E Date: Fri, 20 Nov 2020 15:20:27 -0800 Subject: [PATCH 086/208] deleted code in comments --- app/controllers/order_items_controller.rb | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 1e7f435b8f..5dfc9e5b13 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -3,17 +3,6 @@ class OrderItemsController < ApplicationController before_action :chosen_product, only: [:create, :update] def create - #DELETE - # chosen_product = Product.find_by(id: params[:product_id]) - # if chosen_product.nil? - # flash[:error] = "Product not found" - # redirect_to products_path - # return - # end - #DELETE - # current shopping cart - # current_cart = order_cart # order_card return order_id - @cart = Orderitem.where(order_id: order_cart) if @cart.include?(chosen_product) @order_item = @cart.order_items.find_by(product_id: chosen_product.id) @@ -35,14 +24,6 @@ def create end def update - #DELETE - # chosen_product = Product.find_by(id: params[:product_id]) - # if chosen_product.nil? - # flash[:error] = "Product not found" - # redirect_to products_path - # return - # end - current_cart = order_cart @cart = Orderitem.where(order_id: current_cart) @order_item = @cart.order_items.find_by(product_id: chosen_product.id) @@ -61,8 +42,6 @@ def update end def shipped - # @order_item = Orderitem.find_by(id: params[:id]) - if @order_item.nil? render :file => "#{Rails.root}/public/404.html", layout: false, status: :not_found return @@ -91,8 +70,6 @@ def shipped end def cancelled - # @order_item = Orderitem.find_by(id: params[:id]) - if @order_item.nil? render :file => "#{Rails.root}/public/404.html", layout: false, status: :not_found return From 03f10afd3a9333429035e2f7696a487c5c3dab1c Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Fri, 20 Nov 2020 15:40:19 -0800 Subject: [PATCH 087/208] added working tests for user's show action --- test/controllers/users_controller_test.rb | 65 ++++++++++++++--------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 5199138f32..3ce306bd7a 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -3,45 +3,58 @@ describe UsersController do describe "show" do - it "responds with success when showing user its own info" do + it "responds with success for a logged-in user for their own page" do # Arrange - user = User.create() - p session[:user_id] - # need login_data - - # Act - get "/users/#{ valid_user.id }" - - # Assert - expect(valid_user).wont_be_nil + valid_user = users(:ada) + + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(valid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + get user_path(valid_user) + expect(session[:user_id]).must_equal valid_user.id must_respond_with :success end - it "responds with 404 with an invalid passenger id" do + it "responds with redirect when guest wants to see users' info" do # Arrange - invalid_user_id = -1 - - # Act - get "/users/#{ invalid_user_id }" + valid_user_page = users(:ada) - # Assert - must_respond_with :not_found + # Act-Assert + get user_path(valid_user_page) + + expect(session[:user_id]).must_be_nil + must_redirect_to root_path end it "responds with redirect when user wants to see other users' info" do # Arrange - skip - # need login_data - user = users(grace) - session[:user_id] = user.id - invalid_view = users(:ada) - - # Act - get "/users/#{ invalid_view.id }" + valid_user_page = users(:grace) + invalid_user = users(:ada) + # Create session[:user_id] + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(invalid_user)) + get omniauth_callback_path(:github) + + # Act-Assert + get user_path(valid_user_page) + + expect(session[:user_id]).must_equal invalid_user.id + expect(valid_user_page.id).wont_equal invalid_user.id + must_redirect_to root_path + end + + it "responds with 404 with an invalid user id" do + # Arrange + invalid_user_page = -1 + + # Act + get user_path(invalid_user_page) + # Assert - must_redirect_to user_path(user.id) + must_respond_with :not_found end end From a5b0b5923f1095cb9568591e528393571055cf07 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Fri, 20 Nov 2020 16:30:20 -0800 Subject: [PATCH 088/208] cart view changes --- app/assets/stylesheets/application.scss | 8 +++++++ app/views/layouts/application.html.erb | 2 +- app/views/orders/cart.html.erb | 30 ++++++++++++++++++------- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index c804c81f96..9f6a475bb0 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -23,6 +23,7 @@ $dark-grey: #4a4e69; $secondary-color: #c9ada7; $gold: #f2e9e4; $navy: #22223b; +$pink: #fe6d73; $default-border: 2px solid; @@ -55,6 +56,13 @@ a:hover { border-color: $primary-grey; } +.btn-danger { + background-color: $pink; + color: white; + border-color: $pink + +} + .btn:hover { background-color: $dark-grey; color: white; diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 2775cc91b5..dddb7a4431 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -21,7 +21,7 @@ <%= link_to "View All Products", root_path, class: "nav-link" %> <% if session[:user_id] %>
    +
    + <%= f.label :categories %> + <%= collection_check_boxes(:product, :category_ids, Category.all, :id, :name) do |b|%> + <%= b.label {b.check_box + b.text} %> + <% end %> +
    <%= f.submit action_name, class: "btn btn-primary" %>
    diff --git a/db/seeds.rb b/db/seeds.rb index 8d26bbfb98..d65599987e 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -6,6 +6,35 @@ # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) +# +categories = [ + { + name: "Software development" + }, + { + name: "Sports" + }, + { + name: "Music" + }, + { + name: "Acting" + }, + { + name: "Art" + }, + { + name: "Writing" + } +] + +count = 0 +categories.each do |category| + if Category.create(category) + count += 1 + end +end + USER_FILE = Rails.root.join('db', 'seed_data', 'users_seeds.csv') puts "Loading raw product data from #{USER_FILE}" @@ -50,6 +79,8 @@ end end +puts "Created #{count} categories." + puts "Added #{User.count} user records" puts "#{user_failures.length} users failed to save" From bbe7fdd4459f264500a0c0709d90e0d4220876ba Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Mon, 23 Nov 2020 18:56:08 -0800 Subject: [PATCH 133/208] splited the user show page into dashboard/products/fulfillments --- app/assets/stylesheets/application.scss | 21 ++++++- app/controllers/users_controller.rb | 16 ++++++ app/views/users/_fulfillments.html.erb | 43 ++++++++++++++ app/views/users/_products.html.erb | 35 +++++++++++ app/views/users/_table.html.erb | 41 ------------- app/views/users/_userinfo.html.erb | 17 ++++++ app/views/users/show.html.erb | 67 +++------------------- app/views/users/show_fulfillments.html.erb | 12 ++++ app/views/users/show_products.html.erb | 8 +++ 9 files changed, 158 insertions(+), 102 deletions(-) create mode 100644 app/views/users/_fulfillments.html.erb create mode 100644 app/views/users/_products.html.erb delete mode 100644 app/views/users/_table.html.erb create mode 100644 app/views/users/_userinfo.html.erb create mode 100644 app/views/users/show_fulfillments.html.erb create mode 100644 app/views/users/show_products.html.erb diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 673c99e389..6cb6da0347 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -129,10 +129,27 @@ main { padding: 2rem; } +.product-photo { + width: 2.5rem; +} + +.user-show-primary-wizard { + width: 6rem; +} + .user-show-wizard { - width: 5rem; + width: 4.5rem; } .user-show-icon { width: 2.5rem; -} \ No newline at end of file +} + +.user-split-pages { + display: flex; + justify-content: center; +} + +.btn-distance { + margin: 2rem; +} diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 1e925fadf2..b3ea3bfeb0 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,6 +1,22 @@ class UsersController < ApplicationController before_action :find_user, only: [:show, :edit, :update] + def show_products + @user = User.find_by(id: session[:user_id]) + if @user.nil? + render_404 + return + end + end + + def show_fulfillments + @user = User.find_by(id: session[:user_id]) + if @user.nil? + render_404 + return + end + end + def show if @user.nil? render_404 diff --git a/app/views/users/_fulfillments.html.erb b/app/views/users/_fulfillments.html.erb new file mode 100644 index 0000000000..8d5245c80d --- /dev/null +++ b/app/views/users/_fulfillments.html.erb @@ -0,0 +1,43 @@ +
    +

    <%= image_tag("bubbling-potion.png", alt: "Bubbling potion", class: "user-show-icon") %> <%= action_name.capitalize %>

    + + + + + + + + + + + + <% @user.filter_by_status(action_name).each do |order_item| %> + + + + + + + + + + + <% end %> +
    Order IDOrder StatusOrder ItemQuantitySubtotal PriceOrder DateShipped?Cancel Order
    <%= link_to order_item.order_id, order_path(order_item.order_id) %><%= order_item.order_status.capitalize %><%= link_to Product.find_by(id: order_item.product_id).name, product_path(order_item.product_id) %><%= order_item.quantity %>$ <%= order_item.price %><%= Time.parse("#{Order.find_by(id: order_item.order_id).updated_at}") %> + <% if order_item.shipped %> + Yes + <% elsif order_item.cancelled %> + Order Cancelled + <% else %> + <%= button_to "Shipped", shipped_order_item_path(order_item), method: :patch, class: "btn btn-primary", rel: "nofollow" %> + <% end %> + + <% if order_item.cancelled %> + Cancelled + <% elsif order_item.shipped %> + Order Completed + <% else %> + <%= button_to "Cancel", cancelled_order_item_path(order_item), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> + <% end %> +
    +
    \ No newline at end of file diff --git a/app/views/users/_products.html.erb b/app/views/users/_products.html.erb new file mode 100644 index 0000000000..25a40c8104 --- /dev/null +++ b/app/views/users/_products.html.erb @@ -0,0 +1,35 @@ +
    +

    <%= image_tag("bubbling-potion.png", alt: "Bubbling potion", class: "user-show-wizard") %> Your Product

    + + + + + + + + + + + + + + <% @user.products.order(id: :asc).each do |product| %> + + + + + + + + + + + + + <% end %> +
    Product IDProduct NameProduct ImageProduct PriceStockDescriptionPhoto URLEditHide the productDelete
    <%= product.id %><%= link_to product.name, product_path(product.id) %><%= image_tag product.photo_url, alt: "product photo", class: "product-photo" %><%= product.price %><%= product.stock %><%= product.description %><%= product.photo_url %><%= button_to "Edit", edit_product_path(product), method: :get, class: "btn btn-primary" %><% if product.retired %> + <%= button_to "Make Active", retired_product_path(product), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-primary", rel: "nofollow" %> + <% else %> + <%= button_to "Retire", retired_product_path(product), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-primary", rel: "nofollow" %> + <% end %><%= button_to "Delete", product_path(product), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %>
    +
    \ No newline at end of file diff --git a/app/views/users/_table.html.erb b/app/views/users/_table.html.erb deleted file mode 100644 index 915a20b29c..0000000000 --- a/app/views/users/_table.html.erb +++ /dev/null @@ -1,41 +0,0 @@ -

    <%= image_tag("bubbling-potion.png", alt: "Bubbling potion", class: "user-show-icon") %> <%= action_name.capitalize %>

    - - - - - - - - - - - - <% @user.filter_by_status(action_name).each do |order_item| %> - - - - - - - - - - - <% end %> -
    Order IDOrder StatusOrder ItemQuantitySubtotal PriceOrder DateShipped?Cancel Order
    <%= link_to order_item.order_id, order_path(order_item.order_id) %><%= order_item.order_status.capitalize %><%= link_to Product.find_by(id: order_item.product_id).name, product_path(order_item.product_id) %><%= order_item.quantity %>$ <%= order_item.price %><%= Time.parse("#{Order.find_by(id: order_item.order_id).updated_at}") %> - <% if order_item.shipped %> - Yes - <% elsif order_item.cancelled %> - Order Cancelled - <% else %> - <%= button_to "Shipped", shipped_order_item_path(order_item), method: :patch, class: "btn btn-primary", rel: "nofollow" %> - <% end %> - - <% if order_item.cancelled %> - Cancelled - <% elsif order_item.shipped %> - Order Completed - <% else %> - <%= button_to "Cancel", cancelled_order_item_path(order_item), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> - <% end %> -
    \ No newline at end of file diff --git a/app/views/users/_userinfo.html.erb b/app/views/users/_userinfo.html.erb new file mode 100644 index 0000000000..75c96a98a4 --- /dev/null +++ b/app/views/users/_userinfo.html.erb @@ -0,0 +1,17 @@ +
    +

    <%= image_tag("wizard.png", alt: "wizard icon", class: "user-show-primary-wizard") %> Wizard: <%= @user.name %>

    + + + + + + + + + + + + + +
    User IDUser EmailDescriptionEdit
    <%= @user.id %><%= @user.email %><%= @user.description %><%= button_to "Edit", edit_user_path(@user), method: :get, class: "btn btn-primary" %>
    +
    \ No newline at end of file diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index 6fd9e51fc9..75f9803f27 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -1,58 +1,7 @@ -
    -

    <%= image_tag("wizard.png", alt: "wizard icon", class: "user-show-wizard") %> Wizard: <%= @user.name %>

    - - - - - - - - - - - - - -
    User IDUser EmailDescriptionEdit
    <%= @user.id %><%= @user.email %><%= @user.description %><%= button_to "Edit", edit_user_path(@user), method: :get, class: "btn btn-primary" %>
    -
    - -
    -

    Your Product

    - - - - - - - - - - - - - <% @user.products.order(id: :asc).each do |product| %> - - - - - - - - - - - - <% end %> -
    Product IDProduct NameProduct PriceStockDescriptionPhotoEditHide the productDelete
    <%= product.id %><%= link_to product.name, product_path(product.id) %><%= product.price %><%= product.stock %><%= product.description %><%= product.photo_url %><%= button_to "Edit", edit_product_path(product), method: :get, class: "btn btn-primary" %><% if product.retired %> - <%= button_to "Make Active", retired_product_path(product), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-primary", rel: "nofollow" %> - <% else %> - <%= button_to "Retire", retired_product_path(product), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-primary", rel: "nofollow" %> - <% end %><%= button_to "Delete", product_path(product), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %>
    -
    +<%= render partial: "userinfo" %>
    -

    <%= image_tag("rich_wizard.png", alt: "Rich wizard", class: "user-show-wizard") %> Your Order Fulfillments

    -

    Summary

    +

    <%= image_tag("rich_wizard.png", alt: "Rich wizard", class: "user-show-wizard") %> Revenue Summary

    @@ -76,14 +25,14 @@
    Order Status<%= @user.total_orders %>
    -
    -

    <%= image_tag("rich_wizard.png", alt: "Rich wizard", class: "user-show-wizard") %> Order Fulfillments List

    - <%= render partial: "table", locals: { action_name: "paid"} %> - <%= render partial: "table", locals: { action_name: "pending"} %> - <%= render partial: "table", locals: { action_name: "completed"} %> - <%= render partial: "table", locals: { action_name: "cancelled"} %>
    +
    + <%= button_to "Your products", show_products_user_path(@user), method: :get, class: "btn btn-primary btn-distance" %> + <%= button_to "Your Order Fulfillments", show_fulfillments_user_path(@user), method: :get, class: "btn btn-primary btn-distance" %> +
    + + diff --git a/app/views/users/show_fulfillments.html.erb b/app/views/users/show_fulfillments.html.erb new file mode 100644 index 0000000000..37e4f9a030 --- /dev/null +++ b/app/views/users/show_fulfillments.html.erb @@ -0,0 +1,12 @@ +<%= render partial: "userinfo" %> +
    + <%= button_to "Merchant Dashboard", user_path(@user), method: :get, class: "btn btn-primary btn-distance" %> + <%= button_to "Your products", show_products_user_path(@user), method: :get, class: "btn btn-primary btn-distance" %> +
    +
    +

    <%= image_tag("rich_wizard.png", alt: "Rich wizard", class: "user-show-wizard") %> Your Order Fulfillments

    + <%= render partial: "fulfillments", locals: { action_name: "paid"} %> + <%= render partial: "fulfillments", locals: { action_name: "pending"} %> + <%= render partial: "fulfillments", locals: { action_name: "completed"} %> + <%= render partial: "fulfillments", locals: { action_name: "cancelled"} %> +
    \ No newline at end of file diff --git a/app/views/users/show_products.html.erb b/app/views/users/show_products.html.erb new file mode 100644 index 0000000000..a66437f6e1 --- /dev/null +++ b/app/views/users/show_products.html.erb @@ -0,0 +1,8 @@ +<%= render partial: "userinfo" %> +
    + <%= button_to "Merchant Dashboard", user_path(@user), method: :get, class: "btn btn-primary btn-distance" %> + <%= button_to "Your Order Fulfillments", show_fulfillments_user_path(@user), method: :get, class: "btn btn-primary btn-distance" %> +
    +
    + <%= render partial: "products" %> +
    From 432a3e9b6d1feeaf0a164b2f89ad3745941259e0 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Mon, 23 Nov 2020 20:16:47 -0800 Subject: [PATCH 134/208] removed table from cart --- app/views/orders/cart.html.erb | 55 ++++++++++++++++--------------- app/views/products/_form.html.erb | 2 +- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index 03af44e627..44c830edb6 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -31,39 +31,40 @@ -
    - - - - - - - - - - -
    ItemQuantityPriceUpdate QuantityRemove Item
    +
    +
    +
    Item
    +
    Quantity
    +
    Price
    +
    Update Quantity
    +
    Remove Item
    +
    +
    + <% @cart.orderitems.each do |item| %> +
    <%= form_with scope: @orderitem, url: cart_update_path(item.id), method: :patch do |f| %> - - - - - - - - <% end %> - - - -
    <%= link_to item.product.name, product_path(item.product.id) %> - <%= f.select(:quantity, options_for_select(item.product.create_stock_collection, selected: item.quantity)) %> - $<%= item.price %><%= f.submit "Update", class: "btn btn-primary" %><%= button_to "Remove", order_item_path(item.id), method: :delete, class: "btn btn-primary" %>
    + +
    +
    + <%= link_to item.product.name, product_path(item.product.id) %> +
    +
    + <%= f.select(:quantity, options_for_select(item.product.create_stock_collection, selected: item.quantity)) %> +
    +
    + $<%= item.price %> +
    +
    + <%= f.submit "Update", class: "btn btn-primary" %> +
    + <% end %> +
    <%= button_to "Remove", order_item_path(item.id), method: :delete, class: "btn btn-primary" %>
    <% end %> +
    -
    <%# @cart.orderitems.each do |item| %> diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index b599488a06..9214b37ed9 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -23,7 +23,7 @@
    <%= f.label :categories %> <%= collection_check_boxes(:product, :category_ids, Category.all, :id, :name) do |b|%> - <%= b.label {b.check_box + b.text} %> + <%= b.label(class:"label-checkbox") {b.check_box + b.text} %> <% end %>
    From 658792eced87eb71d9b624ab1fff1f5060204071 Mon Sep 17 00:00:00 2001 From: Marj E Date: Mon, 23 Nov 2020 21:37:42 -0800 Subject: [PATCH 135/208] made changes to order_items update method and test --- app/controllers/order_items_controller.rb | 27 +++++----- .../order_items_controller_test.rb | 53 ++++++++++++++++++- 2 files changed, 65 insertions(+), 15 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 42d2b6e362..5846c9258f 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -48,25 +48,24 @@ def create # create/update shopping cart on product pages end def update - product = Product.find_by(id: @order_item.product_id) - if @order_item.nil? flash[:error] = "Could not find this product" redirect_back(fallback_location: root_path) return - elsif @order_item - @order_item.quantity = params[:quantity].to_i - @order_item.price = product.price * params[:quantity].to_i + end - if @order_item.save && product.stock >= 0 - flash[:success] = "Successfully updated this item in your cart!" - redirect_to cart_path - return - else - flash[:error] = "Something went wrong, please try again!" - redirect_to cart_path - return - end + product = Product.find_by(id: @order_item.product_id) + @order_item.quantity = params[:quantity].to_i + @order_item.price = product.price * params[:quantity].to_i + + if @order_item.save && product.stock >= 0 + flash[:success] = "Successfully updated this item in your cart!" + redirect_to cart_path + return + else + flash[:error] = "Something went wrong, please try again!" + redirect_to cart_path + return end end diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index c13125d768..6e4ffc1c45 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -417,5 +417,56 @@ must_respond_with :not_found end - end + end + + describe "update" do + let (:order_item_params) { + { + order_id: 1, + quantity: 5 + } + } + it 'should find a valid order_item' do + item = orderitems(:orderitem1) + + patch cart_update_path(item.id) + + exist = Orderitem.find_by(id: item.id) + expect(exist).must_equal item + end + + it 'should find valid product' do + product = Product.create + product.name = 'test_product' + order_item = Orderitem.create + + order_item.product_id = product.id + + expect { + patch cart_update(1) + } + + end + + it 'should redirect if order_item is nil' do + expect { + patch cart_update_path(-1) + }.wont_change "Orderitem.count" + + must_respond_with :redirect + non_exist = Orderitem.find_by(id: -1) + expect(non_exist).must_be_nil + end + + it 'should save update to order item' do + item = orderitems(:orderitem1) + expect(item.quantity).must_equal 1 + + patch cart_update_path(item.id), params: order_item_params + + must_respond_with :redirect + expect(item.reload.quantity).must_equal 5 + must_respond_with :redirect + end + end end From 58a2673fbe8fc35c756299d300ec5623913dbb8f Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Mon, 23 Nov 2020 23:20:40 -0800 Subject: [PATCH 136/208] added payment and complete actions to orders controller and custom methods to order model and updated routes --- app/controllers/orders_controller.rb | 49 ++++++++++++++++++++++++-- app/models/order.rb | 40 ++++++++++++++------- app/models/orderitem.rb | 5 +++ app/views/orders/cart.html.erb | 2 +- app/views/orders/confirmation.html.erb | 3 ++ app/views/orders/payment.html.erb | 48 +++++++++++++++++++++++++ config/routes.rb | 11 +++--- 7 files changed, 138 insertions(+), 20 deletions(-) create mode 100644 app/views/orders/confirmation.html.erb create mode 100644 app/views/orders/payment.html.erb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 49bc56cde8..fcad8bb9d7 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -20,9 +20,54 @@ def show end end + def payment + @order = Order.find_by(id: @cart.id) + if @order.orderitems.empty? + flash[:error] = "You have no items in your cart. Please get back to shopping!" + redirect_to root_path + return + end + end + + def complete + @order = Order.find_by(id: @cart.id) + + update_order + if @order.save + flash[:success] = "Your order was created." + @order.mark_as_paid + @order.update_stock + redirect_to confirmation_path(@order.id) + session[:order_id] = nil + return + else + flash[:error] = "Your order was not created." + redirect_to cart_path + return + end + + end - private + def confirm + + end + + + private def order_params - return params.require(:order).permit(:order_item_id, :name, :email, :mailing_address, :cc_name, :cc_number, :cc_exp_date, billing_zip_code) + return params.require(:order).permit(:order_item_id, :name, :email, :mailing_address, :cc_name, :cc_number, :cc_exp_date, :billing_zip_code) + end + + def update_order + + @order.update( + name: params[:name], + email:params[:email], + mailing_address: params[:mailing_address], + cc_name:params[:name_on_credit_card], + cc_number:params[:credit_card_number], + cc_exp_date:params[:credit_card_expiration ], + billing_zip_code:params[:billing_zipcode] + ) end end diff --git a/app/models/order.rb b/app/models/order.rb index cd91a98542..09c9c2df92 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,19 +1,19 @@ class Order < ApplicationRecord has_many :orderitems has_many :products, through: :orderitems - - validates :name, presence: true, on: :create - validates :email, presence: true, - format: { with: URI::MailTo::EMAIL_REGEXP, message: "must be a valid email"}, - on: :create - validates :mailing_address, presence: true, on: :create - validates :cc_name, presence: true, on: :create - validates :cc_number, presence: true, - numericality: { only_integer: true }, - on: :create - validates :cc_exp_date, presence: true, on: :create - validates :billing_zip_code, presence: true, on: :create - validate :cc_num_valid?, :cc_exp_date_valid? + # + # validates :name, presence: true, on: :create + # validates :email, presence: true, + # format: { with: URI::MailTo::EMAIL_REGEXP, message: "must be a valid email"}, + # on: :create + # validates :mailing_address, presence: true, on: :create + # validates :cc_name, presence: true, on: :create + # validates :cc_number, presence: true, + # numericality: { only_integer: true }, + # on: :create + # validates :cc_exp_date, presence: true, on: :create + # validates :billing_zip_code, presence: true, on: :create + # validate :cc_num_valid?, :cc_exp_date_valid? def cc_num_valid? if cc_number.present? && (cc_number.to_s.length < 13 || cc_number.to_s.length > 19) @@ -26,4 +26,18 @@ def cc_exp_date_valid? errors.add(:cc_exp_date, "can't be in the past") end end + + def mark_as_paid + self.orderitems.each do |item| + item.order_status = "paid" + item.save + end + end + + def update_stock + self.orderitems.each do |item| + item.product.stock -= item.quantity + item.product.save + end + end end diff --git a/app/models/orderitem.rb b/app/models/orderitem.rb index beff8032d4..dfa12743c2 100644 --- a/app/models/orderitem.rb +++ b/app/models/orderitem.rb @@ -4,4 +4,9 @@ class Orderitem < ApplicationRecord has_one :user, through: :product validates :quantity, presence: true, numericality: { greater_than: 0, only_integer: true } + + + + end + diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index 12199920c0..46bb8994d9 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -37,4 +37,4 @@

    <%= f.submit "Update", class: "btn btn-primary" %>

    <% end %> <% end %> -<%= button_to "Proceed to Checkout", new_order_path, class: "btn btn-primary" %> \ No newline at end of file +<%= button_to "Proceed to Checkout", payment_path(@cart.id), method: :get, class: "btn btn-primary" %> \ No newline at end of file diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb new file mode 100644 index 0000000000..7c81abe356 --- /dev/null +++ b/app/views/orders/confirmation.html.erb @@ -0,0 +1,3 @@ +

    Confirmation page

    + +<%= button_to "Back to products", root_path, method: :get, class: "btn btn-primary" %> \ No newline at end of file diff --git a/app/views/orders/payment.html.erb b/app/views/orders/payment.html.erb new file mode 100644 index 0000000000..c91790a378 --- /dev/null +++ b/app/views/orders/payment.html.erb @@ -0,0 +1,48 @@ +
    + + <% if @order.errors.any? %> +
      + <% @order.errors.each do |column, message| %> +
    • + <%= column.capitalize %> <%= message %> +
    • + <% end %> +
    + <% end %> + + <%= form_with model: @order,url: complete_path(@order), method: :patch, class: 'order-form' do |f| %> + +

    Please provide the following information to save your order:

    +
    + <%= f.label :name %> + <%= f.text_field :name %> +
    +
    + <%= f.label :email %> + <%= f.text_field :email %> +
    +
    + <%= f.label :mailing_address %> + <%= f.text_field :mailing_address %> +
    +
    + <%= f.label :name_on_credit_card %> + <%= f.text_field :name_on_credit_card %> +
    +
    + <%= f.label :credit_card_number %> + <%= f.text_field :credit_card_number %> +
    +
    + <%= f.label :credit_card_expiration%> + <%= f.text_field :credit_card_expiration %> +
    +
    + <%= f.label :billing_zipcode %> + <%= f.text_field :billing_zipcode %> +
    + + <%= f.submit "Confirm Order", class: "order-button" %> + <% end %> + +
    \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 5084b713a1..9e8ce09a49 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -17,11 +17,14 @@ delete "/logout", to: "users#destroy", as: "logout" # Customized actions + get "/cart", to: "orders#cart", as: "cart" patch '/cart/order_item/:id', to: 'order_items#update', as: 'cart_update' - get "/confirmation", to: "orders#confirmation", as: "confirmation" - patch 'products/:id/retired', to: 'products#retired', as: 'retired_product' - patch 'order_items/:id/shipped', to: 'order_items#shipped', as: 'shipped_order_item' - patch 'order_items/:id/cancelled', to: 'order_items#cancelled', as: 'cancelled_order_item' + get "/orders/:id/payment", to: 'orders#payment', as: 'payment' + patch '/orders/:id/complete', to: 'orders#complete', as: 'complete' + get "/orders/:id/confirmation", to: "orders#confirmation", as: "confirmation" + patch '/products/:id/retired', to: 'products#retired', as: 'retired_product' + patch '/order_items/:id/shipped', to: 'order_items#shipped', as: 'shipped_order_item' + patch '/order_items/:id/cancelled', to: 'order_items#cancelled', as: 'cancelled_order_item' end From f092c8b26963d5f4f98d88764faf859676f51e74 Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Tue, 24 Nov 2020 00:18:41 -0800 Subject: [PATCH 137/208] updates routes and debugged validations --- app/controllers/orders_controller.rb | 17 ++++++++------- app/models/order.rb | 31 ++++++++++++++++------------ 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index fcad8bb9d7..ed70388996 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -32,24 +32,25 @@ def payment def complete @order = Order.find_by(id: @cart.id) - update_order - if @order.save + update_order + if @order.valid_check + binding.pry + @order.save flash[:success] = "Your order was created." @order.mark_as_paid @order.update_stock redirect_to confirmation_path(@order.id) session[:order_id] = nil return - else - flash[:error] = "Your order was not created." - redirect_to cart_path + else + flash.now[:error] = "Your order was not created." + render :payment return - end - + end end def confirm - + @order = Order.find_by(id: @cart.id) end diff --git a/app/models/order.rb b/app/models/order.rb index 09c9c2df92..2f396895a3 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,19 +1,19 @@ class Order < ApplicationRecord has_many :orderitems has_many :products, through: :orderitems - # - # validates :name, presence: true, on: :create - # validates :email, presence: true, - # format: { with: URI::MailTo::EMAIL_REGEXP, message: "must be a valid email"}, - # on: :create - # validates :mailing_address, presence: true, on: :create - # validates :cc_name, presence: true, on: :create - # validates :cc_number, presence: true, - # numericality: { only_integer: true }, - # on: :create - # validates :cc_exp_date, presence: true, on: :create - # validates :billing_zip_code, presence: true, on: :create - # validate :cc_num_valid?, :cc_exp_date_valid? + + validates :name, presence: true, on: :complete + validates :email, presence: true, + format: { with: URI::MailTo::EMAIL_REGEXP, message: "must be a valid email"}, + on: :complete + validates :mailing_address, presence: true, on: :complete + validates :cc_name, presence: true, on: :complete + validates :cc_number, presence: true, + #numericality: { only_integer: true }, + on: :complete + validates :cc_exp_date, presence: true, on: :complete + validates :billing_zip_code, presence: true, on: :complete + #validate :cc_num_valid?, :cc_exp_date_valid? def cc_num_valid? if cc_number.present? && (cc_number.to_s.length < 13 || cc_number.to_s.length > 19) @@ -40,4 +40,9 @@ def update_stock item.product.save end end + + def valid_check + self.valid?(:complete) + binding.pry + end end From 498b6d55319c71fb3ec57911671c7538fce44b7e Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 00:20:09 -0800 Subject: [PATCH 138/208] changed cart layout, added footer, and seeded category data --- app/assets/stylesheets/application.scss | 18 +++++ app/models/order.rb | 24 +++---- app/views/layouts/application.html.erb | 32 +++++---- app/views/orders/cart.html.erb | 89 ++++++------------------- db/seeds.rb | 4 +- 5 files changed, 70 insertions(+), 97 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 9f6a475bb0..ff3f054973 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -129,3 +129,21 @@ main { padding: 2rem; } +.app-footer { + max-width: 100%; + background-color: $secondary-color; + margin-bottom: 0.5rem; + padding: 2rem 1rem 0.5rem 1rem; + h1 { + text-align: center; + margin: 25px auto 40px auto; + a { + color: $gold; + padding-right: 25px; + margin-right: 15px; + } + } + p { + margin-bottom: 5px; + } +} diff --git a/app/models/order.rb b/app/models/order.rb index cd91a98542..b88ba21107 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,18 +2,18 @@ class Order < ApplicationRecord has_many :orderitems has_many :products, through: :orderitems - validates :name, presence: true, on: :create - validates :email, presence: true, - format: { with: URI::MailTo::EMAIL_REGEXP, message: "must be a valid email"}, - on: :create - validates :mailing_address, presence: true, on: :create - validates :cc_name, presence: true, on: :create - validates :cc_number, presence: true, - numericality: { only_integer: true }, - on: :create - validates :cc_exp_date, presence: true, on: :create - validates :billing_zip_code, presence: true, on: :create - validate :cc_num_valid?, :cc_exp_date_valid? + # validates :name, presence: true, on: :create + # validates :email, presence: true, + # format: { with: URI::MailTo::EMAIL_REGEXP, message: "must be a valid email"}, + # on: :create + # validates :mailing_address, presence: true, on: :create + # validates :cc_name, presence: true, on: :create + # validates :cc_number, presence: true, + # numericality: { only_integer: true }, + # on: :create + # validates :cc_exp_date, presence: true, on: :create + # validates :billing_zip_code, presence: true, on: :create + # validate :cc_num_valid?, :cc_exp_date_valid? def cc_num_valid? if cc_number.present? && (cc_number.to_s.length < 13 || cc_number.to_s.length > 19) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f8a6f03274..e9fe212c9d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -53,24 +53,28 @@
    <% if flash[:result_text] or flash[:messages] %> -
    -
    - <%= flash[:status].to_s == "failure" ? "A problem occurred: " : "" %><%= flash[:result_text] %> - <% if flash[:messages] %> -
      - <% flash[:messages].each do |name, problems| %> - <% problems.each do |problem| %> -
    • <%= name %>: <%= problem %>
    • +
      +
      + <%= flash[:status].to_s == "failure" ? "A problem occurred: " : "" %><%= flash[:result_text] %> + <% if flash[:messages] %> +
        + <% flash[:messages].each do |name, problems| %> + <% problems.each do |problem| %> +
      • <%= name %>: <%= problem %>
      • + <% end %> <% end %> - <% end %> -
      - <% end %> -
      -
      - <% end %> +
    + <% end %> +
    +
    + <% end %>
    <%= yield %>
    + +
    + © 2020 Mama Jeti +
    diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index 44c830edb6..85187f3d2c 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -1,36 +1,4 @@

    <%= @cart.orderitems.count %> item(s) in your cart

    - - - - - - - - - - - - - - <%# @cart.orderitems.each do |item| %> - - - - <%#= form_with scope: @orderitem, url: cart_update_path(item.id), method: :patch do |f| %> - - <%#= f.select(:quantity, options_for_select(item.product.create_stock_collection, selected: item.quantity)) %> - - - - <%# end %> - - - <%# end %> - - - - -
    @@ -42,43 +10,26 @@
    - <% @cart.orderitems.each do |item| %> -
    - <%= form_with scope: @orderitem, url: cart_update_path(item.id), method: :patch do |f| %> - -
    -
    - <%= link_to item.product.name, product_path(item.product.id) %> -
    -
    - <%= f.select(:quantity, options_for_select(item.product.create_stock_collection, selected: item.quantity)) %> -
    -
    - $<%= item.price %> -
    -
    - <%= f.submit "Update", class: "btn btn-primary" %> -
    - <% end %> -
    <%= button_to "Remove", order_item_path(item.id), method: :delete, class: "btn btn-primary" %>
    + <% @cart.orderitems.order(id: :asc).each do |item| %> +
    + <%= form_with model: @orderitem, url: cart_update_path(item.id), method: :patch do |f| %> + +
    +
    + <%= link_to item.product.name, product_path(item.product.id) %> +
    +
    + <%= f.select(:quantity, options_for_select(item.product.create_stock_collection, selected: item.quantity)) %> +
    +
    + $<%= item.price %> +
    +
    + <%= f.submit "Update", class: "btn btn-primary" %> +
    <% end %> -
    - - - -<%# @cart.orderitems.each do |item| %> - - <%#= f.select(:quantity, options_for_select(item.product.create_stock_collection, selected: item.quantity)) %> - - - <%# end %> +
    <%= button_to "Remove", order_item_path(item.id), method: :delete, class: "btn btn-primary" %>
    + <% end %> +
    - <%# @cart.orderitems.each do |item| %> - - <%#= form_with model: @orderitem, url: cart_update_path(item.id), method: :patch do |f| %> - <%#= f.select(:quantity, options_for_select(item.product.create_stock_collection, selected: item.quantity)) %> - - - <%# end %> - <%# end %> <%= button_to "Proceed to Checkout", new_order_path, class: "btn btn-primary" %> \ No newline at end of file diff --git a/db/seeds.rb b/db/seeds.rb index d65599987e..6bd7d214e7 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -55,8 +55,6 @@ end end - - PRODUCT_FILE = Rails.root.join('db', 'seed_data', 'products_seeds.csv') puts "Loading raw product data from #{PRODUCT_FILE}" @@ -79,6 +77,8 @@ end end + + puts "Created #{count} categories." puts "Added #{User.count} user records" From 48fce6ca8c650623c853cc7088ed4c53dd08578e Mon Sep 17 00:00:00 2001 From: jwinchan <68631640+jwinchan@users.noreply.github.com> Date: Tue, 24 Nov 2020 00:22:28 -0800 Subject: [PATCH 139/208] Update orders_controller.rb --- app/controllers/orders_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index ed70388996..47583816a3 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -34,7 +34,6 @@ def complete update_order if @order.valid_check - binding.pry @order.save flash[:success] = "Your order was created." @order.mark_as_paid From a9606f64108307f596bfb6d5348cdc6f0ca5254a Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 00:42:28 -0800 Subject: [PATCH 140/208] create routes for split User show --- config/routes.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 5084b713a1..39508815df 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,7 +3,11 @@ # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html root to: 'products#index' - resources :users, except: [:new, :index, :destroy] + resources :users, except: [:new, :index, :destroy] do + get 'show_products', on: :member + get 'show_fulfillments', on: :member + end + resources :products do resources :order_items, only: [:create] end From 5fd85579fc0f124d12093a64da127f2c3847ac15 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 02:21:44 -0800 Subject: [PATCH 141/208] fix order show page to have buyer info and fix the params for order complete --- app/controllers/orders_controller.rb | 39 ++++++++++++---------------- app/models/order.rb | 10 ++++--- app/views/orders/show.html.erb | 10 +++---- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 9973eb34ee..43faceb0f2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -13,10 +13,6 @@ def show flash[:success] = "You don't have product sold in this Order." redirect_to root_path return - else - flash[:success] = "Successfully load the Order fulfillment." - redirect_to order_path(@order.id) - return end end @@ -34,17 +30,17 @@ def complete update_order if @order.valid_check - @order.save - flash[:success] = "Your order was created." - @order.mark_as_paid - @order.update_stock - redirect_to confirmation_path(@order.id) - session[:order_id] = nil - return + @order.save + flash[:success] = "Your order was created." + @order.mark_as_paid + @order.update_stock + redirect_to confirmation_path(@order.id) + session[:order_id] = nil + return else - flash.now[:error] = "Your order was not created." - render :payment - return + flash.now[:error] = "Your order was not created." + render :payment + return end end @@ -59,15 +55,14 @@ def order_params end def update_order - @order.update( - name: params[:name], - email:params[:email], - mailing_address: params[:mailing_address], - cc_name:params[:name_on_credit_card], - cc_number:params[:credit_card_number], - cc_exp_date:params[:credit_card_expiration ], - billing_zip_code:params[:billing_zipcode] + name: params[:order][:name], + email: params[:order][:email], + mailing_address: params[:order][:mailing_address], + cc_name: params[:order][:name_on_credit_card], + cc_number: params[:order][:credit_card_number], + cc_exp_date: params[:order][:credit_card_expiration], + billing_zip_code: params[:order][:billing_zipcode] ) end end diff --git a/app/models/order.rb b/app/models/order.rb index 444dd170a6..f055393d74 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -9,11 +9,11 @@ class Order < ApplicationRecord validates :mailing_address, presence: true, on: :complete validates :cc_name, presence: true, on: :complete validates :cc_number, presence: true, - #numericality: { only_integer: true }, + numericality: { only_integer: true }, on: :complete validates :cc_exp_date, presence: true, on: :complete validates :billing_zip_code, presence: true, on: :complete - #validate :cc_num_valid?, :cc_exp_date_valid? + validate :cc_num_valid?, :cc_exp_date_valid? def cc_num_valid? @@ -23,7 +23,7 @@ def cc_num_valid? end def cc_exp_date_valid? - if cc_exp_date.present? && Datetime.parse(cc_exp_date) < Date.today + if cc_exp_date.present? && Time.parse(cc_exp_date) < Date.today errors.add(:cc_exp_date, "can't be in the past") end end @@ -45,4 +45,8 @@ def update_stock def valid_check self.valid?(:complete) end + + def last_digits + return self.cc_number.to_s[-4..-1] + end end diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 7378cdcbd3..75c2e1bc5a 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -10,11 +10,11 @@ Credit Card Exp Date - <%= @order.name %> - <%= @order.email %> - <%= @order.mailing_address %> - <%= @order.cc_number %> - <%= @order.cc_exp_date %> + <%= @order.name %> + <%= @order.email %> + <%= @order.mailing_address %> + <%= @order.last_digits %> + <%= @order.cc_exp_date %> \ No newline at end of file From db940aa1611c94681c3db84c4c7263e6422fad7f Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 03:32:57 -0800 Subject: [PATCH 142/208] add category to product on user show page --- app/models/product.rb | 4 ++++ app/views/users/_products.html.erb | 30 +++++++++++++++++++----------- db/seeds.rb | 3 +++ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index f5133fb0cf..34d2f537e9 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -9,4 +9,8 @@ def create_stock_collection currently_instock.times { |num| stock_collection << num + 1 } return stock_collection end + + def category_on_user_show + return collection = self.categories.map { |cat| cat.name } + end end diff --git a/app/views/users/_products.html.erb b/app/views/users/_products.html.erb index 25a40c8104..9be1ab5594 100644 --- a/app/views/users/_products.html.erb +++ b/app/views/users/_products.html.erb @@ -3,6 +3,7 @@ + @@ -15,20 +16,27 @@ <% @user.products.order(id: :asc).each do |product| %> - - - - - - - - - + + + + + + + + + + <% end %> + <% end %>
    Product IDProduct Categories Product Name Product Image Product Price
    <%= product.id %><%= link_to product.name, product_path(product.id) %><%= image_tag product.photo_url, alt: "product photo", class: "product-photo" %><%= product.price %><%= product.stock %><%= product.description %><%= product.photo_url %><%= button_to "Edit", edit_product_path(product), method: :get, class: "btn btn-primary" %><% if product.retired %> + <%= product.id %> +
      + <% product.category_on_user_show.sort.each do |cat| %> +
    • <%= cat %>
    • + <% end %> +
    +
    <%= link_to product.name, product_path(product.id) %><%= image_tag product.photo_url, alt: "product photo", class: "product-photo" %><%= product.price %><%= product.stock %><%= product.description %><%= product.photo_url %><%= button_to "Edit", edit_product_path(product), method: :get, class: "btn btn-primary" %><% if product.retired %> <%= button_to "Make Active", retired_product_path(product), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-primary", rel: "nofollow" %> <% else %> <%= button_to "Retire", retired_product_path(product), method: :patch, data: {confirm: "Are you sure?"}, class: "btn btn-primary", rel: "nofollow" %> - <% end %> - <%= button_to "Delete", product_path(product), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %><%= button_to "Delete", product_path(product), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %>
    diff --git a/db/seeds.rb b/db/seeds.rb index 6bd7d214e7..4ae0b1ab0d 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -69,6 +69,9 @@ product.photo_url = row['photo_url'] product.retired = row['retired'] successful = product.save + + product.categories << Category.all.sample(3) + if !successful product_failures << product puts "Failed to save product: #{product.inspect}" From aa563e3014f6334ba4d0681f36441c0fbc5e9004 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 03:47:30 -0800 Subject: [PATCH 143/208] fix tests for order show after revise the action --- test/controllers/orders_controller_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 07c9f37315..4fcad3b285 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -13,7 +13,7 @@ expect(session[:user_id]).must_equal valid_user.id expect(valid_order.products.where(user_id: valid_user.id)). wont_be_empty - must_redirect_to order_path + must_respond_with :success end it "redirects to root_path when a guest wants to see other users' order" do From f9b010769f9658facc58a9a15cb6fa968ae0dd79 Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Tue, 24 Nov 2020 10:57:24 -0800 Subject: [PATCH 144/208] added a confirmation page voew and a helper method for calculationg the total --- app/controllers/orders_controller.rb | 20 +++++------ app/models/order.rb | 4 +++ app/models/orderitem.rb | 2 -- app/views/orders/cart.html.erb | 1 + app/views/orders/confirmation.html.erb | 47 ++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 12 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 9973eb34ee..4662947619 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -15,7 +15,7 @@ def show return else flash[:success] = "Successfully load the Order fulfillment." - redirect_to order_path(@order.id) + redirect_to root_path return end end @@ -48,8 +48,8 @@ def complete end end - def confirm - @order = Order.find_by(id: @cart.id) + def confirmation + @order = Order.find_by(id: params[:id]) end @@ -61,13 +61,13 @@ def order_params def update_order @order.update( - name: params[:name], - email:params[:email], - mailing_address: params[:mailing_address], - cc_name:params[:name_on_credit_card], - cc_number:params[:credit_card_number], - cc_exp_date:params[:credit_card_expiration ], - billing_zip_code:params[:billing_zipcode] + name: params[:order][:name], + email:params[:order][:email], + mailing_address: params[:order][:mailing_address], + cc_name:params[:order][:name_on_credit_card], + cc_number:params[:order][:credit_card_number], + cc_exp_date:params[:order][:credit_card_expiration ], + billing_zip_code:params[:order][:billing_zipcode] ) end end diff --git a/app/models/order.rb b/app/models/order.rb index 444dd170a6..bee17b13f8 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -45,4 +45,8 @@ def update_stock def valid_check self.valid?(:complete) end + + def total + orderitems.sum(&:price) #{ |order_item| order_item.price } + end end diff --git a/app/models/orderitem.rb b/app/models/orderitem.rb index dfa12743c2..eb72888be9 100644 --- a/app/models/orderitem.rb +++ b/app/models/orderitem.rb @@ -6,7 +6,5 @@ class Orderitem < ApplicationRecord validates :quantity, presence: true, numericality: { greater_than: 0, only_integer: true } - - end diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index db2c5156af..ad21af6d2c 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -27,6 +27,7 @@
    <%= f.submit "Update", class: "btn btn-primary" %>
    +
    <% end %>
    <%= button_to "Remove", order_item_path(item.id), method: :delete, class: "btn btn-primary" %>
    <% end %> diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index 7c81abe356..3db2dd9b07 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -1,3 +1,50 @@

    Confirmation page

    +

    Order ID: <%= @order.id %>

    +

    User Information

    +
    + + + + + + + + + + + + + + + +
    NameEmailMailing AdressLast 4 Didgits of Credit CardCredit Card Exp Date
    <%= @order.name %><%= @order.email %><%= @order.mailing_address %><%= @order.cc_number %><%= @order.cc_exp_date %>
    +
    + +
    +

    Order Details

    + + + + + + + + + + <%@order.orderitems.each do |item|%> + + + + + + <% end %> + + + + + + +
    Product nameQuantitySubtotal
    <%= item.product.name %><%= item.quantity %><%= item.price %>
    Total<%=@order.total %>
    +
    <%= button_to "Back to products", root_path, method: :get, class: "btn btn-primary" %> \ No newline at end of file From 3cd5bf536d19023bcc73f0945d94e5d668bb6fb4 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 11:37:12 -0800 Subject: [PATCH 145/208] generated controller and model for review --- app/assets/stylesheets/reviews.scss | 3 +++ app/controllers/reviews_controller.rb | 2 ++ app/helpers/reviews_helper.rb | 2 ++ app/models/review.rb | 2 ++ db/migrate/20201124193548_create_reviews.rb | 10 ++++++++++ test/controllers/reviews_controller_test.rb | 7 +++++++ test/models/review_test.rb | 7 +++++++ 7 files changed, 33 insertions(+) create mode 100644 app/assets/stylesheets/reviews.scss create mode 100644 app/controllers/reviews_controller.rb create mode 100644 app/helpers/reviews_helper.rb create mode 100644 app/models/review.rb create mode 100644 db/migrate/20201124193548_create_reviews.rb create mode 100644 test/controllers/reviews_controller_test.rb create mode 100644 test/models/review_test.rb diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss new file mode 100644 index 0000000000..da98aabdd8 --- /dev/null +++ b/app/assets/stylesheets/reviews.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the reviews controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb new file mode 100644 index 0000000000..b3d77cc1c3 --- /dev/null +++ b/app/controllers/reviews_controller.rb @@ -0,0 +1,2 @@ +class ReviewsController < ApplicationController +end diff --git a/app/helpers/reviews_helper.rb b/app/helpers/reviews_helper.rb new file mode 100644 index 0000000000..682b7b1abc --- /dev/null +++ b/app/helpers/reviews_helper.rb @@ -0,0 +1,2 @@ +module ReviewsHelper +end diff --git a/app/models/review.rb b/app/models/review.rb new file mode 100644 index 0000000000..b2ca4935ed --- /dev/null +++ b/app/models/review.rb @@ -0,0 +1,2 @@ +class Review < ApplicationRecord +end diff --git a/db/migrate/20201124193548_create_reviews.rb b/db/migrate/20201124193548_create_reviews.rb new file mode 100644 index 0000000000..13a7d45257 --- /dev/null +++ b/db/migrate/20201124193548_create_reviews.rb @@ -0,0 +1,10 @@ +class CreateReviews < ActiveRecord::Migration[6.0] + def change + create_table :reviews do |t| + t.integer :rating + t.string :description + + t.timestamps + end + end +end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb new file mode 100644 index 0000000000..444c98848f --- /dev/null +++ b/test/controllers/reviews_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe ReviewsController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end diff --git a/test/models/review_test.rb b/test/models/review_test.rb new file mode 100644 index 0000000000..626fa522d8 --- /dev/null +++ b/test/models/review_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Review do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 6599186c7441bb03df10efd7eba27b584c725554 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 12:11:19 -0800 Subject: [PATCH 146/208] basic setup for review: methods in controller, relation with product, and routes --- app/controllers/reviews_controller.rb | 72 +++++++++++++++++++++++++++ app/models/product.rb | 1 + app/models/review.rb | 3 ++ config/routes.rb | 1 + db/schema.rb | 9 +++- 5 files changed, 85 insertions(+), 1 deletion(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index b3d77cc1c3..fd9943c441 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,2 +1,74 @@ class ReviewsController < ApplicationController + + def index + # don't know if we need it or not + @reviews = Review.all + end + + def show + # we don't need this? + end + + def new + @review = Review.new + end + + def create + @review = Review.new(review_params) + if @review.save + flash[:success] = "Your review has been successfully added" + redirect_to product_path(@review.id) + else + flash[:error] = "Your review has not been added" + render :new, status: :bad_request + return + end + end + + def edit + if @review.nil? + flash[:error] = "The review you are looking for is not found" + redirect_to products_path + return + end + end + + def update + if @review.nil? + flash[:error] = "The review you are looking for is not found" + redirect_to products_path + return + elsif @review.update(review_params) + flash[:success] = "Your review has been successfully updated" + redirect_to product_path # go to the product details page + return + else # save failed + flash.now[:error] = "Your review has not been updated" + render :edit, status: :bad_request # show the new product form view again + return + end + end + + def destroy + if @review.nil? + render_404 + return + end + + @review.destroy + flash[:success] = "Successfully destroyed #{ @review.id }" + # need to clarify which path to redirect + redirect_back(fallback_location: root_path) + return + end + + private + + def find_review + @review = Review.find_by(id: params[:id]) + end + + def review_params + return params.require(:review).permit(:rating, :description) + end end diff --git a/app/models/product.rb b/app/models/product.rb index 34d2f537e9..9cf55ba2f5 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,6 +1,7 @@ class Product < ApplicationRecord belongs_to :user has_many :orderitems + has_many :reviews has_and_belongs_to_many :categories def create_stock_collection diff --git a/app/models/review.rb b/app/models/review.rb index b2ca4935ed..2600b23710 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,2 +1,5 @@ class Review < ApplicationRecord + belongs_to :product + + validates :rating, presence: true, :inclusion => { :in => [1,2,3,4,5] } end diff --git a/config/routes.rb b/config/routes.rb index 2ff102bf75..4f5e8332e2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,6 +10,7 @@ resources :products do resources :order_items, only: [:create] + resources :reviews end resources :orders, except: [:index, :update, :edit, :destroy] diff --git a/db/schema.rb b/db/schema.rb index c59d8781b5..5ee14bf604 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_11_21_073926) do +ActiveRecord::Schema.define(version: 2020_11_24_193548) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -64,6 +64,13 @@ t.boolean "retired", default: false end + create_table "reviews", force: :cascade do |t| + t.integer "rating" + t.string "description" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + create_table "users", force: :cascade do |t| t.string "name" t.string "description" From 4ebf404cd2c4b503353eda3eda52b2e9f4b08e92 Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Tue, 24 Nov 2020 12:44:13 -0800 Subject: [PATCH 147/208] routes no change --- config/routes.rb | 2 ++ db/schema.rb | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 2ff102bf75..c64fc4883f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,8 +12,10 @@ resources :order_items, only: [:create] end + resources :orders, except: [:index, :update, :edit, :destroy] resources :order_items, except: [:index, :new, :edit] + #login and logout routes get "/auth/github", as: "github_login" diff --git a/db/schema.rb b/db/schema.rb index c59d8781b5..5ee14bf604 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_11_21_073926) do +ActiveRecord::Schema.define(version: 2020_11_24_193548) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -64,6 +64,13 @@ t.boolean "retired", default: false end + create_table "reviews", force: :cascade do |t| + t.integer "rating" + t.string "description" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + create_table "users", force: :cascade do |t| t.string "name" t.string "description" From 00f7b3cd79f97c19319aa1270d2ee851721252bc Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 12:53:45 -0800 Subject: [PATCH 148/208] edited user validation, and error messages to show on edit form --- app/models/user.rb | 4 +++- app/views/users/edit.html.erb | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 4043d9ba23..e759b8f860 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -3,7 +3,9 @@ class User < ApplicationRecord has_many :orderitems, through: :products has_many :categories, through: :products - validates :uid, uniqueness: {scope: :provider} + validates :uid, presence:true, uniqueness: {scope: :provider} + validates :name, presence:true, uniqueness: true + validates :email, presence:true, uniqueness: true def total_revenue diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 41c146936f..d2ee11ba53 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -1,3 +1,14 @@ +<% if @user.errors.any? %> +
      + <% @user.errors.each do |column, message| %> +
    • + <%= column.capitalize %> <%= message %> +
    • + <% end %> +
    +<% end %> + + <%= form_with model: @user do |f| %>
    <%= f.label :name %> From 30bd239d5b64d3577f87a239eb32699661e75894 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 13:48:52 -0800 Subject: [PATCH 149/208] added product_id column to reviews table --- app/controllers/reviews_controller.rb | 7 +++++-- app/models/product.rb | 4 ++++ app/views/products/show.html.erb | 17 +++++++++++++++++ ...20201124214404_relate_reviews_to_products.rb | 5 +++++ db/schema.rb | 4 +++- 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20201124214404_relate_reviews_to_products.rb diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index fd9943c441..489494d26f 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -6,7 +6,10 @@ def index end def show - # we don't need this? + if @review.nil? + render_404 + return + end end def new @@ -69,6 +72,6 @@ def find_review end def review_params - return params.require(:review).permit(:rating, :description) + return params.require(:review).permit(:product_id, :rating, :description) end end diff --git a/app/models/product.rb b/app/models/product.rb index 9cf55ba2f5..892fb917e1 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -14,4 +14,8 @@ def create_stock_collection def category_on_user_show return collection = self.categories.map { |cat| cat.name } end + + def product_reviews + return self.reviews.order(id: :desc) + end end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index e82734e37c..adf93afe92 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -18,3 +18,20 @@
    + +
    +

    Product Review

    + + <% @product.product_reviews.each do |review| %> + + + + + + + + + + <% end %> +
    Review ID: <%= review.id %>
    Rating: <%= review.rating %>
    Rating: <%= review.description %>
    +
    diff --git a/db/migrate/20201124214404_relate_reviews_to_products.rb b/db/migrate/20201124214404_relate_reviews_to_products.rb new file mode 100644 index 0000000000..b9f6df9d5a --- /dev/null +++ b/db/migrate/20201124214404_relate_reviews_to_products.rb @@ -0,0 +1,5 @@ +class RelateReviewsToProducts < ActiveRecord::Migration[6.0] + def change + add_reference :reviews, :product, index: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 5ee14bf604..131cb9facf 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_11_24_193548) do +ActiveRecord::Schema.define(version: 2020_11_24_214404) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -69,6 +69,8 @@ t.string "description" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.bigint "product_id" + t.index ["product_id"], name: "index_reviews_on_product_id" end create_table "users", force: :cascade do |t| From 04d6694591d53dc620feb5e4811945cd0d9b3af8 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 14:32:13 -0800 Subject: [PATCH 150/208] changed styling in cart and footer, and added authorization checks for new and edit product --- app/assets/stylesheets/application.scss | 12 +++--------- app/controllers/products_controller.rb | 11 ++++++++++- app/controllers/users_controller.rb | 8 +++----- app/views/layouts/application.html.erb | 2 +- app/views/orders/cart.html.erb | 14 ++++++-------- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 12f7677d3c..2134188ea9 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -110,8 +110,6 @@ a:hover { margin: 25px auto 40px auto; a { color: $gold; - padding-right: 25px; - margin-right: 15px; } } p { @@ -134,14 +132,10 @@ main { background-color: $secondary-color; margin-bottom: 0.5rem; padding: 2rem 1rem 0.5rem 1rem; - h1 { + h6 { text-align: center; - margin: 25px auto 40px auto; - a { - color: $gold; - padding-right: 25px; - margin-right: 15px; - } + margin: 25px auto 25px auto; + color: $gold; } p { margin-bottom: 5px; diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 4461088762..86204ba101 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -14,6 +14,11 @@ def show end def new + if session[:user_id].nil? + flash[:error] = "You cannot add a new product without signing in." + redirect_to root_path + return + end @product = Product.new end @@ -35,7 +40,11 @@ def edit flash[:error] = "Product not found" redirect_to products_path return - + end + if session[:user_id] != @product.user.id + flash[:error] = "You cannot edit another user's products." + redirect_to root_path + return end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index b3ea3bfeb0..342d309fc0 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,8 +1,7 @@ class UsersController < ApplicationController - before_action :find_user, only: [:show, :edit, :update] + before_action :find_user, except: [:create, :destroy] def show_products - @user = User.find_by(id: session[:user_id]) if @user.nil? render_404 return @@ -10,7 +9,6 @@ def show_products end def show_fulfillments - @user = User.find_by(id: session[:user_id]) if @user.nil? render_404 return @@ -18,7 +16,7 @@ def show_fulfillments end def show - if @user.nil? + if @user.nil? #probably needs a redirect? render_404 return elsif session[:user_id] != @user.id @@ -88,7 +86,7 @@ def destroy private def find_user - @user = User.find_by(id: params[:id]) + @user = User.find_by(id: session[:user_id]) end def user_params diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index e9fe212c9d..441f0fcb90 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -74,7 +74,7 @@
    - © 2020 Mama Jeti +
    © 2020 Mama Jeti
    diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index ad21af6d2c..19cadd6499 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -8,12 +8,8 @@
    Update Quantity
    Remove Item
    - - - <% @cart.orderitems.order(id: :asc).each do |item| %> -
    - <%= form_with model: @orderitem, url: cart_update_path(item.id), method: :patch do |f| %> - + <% @cart.orderitems.order(id: :asc).each do |item| %> + <%= form_with model: @orderitem, url: cart_update_path(item.id), method: :patch do |f| %>
    <%= link_to item.product.name, product_path(item.product.id) %> @@ -28,9 +24,11 @@ <%= f.submit "Update", class: "btn btn-primary" %>
    + <% end %> +
    + <%= button_to "Remove", order_item_path(item.id), method: :delete, class: "btn btn-primary" %> +
    <% end %> -
    <%= button_to "Remove", order_item_path(item.id), method: :delete, class: "btn btn-primary" %>
    - <% end %>
    <%= button_to "Proceed to Checkout", payment_path(@cart.id), method: :get, class: "btn btn-primary" %> From e010b7a8f182eb8fb6166c7fbb913b64edf6cf37 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 15:10:31 -0800 Subject: [PATCH 151/208] fixed cart view and added category button in new product --- app/views/orders/cart.html.erb | 2 +- app/views/products/new.html.erb | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index 19cadd6499..711efb4901 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -23,11 +23,11 @@
    <%= f.submit "Update", class: "btn btn-primary" %>
    - <% end %>
    <%= button_to "Remove", order_item_path(item.id), method: :delete, class: "btn btn-primary" %>
    + <% end %> diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index 21a5c107dc..a26a5cd749 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -12,3 +12,6 @@ <%= render partial: "form", locals: { action_name: "Add Product"} %> + +<%= button_to "Add a New Category", class: "btn btn-primary" %> + From 1342ac2d23bc89e8126070f43bb24f60c1723ee5 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 16:13:19 -0800 Subject: [PATCH 152/208] added review button to product show page --- app/controllers/reviews_controller.rb | 9 ++++----- app/views/products/show.html.erb | 13 +++++++++++-- app/views/reviews/edit.html.erb | 0 app/views/reviews/new.html.erb | 0 4 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 app/views/reviews/edit.html.erb create mode 100644 app/views/reviews/new.html.erb diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 489494d26f..db53f57dc4 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,4 +1,5 @@ class ReviewsController < ApplicationController + before_action :find_review def index # don't know if we need it or not @@ -30,20 +31,18 @@ def create def edit if @review.nil? - flash[:error] = "The review you are looking for is not found" - redirect_to products_path + render_404 return end end def update if @review.nil? - flash[:error] = "The review you are looking for is not found" - redirect_to products_path + render_404 return elsif @review.update(review_params) flash[:success] = "Your review has been successfully updated" - redirect_to product_path # go to the product details page + redirect_to product_review_path(@review) return else # save failed flash.now[:error] = "Your review has not been updated" diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index adf93afe92..e79c098f85 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -20,7 +20,10 @@
    -

    Product Review

    +
    +

    Product Review

    + <%= button_to "Add New Review", new_product_review_path(@product), method: :get, class: "nav-link" %> +
    <% @product.product_reviews.each do |review| %> @@ -30,7 +33,13 @@ - + + + +
    + <%= button_to "Edit Review", edit_product_review_path(review.id), method: :get, class: "nav-link" %> + <%= button_to "Delete Review", product_review_path(review), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> +
    <% end %>
    Rating: <%= review.rating %>
    Rating: <%= review.description %> Description: <%= review.description %>
    diff --git a/app/views/reviews/edit.html.erb b/app/views/reviews/edit.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb new file mode 100644 index 0000000000..e69de29bb2 From 0df410ecbc36724306e7ecca467afa44bcb3e057 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 16:22:48 -0800 Subject: [PATCH 153/208] created category controller --- app/assets/stylesheets/categories.scss | 3 +++ app/controllers/categories_controller.rb | 8 ++++++++ app/helpers/categories_helper.rb | 2 ++ app/models/category.rb | 2 ++ app/views/orders/show.html.erb | 2 +- app/views/products/_form.html.erb | 1 + test/controllers/categories_controller_test.rb | 7 +++++++ 7 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 app/assets/stylesheets/categories.scss create mode 100644 app/controllers/categories_controller.rb create mode 100644 app/helpers/categories_helper.rb create mode 100644 test/controllers/categories_controller_test.rb diff --git a/app/assets/stylesheets/categories.scss b/app/assets/stylesheets/categories.scss new file mode 100644 index 0000000000..068dd1a3b9 --- /dev/null +++ b/app/assets/stylesheets/categories.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Categories controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb new file mode 100644 index 0000000000..5b99cb0894 --- /dev/null +++ b/app/controllers/categories_controller.rb @@ -0,0 +1,8 @@ +class CategoriesController < ApplicationController + + def create + @category = Category.find_by(id: params[:id]) + + end + +end diff --git a/app/helpers/categories_helper.rb b/app/helpers/categories_helper.rb new file mode 100644 index 0000000000..e06f31554c --- /dev/null +++ b/app/helpers/categories_helper.rb @@ -0,0 +1,2 @@ +module CategoriesHelper +end diff --git a/app/models/category.rb b/app/models/category.rb index 9b7ad6977e..124468ee97 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,4 +1,6 @@ class Category < ApplicationRecord has_and_belongs_to_many :products has_many :users, through: :products + + end diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 75c2e1bc5a..f8cf750d79 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -6,7 +6,7 @@ Name Email Mailing Adress - Last 4 Didgits of Credit Card + Last 4 Digits of Credit Card Credit Card Exp Date diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index 9214b37ed9..008ad44460 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -26,6 +26,7 @@ <%= b.label(class:"label-checkbox") {b.check_box + b.text} %> <% end %> +
    <%= f.submit action_name, class: "btn btn-primary" %>
    diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb new file mode 100644 index 0000000000..fc964739f0 --- /dev/null +++ b/test/controllers/categories_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe CategoriesController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 8271b4c862e0e574519d05f95ce38e495c6e1632 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 17:05:26 -0800 Subject: [PATCH 154/208] create category method and validations --- app/controllers/categories_controller.rb | 11 +++++++++-- app/models/category.rb | 2 +- app/views/products/_form.html.erb | 10 +++++++++- app/views/products/new.html.erb | 1 + config/routes.rb | 1 + 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 5b99cb0894..5e34fab931 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,8 +1,15 @@ class CategoriesController < ApplicationController def create - @category = Category.find_by(id: params[:id]) - + @category = Category.new(name: params[:name]) + if @category.save + flash[:success] = "Category has been successfully added" + redirect_to new_product_path + else + flash[:error] = "Product has not been added" + redirect_to new_product_path + return + end end end diff --git a/app/models/category.rb b/app/models/category.rb index 124468ee97..d6840b7698 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -2,5 +2,5 @@ class Category < ApplicationRecord has_and_belongs_to_many :products has_many :users, through: :products - + validates :name, presence: true, uniqueness: true end diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index 008ad44460..128afd0037 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -26,9 +26,17 @@ <%= b.label(class:"label-checkbox") {b.check_box + b.text} %> <% end %> -
    <%= f.submit action_name, class: "btn btn-primary" %>
    <% end %> + <%= form_with model: @category, url: categories_path, method: :post do |f| %> +
    + <%= f.label :new_category %> + <%= f.text_field :name %> +
    +
    + <%= f.submit "Add New Category", class: "btn btn-primary" %> +
    + <% end %>
    \ No newline at end of file diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index 21a5c107dc..4b322994da 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -8,6 +8,7 @@ <% end %> +

    Add a new product

    diff --git a/config/routes.rb b/config/routes.rb index 2ff102bf75..609e06d083 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,7 @@ resources :order_items, only: [:create] end + resources :categories, only: [:create] resources :orders, except: [:index, :update, :edit, :destroy] resources :order_items, except: [:index, :new, :edit] From 6d1424f33055bb80dbf5b09d4b28056561aa2938 Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Tue, 24 Nov 2020 17:16:43 -0800 Subject: [PATCH 155/208] _form and partial views for reviews --- app/models/product.rb | 9 +++++++++ app/views/orders/confirmation.html.erb | 4 ++-- app/views/reviews/_form.html.erb | 15 +++++++++++++++ app/views/reviews/edit.html.erb | 14 ++++++++++++++ app/views/reviews/new.html.erb | 13 +++++++++++++ 5 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 app/views/reviews/_form.html.erb create mode 100644 app/views/reviews/edit.html.erb create mode 100644 app/views/reviews/new.html.erb diff --git a/app/models/product.rb b/app/models/product.rb index 892fb917e1..c301b2e96d 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -4,6 +4,15 @@ class Product < ApplicationRecord has_many :reviews has_and_belongs_to_many :categories + validates :name, presence: true + validates :stock, presence: true, numericality: { greater_than: 0, only_integer: true } + validates :price, presence: true + validates :description, presence: true + validates :user_id, presence: true + validates :photo_url, presence: true + + + def create_stock_collection currently_instock = self.stock stock_collection = [] diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index 3db2dd9b07..048568e880 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -6,8 +6,8 @@ Name Email - Mailing Adress - Last 4 Didgits of Credit Card + Mailing Address + Last 4 Digits of Credit Card Credit Card Exp Date diff --git a/app/views/reviews/_form.html.erb b/app/views/reviews/_form.html.erb new file mode 100644 index 0000000000..74ab67969f --- /dev/null +++ b/app/views/reviews/_form.html.erb @@ -0,0 +1,15 @@ +
    + <%= form_with model: @product do |f| %> +
    + <%= f.label :rating %> + <%= f.text_field :rating%> +
    +
    + <%= f.label :description %> + <%= f.text_field :description %> +
    +
    + <%= f.submit "submit_button", class: "btn btn-primary" %> +
    + <% end %> +
    \ No newline at end of file diff --git a/app/views/reviews/edit.html.erb b/app/views/reviews/edit.html.erb new file mode 100644 index 0000000000..8822c73ea9 --- /dev/null +++ b/app/views/reviews/edit.html.erb @@ -0,0 +1,14 @@ +<% if @review.errors.any? %> +
      + <% @review.errors.each do |column, message| %> +
    • + <%= column.capitalize %> <%= message %> +
    • + <% end %> +
    +<% end %> + +

    Edit review

    + + +<%= render partial: "form", locals: { action_name: "Edit review"} %> \ No newline at end of file diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb new file mode 100644 index 0000000000..d3bac91ae1 --- /dev/null +++ b/app/views/reviews/new.html.erb @@ -0,0 +1,13 @@ +<% if @review.errors.any? %> +
      + <% @review.errors.each do |column, message| %> +
    • + <%= column.capitalize %> <%= message %> +
    • + <% end %> +
    +<% end %> + +

    Add a new review

    + +<%= render partial: "form", locals: { action_name: "Add review"} %> \ No newline at end of file From 972f985abceca67761f3953b69470d8326a90394 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 17:31:10 -0800 Subject: [PATCH 156/208] fixed double routes parameters issues --- app/controllers/reviews_controller.rb | 16 ++++++++++------ app/views/products/show.html.erb | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index db53f57dc4..c87fbe9d53 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -8,7 +8,8 @@ def index def show if @review.nil? - render_404 + flash.now[:error] = "The review you are looking for is not found" + redirect_to product_path(@review.product_id) return end end @@ -21,7 +22,7 @@ def create @review = Review.new(review_params) if @review.save flash[:success] = "Your review has been successfully added" - redirect_to product_path(@review.id) + redirect_to product_path(@review.product_id) else flash[:error] = "Your review has not been added" render :new, status: :bad_request @@ -31,14 +32,16 @@ def create def edit if @review.nil? - render_404 + flash.now[:error] = "The review you are looking for is not found" + redirect_to product_path(@review.product_id) return end end def update if @review.nil? - render_404 + flash.now[:error] = "The review you are looking for is not found" + redirect_to product_path(@review.product_id) return elsif @review.update(review_params) flash[:success] = "Your review has been successfully updated" @@ -46,14 +49,15 @@ def update return else # save failed flash.now[:error] = "Your review has not been updated" - render :edit, status: :bad_request # show the new product form view again + render :edit, status: :bad_request return end end def destroy if @review.nil? - render_404 + flash.now[:error] = "The review you are looking for is not found" + redirect_to product_path(@review.product_id) return end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index e79c098f85..943d528a3a 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -37,8 +37,8 @@
    - <%= button_to "Edit Review", edit_product_review_path(review.id), method: :get, class: "nav-link" %> - <%= button_to "Delete Review", product_review_path(review), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> + <%= button_to "Edit Review", edit_product_review_path(product_id: @product, id: review), method: :get, class: "nav-link" %> + <%= button_to "Delete Review", product_review_path(product_id: @product, id: review), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %>
    <% end %> From 1de1cd88d04193b7ff5264e41aeba0378504c994 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 17:32:18 -0800 Subject: [PATCH 157/208] added simplecov code to fix percentage covered --- config/spring.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config/spring.rb b/config/spring.rb index db5bf1307a..530e34330f 100644 --- a/config/spring.rb +++ b/config/spring.rb @@ -4,3 +4,8 @@ "tmp/restart.txt", "tmp/caching-dev.txt" ) + +if ENV['RAILS_ENV'] == 'test' + require 'simplecov' + SimpleCov.start 'rails' +end From ef33de7b096e38d8b50c30a1abb692ae5445a40a Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Tue, 24 Nov 2020 17:32:21 -0800 Subject: [PATCH 158/208] updated views for reviews and update product model validation --- app/models/product.rb | 7 ++----- app/views/reviews/_form.html.erb | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index c301b2e96d..6ba7e4cb04 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -4,13 +4,10 @@ class Product < ApplicationRecord has_many :reviews has_and_belongs_to_many :categories - validates :name, presence: true + validates :name, presence: true, uniqueness: true validates :stock, presence: true, numericality: { greater_than: 0, only_integer: true } - validates :price, presence: true + validates :price, presence: true, numericality: { greater_than: 0, only_integer: true } validates :description, presence: true - validates :user_id, presence: true - validates :photo_url, presence: true - def create_stock_collection diff --git a/app/views/reviews/_form.html.erb b/app/views/reviews/_form.html.erb index 74ab67969f..37c4ade19e 100644 --- a/app/views/reviews/_form.html.erb +++ b/app/views/reviews/_form.html.erb @@ -2,7 +2,7 @@ <%= form_with model: @product do |f| %>
    <%= f.label :rating %> - <%= f.text_field :rating%> + <%= f.select :rating, [[1,1], [2,2], [3,3], [4,4], [5,5]]%>
    <%= f.label :description %> From 8b8660b33eaf534e772020581b0ad55280d83d96 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 17:41:00 -0800 Subject: [PATCH 159/208] changed styling in homepage --- app/views/products/index.html.erb | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index a04a270733..e8a260440a 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -17,10 +17,22 @@
    <% @products.each do |product| %> <% unless product.retired %> - <%= link_to product_path(product.id) do %> - <%= image_tag "#{product.photo_url}", alt: "filler image" %> - <% end %> +
    + filler image +
    +
    <%= link_to product.name, product_path(product.id) %>
    +

    <%= product.description %>

    +
    +
    <% end %> <% end %> + <%# @products.each do |product| %> + <%# unless product.retired %> + <%#= link_to product_path(product.id) do %> + <%#= image_tag "#{product.photo_url}", alt: "filler image" %> + <%# end %> + <%# end %> + <%# end %>
    + From 1ab3d37a6b3ec11413a12c05f7d04d841b1efbbe Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 17:53:17 -0800 Subject: [PATCH 160/208] corrected new category button --- app/views/products/new.html.erb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index 80e1d64750..8bd18a4284 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -14,5 +14,4 @@ <%= render partial: "form", locals: { action_name: "Add Product"} %> -<%= button_to "Add a New Category", class: "btn btn-primary" %> From 6657f95ed7ed48f9f419d0209d9496c618dcbee8 Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Tue, 24 Nov 2020 18:22:22 -0800 Subject: [PATCH 161/208] got rid of partial forms and made a new and edit forms --- app/views/reviews/_form.html.erb | 15 --------------- app/views/reviews/edit.html.erb | 17 +++++++++++++++-- app/views/reviews/new.html.erb | 16 +++++++++++++++- config/routes.rb | 1 - 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/app/views/reviews/_form.html.erb b/app/views/reviews/_form.html.erb index 37c4ade19e..e69de29bb2 100644 --- a/app/views/reviews/_form.html.erb +++ b/app/views/reviews/_form.html.erb @@ -1,15 +0,0 @@ -
    - <%= form_with model: @product do |f| %> -
    - <%= f.label :rating %> - <%= f.select :rating, [[1,1], [2,2], [3,3], [4,4], [5,5]]%> -
    -
    - <%= f.label :description %> - <%= f.text_field :description %> -
    -
    - <%= f.submit "submit_button", class: "btn btn-primary" %> -
    - <% end %> -
    \ No newline at end of file diff --git a/app/views/reviews/edit.html.erb b/app/views/reviews/edit.html.erb index 8822c73ea9..b4c05285be 100644 --- a/app/views/reviews/edit.html.erb +++ b/app/views/reviews/edit.html.erb @@ -10,5 +10,18 @@

    Edit review

    - -<%= render partial: "form", locals: { action_name: "Edit review"} %> \ No newline at end of file +
    +<%= form_with model: @review,url: product_reviews_path(product_id: @review.product_id, id: review), method: :patch, class: 'review-form' do |f| %> +
    + <%= f.label :rating %> + <%= f.select :rating, [[1,1], [2,2], [3,3], [4,4], [5,5]]%> +
    +
    + <%= f.label :description %> + <%= f.text_field :description %> +
    +
    + <%= f.submit "submit_button", class: "btn btn-primary" %> +
    +<% end %> +
    \ No newline at end of file diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index d3bac91ae1..97de2f7d67 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -10,4 +10,18 @@

    Add a new review

    -<%= render partial: "form", locals: { action_name: "Add review"} %> \ No newline at end of file +
    +<%= form_with model: @review,url: product_reviews_path(product_id:@review.product_id) , method: :post, class: 'review-form' do |f| %> +
    + <%= f.label :rating %> + <%= f.select :rating, [[1,1], [2,2], [3,3], [4,4], [5,5]]%> +
    +
    + <%= f.label :description %> + <%= f.text_field :description %> +
    +
    + <%= f.submit "submit_button", class: "btn btn-primary" %> +
    +<% end %> +
    \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index b98154cddd..f59f11dcf9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -13,7 +13,6 @@ resources :reviews end - resources :orders, except: [:index, :update, :edit, :destroy] resources :order_items, except: [:index, :new, :edit] From 7a26ac15181b3a0823873b50a5d88553c9e8b2d8 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 18:22:50 -0800 Subject: [PATCH 162/208] fix url for the new/edit forms for review --- app/controllers/reviews_controller.rb | 33 +++++++++++++++++++++++++-- app/views/reviews/_form.html.erb | 15 ------------ app/views/reviews/edit.html.erb | 16 ++++++++++++- app/views/reviews/new.html.erb | 16 ++++++++++++- 4 files changed, 61 insertions(+), 19 deletions(-) delete mode 100644 app/views/reviews/_form.html.erb diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index c87fbe9d53..869a1f04b1 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -16,21 +16,43 @@ def show def new @review = Review.new + @product = Product.find_by(id: params[:product_id]) + if @product.nil? + flash.now[:error] = "Couldn't find this product" + redirect_to root_path + return + end end def create + @product = Product.find_by(id: params[:product_id]) + if @product.nil? + flash.now[:error] = "Couldn't find this product" + redirect_to root_path + return + end + @review = Review.new(review_params) + @review.product_id = params[:product_id] + if @review.save flash[:success] = "Your review has been successfully added" redirect_to product_path(@review.product_id) else flash[:error] = "Your review has not been added" - render :new, status: :bad_request + redirect_to product_path(@review.product_id) return end end def edit + @product = Product.find_by(id: params[:product_id]) + if @product.nil? + flash.now[:error] = "Couldn't find this product" + redirect_to root_path + return + end + if @review.nil? flash.now[:error] = "The review you are looking for is not found" redirect_to product_path(@review.product_id) @@ -39,13 +61,20 @@ def edit end def update + @product = Product.find_by(id: params[:product_id]) + if @product.nil? + flash.now[:error] = "Couldn't find this product" + redirect_to root_path + return + end + if @review.nil? flash.now[:error] = "The review you are looking for is not found" redirect_to product_path(@review.product_id) return elsif @review.update(review_params) flash[:success] = "Your review has been successfully updated" - redirect_to product_review_path(@review) + redirect_to product_path(@review.product_id) return else # save failed flash.now[:error] = "Your review has not been updated" diff --git a/app/views/reviews/_form.html.erb b/app/views/reviews/_form.html.erb deleted file mode 100644 index 37c4ade19e..0000000000 --- a/app/views/reviews/_form.html.erb +++ /dev/null @@ -1,15 +0,0 @@ -
    - <%= form_with model: @product do |f| %> -
    - <%= f.label :rating %> - <%= f.select :rating, [[1,1], [2,2], [3,3], [4,4], [5,5]]%> -
    -
    - <%= f.label :description %> - <%= f.text_field :description %> -
    -
    - <%= f.submit "submit_button", class: "btn btn-primary" %> -
    - <% end %> -
    \ No newline at end of file diff --git a/app/views/reviews/edit.html.erb b/app/views/reviews/edit.html.erb index 8822c73ea9..5961ae2e59 100644 --- a/app/views/reviews/edit.html.erb +++ b/app/views/reviews/edit.html.erb @@ -11,4 +11,18 @@

    Edit review

    -<%= render partial: "form", locals: { action_name: "Edit review"} %> \ No newline at end of file +
    + <%= form_with model: @review, url: product_review_path(product_id: @review.product_id, id: @review.id), method: :patch do |f| %> +
    + <%= f.label :rating %> + <%= f.select :rating, [[1,1], [2,2], [3,3], [4,4], [5,5]]%> +
    +
    + <%= f.label :description %> + <%= f.text_field :description %> +
    +
    + <%= f.submit "submit_button", class: "btn btn-primary" %> +
    + <% end %> +
    \ No newline at end of file diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index d3bac91ae1..36d1a04ee8 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -10,4 +10,18 @@

    Add a new review

    -<%= render partial: "form", locals: { action_name: "Add review"} %> \ No newline at end of file +
    + <%= form_with model: @review, url: product_reviews_path(product_id: @product), method: :post do |f| %> +
    + <%= f.label :rating %> + <%= f.select :rating, [[1,1], [2,2], [3,3], [4,4], [5,5]]%> +
    +
    + <%= f.label :description %> + <%= f.text_field :description %> +
    +
    + <%= f.submit "submit_button", class: "btn btn-primary" %> +
    + <% end %> +
    \ No newline at end of file From d017f159c8ad0ab93ca186826a0d865e08e2f727 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 18:45:17 -0800 Subject: [PATCH 163/208] styled footer --- app/assets/stylesheets/application.scss | 35 ++++++++++++++++++++----- app/views/layouts/application.html.erb | 12 ++++++++- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 2134188ea9..8f2c494e5c 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -27,7 +27,7 @@ $pink: #fe6d73; $default-border: 2px solid; -body, h1, h2, h3, h4, h5 { +body, h1, h2, h3, h4, h5, h6 { font-family: $primary-font } @@ -127,20 +127,41 @@ main { padding: 2rem; } -.app-footer { +.app-footer__footer { max-width: 100%; background-color: $secondary-color; - margin-bottom: 0.5rem; - padding: 2rem 1rem 0.5rem 1rem; + padding: 0.5rem 0.5rem 0.5rem 0.5rem; h6 { text-align: center; margin: 25px auto 25px auto; color: $gold; } - p { - margin-bottom: 5px; - } } + + +.app-footer__nav { + display: flex; + flex-direction: row; + justify-content: space-between; + justify-content: center; +} + +.app-footer__nav_item { + margin-top: 1rem; +} + +.app-footer__nav_item .nav-link { + color: $dark-grey; +} + +.app-footer__site-nav-container .app-footer__nav_item { + margin-right: 2rem; +} + +.app-footer__user-nav-container .nav-item { + margin-left: 2rem; +} + .product-photo { width: 2.5rem; diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 441f0fcb90..42822430aa 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -73,7 +73,17 @@ <%= yield %> -
    +
    +
    © 2020 Mama Jeti
    From 98ec6c367c9487d792961a5a5c2190f3315beaf8 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 20:43:51 -0800 Subject: [PATCH 164/208] removed over-nested routes for review actions --- app/controllers/reviews_controller.rb | 27 --------------------------- app/views/products/show.html.erb | 4 ++-- app/views/reviews/_form.html.erb | 0 app/views/reviews/edit.html.erb | 2 +- config/routes.rb | 4 ++-- 5 files changed, 5 insertions(+), 32 deletions(-) delete mode 100644 app/views/reviews/_form.html.erb diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 869a1f04b1..af9735adb2 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,19 +1,6 @@ class ReviewsController < ApplicationController before_action :find_review - def index - # don't know if we need it or not - @reviews = Review.all - end - - def show - if @review.nil? - flash.now[:error] = "The review you are looking for is not found" - redirect_to product_path(@review.product_id) - return - end - end - def new @review = Review.new @product = Product.find_by(id: params[:product_id]) @@ -46,13 +33,6 @@ def create end def edit - @product = Product.find_by(id: params[:product_id]) - if @product.nil? - flash.now[:error] = "Couldn't find this product" - redirect_to root_path - return - end - if @review.nil? flash.now[:error] = "The review you are looking for is not found" redirect_to product_path(@review.product_id) @@ -61,13 +41,6 @@ def edit end def update - @product = Product.find_by(id: params[:product_id]) - if @product.nil? - flash.now[:error] = "Couldn't find this product" - redirect_to root_path - return - end - if @review.nil? flash.now[:error] = "The review you are looking for is not found" redirect_to product_path(@review.product_id) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 943d528a3a..fe40a1730e 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -37,8 +37,8 @@
    - <%= button_to "Edit Review", edit_product_review_path(product_id: @product, id: review), method: :get, class: "nav-link" %> - <%= button_to "Delete Review", product_review_path(product_id: @product, id: review), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> + <%= button_to "Edit Review", edit_review_path(review), method: :get, class: "nav-link" %> + <%= button_to "Delete Review", review_path(review), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %>
    <% end %> diff --git a/app/views/reviews/_form.html.erb b/app/views/reviews/_form.html.erb deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/views/reviews/edit.html.erb b/app/views/reviews/edit.html.erb index f75ace6121..16eb4ccfb0 100644 --- a/app/views/reviews/edit.html.erb +++ b/app/views/reviews/edit.html.erb @@ -13,7 +13,7 @@

    Review ID: <%= @review.id %>

    Product: <%= @review.product.name %>

    - <%= form_with model: @review, url: product_review_path(product_id: @review.product_id, id: @review.id), method: :patch do |f| %> + <%= form_with model: @review, url: review_path(@review), method: :patch do |f| %>
    <%= f.label :rating %> <%= f.select :rating, [[1,1], [2,2], [3,3], [4,4], [5,5]]%> diff --git a/config/routes.rb b/config/routes.rb index 6c415d6868..3c61582d0f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,14 +10,14 @@ resources :products do resources :order_items, only: [:create] - resources :reviews + resources :reviews, only: [:new, :create] end resources :categories, only: [:create] resources :orders, except: [:index, :update, :edit, :destroy] resources :order_items, except: [:index, :new, :edit] - + resources :reviews, only: [:edit, :update, :destroy] #login and logout routes get "/auth/github", as: "github_login" From c81910ed515a4e623b498ef9823e85ea270a205a Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 20:53:16 -0800 Subject: [PATCH 165/208] changed nav bar styling and edited test for edit user --- app/assets/stylesheets/application.scss | 3 +-- app/views/products/index.html.erb | 2 +- test/controllers/users_controller_test.rb | 14 +++++--------- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 8f2c494e5c..1acc0ff31b 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -77,7 +77,7 @@ a:hover { .app-header__nav { display: flex; flex-direction: row; - justify-content: space-between; + justify-content: center; } .app-header__nav_item { @@ -142,7 +142,6 @@ main { .app-footer__nav { display: flex; flex-direction: row; - justify-content: space-between; justify-content: center; } diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index e8a260440a..f08e6d43b9 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -18,7 +18,7 @@ <% @products.each do |product| %> <% unless product.retired %>
    - filler image + <%= image_tag product.photo_url, class: "card-img-top", alt: "filler image" %>
    <%= link_to product.name, product_path(product.id) %>

    <%= product.description %>

    diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index a0c4ef87bf..ab6e02e9f2 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -92,29 +92,25 @@ describe "edit" do - #need to figure out how to test edit since it's only visible to the session[:user_id] it "responds with success when getting the edit page for an existing user while logged in as that user" do - skip # Arrange - user = users(:ada) - # Ensure there is an existing user saved + perform_login # Act - get edit_user_path(user.id) + get edit_user_path(session[:user_id]) # Assert must_respond_with :success end it "responds with redirect when getting the edit page for an existing user while logged in as different user" do - skip # Arrange - user = users(:ada) + perform_login # Ensure there is an existing user saved # Act - get edit_user_path(user.id) + get edit_user_path(45) # Assert - must_respond_with :success + must_respond_with :redirect end it "responds with redirect when getting the edit page for an existing user while not logged in" do From c639fe7bd91cacba969e3c2f9b6078cc140f5596 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 21:47:47 -0800 Subject: [PATCH 166/208] untrue to branch name; changed a bunch of styling --- app/assets/stylesheets/application.scss | 8 ++---- app/controllers/order_items_controller.rb | 6 ++--- app/views/orders/confirmation.html.erb | 13 +++++---- app/views/orders/payment.html.erb | 2 +- app/views/products/index.html.erb | 26 +++++++++--------- app/views/products/show.html.erb | 32 ++++++++++------------- app/views/reviews/new.html.erb | 2 +- 7 files changed, 40 insertions(+), 49 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 1acc0ff31b..c4ec4937ac 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -104,17 +104,14 @@ a:hover { max-width: 100%; background-color: $secondary-color; margin-bottom: 0.5rem; - padding: 2rem 1rem 0.5rem 1rem; + padding: 2rem 1rem 1rem 1rem; h1 { text-align: center; - margin: 25px auto 40px auto; + margin: 10px auto 10px auto; a { color: $gold; } } - p { - margin-bottom: 5px; - } } .alert__container { @@ -133,7 +130,6 @@ main { padding: 0.5rem 0.5rem 0.5rem 0.5rem; h6 { text-align: center; - margin: 25px auto 25px auto; color: $gold; } } diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index bebc14d6b2..94ab42361a 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -19,8 +19,8 @@ def create # create/update shopping cart on product pages if @order_item.save flash[:success] = "Successfully added this item to your cart!" - redirect_back(fallback_location: root_path) - return + redirect_to cart_path + return else flash[:error] = "Something went wrong, please try again!" redirect_back(fallback_location: root_path) @@ -37,7 +37,7 @@ def create # create/update shopping cart on product pages return elsif @order_item.save flash[:success] = "Successfully updated this item in your cart!" - redirect_back(fallback_location: root_path) + redirect_to cart_path return else flash[:error] = "Something went wrong, please try again!" diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index 048568e880..72baa9484c 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -1,6 +1,5 @@ -

    Confirmation page

    -

    Order ID: <%= @order.id %>

    -

    User Information

    +

    Order Confirmation | Order #<%= @order.id %>

    +

    Buyer Information

    @@ -21,7 +20,7 @@
    -

    Order Details

    +

    Order Details

    @@ -35,13 +34,13 @@ - + <% end %> - - + +
    <%= item.product.name %> <%= item.quantity %><%= item.price %>$<%= item.price %>
    Total<%=@order.total %>

    Total :

    $<%=@order.total %>
    diff --git a/app/views/orders/payment.html.erb b/app/views/orders/payment.html.erb index c91790a378..a003f9ebbd 100644 --- a/app/views/orders/payment.html.erb +++ b/app/views/orders/payment.html.erb @@ -42,7 +42,7 @@ <%= f.text_field :billing_zipcode %>
    - <%= f.submit "Confirm Order", class: "order-button" %> + <%= f.submit "Confirm Order", class: "btn btn-primary" %> <% end %>
    \ No newline at end of file diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index f08e6d43b9..a9f97f11e9 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,16 +1,16 @@ - + + + + <%# ["Software development", "Sports", "Music", "Acting", "Art", "Writing"].each do |category| %> + + + + + + + <%# end %> + +

    Currently Viewing: <%= "All Products" %>

    <%= select_tag(:category, options_for_select([["All"],["Software development"], ["Sports"], ["Music"], ["Acting"], ["Art"], ["Writing"]])) %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 943d528a3a..21370db0ac 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -20,26 +20,22 @@
    -
    -

    Product Review

    - <%= button_to "Add New Review", new_product_review_path(@product), method: :get, class: "nav-link" %> -
    - +

    Product Review:<%= button_to "Add New Review", new_product_review_path(@product), method: :get, class: "btn btn-primary" %>

    +
    + + + + + + + <% @product.product_reviews.each do |review| %> - - - - - - - - - -
    - <%= button_to "Edit Review", edit_product_review_path(product_id: @product, id: review), method: :get, class: "nav-link" %> - <%= button_to "Delete Review", product_review_path(product_id: @product, id: review), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> -
    + + + + + <% end %>
    Review IDRatingReviewEdit ReviewDelete Review
    Review ID: <%= review.id %>
    Rating: <%= review.rating %>
    Description: <%= review.description %>
    <%= review.id %><%= review.rating %><%= review.description %><%= button_to "Edit", edit_product_review_path(product_id: @product, id: review), method: :get, class: "btn btn-primary" %><%= button_to "Delete", product_review_path(product_id: @product, id: review), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %>
    diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index a32038d628..aa7e28c41d 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -22,7 +22,7 @@ <%= f.text_field :description %>
    - <%= f.submit "submit_button", class: "btn btn-primary" %> + <%= f.submit "Submit Review", class: "btn btn-primary" %>
    <% end %> \ No newline at end of file From 51891dbaac1a3dc87a5c6a274ce3df50ff231a43 Mon Sep 17 00:00:00 2001 From: Marj E Date: Tue, 24 Nov 2020 21:54:36 -0800 Subject: [PATCH 167/208] fixed all select filter for merchant and category --- app/controllers/application_controller.rb | 6 +++ app/controllers/products_controller.rb | 44 ++++++++++++++++- app/models/category.rb | 27 ++++++++++- app/views/products/index.html.erb | 59 ++++++++++++++++++++--- config/routes.rb | 4 ++ db/schema.rb | 9 +++- 6 files changed, 138 insertions(+), 11 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a91ee97980..076dbf5719 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -17,6 +17,12 @@ def render_404 return render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false end + def clear_session(*args) + args.each do |session_key| + session[session_key] = nil + end + end + private def find_user diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 4461088762..e94a100ede 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,8 +1,19 @@ class ProductsController < ApplicationController before_action :find_product, only: [:show, :edit, :update, :destroy, :retired] + before_action :initialize_search, only: [:index] def index - @products = Product.all + @products = Product.where(retired: false) + @users = User.all + @categories_select = Category.alphabetical + + handle_search_name + handle_filters + end + + def clear + clear_session(:search_name, :filter_name, :filter) + redirect_to products_path end def show @@ -40,7 +51,6 @@ def edit end def update - if @product.nil? flash[:error] = "Product not found" redirect_to products_path @@ -120,4 +130,34 @@ def find_product def product_params return params.require(:product).permit(:name, :stock, :price, :description, :photo_url, :user_id, category_ids: []) end + + + def initialize_search + @categories = Category.alphabetical + session[:search_name] ||= params[:search_name] + if session[:filter] != params[:filter] + params[:filter_option] = nil + end + session[:filter] = params[:filter] + params[:filter_option] = nil if params[:filter_option] == "" + session[:filter_option] = params[:filter_option] + end + + def handle_search_name + if session[:search_name] + @products = Product.where("name LIKE ?", "%#{session[:search_name]}%") + @categories = @categories.restrict_by_products(@products) + end + end + + def handle_filters + @filter_merchant = nil + if session[:filter_option] && session[:filter] == "merchant" + @filter_merchant = User.find_by(id: session[:filter_option]) + @products = @products.where(user_id: session[:filter_option]) + @categories = @categories.restrict_by_products(@products) + elsif session[:filter_option] && session[:filter] == "category" + @categories = @categories.where(id: session[:filter_option]) + end + end end diff --git a/app/models/category.rb b/app/models/category.rb index 9b7ad6977e..17108fdf30 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,4 +1,29 @@ class Category < ApplicationRecord has_and_belongs_to_many :products has_many :users, through: :products -end + + def self.alphabetical + self.all.order(:name) + end + + def find_products(merchant = nil, products = nil) + where_clause = { + categories_products: {category_id: self.id} + } + + if merchant + where_clause[:user_id] = merchant.id + end + + if products.nil? + products = Product.where(retired: false) + end + + products.joins(:categories_products).where(where_clause) + end + + # ~Some Rails Magic~ + def self.restrict_by_products(products) + joins(:categories_products).where(categories_products: {product_id: products.pluck(:id)}).distinct + end +end \ No newline at end of file diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index a04a270733..0d570473f7 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -12,15 +12,60 @@
    -

    Currently Viewing: <%= "All Products" %>

    - <%= select_tag(:category, options_for_select([["All"],["Software development"], ["Sports"], ["Music"], ["Acting"], ["Art"], ["Writing"]])) %> -
    - <% @products.each do |product| %> - <% unless product.retired %> +
    + + +
    +
    + + + <% if session[:filter] == "merchant" %> + + <% elsif session[:filter] == "category" %> + + <% end %> +
    + <%= link_to "Clear Filter Options", clear_path %> + + <% @categories.each do |category| %> +

    + <%= category.name %> +

    + +
    + <% category.find_products(@filter_merchant, @products).each do |product| %> <%= link_to product_path(product.id) do %> <%= image_tag "#{product.photo_url}", alt: "filler image" %> <% end %> <% end %> - <% end %> -
    +
    + <% end %> + + + + + <%#= select_tag(:category, options_for_select([["All"],["Software development"], ["Sports"], ["Music"], ["Acting"], ["Art"], ["Writing"]])) %> + + <%# @products.each do |product| %> + <%# unless product.retired %> + <%#= link_to product_path(product.id) do %> + <%#= image_tag "#{product.photo_url}", alt: "filler image" %> + <%# end %> + <%# end %> + <%# end %> +
    diff --git a/config/routes.rb b/config/routes.rb index 2ff102bf75..a606807979 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,6 +8,7 @@ get 'show_fulfillments', on: :member end + get '/products/clear', to: 'products#clear', as: 'clear' resources :products do resources :order_items, only: [:create] end @@ -24,10 +25,13 @@ get "/cart", to: "orders#cart", as: "cart" patch '/cart/order_item/:id', to: 'order_items#update', as: 'cart_update' + get "/orders/:id/payment", to: 'orders#payment', as: 'payment' patch '/orders/:id/complete', to: 'orders#complete', as: 'complete' get "/orders/:id/confirmation", to: "orders#confirmation", as: "confirmation" + patch '/products/:id/retired', to: 'products#retired', as: 'retired_product' + patch '/order_items/:id/shipped', to: 'order_items#shipped', as: 'shipped_order_item' patch '/order_items/:id/cancelled', to: 'order_items#cancelled', as: 'cancelled_order_item' diff --git a/db/schema.rb b/db/schema.rb index c59d8781b5..5ee14bf604 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_11_21_073926) do +ActiveRecord::Schema.define(version: 2020_11_24_193548) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -64,6 +64,13 @@ t.boolean "retired", default: false end + create_table "reviews", force: :cascade do |t| + t.integer "rating" + t.string "description" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + create_table "users", force: :cascade do |t| t.string "name" t.string "description" From 477b7fdf8c5288d390a2312a06404a737b5aa64f Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 22:31:31 -0800 Subject: [PATCH 168/208] fixed merge overwrite for review button --- app/views/products/show.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 21370db0ac..02f11ebfb3 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -34,8 +34,8 @@ <%= review.id %> <%= review.rating %> <%= review.description %> - <%= button_to "Edit", edit_product_review_path(product_id: @product, id: review), method: :get, class: "btn btn-primary" %> - <%= button_to "Delete", product_review_path(product_id: @product, id: review), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> + <%= button_to "Edit", edit_review_path(review), method: :get, class: "btn btn-primary" %> + <%= button_to "Delete", review_path(review), method: :delete, data: {confirm: "Are you sure?"}, class: "btn btn-danger", rel: "nofollow" %> <% end %> From c102972c31aa38562bcfabac4ffa86baa56164e5 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Tue, 24 Nov 2020 22:49:15 -0800 Subject: [PATCH 169/208] add Merchant couldn't review themselve --- app/controllers/reviews_controller.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index af9735adb2..6353eeeaf0 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -5,9 +5,13 @@ def new @review = Review.new @product = Product.find_by(id: params[:product_id]) if @product.nil? - flash.now[:error] = "Couldn't find this product" + flash[:error] = "Couldn't find this product" redirect_to root_path return + elsif @product.user_id == session[:user_id] + flash[:error] = "You couldn't review your own products" + redirect_to product_path(@product) + return end end @@ -17,6 +21,10 @@ def create flash.now[:error] = "Couldn't find this product" redirect_to root_path return + elsif @product.user_id == session[:user_id] + flash[:error] = "You couldn't review your own products" + redirect_to product_path(@product) + return end @review = Review.new(review_params) From 11b946c034395b245269e91c39422c246f29c9d7 Mon Sep 17 00:00:00 2001 From: Marj E Date: Tue, 24 Nov 2020 23:12:38 -0800 Subject: [PATCH 170/208] added the money gem to format prices and revenue --- .idea/betsy.iml | 1 + Gemfile | 4 +++- Gemfile.lock | 3 +++ app/helpers/application_helper.rb | 3 +++ app/views/orders/cart.html.erb | 2 +- app/views/orders/confirmation.html.erb | 4 ++-- app/views/products/show.html.erb | 3 +-- app/views/users/_fulfillments.html.erb | 2 +- app/views/users/_products.html.erb | 2 +- app/views/users/show.html.erb | 8 ++++---- 10 files changed, 20 insertions(+), 12 deletions(-) diff --git a/.idea/betsy.iml b/.idea/betsy.iml index b4be0bb9c5..92b3e58b4b 100644 --- a/.idea/betsy.iml +++ b/.idea/betsy.iml @@ -91,6 +91,7 @@ + diff --git a/Gemfile b/Gemfile index c4fd3ebe6a..41ae53c146 100644 --- a/Gemfile +++ b/Gemfile @@ -89,4 +89,6 @@ group :development do end gem "omniauth" -gem "omniauth-github" \ No newline at end of file +gem "omniauth-github" + +gem "money" \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 437d138d65..2f2d60f1b4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -159,6 +159,8 @@ GEM builder minitest (>= 5.0) ruby-progressbar + money (6.13.8) + i18n (>= 0.6.4, <= 2) msgpack (1.3.3) multi_json (1.14.1) multi_xml (0.6.0) @@ -315,6 +317,7 @@ DEPENDENCIES listen (~> 3.2) minitest-rails minitest-reporters + money omniauth omniauth-github pg (>= 0.18, < 2.0) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index de6be7945c..d8e682964f 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,2 +1,5 @@ module ApplicationHelper + def format_money(money_integer) + Money.new(money_integer.ceil, "USD").format + end end diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index 711efb4901..e58d406bf1 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -18,7 +18,7 @@ <%= f.select(:quantity, options_for_select(item.product.create_stock_collection, selected: item.quantity)) %>
    - $<%= item.price %> + <%= format_money(item.price) %>
    <%= f.submit "Update", class: "btn btn-primary" %> diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index 72baa9484c..da14e58e53 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -34,13 +34,13 @@ <%= item.product.name %> <%= item.quantity %> - $<%= item.price %> + <%= format_money(item.price) %> <% end %>

    Total :

    - $<%=@order.total %> + <%=format_money(@order.total) %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 02f11ebfb3..ac7c349f47 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -4,7 +4,7 @@

    <%= @product.name %>

    -

    $<%= @product.price %>

    +

    <%= format_money(@product.price) %>

    <%= form_with model: @orderitem, class: 'create-orderitem', url: product_order_items_path(@product) do |f| %>
    <%= f.label :quantity %> @@ -18,7 +18,6 @@
    -

    Product Review:<%= button_to "Add New Review", new_product_review_path(@product), method: :get, class: "btn btn-primary" %>

    diff --git a/app/views/users/_fulfillments.html.erb b/app/views/users/_fulfillments.html.erb index 8d5245c80d..962438618a 100644 --- a/app/views/users/_fulfillments.html.erb +++ b/app/views/users/_fulfillments.html.erb @@ -17,7 +17,7 @@ - + - + diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index 75f9803f27..fc6cf4eecf 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -12,10 +12,10 @@ - - - - + + + + From d8dfe3cb771e49dfe7900d98cd6b79666b4ad2b0 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Tue, 24 Nov 2020 23:18:37 -0800 Subject: [PATCH 171/208] fixed product index page --- app/controllers/users_controller.rb | 3 ++- app/views/products/index.html.erb | 19 +++++-------------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 342d309fc0..0a78e0b4ff 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -56,6 +56,7 @@ def edit elsif @user.id != session[:user_id] flash[:error] = "You must log in as this user." redirect_to root_path + return end end @@ -86,7 +87,7 @@ def destroy private def find_user - @user = User.find_by(id: session[:user_id]) + @user = User.find_by(id: params[:id]) end def user_params diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 2bf63977c4..2af56fa11d 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -35,18 +35,6 @@
    <% category.find_products(@filter_merchant, @products).each do |product| %> - <%= link_to product_path(product.id) do %> - <%= image_tag "#{product.photo_url}", alt: "filler image" %> - <% end %> - <% end %> -
    - <% end %> - -

    Currently Viewing: <%= "All Products" %>

    - <%= select_tag(:category, options_for_select([["All"],["Software development"], ["Sports"], ["Music"], ["Acting"], ["Art"], ["Writing"]])) %> -
    - <% @products.each do |product| %> - <% unless product.retired %>
    <%= image_tag product.photo_url, class: "card-img-top", alt: "filler image" %>
    @@ -55,8 +43,11 @@
    <% end %> - <% end %> -
    + + <% end %> + + + From 088d9f68d11512236ef21537389bd19dce04370d Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 00:08:50 -0800 Subject: [PATCH 172/208] added styling to index product and confirmation page --- app/assets/stylesheets/application.scss | 4 +++- app/views/layouts/application.html.erb | 30 ++++++------------------- app/views/orders/confirmation.html.erb | 2 +- app/views/products/index.html.erb | 8 ++++++- 4 files changed, 18 insertions(+), 26 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index c4ec4937ac..31e40775ef 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -118,7 +118,9 @@ a:hover { margin: 2rem 0 1rem 0; } - +.card{ + margin-bottom: 20px; +} main { padding: 2rem; diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 42822430aa..c7fa45ce90 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -42,32 +42,16 @@ <% end %> - -
    - <% flash.each do |name, message| %> -
    - <%= message %> -
    - <% end %> -
    - <% if flash[:result_text] or flash[:messages] %> -
    -
    - <%= flash[:status].to_s == "failure" ? "A problem occurred: " : "" %><%= flash[:result_text] %> - <% if flash[:messages] %> -
      - <% flash[:messages].each do |name, problems| %> - <% problems.each do |problem| %> -
    • <%= name %>: <%= problem %>
    • - <% end %> - <% end %> -
    - <% end %> +
    + <% flash.each do |name, message| %> +
    + <%= message %>
    -
    - <% end %> + <% end %> +
    +
    <%= yield %> diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index da14e58e53..385aa38bb8 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -6,7 +6,7 @@
    - + diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 2af56fa11d..63fd2c9b36 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,3 +1,9 @@ +
    +

    Sponsored Product: <%= Product.all.sample.name %>

    + +
    + +
    @@ -33,7 +39,7 @@ <%= category.name %> -
    +
    <% category.find_products(@filter_merchant, @products).each do |product| %>
    <%= image_tag product.photo_url, class: "card-img-top", alt: "filler image" %> From ec9da5a3bee7dacba6c04ee57a70682bb1ee28a4 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 25 Nov 2020 00:11:11 -0800 Subject: [PATCH 173/208] fix footer position --- app/assets/stylesheets/application.scss | 21 ++++ app/views/layouts/application.html.erb | 134 ++++++++++++------------ 2 files changed, 89 insertions(+), 66 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index c4ec4937ac..e8446df05b 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -27,6 +27,27 @@ $pink: #fe6d73; $default-border: 2px solid; +body, html { + overflow: auto; + height: 100%; +} +.main-container { + min-height: 100vh; + display: block; + position: relative; + padding-bottom: 100px; /* height of the footer */ + margin-bottom: -50px; +} +footer { + position: absolute; + bottom: 0; + right: 0; + text-align: center; + color: #363636; + width: 100%; +} + + body, h1, h2, h3, h4, h5, h6 { font-family: $primary-font } diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 42822430aa..74efe318d3 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -11,80 +11,82 @@ -
    -

    - <%= link_to "Mama Jeti's Apothecary", root_path %> -

    - -
    - <% flash.each do |name, message| %> -
    - <%= message %> -
    - <% end %> -
    -
    +
    + <% flash.each do |name, message| %> +
    + <%= message %> +
    + <% end %> +
    + - <% if flash[:result_text] or flash[:messages] %> -
    -
    - <%= flash[:status].to_s == "failure" ? "A problem occurred: " : "" %><%= flash[:result_text] %> - <% if flash[:messages] %> -
      - <% flash[:messages].each do |name, problems| %> - <% problems.each do |problem| %> -
    • <%= name %>: <%= problem %>
    • + <% if flash[:result_text] or flash[:messages] %> +
      +
      + <%= flash[:status].to_s == "failure" ? "A problem occurred: " : "" %><%= flash[:result_text] %> + <% if flash[:messages] %> +
        + <% flash[:messages].each do |name, problems| %> + <% problems.each do |problem| %> +
      • <%= name %>: <%= problem %>
      • + <% end %> <% end %> - <% end %> -
      - <% end %> -
      -
      - <% end %> +
    + <% end %> +
    +
    + <% end %> -
    - <%= yield %> -
    +
    + <%= yield %> +
    -
    - -
    © 2020 Mama Jeti
    -
    +
    + +
    © 2020 Mama Jeti
    +
    +
    From cb2d724b8b8b141c008f8799e747841b276d886d Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 00:48:17 -0800 Subject: [PATCH 174/208] changed csv for product seed data --- db/seed_data/products_seeds.csv | 50 ++++++++++++++++----------------- db/seeds.rb | 12 ++++---- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/db/seed_data/products_seeds.csv b/db/seed_data/products_seeds.csv index a25ee8f45d..b04329967d 100644 --- a/db/seed_data/products_seeds.csv +++ b/db/seed_data/products_seeds.csv @@ -1,26 +1,26 @@ name,stock,price,description,user_id,photo_url,retired -Titus McKenzie,2,544,Maxime deleniti sint ut.,2,https://robohash.org/placeateumquam.png?size=300x300&set=set1,true -Forest Jast,397,9786,Et aut delectus consequatur.,7,https://robohash.org/delenitieosquo.png?size=300x300&set=set1,false -Tomeka Mills,24,441,Illo aut inventore voluptates.,2,https://robohash.org/impeditporroaut.png?size=300x300&set=set1,true -Yuk Johnston V,422,3899,Sunt ab est nesciunt.,6,https://robohash.org/consequaturenimillo.png?size=300x300&set=set1,true -Trudie Heathcote,103,2653,Deserunt nemo dolores delectus.,2,https://robohash.org/quibusdamexplicabofuga.png?size=300x300&set=set1,true -Dena Crona,96,8100,Nulla odio accusantium ipsum.,2,https://robohash.org/auteoset.png?size=300x300&set=set1,true -Mckenzie Hermiston,342,8458,Nobis dolores temporibus omnis.,5,https://robohash.org/inciduntsaepevoluptates.png?size=300x300&set=set1,false -Raleigh Durgan,21,7341,Provident et a quo.,2,https://robohash.org/teneturquoesse.png?size=300x300&set=set1,true -Dewey Swift V,185,760,Aut ipsum sint fuga.,4,https://robohash.org/isteutaut.png?size=300x300&set=set1,false -Prof. Garfield Renner,497,7400,Ut unde nostrum quas.,8,https://robohash.org/veritatisexnobis.png?size=300x300&set=set1,true -Reginia Gerhold VM,361,9308,Assumenda vero cupiditate quos.,3,https://robohash.org/rerumeligendiab.png?size=300x300&set=set1,true -Tori Stanton,215,4628,Iure maiores dolorem aperiam.,7,https://robohash.org/minusutducimus.png?size=300x300&set=set1,false -Ezequiel Toy,297,5150,Voluptatibus dolore quia a.,6,https://robohash.org/blanditiisreprehenderitculpa.png?size=300x300&set=set1,true -Maynard Rau,320,6304,Occaecati consequatur distinctio eum.,10,https://robohash.org/utvelitvoluptas.png?size=300x300&set=set1,false -Palmer Schmitt DDS,160,1764,Eius voluptatem explicabo ipsum.,8,https://robohash.org/undeculpased.png?size=300x300&set=set1,true -Mohamed Lubowitz,236,8869,Veritatis incidunt illum occaecati.,1,https://robohash.org/etfuganecessitatibus.png?size=300x300&set=set1,true -Merilyn Wehner,469,875,Quae ex molestias molestiae.,8,https://robohash.org/placeatmodiimpedit.png?size=300x300&set=set1,true -Hortensia Walker,414,590,Voluptatem deserunt animi quod.,7,https://robohash.org/voluptatemsitfacere.png?size=300x300&set=set1,true -Miss Tami Mertz,441,3995,Unde quia accusamus aliquam.,8,https://robohash.org/perspiciatisdoloreset.png?size=300x300&set=set1,false -Joan O'Kon,400,4171,Asperiores aut voluptatem repellendus.,9,https://robohash.org/sitdoloremqueaut.png?size=300x300&set=set1,false -Megan Schultz,483,763,Asperiores enim eveniet voluptatem.,1,https://robohash.org/asperioresullamquasi.png?size=300x300&set=set1,true -Tracy Kohler,114,4798,Rem magni enim ipsam.,5,https://robohash.org/veniamaccusantiumdeserunt.png?size=300x300&set=set1,true -Orpha Glover,258,158,A vitae voluptate quia.,7,https://robohash.org/veniaminventoreatque.png?size=300x300&set=set1,true -Gertrudis Nienow,330,3016,Fugit aut quis velit.,7,https://robohash.org/insolutaquidem.png?size=300x300&set=set1,true -Isa Beahan,360,9222,Non ad quasi quia.,6,https://robohash.org/minimamollitiabeatae.png?size=300x300&set=set1,false +Python Coding,2,544,Maxime deleniti sint ut.,2,https://i.pinimg.com/originals/fb/21/10/fb2110c34cc85821cbe40c48a72cb4a7.jpg?size=300x300&set=set1,false +Javascript,397,9786,Et aut delectus consequatur.,7,https://i.pinimg.com/originals/fb/5c/b4/fb5cb42af7b421fbc32c1fe04766c870.jpg?size=300x300&set=set1,false +Public Speaking,24,441,Illo aut inventore voluptates.,2,https://i.pinimg.com/564x/1a/bb/d4/1abbd47b5ccea3eda7d8acb092ab011b.jpg?size=300x300&set=set1,false +Persuasion,422,3899,Sunt ab est nesciunt.,6,https://i.pinimg.com/originals/fb/21/10/fb2110c34cc85821cbe40c48a72cb4a7.jpg?size=300x300&set=set1,false +Googling,103,2653,Deserunt nemo dolores delectus.,2,https://i.pinimg.com/originals/02/fc/1c/02fc1cd0a07865200a94c7fc1b5b150a.jpg?size=300x300&set=set1,false +Bob Ross,96,8100,Nulla odio accusantium ipsum.,2,https://i.stack.imgur.com/1VslF.jpg?size=300x300&set=set1,false +Negotiation,342,8458,Nobis dolores temporibus omnis.,5,https://cdn.pixabay.com/photo/2018/11/22/16/28/glass-3832301__480.jpg?size=300x300&set=set1,false +Organization,21,7341,Provident et a quo.,2,https://i.pinimg.com/564x/1a/bb/d4/1abbd47b5ccea3eda7d8acb092ab011b.jpg?size=300x300&set=set1,false +Basketball Dunking,185,760,Aut ipsum sint fuga.,4,https://i.pinimg.com/564x/1a/bb/d4/1abbd47b5ccea3eda7d8acb092ab011b.jpg?size=300x300&set=set1,false +Anti-Procrastination,497,7400,Ut unde nostrum quas.,8,https://i.pinimg.com/originals/fb/21/10/fb2110c34cc85821cbe40c48a72cb4a7.jpg?size=300x300&set=set1,false +Transfiguration,361,9308,Assumenda vero cupiditate quos.,3,https://cdn.pixabay.com/photo/2018/11/22/16/28/glass-3832301__480.jpg?size=300x300&set=set1,false +Defense Against Dark Arts,215,4628,Iure maiores dolorem aperiam.,7,https://cdn.pixabay.com/photo/2018/11/22/16/28/glass-3832301__480.jpg?size=300x300&set=set1,false +Focus,297,5150,Voluptatibus dolore quia a.,6,https://i.stack.imgur.com/1VslF.jpg?size=300x300&set=set1,false +Empathy,320,6304,Occaecati consequatur distinctio eum.,10,https://i.pinimg.com/originals/fb/21/10/fb2110c34cc85821cbe40c48a72cb4a7.jpg?size=300x300&set=set1,false +Willpower,160,1764,Eius voluptatem explicabo ipsum.,8,https://i.pinimg.com/564x/1a/bb/d4/1abbd47b5ccea3eda7d8acb092ab011b.jpg?size=300x300&set=set1,false +Javascript,236,8869,Veritatis incidunt illum occaecati.,1,https://i.pinimg.com/originals/02/fc/1c/02fc1cd0a07865200a94c7fc1b5b150a.jpg?size=300x300&set=set1,false +Motivation,469,875,Quae ex molestias molestiae.,8,https://i.pinimg.com/originals/fb/21/10/fb2110c34cc85821cbe40c48a72cb4a7.jpg?size=300x300&set=set1,false +Ballet Dance,414,590,Voluptatem deserunt animi quod.,7,https://i.stack.imgur.com/1VslF.jpg?size=300x300&set=set1,false +Opera-Singing,441,3995,Unde quia accusamus aliquam.,8,https://i.pinimg.com/originals/02/fc/1c/02fc1cd0a07865200a94c7fc1b5b150a.jpg?size=300x300&set=set1,false +Gymnastics,400,4171,Asperiores aut voluptatem repellendus.,9,https://i.pinimg.com/originals/fb/21/10/fb2110c34cc85821cbe40c48a72cb4a7.jpg?size=300x300&set=set1,false +Fortune-Telling,483,763,Asperiores enim eveniet voluptatem.,1,https://i.pinimg.com/564x/1a/bb/d4/1abbd47b5ccea3eda7d8acb092ab011b.jpg?size=300x300&set=set1,false +Spontaneity,114,4798,Rem magni enim ipsam.,5,https://i.pinimg.com/originals/fb/5c/b4/fb5cb42af7b421fbc32c1fe04766c870.jpg?size=300x300&set=set1,false +Strategic-Thinking,258,158,A vitae voluptate quia.,7,https://i.pinimg.com/originals/fb/21/10/fb2110c34cc85821cbe40c48a72cb4a7.jpg?size=300x300&set=set1,false +C,330,3016,Fugit aut quis velit.,7,https://i.pinimg.com/originals/fb/5c/b4/fb5cb42af7b421fbc32c1fe04766c870.jpg?size=300x300&set=set1,false +Binary,360,9222,Non ad quasi quia.,6,https://i.pinimg.com/originals/fb/21/10/fb2110c34cc85821cbe40c48a72cb4a7.jpg?size=300x300&set=set1,false diff --git a/db/seeds.rb b/db/seeds.rb index 4ae0b1ab0d..e73cdac82a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -9,22 +9,22 @@ # categories = [ { - name: "Software development" + name: "Software Development" }, { - name: "Sports" + name: "Cognitive" }, { - name: "Music" + name: "Behavioral" }, { - name: "Acting" + name: "Athleticism" }, { - name: "Art" + name: "Artistic" }, { - name: "Writing" + name: "Magical" } ] From 11c16a34dc3304c29b3cbd0ed8371149a5ba4142 Mon Sep 17 00:00:00 2001 From: Marj E Date: Wed, 25 Nov 2020 00:52:14 -0800 Subject: [PATCH 175/208] added zero stock notice on product show page --- app/models/product.rb | 4 ++-- app/views/products/show.html.erb | 15 +++++++++++---- db/schema.rb | 1 - 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index 6ba7e4cb04..c08484034f 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -5,7 +5,7 @@ class Product < ApplicationRecord has_and_belongs_to_many :categories validates :name, presence: true, uniqueness: true - validates :stock, presence: true, numericality: { greater_than: 0, only_integer: true } + validates :stock, presence: true, numericality: { greater_than_or_equal_to: 0, only_integer: true } validates :price, presence: true, numericality: { greater_than: 0, only_integer: true } validates :description, presence: true @@ -14,7 +14,7 @@ def create_stock_collection currently_instock = self.stock stock_collection = [] currently_instock.times { |num| stock_collection << num + 1 } - return stock_collection + return stock_collection == [] ? 0 : stock_collection end def category_on_user_show diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index ac7c349f47..76ac53d2d7 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -6,11 +6,18 @@

    <%= @product.name %>

    <%= format_money(@product.price) %>

    <%= form_with model: @orderitem, class: 'create-orderitem', url: product_order_items_path(@product) do |f| %> -
    - <%= f.label :quantity %> - <%= f.select :quantity, @product.create_stock_collection, selected: :quantity %> -
    + <% if @product.stock == 0 %> +
    +

    Currently out of stock!

    + <%= f.submit "Add to cart", class: "btn btn-secondary", disabled: true %> +
    + <% else %> +
    + <%= f.label :quantity %> + <%= f.select :quantity, @product.create_stock_collection, selected: :quantity %> +
    <%= f.submit "Add to cart", class: "btn btn-primary" %> + <% end %> <% end %>

    Description:

    diff --git a/db/schema.rb b/db/schema.rb index 211c71db9a..131cb9facf 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,6 @@ # # It's strongly recommended that you check this file into your version control system. - ActiveRecord::Schema.define(version: 2020_11_24_214404) do # These are extensions that must be enabled in order to support this database From 322016f64f9743c01654228b3ec93386c6f8eb39 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 01:27:10 -0800 Subject: [PATCH 176/208] changed card sizing, spotlight product, and header --- app/assets/stylesheets/application.scss | 7 ++++++- app/models/product.rb | 4 ++++ app/views/layouts/application.html.erb | 1 + app/views/products/index.html.erb | 4 +--- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 31e40775ef..8cebf8cfbb 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -122,6 +122,12 @@ a:hover { margin-bottom: 20px; } +.card-img-top { + width: auto; + height: 350px; + object-fit:cover; +} + main { padding: 2rem; } @@ -158,7 +164,6 @@ main { .app-footer__user-nav-container .nav-item { margin-left: 2rem; } - .product-photo { width: 2.5rem; diff --git a/app/models/product.rb b/app/models/product.rb index 6ba7e4cb04..91fe62a1ba 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -24,4 +24,8 @@ def category_on_user_show def product_reviews return self.reviews.order(id: :desc) end + + def spotlight_product + + end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index c7fa45ce90..6577608e54 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -14,6 +14,7 @@

    <%= link_to "Mama Jeti's Apothecary", root_path %> + Why learn a new skill when you can drink it?

    - <%= f.submit "submit_button", class: "btn btn-primary" %> + <%= f.submit "Submit Edit", class: "btn btn-primary" %>
    <% end %>
    \ No newline at end of file From 42352f53aa2daf9a3dae22f5649dc3d27c5cf9cc Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 25 Nov 2020 01:49:22 -0800 Subject: [PATCH 179/208] add grid on product show page --- app/assets/stylesheets/application.scss | 31 ++++++++++++++++++++++++- app/models/product.rb | 5 ++++ app/views/products/show.html.erb | 21 ++++++++++------- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index e8446df05b..560e6a6945 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -178,7 +178,35 @@ main { margin-left: 2rem; } - +.pr-grid { + display: grid; + grid-template-columns: 2fr 3fr 3fr 2fr; +} + +.pr-img { + grid-column: 2 /3; +} + +.pr-description { + grid-column: 3 /4; +} +.pr-description > h2 { + padding-top: 3rem; + padding-bottom: 3rem; +} + +.pr-description h5 { + padding-bottom: 2rem; +} +.pr-under { + padding-top: 3rem; + padding-bottom: .5rem; +} + +.pr-size { + width: 25vw; +} + .product-photo { width: 2.5rem; } @@ -203,3 +231,4 @@ main { .btn-distance { margin: 2rem; } + diff --git a/app/models/product.rb b/app/models/product.rb index 6ba7e4cb04..eb2e084fd2 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -24,4 +24,9 @@ def category_on_user_show def product_reviews return self.reviews.order(id: :desc) end + + def ave_rating + total_rating = self.reviews.sum { |review| review.rating } + return (total_rating / self.reviews.count.to_f).round(1) + end end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index ac7c349f47..b3ad41efea 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,10 +1,15 @@ -
    -
    - <%= image_tag "#{@product.photo_url}", alt: "filler" %> +
    +
    + <%= image_tag "#{@product.photo_url}", alt: "filler", class: "pr-size" %>
    -
    -

    <%= @product.name %>

    -

    <%= format_money(@product.price) %>

    +
    +

    <%= @product.name %>

    +
    Price: <%= format_money(@product.price) %>
    + <% if @product.reviews.count == 0 %> +
    Average Rating: Waiting for you to add a Review!
    + <% else %> +
    Average Rating: <%= @product.ave_rating %>
    + <% end %> <%= form_with model: @orderitem, class: 'create-orderitem', url: product_order_items_path(@product) do |f| %>
    <%= f.label :quantity %> @@ -13,8 +18,8 @@ <%= f.submit "Add to cart", class: "btn btn-primary" %> <% end %>
    -

    Description:

    -

    <%= @product.description %>

    +
    Description:
    +
    <%= @product.description %>
    From 4b5475201487d1612734fb7a2201206721bacd8a Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 02:14:10 -0800 Subject: [PATCH 180/208] changed product sizing --- app/assets/stylesheets/application.scss | 2 +- app/views/products/index.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 266e792045..f9eb07d720 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -151,7 +151,7 @@ a:hover { .card-img-top { width: auto; - height: 350px; + height: 300px; object-fit:cover; } diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 1e79dacad9..991d9ebdcc 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -39,7 +39,7 @@
    <% category.find_products(@filter_merchant, @products).each do |product| %> -
    +
    <%= image_tag product.photo_url, class: "card-img-top", alt: "filler image" %>
    <%= link_to product.name, product_path(product.id) %>
    From 3d44a68defe5871fb2b72762606cddfceed488e8 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 02:49:49 -0800 Subject: [PATCH 181/208] matched confirmation page to user stories --- app/views/orders/confirmation.html.erb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index 385aa38bb8..763d830101 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -1,4 +1,5 @@ -

    Order Confirmation | Order #<%= @order.id %>

    +

    Order #<%= @order.id %> Confirmation | + Placed: <%= Time.parse("#{@order.updated_at}") %>

    Buyer Information

    <%= order_item.order_status.capitalize %> <%= link_to Product.find_by(id: order_item.product_id).name, product_path(order_item.product_id) %> <%= order_item.quantity %>$ <%= order_item.price %> <%= format_money(order_item.price) %> <%= Time.parse("#{Order.find_by(id: order_item.order_id).updated_at}") %> <% if order_item.shipped %> diff --git a/app/views/users/_products.html.erb b/app/views/users/_products.html.erb index 9be1ab5594..267495ebc0 100644 --- a/app/views/users/_products.html.erb +++ b/app/views/users/_products.html.erb @@ -26,7 +26,7 @@ <%= link_to product.name, product_path(product.id) %> <%= image_tag product.photo_url, alt: "product photo", class: "product-photo" %><%= product.price %><%= format_money(product.price) %> <%= product.stock %> <%= product.description %> <%= product.photo_url %>
    Total Revenue$ <%= @user.total_revenue_by_status("pending") %>$ <%= @user.total_revenue_by_status("paid") %>$ <%= @user.total_revenue_by_status("completed") %>$ <%= @user.total_revenue %> <%= format_money(@user.total_revenue_by_status("pending")) %> <%= format_money(@user.total_revenue_by_status("paid")) %> <%= format_money(@user.total_revenue_by_status("completed")) %> <%= format_money(@user.total_revenue) %>
    Total Number of OrdersName Email Mailing AddressLast 4 Digits of Credit CardCredit Card Number Credit Card Exp Date
    @@ -32,7 +33,7 @@ <%@order.orderitems.each do |item|%> - + From cacf4a569a5ba056a1acecdff3567511e578550b Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 25 Nov 2020 03:15:41 -0800 Subject: [PATCH 182/208] css for shopping cart button --- app/assets/stylesheets/application.scss | 9 +++++++++ app/views/orders/cart.html.erb | 7 ++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index f9eb07d720..0771c9e9af 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -192,6 +192,15 @@ main { margin-left: 2rem; } +.cart-checkout { + margin: 5rem; + justify-content: center; + display: flex; +} +.cart-line { + padding: .5rem; +} + .pr-grid { display: grid; grid-template-columns: 2fr 3fr 3fr 2fr; diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index e58d406bf1..6f619dd3d8 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -10,7 +10,7 @@ <% @cart.orderitems.order(id: :asc).each do |item| %> <%= form_with model: @orderitem, url: cart_update_path(item.id), method: :patch do |f| %> -
    +
    <%= link_to item.product.name, product_path(item.product.id) %>
    @@ -30,7 +30,8 @@
    <% end %>
    +
    + <%= button_to "Proceed to Checkout", payment_path(@cart.id), method: :get, class: "btn btn-primary" %> +
    -<%= button_to "Proceed to Checkout", payment_path(@cart.id), method: :get, class: "btn btn-primary" %> - From bb3cc3fa47a4e76bcb553d0f14b829c8c737a658 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 03:17:25 -0800 Subject: [PATCH 183/208] unskipped edit user test --- test/controllers/users_controller_test.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index ab6e02e9f2..13a44a9b11 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -114,7 +114,6 @@ end it "responds with redirect when getting the edit page for an existing user while not logged in" do - skip # Arrange user = users(:ada) # Ensure there is an existing user saved @@ -122,7 +121,7 @@ get edit_user_path(user.id) # Assert - must_respond_with :success + must_respond_with :redirect end it "responds with redirect when getting the edit page for a non-existing user" do From 9855f1eb8686a757944d725b9abe0e88e0d92dbd Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 09:37:46 -0800 Subject: [PATCH 184/208] added cart tests --- test/controllers/orders_controller_test.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 4fcad3b285..faf7f2e6ac 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -54,4 +54,20 @@ must_respond_with :not_found end end + + describe "cart" do + it "responds with success when getting the cart page for guest" do + get cart_path + + must_respond_with :success + end + + it "responds with success when getting the cart page for logged-in user" do + perform_login + + get cart_path + + must_respond_with :success + end + end end From 8beca2fc6db609f705d337d3e59c58de3f4d69b4 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 25 Nov 2020 10:08:56 -0800 Subject: [PATCH 185/208] add about us page --- app/assets/stylesheets/application.scss | 12 ++++++++++++ app/assets/stylesheets/extrapages.scss | 3 +++ app/controllers/extrapages_controller.rb | 5 +++++ app/helpers/extrapages_helper.rb | 2 ++ app/views/extrapages/about.html.erb | 15 +++++++++++++++ app/views/layouts/application.html.erb | 4 ++-- config/routes.rb | 3 ++- test/controllers/extrapages_controller_test.rb | 7 +++++++ 8 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 app/assets/stylesheets/extrapages.scss create mode 100644 app/controllers/extrapages_controller.rb create mode 100644 app/helpers/extrapages_helper.rb create mode 100644 app/views/extrapages/about.html.erb create mode 100644 test/controllers/extrapages_controller_test.rb diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 0771c9e9af..3e0896e28e 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -234,6 +234,18 @@ main { width: 2.5rem; } +.about { + display: grid; + grid-template-columns: 2fr auto 2fr; +} +.about-box { + grid-column: 2 /3; +} + +.about-box > p{ + padding: 2rem; +} + .user-show-primary-wizard { width: 6rem; } diff --git a/app/assets/stylesheets/extrapages.scss b/app/assets/stylesheets/extrapages.scss new file mode 100644 index 0000000000..99260d7c36 --- /dev/null +++ b/app/assets/stylesheets/extrapages.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the extrapages controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/extrapages_controller.rb b/app/controllers/extrapages_controller.rb new file mode 100644 index 0000000000..e86918d2bb --- /dev/null +++ b/app/controllers/extrapages_controller.rb @@ -0,0 +1,5 @@ +class ExtrapagesController < ApplicationController + def about + @mascot = "https://robohash.org/nihilipsamvoluptas.png?size=300x300&set=set1" + end +end diff --git a/app/helpers/extrapages_helper.rb b/app/helpers/extrapages_helper.rb new file mode 100644 index 0000000000..39cdec945c --- /dev/null +++ b/app/helpers/extrapages_helper.rb @@ -0,0 +1,2 @@ +module ExtrapagesHelper +end diff --git a/app/views/extrapages/about.html.erb b/app/views/extrapages/about.html.erb new file mode 100644 index 0000000000..ec80e3097b --- /dev/null +++ b/app/views/extrapages/about.html.erb @@ -0,0 +1,15 @@ +
    +
    +

    About US

    +

    We are Mama Jeti's Apothecary! Mama is Maha and Marj, and Jeti is Jessica and Ting-Yi!

    +
    +
    +

    Our Mascot - Sebastian Witting

    + <%= image_tag "#{@mascot}", alt: "Sebastian Witting", class: "pr-size" %> +

    Sebastian is our Mascot, because...

    +
    +
    +

    Contact US

    +

    We are Mama Jeti's Apothecary! Mama is Maha and Marj, and Jeti is Jessica and Ting-Yi!

    +
    +
    \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index e5ec067237..8544335676 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -62,10 +62,10 @@ diff --git a/config/routes.rb b/config/routes.rb index eeb5d99e12..6a84373c31 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -26,6 +26,7 @@ delete "/logout", to: "users#destroy", as: "logout" # Customized actions + get "/about", to: "extrapages#about", as: "about" get "/cart", to: "orders#cart", as: "cart" patch '/cart/order_item/:id', to: 'order_items#update', as: 'cart_update' @@ -38,5 +39,5 @@ patch '/order_items/:id/shipped', to: 'order_items#shipped', as: 'shipped_order_item' patch '/order_items/:id/cancelled', to: 'order_items#cancelled', as: 'cancelled_order_item' - + end diff --git a/test/controllers/extrapages_controller_test.rb b/test/controllers/extrapages_controller_test.rb new file mode 100644 index 0000000000..74813cf407 --- /dev/null +++ b/test/controllers/extrapages_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe ExtrapagesController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 5b92f9a12637d312d213445948fe394fe9c7ed7a Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 10:19:51 -0800 Subject: [PATCH 186/208] added category relationships and validations tests for model --- test/models/category_test.rb | 52 +++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 841a2edc6d..e98f5abca5 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -1,7 +1,53 @@ require "test_helper" describe Category do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + before do + @category = categories(:mental) + end + + describe "Validations" do + it 'is valid when all fields are filled' do + expect(@category.valid?).must_equal true + end + + it 'fails validation when there is no name' do + @category.name = nil + + expect(@category.valid?).must_equal false + end + + it 'fails validation when name already exists' do + @category2 = Category.create(name: @category.name) + + expect(@category2.valid?).must_equal false + end + end + + describe 'Relationships' do + it 'can have many products' do + product1 = products(:confidence) + product2 = products(:python) + expect(@category.products.count).must_equal 2 + @category.products.each do |product| + expect(product).must_be_instance_of Product + end + end + + it 'belongs to many products' do + product1 = products(:confidence) + product2 = products(:python) + expect(product1.categories).must_include @category + expect(product2.categories).must_include @category + end + + it 'can have many users through products' do + user1 = users(:ada) + user2 = users(:grace) + + expect(@category.users.count).must_equal 2 + @category.users.each do |user| + expect(user).must_be_instance_of User + end + end + end end From ba448fd4ebcd258b1e1ab2c2f9e821a7a9b12f5f Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 10:44:12 -0800 Subject: [PATCH 187/208] created validation tests for user model --- test/models/user_test.rb | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/test/models/user_test.rb b/test/models/user_test.rb index ed922b0de2..b9fa5b5725 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -2,12 +2,30 @@ describe User do describe "validations" do + before do + @user = users(:ada) + end it 'is valid when all fields are present' do - skip + expect(@user.valid?).must_equal true + end + + it "is invalid when uid is missing" do + @user.uid = nil + expect(@user.valid?).must_equal false + end + + it "is invalid when name is missing" do + @user.name = nil + expect(@user.valid?).must_equal false + end + + it "is invalid when email is missing" do + @user.email = nil + expect(@user.valid?).must_equal false end end - describe "relaitons" do + describe "relations" do describe "products" do end From df810c88dc74178220c2febdb91d0ce46abb6859 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 10:53:19 -0800 Subject: [PATCH 188/208] edited about us page --- app/views/extrapages/about.html.erb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/views/extrapages/about.html.erb b/app/views/extrapages/about.html.erb index ec80e3097b..725a03e5a0 100644 --- a/app/views/extrapages/about.html.erb +++ b/app/views/extrapages/about.html.erb @@ -1,15 +1,16 @@
    -

    About US

    +

    About Us

    We are Mama Jeti's Apothecary! Mama is Maha and Marj, and Jeti is Jessica and Ting-Yi!

    +

    We're in the business of selling skills in the form of potions.

    Our Mascot - Sebastian Witting

    <%= image_tag "#{@mascot}", alt: "Sebastian Witting", class: "pr-size" %> -

    Sebastian is our Mascot, because...

    +

    Sebastian is our Mascot.

    -

    Contact US

    -

    We are Mama Jeti's Apothecary! Mama is Maha and Marj, and Jeti is Jessica and Ting-Yi!

    +

    Contact Us

    +

    Sorry we can't help you. Go ahead and try contacting us.

    \ No newline at end of file From e8fe3f3a99bd598cd48bb024aec53279c4e42ab0 Mon Sep 17 00:00:00 2001 From: Marj E Date: Wed, 25 Nov 2020 10:53:38 -0800 Subject: [PATCH 189/208] changed form styling --- app/assets/stylesheets/products.scss | 6 +++ app/helpers/products_helper.rb | 3 ++ app/views/products/_form.html.erb | 74 +++++++++++++++++++--------- 3 files changed, 59 insertions(+), 24 deletions(-) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index d45571ea44..137cc0be53 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -16,4 +16,10 @@ img { div.product-right > * { margin: 30px 0px; +} + +input[type='checkbox'] { + width: 20px; + height: 20px; + margin: 0 10px; } \ No newline at end of file diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb index ab5c42b325..651e7c947e 100644 --- a/app/helpers/products_helper.rb +++ b/app/helpers/products_helper.rb @@ -1,2 +1,5 @@ module ProductsHelper + def show_validation_status + + end end diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index 128afd0037..e9798c770b 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -1,42 +1,68 @@
    <%= form_with model: @product do |f| %> -
    - <%= f.label :name %> - <%= f.text_field :name%> +
    +
    + <%= f.label :name %> + <%= f.text_field :name, class: "form-control" %> +
    -
    - <%= f.label :stock %> - <%= f.text_field :stock %> + +
    +
    + <%= f.label :stock %> + <%= f.text_field :stock, class: "form-control" %> +
    -
    - <%= f.label :price %> - <%= f.text_field :price %> + +
    +
    + <%= f.label :price %> + <%= f.text_field :price, class: "form-control" %> +
    -
    - <%= f.label :photo_url %> - <%= f.text_field :photo_url %> + +
    +
    + <%= f.label :photo_url %> + <%= f.text_field :photo_url, class: "form-control" %> +
    -
    - <%= f.label :description %> - <%= f.text_area :description %> + +
    +
    + <%= f.label :description %> + <%= f.text_area :description, class: "form-control" %> +
    -
    + + +
    <%= f.label :categories %> <%= collection_check_boxes(:product, :category_ids, Category.all, :id, :name) do |b|%> - <%= b.label(class:"label-checkbox") {b.check_box + b.text} %> + <%= b.label(class:"label-checkbox") {b.check_box + b.text }%> <% end %>
    -
    - <%= f.submit action_name, class: "btn btn-primary" %> + + +
    +
    + <%= f.submit action_name, class: "btn btn-primary" %> +
    <% end %> + <%= form_with model: @category, url: categories_path, method: :post do |f| %> -
    - <%= f.label :new_category %> - <%= f.text_field :name %> +
    +
    + <%= f.label :new_category %> + <%= f.text_field :name, class: "form-control" %> +
    -
    - <%= f.submit "Add New Category", class: "btn btn-primary" %> + +
    +
    + <%= f.submit "Add New Category", class: "btn btn-primary" %> +
    <% end %>
    \ No newline at end of file From 09d4300fc641d09b0807d0bf5d5474eb1a051e5f Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 25 Nov 2020 15:27:46 -0800 Subject: [PATCH 190/208] add cc_cvv to orders table, add validates and revise order controller and payment view to include cc_cvv --- app/controllers/orders_controller.rb | 3 ++- app/models/order.rb | 11 ++++++++++- app/views/orders/confirmation.html.erb | 2 ++ app/views/orders/payment.html.erb | 4 ++++ db/migrate/20201125230854_addcc_cvvtoorders.rb | 5 +++++ db/schema.rb | 3 ++- 6 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20201125230854_addcc_cvvtoorders.rb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 93e51ef726..135c9c3023 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -51,7 +51,7 @@ def confirmation private def order_params - return params.require(:order).permit(:order_item_id, :name, :email, :mailing_address, :cc_name, :cc_number, :cc_exp_date, :billing_zip_code) + return params.require(:order).permit(:order_item_id, :name, :email, :mailing_address, :cc_name, :cc_number, :cc_cvv, :cc_exp_date, :billing_zip_code) end def update_order @@ -61,6 +61,7 @@ def update_order mailing_address: params[:order][:mailing_address], cc_name: params[:order][:name_on_credit_card], cc_number: params[:order][:credit_card_number], + cc_cvv: params[:order][:credit_card_cvv], cc_exp_date: params[:order][:credit_card_expiration], billing_zip_code: params[:order][:billing_zipcode] ) diff --git a/app/models/order.rb b/app/models/order.rb index 42489e63e4..b41c2f399e 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -11,9 +11,12 @@ class Order < ApplicationRecord validates :cc_number, presence: true, numericality: { only_integer: true }, on: :complete + validates :cc_cvv, presence: true, + numericality: { only_integer: true }, + on: :complete validates :cc_exp_date, presence: true, on: :complete validates :billing_zip_code, presence: true, on: :complete - validate :cc_num_valid?, :cc_exp_date_valid? + validate :cc_num_valid?, :cc_exp_date_valid?, :cc_cvv_valid? def cc_num_valid? @@ -28,6 +31,12 @@ def cc_exp_date_valid? end end + def cc_cvv_valid? + if cc_cvv.present? && !(100..999).include?(cc_cvv) + errors.add(:cc_cvv, "must be a three-digit number") + end + end + def mark_as_paid self.orderitems.each do |item| item.order_status = "paid" diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index 763d830101..d9afcd0fce 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -8,6 +8,7 @@
    + @@ -15,6 +16,7 @@ +
    <%= item.product.name %><%= link_to item.product.name, product_path(item.product.id) %> <%= item.quantity %> <%= format_money(item.price) %>
    Email Mailing Address Credit Card NumberCredit Card CVV Credit Card Exp Date
    <%= @order.email %> <%= @order.mailing_address %> <%= @order.cc_number %><%= @order.cc_cvv %> <%= @order.cc_exp_date %>
    diff --git a/app/views/orders/payment.html.erb b/app/views/orders/payment.html.erb index a003f9ebbd..c86bedaa47 100644 --- a/app/views/orders/payment.html.erb +++ b/app/views/orders/payment.html.erb @@ -33,6 +33,10 @@ <%= f.label :credit_card_number %> <%= f.text_field :credit_card_number %>
    +
    + <%= f.label :credit_card_cvv %> + <%= f.text_field :credit_card_cvv %> +
    <%= f.label :credit_card_expiration%> <%= f.text_field :credit_card_expiration %> diff --git a/db/migrate/20201125230854_addcc_cvvtoorders.rb b/db/migrate/20201125230854_addcc_cvvtoorders.rb new file mode 100644 index 0000000000..447b896565 --- /dev/null +++ b/db/migrate/20201125230854_addcc_cvvtoorders.rb @@ -0,0 +1,5 @@ +class AddccCvvtoorders < ActiveRecord::Migration[6.0] + def change + add_column :orders, :cc_cvv, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 131cb9facf..dd74a1048b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_11_24_214404) do +ActiveRecord::Schema.define(version: 2020_11_25_230854) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -50,6 +50,7 @@ t.integer "billing_zip_code" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.integer "cc_cvv" end create_table "products", force: :cascade do |t| From 2f6b27e956bad3ae4f99adf654a96222a711fa61 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 15:49:43 -0800 Subject: [PATCH 191/208] changed product new test to account for login, created tests for users validations --- test/controllers/products_controller_test.rb | 11 +++++- test/models/user_test.rb | 37 ++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index c88b093706..c46c7d1525 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -40,13 +40,22 @@ end describe "new" do - it "responds with success" do + it "responds with success when user is logged in" do + perform_login + # Act get new_product_path # Assert must_respond_with :success + end + it "responds with redirect when user is not logged in" do + # Act + get new_product_path + + # Assert + must_respond_with :redirect end end diff --git a/test/models/user_test.rb b/test/models/user_test.rb index b9fa5b5725..b1fcbd451e 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -1,7 +1,7 @@ require "test_helper" describe User do - describe "validations" do + describe "Validations" do before do @user = users(:ada) end @@ -19,20 +19,53 @@ expect(@user.valid?).must_equal false end + it "is invalid when name already exists" do + skip + user_hash = { + uid: 1231224, + name: @user.name, + email: "newemail@gmail.com" + } + new_user = User.create(user_hash) + expect(new_user).must_equal false + end + it "is invalid when email is missing" do @user.email = nil expect(@user.valid?).must_equal false end + + it "is invalid when email already exists" do + skip + user_hash = { + uid: 1231224, + name: "new name", + email: @user.email + } + + new_user = User.create(user_hash) + expect(new_user).must_equal false + end end - describe "relations" do + describe "Relationships" do describe "products" do + it "can have many products" do + product1 = products(:confidence) + product2 = products(:python) + end end describe "orderitems" do + it "can have many orderitems through products" do + + end end describe "categories" do + it "can have many categories through products" do + + end end end From 0fa0f57cdee94fc7c12ff2c17000c47d1e3b871c Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 16:06:32 -0800 Subject: [PATCH 192/208] relationship tests for user --- test/models/user_test.rb | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/test/models/user_test.rb b/test/models/user_test.rb index b1fcbd451e..8dca9f07ce 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -1,10 +1,11 @@ require "test_helper" describe User do + before do + @user = users(:grace) + end + describe "Validations" do - before do - @user = users(:ada) - end it 'is valid when all fields are present' do expect(@user.valid?).must_equal true end @@ -51,20 +52,31 @@ describe "Relationships" do describe "products" do it "can have many products" do - product1 = products(:confidence) + product1 = products(:yoga) product2 = products(:python) + + expect(@user.products.count).must_equal 2 + @user.products.each do |product| + expect(product).must_be_instance_of Product + end end end describe "orderitems" do it "can have many orderitems through products" do + orderitem1 = orderitems(:orderitem3) + orderitem2 = orderitems(:orderitem4) + expect(@user.orderitems.count).must_equal 2 end end describe "categories" do it "can have many categories through products" do + category1 = categories(:cs) + category2 = categories(:mental) + expect(@user.categories.count).must_equal 2 end end end From ef69eb9de5bc8d33fc65371a6b42f32d003cb850 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 25 Nov 2020 16:10:57 -0800 Subject: [PATCH 193/208] revise credit card expiration date format --- app/controllers/orders_controller.rb | 2 +- app/views/orders/payment.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 135c9c3023..10b6dba52e 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -62,7 +62,7 @@ def update_order cc_name: params[:order][:name_on_credit_card], cc_number: params[:order][:credit_card_number], cc_cvv: params[:order][:credit_card_cvv], - cc_exp_date: params[:order][:credit_card_expiration], + cc_exp_date: Date.civil(params[:order]["credit_card_expiration(1i)"].to_i,params[:order]["credit_card_expiration(2i)"].to_i,params[:order]["credit_card_expiration(3i)"].to_i), billing_zip_code: params[:order][:billing_zipcode] ) end diff --git a/app/views/orders/payment.html.erb b/app/views/orders/payment.html.erb index c86bedaa47..0a8c301371 100644 --- a/app/views/orders/payment.html.erb +++ b/app/views/orders/payment.html.erb @@ -39,7 +39,7 @@
    <%= f.label :credit_card_expiration%> - <%= f.text_field :credit_card_expiration %> + <%= f.date_select :credit_card_expiration, discard_day: true %>
    <%= f.label :billing_zipcode %> From 2a9e4665504063d615e035d2b2dd910d7ae5268c Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 25 Nov 2020 17:00:10 -0800 Subject: [PATCH 194/208] add tests for orderitem validates & relations --- test/models/orderitem_test.rb | 104 +++++++++++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/test/models/orderitem_test.rb b/test/models/orderitem_test.rb index 4a0ce79e75..592eeaffbc 100644 --- a/test/models/orderitem_test.rb +++ b/test/models/orderitem_test.rb @@ -1,9 +1,111 @@ require "test_helper" describe Orderitem do - describe "relation" do + describe "relations" do + describe "product" do + it "can set the product using a Product" do + # Arrange + orderitem1 = orderitems(:orderitem1) + product1 = products(:confidence) + + # Act & Assert + expect(orderitem1.product).must_equal product1 + end + + it "can set the product using a product_id" do + # Arrange + orderitem1 = orderitems(:orderitem1) + product1 = products(:confidence) + + # Act & Assert + expect(orderitem1.product_id).must_equal product1.id + end + end + + describe "order" do + it "can set the order using a Order" do + # Arrange + orderitem1 = orderitems(:orderitem1) + order1 = orders(:order1) + + # Act & Assert + expect(orderitem1.order).must_equal order1 + end + + it "can set the order using a product_id" do + # Arrange + orderitem1 = orderitems(:orderitem1) + order1 = orders(:order1) + + # Act & Assert + expect(orderitem1.order_id).must_equal order1.id + end + end + + describe "user" do + it "can set the user using a User" do + # Arrange + orderitem1 = orderitems(:orderitem1) + user1 = users(:ada) + + # Act & Assert + expect(orderitem1.user).must_equal user1 + end + end end describe "validates" do + it 'is valid when all fields are present' do + # Act + orderitem1 = orderitems(:orderitem1) + + # Arrange + result = orderitem1.valid? + + # Assert + expect(result).must_equal true + end + + it 'is invalid without a quantity' do + # Arrange + orderitem1 = orderitems(:orderitem1) + orderitem1.quantity = nil + + # Act + result = orderitem1.valid? + + # Assert + expect(result).must_equal false + expect(orderitem1.errors.messages).must_include :quantity + expect(orderitem1.errors.messages[:quantity].include?("can't be blank")).must_equal true + end + + it 'is invalid with a non-integer quantity' do + # Arrange + orderitem1 = orderitems(:orderitem1) + orderitem1.quantity = "test" + + # Act + result = orderitem1.valid? + + # Assert + expect(result).must_equal false + expect(orderitem1.errors.messages).must_include :quantity + expect(orderitem1.errors.messages[:quantity].include?("is not a number")).must_equal true + end + + it 'is invalid when quantity <= 0' do + # Arrange + orderitem1 = orderitems(:orderitem1) + orderitem1.quantity = 0 + + # Act + result = orderitem1.valid? + + # Assert + expect(result).must_equal false + expect(orderitem1.errors.messages).must_include :quantity + expect(orderitem1.errors.messages[:quantity].include?("must be greater than 0")).must_equal true + end end end From 46844ddb674d1c29666a2bd50169e3dabb13a37b Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 25 Nov 2020 17:31:17 -0800 Subject: [PATCH 195/208] tests for new/create for review --- .../order_items_controller_test.rb | 1 - test/controllers/reviews_controller_test.rb | 132 +++++++++++++++++- 2 files changed, 129 insertions(+), 4 deletions(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 6f36f2e063..a52ee02ffc 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -29,7 +29,6 @@ order_item = Orderitem.last.reload - p order_item expect(order_item.order_id).must_equal session[:order_id] expect(order_item.product_id).must_equal id expect(order_item.quantity).must_equal 5 diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 444c98848f..0495e80f51 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -1,7 +1,133 @@ require "test_helper" describe ReviewsController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + let (:valid_review) { + { + review: { + rating: 5 + } + } + } + + let (:invalid_review) { + { + review: { + rating: -1 + } + } + } + + describe "new" do + it "responds with success when review is created" do + # Arrange + product = products(:confidence) + + # Act + get new_product_review_path(product) + + # Assert + must_respond_with :success + end + + it "responds with redirect when reviewer is not logged-in merchant" do + # Arrange + invalid_reviewer = perform_login(users(:ada)) + product = products(:confidence) # merchant is Ada + + # Act + get new_product_review_path(product) + + # Assert + must_respond_with :redirect + end + + it "responds with redirect when review is not created" do + # Arrange + invalid_product = -1 + + # Act + get new_product_review_path(invalid_product) + + # Assert + must_respond_with :redirect + end + end + + describe "create" do + it "can add review to an existing product" do + # Arrange + product = products(:confidence) + + # Act & Assert + expect { + post product_reviews_path(product_id: product), params: valid_review + }.must_differ 'Review.count', 1 + + review = Review.last.reload + expect(review.product_id).must_equal product.id + expect(review.rating).must_equal 5 + end + + it "cannot add review to non-existing product" do + # Arrange + invalid_product = -1 + + # Act & Assert + expect { + post product_reviews_path(-1), params: valid_review + }.wont_change 'Review.count' + + must_respond_with :redirect + end + + it "cannot add review to an existing product when reviewer is not logged-in merchant" do + # Arrange + invalid_reviewer = perform_login(users(:ada)) + product = products(:confidence) # merchant is Ada + + # Act & Assert + expect { + post product_reviews_path(product_id: product), params: valid_review + }.wont_change 'Review.count' + + must_respond_with :redirect + end + + it "cannot add review an existing product with invalid rating" do + # Arrange + product = products(:confidence) + + # Act & Assert + expect { + post product_reviews_path(-1), params: invalid_review + }.wont_change 'Review.count' + + must_respond_with :redirect + end + end + + describe "edit" do + it "must get edit page for existing product" do + #Act + product = Product.create(name: 'Python', description: 'Gain Python skills') + get edit_product_path(product.id) + + # Assert + must_respond_with :success + end + + it "will respond with not_found when a product does not exist" do + # Act + get edit_product_path(-1) + + # Assert + must_respond_with :redirect + end + end + + describe "update" do + end + + describe "destroy" do + end end From 03bdc9940e7998653d7d76af062954d27ed36e3c Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 25 Nov 2020 18:09:38 -0800 Subject: [PATCH 196/208] tests for edit/update for review --- app/controllers/reviews_controller.rb | 23 ++++- test/controllers/reviews_controller_test.rb | 101 +++++++++++++++++--- test/fixtures/reviews.yml | 5 + 3 files changed, 111 insertions(+), 18 deletions(-) create mode 100644 test/fixtures/reviews.yml diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 6353eeeaf0..4391b92dba 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -43,7 +43,14 @@ def create def edit if @review.nil? flash.now[:error] = "The review you are looking for is not found" - redirect_to product_path(@review.product_id) + render_404 + return + end + + @product = Product.find_by(id: @review.product_id) + if @product.user_id == session[:user_id] + flash[:error] = "You couldn't edit the reviews for your own products" + redirect_to product_path(@product) return end end @@ -51,15 +58,22 @@ def edit def update if @review.nil? flash.now[:error] = "The review you are looking for is not found" - redirect_to product_path(@review.product_id) + render_404 + return + end + + @product = Product.find_by(id: @review.product_id) + if @product.user_id == session[:user_id] + flash[:error] = "You couldn't edit the reviews for your own products" + redirect_to product_path(@product) return elsif @review.update(review_params) flash[:success] = "Your review has been successfully updated" redirect_to product_path(@review.product_id) return - else # save failed + else flash.now[:error] = "Your review has not been updated" - render :edit, status: :bad_request + redirect_to product_path(@product) return end end @@ -73,7 +87,6 @@ def destroy @review.destroy flash[:success] = "Successfully destroyed #{ @review.id }" - # need to clarify which path to redirect redirect_back(fallback_location: root_path) return end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 0495e80f51..6a9ae33ec6 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -29,7 +29,7 @@ must_respond_with :success end - it "responds with redirect when reviewer is not logged-in merchant" do + it "responds with redirect when reviewer is logged-in merchant" do # Arrange invalid_reviewer = perform_login(users(:ada)) product = products(:confidence) # merchant is Ada @@ -74,13 +74,13 @@ # Act & Assert expect { - post product_reviews_path(-1), params: valid_review + post product_reviews_path(product_id: invalid_product), params: valid_review }.wont_change 'Review.count' must_respond_with :redirect end - it "cannot add review to an existing product when reviewer is not logged-in merchant" do + it "cannot add review to an existing product when reviewer is logged-in merchant" do # Arrange invalid_reviewer = perform_login(users(:ada)) product = products(:confidence) # merchant is Ada @@ -99,7 +99,7 @@ # Act & Assert expect { - post product_reviews_path(-1), params: invalid_review + post product_reviews_path(product_id: product.id), params: invalid_review }.wont_change 'Review.count' must_respond_with :redirect @@ -107,25 +107,100 @@ end describe "edit" do - it "must get edit page for existing product" do - #Act - product = Product.create(name: 'Python', description: 'Gain Python skills') - get edit_product_path(product.id) - + it "responds with success when getting the edit page for an existing review" do + # Arrange + review1 = reviews(:review1) # review for confidence + + # Act + get edit_review_path(review1) + # Assert must_respond_with :success end - - it "will respond with not_found when a product does not exist" do + + it "responds with redirect when the review editor is logged-in merchant" do + # Arrange + invalid_reviewer = perform_login(users(:ada)) + review1 = reviews(:review1) # review for confidence + # Act - get edit_product_path(-1) - + get edit_review_path(review1) + # Assert must_respond_with :redirect end + + it "responds with redirect when a review is not existed" do + # Arrange + invalid_review = -1 + + # Act + get edit_review_path(invalid_review) + + # Assert + must_respond_with :not_found + end end describe "update" do + it "can update review to an existing product" do + # Arrange + review1 = reviews(:review1) # review for confidence, rating 3 + + # Act & Assert + expect { + patch review_path(review1), params: valid_review + }.wont_change 'Review.count' + + review = Review.find_by(id: review1.id) + expect(review).must_equal review1 + expect(review.rating).wont_equal review1.rating + expect(review.rating).must_equal 5 + end + + it "cannot update review to an existing product when reviewer is logged-in merchant" do + # Arrange + invalid_reviewer = perform_login(users(:ada)) + review1 = reviews(:review1) # merchant is Ada, rating is 3 + initial_rating = review1.rating + + # Act & Assert + expect { + patch review_path(review1), params: valid_review + }.wont_change 'Review.count' + + review1.reload + expect(review1.rating).must_equal initial_rating + must_respond_with :redirect + end + + it "cannot update a review when the review is not existed" do + # Arrange + invalid_review = -1 + + # Act + expect { + patch review_path(invalid_review), params: valid_review + }.wont_change 'Review.count' + + # Assert + must_respond_with :not_found + end + + it "cannot update review with invalid rating" do + # Arrange + review1 = reviews(:review1) + initial_rating = review1.rating + + # Act & Assert + expect { + patch review_path(review1), params: invalid_review + }.wont_change 'Review.count' + + review1.reload + expect(review1.rating).must_equal initial_rating + must_respond_with :redirect + end end describe "destroy" do diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml new file mode 100644 index 0000000000..b4e550ddd0 --- /dev/null +++ b/test/fixtures/reviews.yml @@ -0,0 +1,5 @@ +review1: + id: 1 + rating: 3 + description: Wonderful potion + product_id: 1 \ No newline at end of file From cf2f16c55cc63ed861469f71a7c6194e4b60291d Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 25 Nov 2020 18:15:42 -0800 Subject: [PATCH 197/208] tests for destroy for review --- app/controllers/reviews_controller.rb | 2 +- test/controllers/reviews_controller_test.rb | 27 +++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 4391b92dba..765adec4eb 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -81,7 +81,7 @@ def update def destroy if @review.nil? flash.now[:error] = "The review you are looking for is not found" - redirect_to product_path(@review.product_id) + render_404 return end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 6a9ae33ec6..5652300037 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -130,7 +130,7 @@ must_respond_with :redirect end - it "responds with redirect when a review is not existed" do + it "responds with 404 when a review is not existed" do # Arrange invalid_review = -1 @@ -174,7 +174,7 @@ must_respond_with :redirect end - it "cannot update a review when the review is not existed" do + it "responds with 404 when the review is not existed" do # Arrange invalid_review = -1 @@ -204,5 +204,28 @@ end describe "destroy" do + it "can delete a review" do + # Arrange + review1 = reviews(:review1) + + # Act-Assert + expect { + delete review_path(review1) + }.must_differ "Review.count", -1 + + must_respond_with :redirect + end + + it "responds with 404 when a review is not existed" do + # Arrange + invalid_review = -1 + + # Act-Assert + expect { + delete review_path(invalid_review) + }.wont_change "Review.count" + + must_respond_with :not_found + end end end From 146a66b6c836712c9a4abd9aa33c7744914a0f53 Mon Sep 17 00:00:00 2001 From: Ting-Yi Liu <46391352+ichbinorange@users.noreply.github.com> Date: Wed, 25 Nov 2020 18:30:06 -0800 Subject: [PATCH 198/208] tests for validates/relations for review --- test/models/review_test.rb | 60 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 626fa522d8..abebf20dcc 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,7 +1,61 @@ require "test_helper" describe Review do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe "relation" do + describe "products" do + it "can set the product using a Product" do + # Arrange + review1 = reviews(:review1) # for product1 + product1 = products(:confidence) + + # Act & Assert + expect(review1.product).must_equal product1 + end + + it "can set the product using a product_id" do + # Arrange + review1 = reviews(:review1) # for product1 + product1 = products(:confidence) + + # Act & Assert + expect(review1.product_id).must_equal product1.id + end + end + end + + describe "validates" do + it 'is valid when all fields are present' do + # Arrange + review1 = reviews(:review1) + # Act + result = review1.valid? + + # Assert + expect(result).must_equal true + end + + it "is invalid when rating is missing" do + # Arrange + review1 = reviews(:review1) + review1.rating = nil + + # Act + result = review1.valid? + + # Assert + expect(result).must_equal false + end + + it "is invalid when rating is not in (1..5)" do + # Arrange + review1 = reviews(:review1) + review1.rating = 6 + + # Act + result = review1.valid? + + # Assert + expect(result).must_equal false + end + end end From 1070aced0d462f00f4ceb02e072db94f84effe21 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 23:05:27 -0800 Subject: [PATCH 199/208] updated products controller tests and method for show --- app/controllers/products_controller.rb | 9 ++++----- test/controllers/products_controller_test.rb | 11 +++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 9c8b703de0..ac828cac68 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -17,11 +17,10 @@ def clear end def show - #review test with group - # if @product.nil? - # head :not_found - # return - # end + if @product.nil? + render_404 + return + end end def new diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index c46c7d1525..d31a4508c5 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -33,9 +33,9 @@ must_respond_with :success end - it 'should respond with 3xx with an invalid product id' do + it 'should respond with 4xx with an invalid product id' do get product_path(-1) - must_respond_with :redirect + must_respond_with :not_found end end @@ -61,15 +61,13 @@ describe "create" do it "can create a new product with valid information accurately, and redirect" do - #maybe failing because of sessions[:user_id] ? - skip # Arrange - user = users(:ada) + perform_login # Set up the form data product_hash = { product: { name: 'Artists Potion', - user_id: user.id, + user_id: 2, stock: 2, price: 1400, description: 'Turns you into Bob Ross', @@ -98,6 +96,7 @@ it "does not create a product if the form data violates product validations" do # Note: This will not pass until ActiveRecord Validations lesson # Arrange + perform_login # Set up the form data so that it violates product validations product_hash = { product: { From bb4adb9b9fd564bcc0224309f2b813dc585c5fe5 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 23:12:04 -0800 Subject: [PATCH 200/208] corrected tests for edit product --- test/controllers/products_controller_test.rb | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index d31a4508c5..de60191e27 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -10,7 +10,7 @@ it "responds with success when there are many products saved" do get products_path - expect(Product.count).must_equal 1 + expect(Product.count).must_equal 3 must_respond_with :success end @@ -18,6 +18,8 @@ it "responds with success when there are no products saved" do #ask team about this test! It's kind of weird... products(:confidence).destroy + products(:python).destroy + products(:yoga).destroy get products_path @@ -118,15 +120,25 @@ describe "Edit" do - it "must get edit page for existing product" do + it "must get edit page for existing product when logged in" do + perform_login #Act - product = Product.create(name: 'Python', description: 'Gain Python skills') + product = products(:confidence) get edit_product_path(product.id) # Assert must_respond_with :success end + it "responds with redirect for existing product when not logged in" do + #Act + product = products(:python) + get edit_product_path(product.id) + + # Assert + must_respond_with :redirect + end + it "will respond with not_found when a product does not exist" do # Act get edit_product_path(-1) From 3bc42c12cc7b687513e4197df9d92893691c9f4f Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 23:27:00 -0800 Subject: [PATCH 201/208] edited update products tests --- test/controllers/products_controller_test.rb | 49 ++++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index de60191e27..9cdbf60a1c 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -169,20 +169,41 @@ expect(product.name).must_equal updated_product[:product][:name] end - it "will respond with not found given an invalid id" do - updated_product = { - product: { - name: "Public Speaking", - description: "Level 1", - price: 45, - } - } - expect { - patch product_path(-1), params: updated_product - }.wont_change "Product.count" - - must_respond_with :redirect - end + it "will respond with not found given an invalid id" do + updated_product = { + product: { + name: "Public Speaking", + description: "Level 1", + price: 45, + } + } + expect { + patch product_path(-1), params: updated_product + }.wont_change "Product.count" + + must_respond_with :redirect + end + + it "does not update a product if the form data violates product validations" do + product = products(:confidence) + + updated_product = { + product: { + name: "Public Speaking", + description: "Level 1", + price: nil, + } + } + # Set up the form data so that it violates product validations + + # Act-Assert + expect { + patch product_path(product.id), params: updated_product + }.wont_change "Product.count" + + must_respond_with :bad_request + + end end From 503e98610f19a30fac05d098c0bb6f9d7602406d Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 23:42:03 -0800 Subject: [PATCH 202/208] updated user tests --- test/models/user_test.rb | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/test/models/user_test.rb b/test/models/user_test.rb index 8dca9f07ce..b3d0a0cdf3 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -20,33 +20,10 @@ expect(@user.valid?).must_equal false end - it "is invalid when name already exists" do - skip - user_hash = { - uid: 1231224, - name: @user.name, - email: "newemail@gmail.com" - } - new_user = User.create(user_hash) - expect(new_user).must_equal false - end - it "is invalid when email is missing" do @user.email = nil expect(@user.valid?).must_equal false end - - it "is invalid when email already exists" do - skip - user_hash = { - uid: 1231224, - name: "new name", - email: @user.email - } - - new_user = User.create(user_hash) - expect(new_user).must_equal false - end end describe "Relationships" do From f27ed2270772425abe31b2ac1e8e75039d6cde1e Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Wed, 25 Nov 2020 23:53:09 -0800 Subject: [PATCH 203/208] created category controller tests --- .../controllers/categories_controller_test.rb | 30 +++++++++++++++++-- test/controllers/orders_controller_test.rb | 1 + 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index fc964739f0..0c38c89c8a 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -1,7 +1,31 @@ require "test_helper" describe CategoriesController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe "create" do + it "can create a new category when given valid input" do + category_hash = { + name: "test category" + } + perform_login + + expect { + post categories_path, params: category_hash + }.must_change "Category.count", 1 + + must_respond_with :redirect + end + + it "wont save when creating category with invalid input" do + category_hash = { + name: nil + } + perform_login + + expect { + post categories_path, params: category_hash + }.wont_differ "Category.count" + + must_respond_with :redirect + end + end end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index faf7f2e6ac..830044dbdd 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -56,6 +56,7 @@ end describe "cart" do + #most testing for cart operation falls under orderitems controller it "responds with success when getting the cart page for guest" do get cart_path From 0b3adb866eeab05cf7d41498b7dfb80b08111a88 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Thu, 26 Nov 2020 00:16:03 -0800 Subject: [PATCH 204/208] tested order_cart method from application controller --- test/controllers/orders_controller_test.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 830044dbdd..31ec88c64f 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -70,5 +70,24 @@ must_respond_with :success end + + describe "order_cart" do + it "creates an order if there's currently no cart in session" do + + expect { + get cart_path + }.must_change "Order.count", 1 + end + + it "does not create a new order if there's a cart in session" do + get cart_path + + expect { + get cart_path + }.wont_differ "Order.count" + end + end end + + end From b21758b62070824316df94749e0298807ec838f0 Mon Sep 17 00:00:00 2001 From: Marj E Date: Thu, 26 Nov 2020 06:57:08 -0800 Subject: [PATCH 205/208] added destroy tests for orderitem --- app/controllers/order_items_controller.rb | 1 - .../order_items_controller_test.rb | 24 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 94ab42361a..4691a4b6e0 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -68,7 +68,6 @@ def update end def destroy - item_name = @order_item.product.name if @order_item.nil? flash[:error] = "Could not remove Order." diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index a52ee02ffc..9bf410d1e9 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -437,4 +437,28 @@ must_respond_with :redirect end end + + describe "destroy" do + it 'should redirect if order_item is nil' do + expect { + delete order_item_path(-1) + }.wont_change "Orderitem.count" + + non_exist = Orderitem.find_by(id: -1) + expect(non_exist).must_be_nil + must_respond_with :redirect + end + + it 'should destroy order item' do + first_item = Orderitem.find_by(id: 1) + + expect(Orderitem.count).must_equal 8 + + expect { + delete order_item_path(first_item.id) + }.must_change "Orderitem.count", 1 + + must_respond_with :redirect + end + end end From ef244ae52a23704085c23fd4d8e3e664fb5a6eb0 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Thu, 26 Nov 2020 10:28:30 -0800 Subject: [PATCH 206/208] tested custom modek methods for order --- test/fixtures/orderitems.yml | 2 +- test/models/order_test.rb | 39 +++++++++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/test/fixtures/orderitems.yml b/test/fixtures/orderitems.yml index 18f7b665c6..6bb4d474a5 100644 --- a/test/fixtures/orderitems.yml +++ b/test/fixtures/orderitems.yml @@ -3,7 +3,7 @@ orderitem1: order_id: 1 product_id: 1 quantity: 1 - price: 100 + price: 5 order_status: "pending" shipped: false cancelled: false diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 59ceb9a253..fae749dc70 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,7 +1,40 @@ require "test_helper" describe Order do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe "Relationships" do + + end + + describe "Validations" do + + end + + describe "Custom Validations" do + + end + + describe "Custom Methods" do + it "marks orderitems as paid only when order payment is completed" do + @order = orders(:order1) + + expect(@order.orderitems.first.order_status).must_equal "pending" + + @order.mark_as_paid + + expect(@order.orderitems.first.order_status).must_equal "paid" + end + it "updates product stock only when order payment is completed" do + @order = orders(:order1) + + expect(@order.products.first.stock).must_equal 100 + + @order.update_stock + + expect(@order.products.first.stock).must_equal 99 + end + + it "sums up order subtotals" do + + end + end end From 9febbc36696a86165407da365bf4ac4db45b51af Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Thu, 26 Nov 2020 11:01:26 -0800 Subject: [PATCH 207/208] added more custom method tests for order --- test/fixtures/orders.yml | 2 +- test/models/order_test.rb | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 77abcd1452..c47e88d060 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -4,7 +4,7 @@ order1: email: xxx mailing_address: 123 WA cc_name: Ada - cc_number: 1111 + cc_number: 22221111 cc_exp_date: May 23, 2022 billing_zip_code: 98136 order2: diff --git a/test/models/order_test.rb b/test/models/order_test.rb index fae749dc70..a5727c99fd 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -14,18 +14,19 @@ end describe "Custom Methods" do - it "marks orderitems as paid only when order payment is completed" do + before do @order = orders(:order1) - + end + + it "marks orderitems as paid only when order payment is completed" do expect(@order.orderitems.first.order_status).must_equal "pending" @order.mark_as_paid expect(@order.orderitems.first.order_status).must_equal "paid" end - it "updates product stock only when order payment is completed" do - @order = orders(:order1) + it "updates product stock only when order payment is completed" do expect(@order.products.first.stock).must_equal 100 @order.update_stock @@ -34,7 +35,13 @@ end it "sums up order subtotals" do - + expect(@order.total).must_equal 40005 + end + + it "only shows last 4 digits of credit card number" do + expect(@order.cc_number).must_equal 22221111 + + expect(@order.last_digits).must_equal "1111" end end end From 24d848fd499ee3cd24cba9d48f9ce0c95861e194 Mon Sep 17 00:00:00 2001 From: Jessica Chan Date: Thu, 26 Nov 2020 11:40:13 -0800 Subject: [PATCH 208/208] finished order model tests --- test/fixtures/orders.yml | 3 ++- test/models/order_test.rb | 44 ++++++++++++++++++++++++++++++++++----- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index c47e88d060..36b70fa151 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -4,8 +4,9 @@ order1: email: xxx mailing_address: 123 WA cc_name: Ada - cc_number: 22221111 + cc_number: 9999922221111 cc_exp_date: May 23, 2022 + cc_cvv: 123 billing_zip_code: 98136 order2: id: 2 diff --git a/test/models/order_test.rb b/test/models/order_test.rb index a5727c99fd..ceda8388bc 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,23 +1,57 @@ require "test_helper" describe Order do + before do + @order = orders(:order1) + end describe "Relationships" do + it "can have many order items" do + expect(@order.orderitems.count).must_equal 2 + end + + it "can have many products through order items" do + expect(@order.products.count).must_equal 2 + end end describe "Validations" do + #all order validations only apply upon payment, not during cart + it "is valid when all required fields are filled" do + expect(@order.valid?).must_equal true + end + it "is still valid if a field is missing before checkout" do + new_order = Order.create() + expect(new_order.valid?).must_equal true + end end describe "Custom Validations" do + it "fails validation if cc num is less than 13 or more than 19 digits" do + @order.cc_number = 1234 + expect(@order.valid?).must_equal false + + @order.cc_number = 12345678901234567890 + expect(@order.valid?).must_equal false + end + + it "fails validation if cc exp date is in the past" do + @order.cc_exp_date = "May 23, 1990" + expect(@order.valid?).must_equal false + + @order.cc_exp_date = "May 23, 3000" + expect(@order.valid?).must_equal true + end + + it "fails validation if cc cvv is not a 3 digit number" do + @order.cc_cvv = 12 + expect(@order.valid?).must_equal false + end end describe "Custom Methods" do - before do - @order = orders(:order1) - end - it "marks orderitems as paid only when order payment is completed" do expect(@order.orderitems.first.order_status).must_equal "pending" @@ -39,7 +73,7 @@ end it "only shows last 4 digits of credit card number" do - expect(@order.cc_number).must_equal 22221111 + expect(@order.cc_number).must_equal 9999922221111 expect(@order.last_digits).must_equal "1111" end