From c6b5989fb3de22d12a05e9a2c0d2b7f19c4ed132 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 9 Jun 2020 16:41:19 -0700 Subject: [PATCH 001/367] set up 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 | 7631 +++++++++++++++++ 93 files changed, 9441 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..bf513ff7ce --- /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.1' +# 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..4961154df0 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,298 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (6.0.3.1) + actionpack (= 6.0.3.1) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailbox (6.0.3.1) + actionpack (= 6.0.3.1) + activejob (= 6.0.3.1) + activerecord (= 6.0.3.1) + activestorage (= 6.0.3.1) + activesupport (= 6.0.3.1) + mail (>= 2.7.1) + actionmailer (6.0.3.1) + actionpack (= 6.0.3.1) + actionview (= 6.0.3.1) + activejob (= 6.0.3.1) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (6.0.3.1) + actionview (= 6.0.3.1) + activesupport (= 6.0.3.1) + 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.1) + actionpack (= 6.0.3.1) + activerecord (= 6.0.3.1) + activestorage (= 6.0.3.1) + activesupport (= 6.0.3.1) + nokogiri (>= 1.8.5) + actionview (6.0.3.1) + activesupport (= 6.0.3.1) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.1, >= 1.2.0) + activejob (6.0.3.1) + activesupport (= 6.0.3.1) + globalid (>= 0.3.6) + activemodel (6.0.3.1) + activesupport (= 6.0.3.1) + activerecord (6.0.3.1) + activemodel (= 6.0.3.1) + activesupport (= 6.0.3.1) + activestorage (6.0.3.1) + actionpack (= 6.0.3.1) + activejob (= 6.0.3.1) + activerecord (= 6.0.3.1) + marcel (~> 0.3.1) + activesupport (6.0.3.1) + 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 (9.7.6) + execjs + better_errors (2.7.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.4.6) + msgpack (~> 1.0) + bootstrap (4.5.0) + 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.32.2) + 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.6) + crass (1.0.6) + debase (0.2.4.1) + debase-ruby_core_source (>= 0.10.2) + debase-ruby_core_source (0.10.9) + debug_inspector (0.0.3) + erubi (1.9.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.3) + concurrent-ruby (~> 1.0) + jbuilder (2.10.0) + 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.2.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + loofah (2.5.0) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + lumberjack (1.2.5) + 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.1) + 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.2) + nokogiri (1.10.9) + 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.5) + puma (4.3.5) + nio4r (~> 2.0) + rack (2.2.2) + rack-proxy (0.6.5) + rack + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (6.0.3.1) + actioncable (= 6.0.3.1) + actionmailbox (= 6.0.3.1) + actionmailer (= 6.0.3.1) + actionpack (= 6.0.3.1) + actiontext (= 6.0.3.1) + actionview (= 6.0.3.1) + activejob (= 6.0.3.1) + activemodel (= 6.0.3.1) + activerecord (= 6.0.3.1) + activestorage (= 6.0.3.1) + activesupport (= 6.0.3.1) + bundler (>= 1.3.0) + railties (= 6.0.3.1) + 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.1) + actionpack (= 6.0.3.1) + activesupport (= 6.0.3.1) + 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.7.1) + 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.0) + 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.1) + 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.7) + thread_safe (~> 0.1) + web-console (4.0.2) + 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.2.2) + activesupport (>= 4.2) + rack-proxy (>= 0.6.1) + railties (>= 4.2) + websocket-driver (0.7.2) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + xpath (3.2.0) + nokogiri (~> 1.8) + zeitwerk (2.3.0) + +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.1) + 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..81334e4c79 --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +617+zvLlnGagmNqSdkuUkzpE8zLu73TbVPo1YlVaQ7eQMdHOpeMv14GJo+/931HwZW/ZSIrqr4QjBrOITI6YPO2LIKNxzBDrLrP9WVHBwjz9qBIwtANyx8Lo6QaRiirYqtzytsMgV+3HYlAxoYMs5BP4zbTYaQLsF4e1nzp52S4VPXcCsR4IXDRpvKHhlX9hrlJrrB6rAqMdEGqfAog3lpFF1E0hluPpipfmQ8cTVJt4di1/Kagjadjt78+bthG5gJ/wpkrTbFgwlSwb1lMaSX9bDWAoM5/KGN1QI00Z799uoRgPcsuBzrG6BVger1vRy8BPcXSerPIFyKzaATQjOh3GrE1UER5jI80cVoCcYaeD3675JATSsrAAYv592DczlEYRmX7+FX1RRzKYA9WlTd0NRvdHK9drOsAV--Tj7s8VwOol+9ErgM--7DDDQfw25xOCXNaOKDFx2A== \ 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..7ae6822064 --- /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.2.2", + "bootstrap": "^4.5.0", + "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..c60a702158 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7631 @@ +# 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.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" + integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== + dependencies: + "@babel/highlight" "^7.10.1" + +"@babel/compat-data@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db" + integrity sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw== + dependencies: + browserslist "^4.12.0" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@^7.7.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a" + integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/generator" "^7.10.2" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helpers" "^7.10.1" + "@babel/parser" "^7.10.2" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.2" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.10.1", "@babel/generator@^7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9" + integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA== + dependencies: + "@babel/types" "^7.10.2" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" + integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059" + integrity sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-compilation-targets@^7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285" + integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA== + dependencies: + "@babel/compat-data" "^7.10.1" + browserslist "^4.12.0" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.10.1": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz#7474295770f217dbcf288bf7572eb213db46ee67" + integrity sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-member-expression-to-functions" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + +"@babel/helper-create-regexp-features-plugin@^7.10.1", "@babel/helper-create-regexp-features-plugin@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd" + integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-regex" "^7.10.1" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d" + integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/types" "^7.10.1" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz#e9d76305ee1162ca467357ae25df94f179af2b7e" + integrity sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg== + dependencies: + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-function-name@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4" + integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-get-function-arity@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d" + integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-hoist-variables@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz#7e77c82e5dcae1ebf123174c385aaadbf787d077" + integrity sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-member-expression-to-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15" + integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-module-imports@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" + integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-module-transforms@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" + integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== + dependencies: + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543" + integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.8.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" + integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== + +"@babel/helper-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" + integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz#bad6aaa4ff39ce8d4b82ccaae0bfe0f7dbb5f432" + integrity sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-wrap-function" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-replace-supers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" + integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-simple-access@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" + integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-split-export-declaration@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" + integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-validator-identifier@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" + integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== + +"@babel/helper-wrap-function@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9" + integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helpers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" + integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/highlight@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" + integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg== + dependencies: + "@babel/helper-validator-identifier" "^7.10.1" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.10.1", "@babel/parser@^7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0" + integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ== + +"@babel/plugin-proposal-async-generator-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz#6911af5ba2e615c4ff3c497fe2f47b35bf6d7e55" + integrity sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-remap-async-to-generator" "^7.10.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.10.1", "@babel/plugin-proposal-class-properties@^7.7.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" + integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-proposal-dynamic-import@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0" + integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09" + integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78" + integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123" + integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-numeric-separator" "^7.10.1" + +"@babel/plugin-proposal-object-rest-spread@^7.10.1", "@babel/plugin-proposal-object-rest-spread@^7.6.2": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6" + integrity sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.1" + +"@babel/plugin-proposal-optional-catch-binding@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2" + integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz#15f5d6d22708629451a91be28f8facc55b0e818c" + integrity sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598" + integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-proposal-unicode-property-regex@^7.10.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f" + integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@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.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" + integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@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-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-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.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" + integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@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.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362" + integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-arrow-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b" + integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-async-to-generator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062" + integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg== + dependencies: + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-remap-async-to-generator" "^7.10.1" + +"@babel/plugin-transform-block-scoped-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d" + integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-block-scoping@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" + integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f" + integrity sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-define-map" "^7.10.1" + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz#59aa399064429d64dce5cf76ef9b90b7245ebd07" + integrity sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-destructuring@^7.10.1", "@babel/plugin-transform-destructuring@^7.6.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" + integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-dotall-regex@^7.10.1", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee" + integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-duplicate-keys@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9" + integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-exponentiation-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3" + integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-for-of@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5" + integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-function-name@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d" + integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a" + integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-member-expression-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39" + integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-modules-amd@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a" + integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw== + dependencies: + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301" + integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg== + dependencies: + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz#9962e4b0ac6aaf2e20431ada3d8ec72082cbffb6" + integrity sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA== + dependencies: + "@babel/helper-hoist-variables" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595" + integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA== + dependencies: + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324" + integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-object-super@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde" + integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + +"@babel/plugin-transform-parameters@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd" + integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg== + dependencies: + "@babel/helper-get-function-arity" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-property-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d" + integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-regenerator@^7.10.1", "@babel/plugin-transform-regenerator@^7.7.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490" + integrity sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86" + integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-runtime@^7.6.2": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz#fd1887f749637fb2ed86dc278e79eb41df37f4b1" + integrity sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw== + dependencies: + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3" + integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-spread@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8" + integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-sticky-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00" + integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-regex" "^7.10.1" + +"@babel/plugin-transform-template-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz#914c7b7f4752c570ea00553b4284dad8070e8628" + integrity sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-typeof-symbol@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e" + integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-unicode-escapes@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940" + integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-unicode-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f" + integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/preset-env@^7.7.1": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.2.tgz#715930f2cf8573b0928005ee562bed52fb65fdfb" + integrity sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA== + dependencies: + "@babel/compat-data" "^7.10.1" + "@babel/helper-compilation-targets" "^7.10.2" + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-proposal-async-generator-functions" "^7.10.1" + "@babel/plugin-proposal-class-properties" "^7.10.1" + "@babel/plugin-proposal-dynamic-import" "^7.10.1" + "@babel/plugin-proposal-json-strings" "^7.10.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" + "@babel/plugin-proposal-numeric-separator" "^7.10.1" + "@babel/plugin-proposal-object-rest-spread" "^7.10.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.1" + "@babel/plugin-proposal-optional-chaining" "^7.10.1" + "@babel/plugin-proposal-private-methods" "^7.10.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.10.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.1" + "@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.10.1" + "@babel/plugin-transform-arrow-functions" "^7.10.1" + "@babel/plugin-transform-async-to-generator" "^7.10.1" + "@babel/plugin-transform-block-scoped-functions" "^7.10.1" + "@babel/plugin-transform-block-scoping" "^7.10.1" + "@babel/plugin-transform-classes" "^7.10.1" + "@babel/plugin-transform-computed-properties" "^7.10.1" + "@babel/plugin-transform-destructuring" "^7.10.1" + "@babel/plugin-transform-dotall-regex" "^7.10.1" + "@babel/plugin-transform-duplicate-keys" "^7.10.1" + "@babel/plugin-transform-exponentiation-operator" "^7.10.1" + "@babel/plugin-transform-for-of" "^7.10.1" + "@babel/plugin-transform-function-name" "^7.10.1" + "@babel/plugin-transform-literals" "^7.10.1" + "@babel/plugin-transform-member-expression-literals" "^7.10.1" + "@babel/plugin-transform-modules-amd" "^7.10.1" + "@babel/plugin-transform-modules-commonjs" "^7.10.1" + "@babel/plugin-transform-modules-systemjs" "^7.10.1" + "@babel/plugin-transform-modules-umd" "^7.10.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.10.1" + "@babel/plugin-transform-object-super" "^7.10.1" + "@babel/plugin-transform-parameters" "^7.10.1" + "@babel/plugin-transform-property-literals" "^7.10.1" + "@babel/plugin-transform-regenerator" "^7.10.1" + "@babel/plugin-transform-reserved-words" "^7.10.1" + "@babel/plugin-transform-shorthand-properties" "^7.10.1" + "@babel/plugin-transform-spread" "^7.10.1" + "@babel/plugin-transform-sticky-regex" "^7.10.1" + "@babel/plugin-transform-template-literals" "^7.10.1" + "@babel/plugin-transform-typeof-symbol" "^7.10.1" + "@babel/plugin-transform-unicode-escapes" "^7.10.1" + "@babel/plugin-transform-unicode-regex" "^7.10.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.10.2" + browserslist "^4.12.0" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + 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.10.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" + integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811" + integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/parser" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/traverse@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" + integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/generator" "^7.10.1" + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/parser" "^7.10.1" + "@babel/types" "^7.10.1" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.4.4": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" + integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng== + dependencies: + "@babel/helper-validator-identifier" "^7.10.1" + lodash "^4.17.13" + 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== + +"@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.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@rails/webpacker/-/webpacker-4.2.2.tgz#b9dd3235fdf4d0badbda8e33f6ebee742a9f3abb" + integrity sha512-jzw7qMfSCLdrt9j1X+2IvXjf63huXYqeIPwLujXa9pYFvxtEstbVYRDivuLhiDokzih+PrYpB+dLTGBNgVsnpw== + 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 "^3.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.2" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.2.tgz#06ca26521353a545d94a0adc74f38a59d232c987" + integrity sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/json-schema@^7.0.4": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" + integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== + +"@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.0.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.13.tgz#ee1128e881b874c371374c1f72201893616417c9" + integrity sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA== + +"@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.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + 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: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5: + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== + 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@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.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.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511" + integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001061" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.30" + 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.10.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" + integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== + +babel-loader@^8.0.6: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + 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.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +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.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +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.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" + integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== + +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.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.0.tgz#97d9dbcb5a8972f8722c9962483543b907d9b9ec" + integrity sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA== + +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.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" + integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.2" + 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.6.4, browserslist@^4.8.5: + version "4.12.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" + integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== + dependencies: + caniuse-lite "^1.0.30001043" + electron-to-chromium "^1.3.413" + node-releases "^1.1.53" + pkg-up "^2.0.0" + +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" + +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" + +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.30001043, caniuse-lite@^1.0.30001061: + version "1.0.30001079" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001079.tgz#ed3e5225cd9a6850984fdd88bf24ce45d69b9c22" + integrity sha512-2KaYheg0iOY+CMmDuAB3DHehrXhhb4OZU4KBVGDr/YKyYAcpudaiUQ9PJ9rxrPlKEoJ3ATasQ5AN48MqpwS43Q== + +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@2.4.2, 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" + +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" + +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.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" + integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== + 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.4.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== + +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.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +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@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-3.1.0.tgz#9f510172a7b5fae5aad3b670652e8bd7997aeeca" + integrity sha512-iqTHj3rADN4yHwXMBrQa/xrncex/uEQy8QHlaTKxGchT/hC0SdlJlmL/5eRqffmWq2ep0/Romw6Ld39JjTR/ug== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.0.0" + neo-async "^2.5.0" + schema-utils "^2.6.1" + serialize-javascript "^2.1.2" + webpack-sources "^1.0.1" + +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.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== + dependencies: + browserslist "^4.8.5" + semver "7.0.0" + +core-js@^3.4.0: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + +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.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +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@6.0.5, cross-spawn@^6.0.0: + 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" + +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" + +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.5.3" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.3.tgz#95ac16468e1adcd95c844729e0bb167639eb0bcf" + integrity sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw== + 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.27" + 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.0.3" + schema-utils "^2.6.6" + 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-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" + integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== + +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.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + dependencies: + css-tree "1.0.0-alpha.39" + +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.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.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +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.2, 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.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +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.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + 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.413: + version "1.3.465" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.465.tgz#d692e5c383317570c2bd82092a24a0308c6ccf29" + integrity sha512-K/lUeT3NLAsJ5SHRDhK3/zd0tw7OUllYD8w+fTOXm6ljCPsp2qq+vMzxpLo8u1M27ZjZAjRbsA6rirvne2nAMQ== + +elliptic@^6.0.0, elliptic@^6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + 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@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +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.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + +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, es-abstract@^1.17.5: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.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" + +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.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.1.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== + +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.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +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.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@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^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.11.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb" + integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA== + dependencies: + debug "^3.0.0" + +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.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +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-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@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-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-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.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + 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.0, 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.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +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.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + 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, 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.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +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.1.5: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + +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-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-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.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" + integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== + 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.5.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" + integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + 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-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" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.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.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +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.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.10: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +loglevel@^1.6.8: + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +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" + +make-dir@^2.0.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-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.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.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + +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= + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.0, 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, "mime-db@>= 1.43.0 < 2": + 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-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== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +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.3" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34" + integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ== + 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" + +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.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" + +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.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.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +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.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +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.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== + +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.53: + version "1.1.58" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" + integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg== + +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.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +object-keys@^1.0.11, 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: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +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.3" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== + 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-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +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-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +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-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.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-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@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +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.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.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.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + 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" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.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.26" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" + integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" + +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.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" + integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + 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.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" + integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + 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.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" + integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + 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.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.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.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +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.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3, 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.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + 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= + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +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.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +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.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + 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.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" + integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + +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.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + 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.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + 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" + +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.1, schema-utils@^2.6.5, schema-utils@^2.6.6: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +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.7" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + dependencies: + node-forge "0.9.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@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +serialize-javascript@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" + integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== + 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.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +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" + +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.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimleft@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" + +string.prototype.trimright@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +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.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" + integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.6" + +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@6.1.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@^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@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + 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" + +terser-webpack-plugin@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f" + integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^3.1.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.7" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.7.tgz#4910ff5d1a872168cc7fa6cd3749e2b0d60a8a0b" + integrity sha512-xzYyaHUNhzgaAdBsXxk2Yvo/x1NJdslUaussK3fdpBbvttm1iIwU+c26dj9UxJcwk2c5UWt5F55MUTIA8BE7Dg== + 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 "^3.1.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.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz#15852cf1a08e3256a80428e865a2fa893ffba006" + integrity sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw== + 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.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + 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.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +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.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + 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.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.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + +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.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" + integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.0" + watchpack-chokidar2 "^2.0.0" + +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.11" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" + integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +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.0.1, 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.43.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" + integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== + 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.1.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.6.1" + 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.0, 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.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + 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.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 f2f5146d0d0c6a01564fe3d90032d0bfac7b0a91 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 9 Jun 2020 17:01:26 -0700 Subject: [PATCH 002/367] model is set up with test skeletons --- app/models/order_item.rb | 2 ++ .../20200609234951_create_order_items.rb | 9 ++++++++ test/models/order_item_test.rb | 23 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 app/models/order_item.rb create mode 100644 db/migrate/20200609234951_create_order_items.rb create mode 100644 test/models/order_item_test.rb diff --git a/app/models/order_item.rb b/app/models/order_item.rb new file mode 100644 index 0000000000..acc6099fd0 --- /dev/null +++ b/app/models/order_item.rb @@ -0,0 +1,2 @@ +class OrderItem < ApplicationRecord +end diff --git a/db/migrate/20200609234951_create_order_items.rb b/db/migrate/20200609234951_create_order_items.rb new file mode 100644 index 0000000000..916faa9d03 --- /dev/null +++ b/db/migrate/20200609234951_create_order_items.rb @@ -0,0 +1,9 @@ +class CreateOrderItems < ActiveRecord::Migration[6.0] + def change + create_table :order_items do |t| + t.integer :quantity + + t.timestamps + end + end +end diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb new file mode 100644 index 0000000000..806cc0ae5a --- /dev/null +++ b/test/models/order_item_test.rb @@ -0,0 +1,23 @@ +require "test_helper" + +describe OrderItem do + describe 'relationships' do + it 'must belong to a Product' do + + end + + it 'must belong to an Order' do + + end + end + + descirbe 'validations' do + it 'is valid if quantity is greater than 0' do + + end + + it 'is not valid if quantity is less than or equal to 0' do + + end + end +end From 36608395efb209bad65c34ebd7af78e71516fb35 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 9 Jun 2020 17:36:17 -0700 Subject: [PATCH 003/367] tests for validating order_item are passing --- app/models/order_item.rb | 1 + db/schema.rb | 24 ++++++++++++++++++++++++ test/models/order_item_test.rb | 34 +++++++++++++++++++++++++++++++--- 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 db/schema.rb diff --git a/app/models/order_item.rb b/app/models/order_item.rb index acc6099fd0..23eec43434 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -1,2 +1,3 @@ class OrderItem < ApplicationRecord + validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 } end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..c1c11efeb7 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,24 @@ +# 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_06_09_234951) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "order_items", force: :cascade do |t| + t.integer "quantity" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + +end diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index 806cc0ae5a..8011671be3 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -2,7 +2,7 @@ describe OrderItem do describe 'relationships' do - it 'must belong to a Product' do + it 'must belong to a Plant' do end @@ -11,13 +11,41 @@ end end - descirbe 'validations' do - it 'is valid if quantity is greater than 0' do + describe 'validations' do + before do + @order_item = OrderItem.new quantity: 2 + end + it 'is valid if quantity is greater than 0' do + result = @order_item.valid? + expect(result).must_equal true end it 'is not valid if quantity is less than or equal to 0' do + @order_item.quantity = 0 + result = @order_item.valid? + + expect(result).must_equal false + expect(@order_item.errors.messages).must_include :quantity + expect(@order_item.errors.messages[:quantity]).must_include "must be greater than 0" + end + + it 'is not valid if quantity is not present' do + order_item = OrderItem.new + result = order_item.valid? + + expect(result).must_equal false + expect(order_item.errors.messages).must_include :quantity + expect(order_item.errors.messages[:quantity]).must_include "can't be blank" + end + + it 'is not valid if quantity is not a number' do + @order_item.quantity = "not a number" + result = @order_item.valid? + expect(result).must_equal false + expect(@order_item.errors.messages).must_include :quantity + expect(@order_item.errors.messages[:quantity]).must_include "is not a number" end end end From 982453d654aa8f0345df36a2c5e30afceb32cf9b Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 9 Jun 2020 17:41:20 -0700 Subject: [PATCH 004/367] created customer model --- app/models/customer.rb | 2 ++ db/migrate/20200610004051_create_customers.rb | 9 +++++++++ db/schema.rb | 8 +++++++- test/models/customer_test.rb | 7 +++++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 app/models/customer.rb create mode 100644 db/migrate/20200610004051_create_customers.rb create mode 100644 test/models/customer_test.rb diff --git a/app/models/customer.rb b/app/models/customer.rb new file mode 100644 index 0000000000..0b5277335c --- /dev/null +++ b/app/models/customer.rb @@ -0,0 +1,2 @@ +class Customer < ApplicationRecord +end diff --git a/db/migrate/20200610004051_create_customers.rb b/db/migrate/20200610004051_create_customers.rb new file mode 100644 index 0000000000..7546c47412 --- /dev/null +++ b/db/migrate/20200610004051_create_customers.rb @@ -0,0 +1,9 @@ +class CreateCustomers < ActiveRecord::Migration[6.0] + def change + create_table :customers do |t| + t.string :email + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index c1c11efeb7..f143136653 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,11 +10,17 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_06_09_234951) do +ActiveRecord::Schema.define(version: 2020_06_10_004051) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "customers", force: :cascade do |t| + t.string "email" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + create_table "order_items", force: :cascade do |t| t.integer "quantity" t.datetime "created_at", precision: 6, null: false diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb new file mode 100644 index 0000000000..30d5c53090 --- /dev/null +++ b/test/models/customer_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Customer do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 2ef8e3b40cec220f91c5a2feb80b056c1f145eed Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 9 Jun 2020 17:43:26 -0700 Subject: [PATCH 005/367] skeleton relationship test --- test/models/customer_test.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb index 30d5c53090..d106ce477f 100644 --- a/test/models/customer_test.rb +++ b/test/models/customer_test.rb @@ -1,7 +1,9 @@ require "test_helper" describe Customer do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + describe 'relationships' do + it 'has many Orders' do + + end + end end From 7b52cda91506c146f468d3679dceb65048be0cdb Mon Sep 17 00:00:00 2001 From: Suely Barreto <55418069+SuelyBarreto@users.noreply.github.com> Date: Tue, 9 Jun 2020 19:06:14 -0700 Subject: [PATCH 006/367] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c74be7902..a5bf1e1912 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ## Learning Goals -- Core comprehension of: +- Core comprehension of - Routes - Controllers - Models From 5f51fa48b3ef8bf81a5538edf52470dbfcb74542 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Tue, 9 Jun 2020 19:14:12 -0700 Subject: [PATCH 007/367] Created Order model --- app/models/order.rb | 2 ++ db/migrate/20200610021248_create_orders.rb | 17 +++++++++++++++++ test/models/order_test.rb | 7 +++++++ 3 files changed, 26 insertions(+) create mode 100644 app/models/order.rb create mode 100644 db/migrate/20200610021248_create_orders.rb create mode 100644 test/models/order_test.rb 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/db/migrate/20200610021248_create_orders.rb b/db/migrate/20200610021248_create_orders.rb new file mode 100644 index 0000000000..74d0b4dd2a --- /dev/null +++ b/db/migrate/20200610021248_create_orders.rb @@ -0,0 +1,17 @@ +class CreateOrders < ActiveRecord::Migration[6.0] + def change + create_table :orders do |t| + t.string :status + t.integer :credit_card_num + t.string :credit_card_exp + t.integer :credit_card_cvv + t.string :address + t.string :city + t.string :state + t.string :zip + t.datetime :time_submitted + + t.timestamps + end + 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 From d9eb1497d99576a49bbf0f77d5e9121b432f83cc Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Tue, 9 Jun 2020 19:31:58 -0700 Subject: [PATCH 008/367] Added relationships from Orders to Customer --- app/models/order.rb | 1 + ...0200610022651_relate_orders_to_customers.rb | 5 +++++ db/schema.rb | 18 +++++++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20200610022651_relate_orders_to_customers.rb diff --git a/app/models/order.rb b/app/models/order.rb index 10281b3450..d21263cea9 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,2 +1,3 @@ class Order < ApplicationRecord + belongs_to :customer end diff --git a/db/migrate/20200610022651_relate_orders_to_customers.rb b/db/migrate/20200610022651_relate_orders_to_customers.rb new file mode 100644 index 0000000000..e6deffa245 --- /dev/null +++ b/db/migrate/20200610022651_relate_orders_to_customers.rb @@ -0,0 +1,5 @@ +class RelateOrdersToCustomers < ActiveRecord::Migration[6.0] + def change + add_reference :orders, :customer, index: true + end +end diff --git a/db/schema.rb b/db/schema.rb index f143136653..bd9c27fd28 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_06_10_004051) do +ActiveRecord::Schema.define(version: 2020_06_10_022651) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -27,4 +27,20 @@ t.datetime "updated_at", precision: 6, null: false end + create_table "orders", force: :cascade do |t| + t.string "status" + t.integer "credit_card_num" + t.string "credit_card_exp" + t.integer "credit_card_cvv" + t.string "address" + t.string "city" + t.string "state" + t.string "zip" + t.datetime "time_submitted" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.bigint "customer_id" + t.index ["customer_id"], name: "index_orders_on_customer_id" + end + end From b9b3be95eecfbabc7dd33e70ee730a158e6b0c2e Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Tue, 9 Jun 2020 19:42:55 -0700 Subject: [PATCH 009/367] Added validations to Order --- app/models/order.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/models/order.rb b/app/models/order.rb index d21263cea9..b2426b466a 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,3 +1,7 @@ class Order < ApplicationRecord belongs_to :customer + has_many :order_items, dependent: :destroy + + VALID_STATUS = %w(pending paid complete cancelled) + validates :status, presence: true, inclusion: {in: VALID_STATUS} end From 3b996c933de60608bbfb686be509c9f275f0fffb Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Tue, 9 Jun 2020 20:54:40 -0700 Subject: [PATCH 010/367] Order model tests: relationships and validations --- app/models/order.rb | 2 +- test/models/order_test.rb | 49 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index b2426b466a..d9440113ba 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,6 +1,6 @@ class Order < ApplicationRecord belongs_to :customer - has_many :order_items, dependent: :destroy + has_many :orderitems, dependent: :destroy VALID_STATUS = %w(pending paid complete cancelled) validates :status, presence: true, inclusion: {in: VALID_STATUS} diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 59ceb9a253..131e11bac5 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,7 +1,50 @@ require "test_helper" describe Order do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + + let (:new_customer) { Customer.new(email: "jane@gmail.com") } + let (:new_order) { Order.new(customer_id: new_customer.id, status: "pending") } + + describe "relations" do + + it "has a customer" do + new_customer.save! + new_order.save! + expect(new_order).must_respond_to :customer + expect(new_order.customer).must_be_kind_of Customer + end + + it "has a list of order_items" do + # TODO add order_items here when available + # TODO remove comments when order_item relationship available + new_customer.save! + new_order.save! + expect(new_order).must_respond_to :orderitems + # new_order.orderitems.each do |order_item| + # expect(order_item).must_be_kind_of OrderItem + # end + end + end # describe "relations" + + describe "validations" do + it "allows the four status" do + new_customer.save! + valid_statuses = %w(pending paid complete cancelled) + valid_statuses.each do |status| + order = Order.new(customer_id: new_customer.id, status: status) + expect(order.valid?).must_equal true + end + end + + it "rejects invalid statuses" do + new_customer.save! + invalid_statuses = ["parrot", "parakeet", "incomplete", 2020, nil] + invalid_statuses.each do |status| + order = Order.new(customer_id: new_customer.id, status: status) + expect(order.valid?).must_equal false + expect(order.errors.messages).must_include :status + end + end + end # describe "validations" + end From 6a344a6b4e49d872c25fb4b330be377a6729348d Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 9 Jun 2020 21:13:56 -0700 Subject: [PATCH 011/367] created Merchant model --- app/models/merchant.rb | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/models/merchant.rb diff --git a/app/models/merchant.rb b/app/models/merchant.rb new file mode 100644 index 0000000000..2b681c094f --- /dev/null +++ b/app/models/merchant.rb @@ -0,0 +1,5 @@ +class Merchant < ApplicationRecord + + has_many :products + +end From 82a7bfcf54382eaf804e0d94f5fcee0a31a7e9c1 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 9 Jun 2020 21:14:49 -0700 Subject: [PATCH 012/367] migration for Merchant model --- db/migrate/20200610040720_create_merchants.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 db/migrate/20200610040720_create_merchants.rb diff --git a/db/migrate/20200610040720_create_merchants.rb b/db/migrate/20200610040720_create_merchants.rb new file mode 100644 index 0000000000..3009d8f788 --- /dev/null +++ b/db/migrate/20200610040720_create_merchants.rb @@ -0,0 +1,10 @@ +class CreateMerchants < ActiveRecord::Migration[6.0] + def change + create_table :merchants do |t| + t.string :email + t.string :username + + t.timestamps + end + end +end From b97de07544f01162fe1d0f3e3b3fce913c5d6909 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 9 Jun 2020 21:15:16 -0700 Subject: [PATCH 013/367] test_helper for Merchant model --- test/models/merchant_test.rb | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 test/models/merchant_test.rb diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb new file mode 100644 index 0000000000..ca3d6ca9b2 --- /dev/null +++ b/test/models/merchant_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Merchant do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 80aef5bfc3043654e1734455df83a3df71feec81 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 9 Jun 2020 21:33:15 -0700 Subject: [PATCH 014/367] created Review model --- app/models/review.rb | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/models/review.rb diff --git a/app/models/review.rb b/app/models/review.rb new file mode 100644 index 0000000000..9b208330e0 --- /dev/null +++ b/app/models/review.rb @@ -0,0 +1,5 @@ +class Review < ApplicationRecord + + belongs_to :products + +end From 8c7acf6d574b88bddf0a05d6a313ff46e9811a6f Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 9 Jun 2020 21:33:31 -0700 Subject: [PATCH 015/367] migration for Review model --- db/migrate/20200610042728_create_reviews.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 db/migrate/20200610042728_create_reviews.rb diff --git a/db/migrate/20200610042728_create_reviews.rb b/db/migrate/20200610042728_create_reviews.rb new file mode 100644 index 0000000000..13a7d45257 --- /dev/null +++ b/db/migrate/20200610042728_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 From b7f92cdfa072fb83148ccf6b5cffe19cc98a4d70 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 9 Jun 2020 21:33:50 -0700 Subject: [PATCH 016/367] test_helper for Review model --- test/models/review_test.rb | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 test/models/review_test.rb 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 b517f5b0e28460d2494f2f93c8c9c4c31375cddd Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 9 Jun 2020 21:45:10 -0700 Subject: [PATCH 017/367] added validations to Merchant model --- app/models/merchant.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 2b681c094f..e21d4e4250 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -2,4 +2,7 @@ class Merchant < ApplicationRecord has_many :products + validates :username, presence: true, uniqueness: true + validates :email, presence: true, uniqueness: true + end From 6527459af78a1ca2e2f9f515af62405c54ed0982 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 9 Jun 2020 21:45:29 -0700 Subject: [PATCH 018/367] added validation and r/s to Review model --- app/models/review.rb | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 app/models/review.rb diff --git a/app/models/review.rb b/app/models/review.rb new file mode 100644 index 0000000000..4edd8fa1e3 --- /dev/null +++ b/app/models/review.rb @@ -0,0 +1,7 @@ +class Review < ApplicationRecord + + belongs_to :products + + validates :rating, :inclusion => { :in => 0..5, :message => " should be between 0 to 5" } + +end From a29f28aaf36b2e3190b725a01ef9bcc8fc184d66 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 9 Jun 2020 21:54:33 -0700 Subject: [PATCH 019/367] added Category model --- app/models/category.rb | 3 +++ db/migrate/20200610044140_create_categories.rb | 10 ++++++++++ test/models/category_test.rb | 7 +++++++ 3 files changed, 20 insertions(+) create mode 100644 app/models/category.rb create mode 100644 db/migrate/20200610044140_create_categories.rb create mode 100644 test/models/category_test.rb diff --git a/app/models/category.rb b/app/models/category.rb new file mode 100644 index 0000000000..f3218758f1 --- /dev/null +++ b/app/models/category.rb @@ -0,0 +1,3 @@ +class Category < ApplicationRecord + has_and_belongs_to_many :products +end diff --git a/db/migrate/20200610044140_create_categories.rb b/db/migrate/20200610044140_create_categories.rb new file mode 100644 index 0000000000..5592f359e9 --- /dev/null +++ b/db/migrate/20200610044140_create_categories.rb @@ -0,0 +1,10 @@ +class CreateCategories < ActiveRecord::Migration[6.0] + def change + create_table :categories do |t| + t.string :name + t.string :description + + t.timestamps + end + end +end diff --git a/test/models/category_test.rb b/test/models/category_test.rb new file mode 100644 index 0000000000..841a2edc6d --- /dev/null +++ b/test/models/category_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Category do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 7d213e10293ba046016b138aa0f4683a61fd8f41 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 9 Jun 2020 21:55:24 -0700 Subject: [PATCH 020/367] added Product model --- app/models/product.rb | 4 ++++ db/migrate/20200610044109_create_products.rb | 13 +++++++++++++ test/models/product_test.rb | 7 +++++++ 3 files changed, 24 insertions(+) create mode 100644 app/models/product.rb create mode 100644 db/migrate/20200610044109_create_products.rb create mode 100644 test/models/product_test.rb diff --git a/app/models/product.rb b/app/models/product.rb new file mode 100644 index 0000000000..89f2f2899e --- /dev/null +++ b/app/models/product.rb @@ -0,0 +1,4 @@ +class Product < ApplicationRecord + belongs_to :merchant + has_and_belongs_to_many :categories +end diff --git a/db/migrate/20200610044109_create_products.rb b/db/migrate/20200610044109_create_products.rb new file mode 100644 index 0000000000..3c720b0563 --- /dev/null +++ b/db/migrate/20200610044109_create_products.rb @@ -0,0 +1,13 @@ +class CreateProducts < ActiveRecord::Migration[6.0] + def change + create_table :products do |t| + t.string :name + t.string :description + t.string :photo + t.integer :stock + t.boolean :active + + t.timestamps + end + 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 0c6ebc9b64896b218f5d81fc0015773b86176a02 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 9 Jun 2020 21:55:54 -0700 Subject: [PATCH 021/367] migrations for product price and categories_products join table --- db/migrate/20200610044231_add_price_to_products.rb | 5 +++++ .../20200610044544_create_categories_products_join.rb | 8 ++++++++ 2 files changed, 13 insertions(+) create mode 100644 db/migrate/20200610044231_add_price_to_products.rb create mode 100644 db/migrate/20200610044544_create_categories_products_join.rb diff --git a/db/migrate/20200610044231_add_price_to_products.rb b/db/migrate/20200610044231_add_price_to_products.rb new file mode 100644 index 0000000000..8848949cfb --- /dev/null +++ b/db/migrate/20200610044231_add_price_to_products.rb @@ -0,0 +1,5 @@ +class AddPriceToProducts < ActiveRecord::Migration[6.0] + def change + add_column :products, :price, :decimal + end +end diff --git a/db/migrate/20200610044544_create_categories_products_join.rb b/db/migrate/20200610044544_create_categories_products_join.rb new file mode 100644 index 0000000000..82dfdf6bad --- /dev/null +++ b/db/migrate/20200610044544_create_categories_products_join.rb @@ -0,0 +1,8 @@ +class CreateCategoriesProductsJoin < ActiveRecord::Migration[6.0] + def change + create_table :categories_products do |t| + t.belongs_to :category, index: true + t.belongs_to :product, index: true + end + end +end From 27f758831752a43d4d66b3e6253e7743d6146ee8 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 9 Jun 2020 22:12:07 -0700 Subject: [PATCH 022/367] added omiauth to gemfile --- Gemfile | 3 +++ Gemfile.lock | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/Gemfile b/Gemfile index bf513ff7ce..064e607682 100644 --- a/Gemfile +++ b/Gemfile @@ -76,3 +76,6 @@ group :test do gem 'minitest-rails' gem 'minitest-reporters' end + +gem "omniauth" +gem "omniauth-github" \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 4961154df0..55478b7ea2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -94,6 +94,8 @@ GEM debug_inspector (0.0.3) erubi (1.9.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) @@ -111,6 +113,7 @@ GEM guard-minitest (2.4.6) guard-compat (~> 1.2) minitest (>= 3.0) + hashie (4.1.0) i18n (1.8.3) concurrent-ruby (~> 1.0) jbuilder (2.10.0) @@ -122,6 +125,7 @@ GEM jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks + jwt (2.2.1) listen (3.2.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) @@ -147,6 +151,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.2) nokogiri (1.10.9) @@ -154,6 +161,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) @@ -276,6 +298,8 @@ DEPENDENCIES listen (~> 3.2) minitest-rails minitest-reporters + omniauth + omniauth-github pg (>= 0.18, < 2.0) pry-rails puma (~> 4.1) From b34b307d479e1357543d3f2b7f702193720ee654 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 9 Jun 2020 22:14:46 -0700 Subject: [PATCH 023/367] updated schema after migrations --- db/schema.rb | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index bd9c27fd28..c5d08b4d0c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,17 +10,38 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_06_10_022651) do +ActiveRecord::Schema.define(version: 2020_06_10_044544) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "categories", force: :cascade do |t| + t.string "name" + t.string "description" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + + create_table "categories_products", force: :cascade do |t| + t.bigint "category_id" + t.bigint "product_id" + t.index ["category_id"], name: "index_categories_products_on_category_id" + t.index ["product_id"], name: "index_categories_products_on_product_id" + end + create_table "customers", force: :cascade do |t| t.string "email" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end + create_table "merchants", force: :cascade do |t| + t.string "email" + t.string "username" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + create_table "order_items", force: :cascade do |t| t.integer "quantity" t.datetime "created_at", precision: 6, null: false @@ -43,4 +64,22 @@ t.index ["customer_id"], name: "index_orders_on_customer_id" end + create_table "products", force: :cascade do |t| + t.string "name" + t.string "description" + t.string "photo" + t.integer "stock" + t.boolean "active" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.decimal "price" + 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 + end From 56271faacf70959c1b6919597ef29be9eda7448e Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 9 Jun 2020 22:15:13 -0700 Subject: [PATCH 024/367] ignoring coverage file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f22dd34725..5c56406a85 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ /yarn-error.log yarn-debug.log* .yarn-integrity +coverage From d4385e0f9442d1941646b685b18a074d0c7dc77b Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 9 Jun 2020 22:24:49 -0700 Subject: [PATCH 025/367] ignoring test_helper --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5c56406a85..9656b9db7c 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ yarn-debug.log* .yarn-integrity coverage +/test/test_helper.rb From 2a2583b206238954f7d752d5b76e0b45d8de404a Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 9 Jun 2020 22:25:01 -0700 Subject: [PATCH 026/367] Add coverage directory to .gitignore file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f22dd34725..5c56406a85 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ /yarn-error.log yarn-debug.log* .yarn-integrity +coverage From 5916f159d71bd03b513228cc18a256acefee4b30 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 9 Jun 2020 22:30:03 -0700 Subject: [PATCH 027/367] added simplecov to test_helper --- test/models/merchant_test.rb | 1 + test/test_helper.rb | 3 +++ 2 files changed, 4 insertions(+) diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index ca3d6ca9b2..cf059cd6da 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -1,5 +1,6 @@ require "test_helper" + describe Merchant do # it "does a thing" do # value(1+1).must_equal 2 diff --git a/test/test_helper.rb b/test/test_helper.rb index b19af0d5bd..0558e24ea2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -3,6 +3,9 @@ require 'rails/test_help' require "minitest/rails" require "minitest/reporters" # for Colorized output +require 'simplecov' +SimpleCov.start 'rails' + # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, From 666e7c6103d7cf3dd8d8a5e72a1799f1af9db2e8 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 9 Jun 2020 22:32:44 -0700 Subject: [PATCH 028/367] simplecov setup --- Gemfile | 1 + Gemfile.lock | 6 ++++++ test/test_helper.rb | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/Gemfile b/Gemfile index bf513ff7ce..e6a5cd91e8 100644 --- a/Gemfile +++ b/Gemfile @@ -75,4 +75,5 @@ end group :test do gem 'minitest-rails' gem 'minitest-reporters' + gem 'simplecov' end diff --git a/Gemfile.lock b/Gemfile.lock index 4961154df0..29081893ea 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.9) debug_inspector (0.0.3) + docile (1.3.2) erubi (1.9.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.18.5) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov-html (0.12.2) spring (2.1.0) 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/test/test_helper.rb b/test/test_helper.rb index b19af0d5bd..3c6c8308bc 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -3,6 +3,10 @@ require 'rails/test_help' require "minitest/rails" require "minitest/reporters" # for Colorized output +require 'simplecov' +SimpleCov.start do + add_filter 'test/' # Tests should not be checked for coverage. +end # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, @@ -10,6 +14,8 @@ Minitest.backtrace_filter ) + + class ActiveSupport::TestCase # Run tests in parallel with specified workers # parallelize(workers: :number_of_processors) # causes out of order output. From fc616f71ac79b299c4d478029d1f8e13ea53a1c6 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 9 Jun 2020 22:49:56 -0700 Subject: [PATCH 029/367] added simplecov to gemfile --- Gemfile | 1 + Gemfile.lock | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/Gemfile b/Gemfile index 064e607682..415e84a8c7 100644 --- a/Gemfile +++ b/Gemfile @@ -75,6 +75,7 @@ end group :test do gem 'minitest-rails' gem 'minitest-reporters' + gem 'simplecov' end gem "omniauth" diff --git a/Gemfile.lock b/Gemfile.lock index 55478b7ea2..ebdb8263b3 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.9) debug_inspector (0.0.3) + docile (1.3.2) erubi (1.9.0) execjs (2.7.0) faraday (1.0.1) @@ -240,6 +241,10 @@ GEM childprocess (>= 0.5, < 4.0) rubyzip (>= 1.2.2) shellany (0.0.1) + simplecov (0.18.5) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov-html (0.12.2) spring (2.1.0) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) @@ -307,6 +312,7 @@ DEPENDENCIES ruby-debug-ide (>= 0.7.0) sass-rails (>= 6) selenium-webdriver + simplecov spring spring-watcher-listen (~> 2.0.0) turbolinks (~> 5) From fdc657731585824e4be9b09b588557decd6db761 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 10 Jun 2020 00:30:07 -0700 Subject: [PATCH 030/367] added model testing for category --- app/models/category.rb | 5 +++++ test/fixtures/categories.yml | 11 +++++++++++ test/models/category_test.rb | 32 +++++++++++++++++++++++++++++--- 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/categories.yml diff --git a/app/models/category.rb b/app/models/category.rb index f3218758f1..f2cd5738bc 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,3 +1,8 @@ class Category < ApplicationRecord has_and_belongs_to_many :products + + validates :name, presence: true, uniqueness: { + message: "Category: %{value} already exists." + } + end diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml new file mode 100644 index 0000000000..d0d7b75807 --- /dev/null +++ b/test/fixtures/categories.yml @@ -0,0 +1,11 @@ +flower: + name: flower + description: very pretty plants much beloved by bumblebees + +herb: + name: herb + description: plants with a multitude of culinary and health uses + +vegetable: + name: vegetable + description: chock full of nutrients and delicious to boot \ No newline at end of file diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 841a2edc6d..ebd33dde00 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -1,7 +1,33 @@ require "test_helper" describe Category do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + let(:category) { categories(:flower) } + + describe "validations" do + it "is valid when name is present" do + expect(category.valid?).must_equal true + end + + it "is invalid when name is missing" do + category.name = nil + expect(category.valid?).must_equal false + expect(category.errors.messages).must_include :name + end + + it "is invalid when category already exists" do + repeated_category = Category.new( + name: category.name, + description: "repeated category" + ) + expect(repeated_category.valid?).must_equal false + expect(repeated_category.errors.messages).must_include :name + end + end + + describe "relationships" do + it "has/responds to products" do + expect(category.respond_to?(:products)).must_equal true + end + end + end From 49187ee999b73645c2ee520e1cc8ced7b3f28c3f Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 10 Jun 2020 00:31:14 -0700 Subject: [PATCH 031/367] added product model tests --- app/models/product.rb | 6 ++ ...200610070047_add_foreign_key_to_product.rb | 5 ++ db/schema.rb | 5 +- test/fixtures/merchants.yml | 12 +++ test/fixtures/products.yml | 36 +++++++++ test/models/product_test.rb | 75 ++++++++++++++++++- 6 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20200610070047_add_foreign_key_to_product.rb create mode 100644 test/fixtures/merchants.yml create mode 100644 test/fixtures/products.yml diff --git a/app/models/product.rb b/app/models/product.rb index 89f2f2899e..ff73cd102e 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,4 +1,10 @@ class Product < ApplicationRecord belongs_to :merchant has_and_belongs_to_many :categories + + validates :name, presence: true, uniqueness: {scope: :merchant_id, + message: "Merchant already has product of this name %{value} ." } + validates :price, presence: true, numericality: { greater_than: 0, + message: "Price of product must be a number greater than $0" } + end diff --git a/db/migrate/20200610070047_add_foreign_key_to_product.rb b/db/migrate/20200610070047_add_foreign_key_to_product.rb new file mode 100644 index 0000000000..a5946e3779 --- /dev/null +++ b/db/migrate/20200610070047_add_foreign_key_to_product.rb @@ -0,0 +1,5 @@ +class AddForeignKeyToProduct < ActiveRecord::Migration[6.0] + def change + add_reference :products, :merchant, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index c5d08b4d0c..6b447b6704 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_06_10_044544) do +ActiveRecord::Schema.define(version: 2020_06_10_070047) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -73,6 +73,8 @@ t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.decimal "price" + t.bigint "merchant_id" + t.index ["merchant_id"], name: "index_products_on_merchant_id" end create_table "reviews", force: :cascade do |t| @@ -82,4 +84,5 @@ t.datetime "updated_at", precision: 6, null: false end + add_foreign_key "products", "merchants" end diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml new file mode 100644 index 0000000000..8a2da1d4ce --- /dev/null +++ b/test/fixtures/merchants.yml @@ -0,0 +1,12 @@ +annie: + username: Annie Easley + email: aeasley@email.com + +katherine: + username: Katherine Johnson + email: kjohnson@email.com + +melba: + username: Melba Mouton + email: melmou@email.com + diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml new file mode 100644 index 0000000000..350b36f7a7 --- /dev/null +++ b/test/fixtures/products.yml @@ -0,0 +1,36 @@ +tulip: + name: tulip + description: wowie a whole field of these babies are a sight to behold + photo: www.google.com/tulips + stock: 6 + active: true + price: 12.50 + merchant_id: 1 + +daisy: + name: daisy + description: if you chain these flowers together you can make a crown + photo: www.google.com/daisies + stock: 2 + active: true + price: 3.75 + merchant_id: 1 + +onion: + name: onion + description: sprouts very easily when left alone in a kitchen + photo: www.google.com/onions + stock: 10 + active: true + price: .50 + merchant_id: 2 + +cilantro: + name: cilantro + description: usually tasty but occasionally soapy no one knows why + photo: www.google.com/cilantro + stock: 1 + active: false + price: 100 + merchant_id: 3 + diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 6977718e14..67ffff740e 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -1,7 +1,76 @@ require "test_helper" describe Product do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + before do + @product = products(:tulip) + @merchant_id = @product.merchant_id + end + + describe "validations" do + + before do + @product.merchant_id = merchants(:melba).id + end + + it "is valid when name and price are present" do + expect(@product.valid?).must_equal true + end + + it "is invalid when name is missing" do + @product.name = nil + expect(@product.valid?).must_equal false + expect(@product.errors.messages).must_include :name + end + + it "is invalid when price is missing" do + @product.price = nil + expect(@product.valid?).must_equal false + expect(@product.errors.messages).must_include :price + end + + it "is invalid when merchant has same product already" do + repeated_product = Product.new( + name: @product.name, + description: "doubling up on the tulips", + photo: "www.google.com/tulips", + stock: 6, + active: true, + price: 12.50, + merchant_id: @merchant_id + ) + expect(repeated_product.valid?).must_equal false + expect(repeated_product.errors.messages).must_include :name + end + + it "is valid when product name is non-unique but merchant differs" do + new_merchant = Merchant.create!( + username: "plantwitch", + email: "plantcovenhq@plantwitch.com", + ) + same_name_product = Product.create!( + name: @product.name, + description: "doubling up on the tulips", + photo: "www.google.com/tulips", + stock: 6, + active: true, + price: 12.50, + merchant_id: Merchant.last.id, + ) + expect(same_name_product.name).must_equal @product.name + expect(same_name_product.merchant_id).wont_equal @product.merchant_id + expect(same_name_product.valid?).must_equal true + end + + end + + describe "relationships" do + before do + @product = products(:cilantro) + end + + it "belongs to/responds to Merchant" do + expect(@product.respond_to?(:merchant_id)).must_equal true + end + + end end From 7f2d5b790bc6682d5546daeae239ab10456d2a1d Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 10 Jun 2020 00:31:40 -0700 Subject: [PATCH 032/367] changed Plants to Products in test description --- test/models/order_item_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index 8011671be3..572ff36e9d 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -2,7 +2,7 @@ describe OrderItem do describe 'relationships' do - it 'must belong to a Plant' do + it 'must belong to a Product' do end From d6c52b476c5ea31117ec7973e6cc259f7ada562c Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 00:43:15 -0700 Subject: [PATCH 033/367] minore edits --- app/models/review.rb | 2 +- test/models/merchant_test.rb | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/models/review.rb b/app/models/review.rb index 4edd8fa1e3..38b3ed5970 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,6 +1,6 @@ class Review < ApplicationRecord - belongs_to :products + belongs_to :product validates :rating, :inclusion => { :in => 0..5, :message => " should be between 0 to 5" } diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index cf059cd6da..260bd1955c 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -2,7 +2,5 @@ describe Merchant do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + end From ec60a894405d8dcba9d02a6ada68dd6b854b948b Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 00:47:51 -0700 Subject: [PATCH 034/367] added migration to relate reviews to product --- db/migrate/20200610074429_relate_reviews_to_products.rb | 5 +++++ db/schema.rb | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20200610074429_relate_reviews_to_products.rb diff --git a/db/migrate/20200610074429_relate_reviews_to_products.rb b/db/migrate/20200610074429_relate_reviews_to_products.rb new file mode 100644 index 0000000000..d4add059b6 --- /dev/null +++ b/db/migrate/20200610074429_relate_reviews_to_products.rb @@ -0,0 +1,5 @@ +class RelateReviewsToProducts < ActiveRecord::Migration[6.0] + def change + add_reference :reviews, :product, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 6b447b6704..c0d72d4852 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_06_10_070047) do +ActiveRecord::Schema.define(version: 2020_06_10_074429) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -82,7 +82,10 @@ 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 add_foreign_key "products", "merchants" + add_foreign_key "reviews", "products" end From de8fdd70d41be520d533633c4a54aae62a7c0b5b Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 10 Jun 2020 00:51:54 -0700 Subject: [PATCH 035/367] added more relationship testing to product --- app/models/product.rb | 2 +- test/models/product_test.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/models/product.rb b/app/models/product.rb index ff73cd102e..a90fe13d57 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -2,7 +2,7 @@ class Product < ApplicationRecord belongs_to :merchant has_and_belongs_to_many :categories - validates :name, presence: true, uniqueness: {scope: :merchant_id, + validates :name, presence: true, uniqueness: { scope: :merchant_id, message: "Merchant already has product of this name %{value} ." } validates :price, presence: true, numericality: { greater_than: 0, message: "Price of product must be a number greater than $0" } diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 67ffff740e..b08b5b3879 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -72,5 +72,9 @@ expect(@product.respond_to?(:merchant_id)).must_equal true end + it "has/responds to categories" do + expect(@product.respond_to?(:categories)).must_equal true + end + end end From a1de97bea06e41db0a19021dde94342edf536cf4 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 10 Jun 2020 00:56:16 -0700 Subject: [PATCH 036/367] added testing for Product - Reviews relationship --- app/models/product.rb | 1 + test/models/product_test.rb | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/app/models/product.rb b/app/models/product.rb index a90fe13d57..0e8d9827ec 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,6 +1,7 @@ class Product < ApplicationRecord belongs_to :merchant has_and_belongs_to_many :categories + has_many :reviews validates :name, presence: true, uniqueness: { scope: :merchant_id, message: "Merchant already has product of this name %{value} ." } diff --git a/test/models/product_test.rb b/test/models/product_test.rb index b08b5b3879..4a1db6b680 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -76,5 +76,9 @@ expect(@product.respond_to?(:categories)).must_equal true end + it "has/responds to reviews" do + expect(@product.respond_to?(:reviews)).must_equal true + end + end end From 9ceb3819752b2b77cd5054c69adefd2c8ac788f4 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 02:01:59 -0700 Subject: [PATCH 037/367] added review model tests, validatio test not passing --- app/models/review.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/review.rb b/app/models/review.rb index 38b3ed5970..ecc4c794d5 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -2,6 +2,6 @@ class Review < ApplicationRecord belongs_to :product - validates :rating, :inclusion => { :in => 0..5, :message => " should be between 0 to 5" } - + validates :rating, :numericality => { :in => 0..5, :message => " should be between 0 to 5" } + #validates :rating, :numericality: { greater_than: 0, less_than_or_equal_to: 5 } end From 943c33a9fb24272b4a3b0cb2c1324f3732ea917d Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 02:02:25 -0700 Subject: [PATCH 038/367] added reviews fixtures --- test/fixtures/reviews.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 test/fixtures/reviews.yml diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml new file mode 100644 index 0000000000..10464179cf --- /dev/null +++ b/test/fixtures/reviews.yml @@ -0,0 +1,9 @@ +review_one: + rating: 5 + description: very beautiful flower + product_id: 2 + +review_two: + rating: 3 + description: very smelly onion + product_id: 3 \ No newline at end of file From 789099d264737a3300930c553f0413e2b9fef253 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 02:02:56 -0700 Subject: [PATCH 039/367] added merchant tests, not passing --- test/models/merchant_test.rb | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 260bd1955c..1795ece883 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -2,5 +2,36 @@ describe Merchant do - + let (:new_merchant) {merchants(:katherine) } + + + describe "validations" do + + it "is valid when a merchant has a username and email" do + expect(merchant.valid?).must_equal true + end + + it "is invalid without a username" do + merchant.username = nil + expect(merchant.valid?).must_equal false + expect(merchant.errors.messages).must_include :username + end + + + it "is invalid without an email" do + merchant.email = nil + expect(merchant.valid?).must_equal false + expect(merchant.errors.messages).must_include :email + end + + end + + + + describe "relationships" do + it "has/responds to products" do + expect(merchants.respond_to?(:products)).must_equal true + end + end + end From 44686a988b1fbb388d98fa38696731a3b9c09c3d Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 02:04:27 -0700 Subject: [PATCH 040/367] added review tests , not complete --- test/models/review_test.rb | 53 +++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 626fa522d8..8a9054c49c 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,7 +1,54 @@ require "test_helper" describe Review do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + let (:review) {reviews(:review_one) } + let (:product) {products(:daisy) } + before do + review.product_id = product.id + end + + + describe "validations" do + + it "is valid when a review has rating" do + expect(review.valid?).must_equal true + + end + + it "is not valid without a rating" do + review.rating = nil + expect(review.valid?).must_equal false + expect(review.errors.messages).must_include :rating + + end + + it "is not valid if the rating isn't between 0-5" do + review.rating = 7 + result = review.valid? + + expect(result).must_equal false + expect(review.errors.messages).must_include :rating + expect(review.errors.messages[:rating]).must_include " should be between 0 to 5" + + end + + it 'is not valid if rating is not a number' do + review.rating = "not a number" + result = review.valid? + + expect(result).must_equal false + expect(review.errors.messages).must_include :rating + expect(review.errors.messages[:rating]).must_include "is not a number" + end + + + end + + + describe "relationships" do + it "belongs to a product" do + expect(review.respond_to?(:product)).must_equal true + end + end + end From c398401b9fad8560d6dc53035b367b98864c5a08 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 10 Jun 2020 12:03:23 -0700 Subject: [PATCH 041/367] added category seeds data file --- db/category_seeds.csv | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 db/category_seeds.csv diff --git a/db/category_seeds.csv b/db/category_seeds.csv new file mode 100644 index 0000000000..75099a861d --- /dev/null +++ b/db/category_seeds.csv @@ -0,0 +1,9 @@ +id,name,description +1, flowering, annual flowering plants that look great anywhere +2, cactus, low maintenance but high value +3, vine, plants that grow and stretch out along support systems +4, fern, beautiful green foliage with abundant growth +5, hanging, suitable for suspension and hanging +6, foliage, low maintenance plants that don't need a lot of attention +7, herb, all sorts of culinary and health uses +8, low light, plants that thrive in even the lowest light From 53dd56dabcbea82c42a8a8c9359cac0fd53eefcc Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Wed, 10 Jun 2020 12:53:32 -0700 Subject: [PATCH 042/367] configured google cloud platform to upload images to --- Gemfile | 3 +- Gemfile.lock | 46 +++++++++++++++++++ config/environments/production.rb | 2 +- config/gce.json | 12 +++++ config/storage.yml | 10 ++-- ...te_active_storage_tables.active_storage.rb | 27 +++++++++++ db/product_seeds.csv | 2 + db/schema.rb | 24 +++++++++- 8 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 config/gce.json create mode 100644 db/migrate/20200610192239_create_active_storage_tables.active_storage.rb create mode 100644 db/product_seeds.csv diff --git a/Gemfile b/Gemfile index 415e84a8c7..b07a5295fb 100644 --- a/Gemfile +++ b/Gemfile @@ -79,4 +79,5 @@ group :test do end gem "omniauth" -gem "omniauth-github" \ No newline at end of file +gem "omniauth-github" +gem "google-cloud-storage", "~> 1.11", require: false \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index ebdb8263b3..88dae8cb98 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -92,6 +92,9 @@ GEM debase-ruby_core_source (>= 0.10.2) debase-ruby_core_source (0.10.9) debug_inspector (0.0.3) + declarative (0.0.10) + declarative-option (0.1.0) + digest-crc (0.5.1) docile (1.3.2) erubi (1.9.0) execjs (2.7.0) @@ -101,6 +104,34 @@ GEM formatador (0.2.5) globalid (0.4.2) activesupport (>= 4.2.0) + google-api-client (0.40.1) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 0.9) + httpclient (>= 2.8.1, < 3.0) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + signet (~> 0.12) + google-cloud-core (1.5.0) + google-cloud-env (~> 1.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.3.2) + faraday (>= 0.17.3, < 2.0) + google-cloud-errors (1.0.1) + google-cloud-storage (1.26.2) + addressable (~> 2.5) + digest-crc (~> 0.4) + google-api-client (~> 0.33) + google-cloud-core (~> 1.2) + googleauth (~> 0.9) + mini_mime (~> 1.0) + googleauth (0.12.0) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.4, < 3.0) + memoist (~> 0.16) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (~> 0.14) guard (2.16.2) formatador (>= 0.2.4) listen (>= 2.7, < 4.0) @@ -115,6 +146,7 @@ GEM guard-compat (~> 1.2) minitest (>= 3.0) hashie (4.1.0) + httpclient (2.8.3) i18n (1.8.3) concurrent-ruby (~> 1.0) jbuilder (2.10.0) @@ -138,6 +170,7 @@ GEM mini_mime (>= 0.1.1) marcel (0.3.3) mimemagic (~> 0.3.2) + memoist (0.16.2) method_source (1.0.0) mimemagic (0.3.5) mini_mime (1.0.2) @@ -177,6 +210,7 @@ GEM omniauth-oauth2 (1.6.0) oauth2 (~> 1.1) omniauth (~> 1.9) + os (1.1.0) pg (1.2.3) popper_js (1.16.0) pry (0.13.1) @@ -223,6 +257,11 @@ GEM rb-inotify (0.10.1) ffi (~> 1.0) regexp_parser (1.7.1) + representable (3.0.4) + declarative (< 0.1.0) + declarative-option (< 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) ruby-debug-ide (0.7.2) rake (>= 0.8.1) ruby-progressbar (1.10.1) @@ -241,6 +280,11 @@ GEM childprocess (>= 0.5, < 4.0) rubyzip (>= 1.2.2) shellany (0.0.1) + signet (0.14.0) + addressable (~> 2.3) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) simplecov (0.18.5) docile (~> 1.1) simplecov-html (~> 0.11) @@ -264,6 +308,7 @@ GEM turbolinks-source (5.2.0) tzinfo (1.2.7) thread_safe (~> 0.1) + uber (0.1.0) web-console (4.0.2) actionview (>= 6.0.0) activemodel (>= 6.0.0) @@ -295,6 +340,7 @@ DEPENDENCIES byebug capybara (>= 2.15) debase (>= 0.2.4.1) + google-cloud-storage (~> 1.11) guard guard-minitest jbuilder (~> 2.7) diff --git a/config/environments/production.rb b/config/environments/production.rb index cd0d255545..24b7557cdb 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -36,7 +36,7 @@ # 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 + config.active_storage.service = :google # Mount Action Cable outside main process or domain. # config.action_cable.mount_path = nil diff --git a/config/gce.json b/config/gce.json new file mode 100644 index 0000000000..915ebe4f92 --- /dev/null +++ b/config/gce.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "betsy-279919", + "private_key_id": "1b0da1465cf6bdd683dba9d043f93f71a18c4dc8", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC+DC4JA1oH0Kct\ng34R14wCARIcaB++gTOptF+hPzpdX6IEsZQog2z5JSV5XU+95nGmMdzcTPnLYPwA\n97NPOIC+T0oaLrl/NZr8ZcxhQmfpMmVxrxJs2Q3uoSM7I2InMm6Tm8XhYlbIToFC\n68OBCElZ2fdVepsWRi82f6vYb51Q65C1tSPXUGLwxS/YZ4YljxZDfQVorv0xhyjm\ntreL0bEnfASB9hsv0Utwe2XEtsYMGOdgjxng0PehA4u4C8k/amZOL+dxUQrmJybz\nqoUJHqIoxEOgaiLEMBVpa+dvFJ8aR8VRP+37NLzCImnPcOYYVUvNjm2HPXbLvfbc\nX3R2LqRrAgMBAAECggEAASssAUwu+otS69m6JbvwlXaSOPB++Xnr6mg8ik5MOpTC\n90psQc+FFQcgct2bBuzq1/3IgOZMRu7ivdLIHH2ZdRIhv4V4CIs418J8fkCdSPbR\nXuCXuWmgR05gXBW8nccWnPvBPMCRDgxFiTbP7fQyF0Za2gC2AW4PDkO8t8j/66Z0\nc9vItTR9YfdP+xscmActrViVAAFEbbdn5ninoH5mQFxSlFDx+8+8bo3LH1a3uvpr\nif91FULvLAJw3PKOZZzFynIctKCkI9eBQMepBjHkLhUAFrQxD/mv0QqxVBBx4oZw\n825DFRDmyOC82g4vxyhdDFIVXrSPj77YErdRcXqT+QKBgQD1qNj02gJWrd3Q4Vgn\nhiGKw7WD6JkrBkRouMV8M36S5F0Quke/oKY3QqTAWIb1OiqjjV+A4rx25ERAAkvO\nk0v1ZWpmGW3nztxIWSubGHS2VPP7Q1YZpFIqAW5V7wixHll0+onN32QHE+zLOjFL\nOish+Rd4Be9KeUIBYIHeSDttnQKBgQDGDBMW24MIy6xT5nwvhsxh4CunPdnVWwIz\nPDM74soRtbvkw4lS0gvMNpaxaHoYKNzI9X2uIkcL474bL3LlmjmABCX3Bv328/Hg\nVAonpmUT3TpCMvmBE/TrlCItSY90rFG+UNvp57x6G8X9XVLEkx32k5ZIOEwZEhFa\nxAiucoq/pwKBgGCdgo5x+395rAaNyezpfOGlbQsu/KaGNXt2R/08B2jgNZXxnWxJ\nU3XiWQdpCdMCiGiAnnIDOpoL1qfR/1yEY9hkhX8YOzhzDAHMSDEcYjKfoMFOT1uQ\nW9w3adyUQTffttEiA/abCC0ccgHPpjlu7C3VWJyUwPLqU8JU4V65y92lAoGBAKWJ\nlC8n3hfs/ibG4YhsOMuar4JD7Z8rSeR/biehQduZturZEiB610ejXUP+mwc0qI8E\nuz9hAVeLzew1Nel6hpNdZEpdusu/Ta5/MFnB+HypDrgkmW5tuutqT0LhWJpiKpVU\nSuzxORYrvssvRS5v9byT0iqde+X8tyrR7pu5vAXDAoGAfmuewnrIYC9xuWDwA8Wp\nK1MLtXJVCer9vMII89/iAkFoWl/F391cTHMHmP1K+lg0GdN3m1dlndQvT+tnlq7k\nX/uagnqEEqA/kJ1kkE7Xy38VFrExu14GgRJFjZirXZcyRg1wpIlTYVlQvjFrvvPg\n0014TQLmpM8DJK4aHJ3qZJY=\n-----END PRIVATE KEY-----\n", + "client_email": "betsy-816@betsy-279919.iam.gserviceaccount.com", + "client_id": "109836174693392164966", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/betsy-816%40betsy-279919.iam.gserviceaccount.com" +} diff --git a/config/storage.yml b/config/storage.yml index d32f76e8fb..65451a5659 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -15,11 +15,11 @@ local: # 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 +google: + service: GCS + project: bEtsy + credentials: <%= Rails.root.join("config/gcs.json") %> + bucket: betsy_product_images # Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) # microsoft: diff --git a/db/migrate/20200610192239_create_active_storage_tables.active_storage.rb b/db/migrate/20200610192239_create_active_storage_tables.active_storage.rb new file mode 100644 index 0000000000..0b2ce257c8 --- /dev/null +++ b/db/migrate/20200610192239_create_active_storage_tables.active_storage.rb @@ -0,0 +1,27 @@ +# This migration comes from active_storage (originally 20170806125915) +class CreateActiveStorageTables < ActiveRecord::Migration[5.2] + def change + create_table :active_storage_blobs do |t| + t.string :key, null: false + t.string :filename, null: false + t.string :content_type + t.text :metadata + t.bigint :byte_size, null: false + t.string :checksum, null: false + t.datetime :created_at, null: false + + t.index [ :key ], unique: true + end + + create_table :active_storage_attachments do |t| + t.string :name, null: false + t.references :record, null: false, polymorphic: true, index: false + t.references :blob, null: false + + t.datetime :created_at, null: false + + t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true + t.foreign_key :active_storage_blobs, column: :blob_id + end + end +end diff --git a/db/product_seeds.csv b/db/product_seeds.csv new file mode 100644 index 0000000000..ff3ebca309 --- /dev/null +++ b/db/product_seeds.csv @@ -0,0 +1,2 @@ +id, name, description, photo, stock, active, price, merchant +1, Rose, A rose is a woody perennial flowering plant of the genus Rosa, in the family Rosaceae, or the flower it bears. There are over three hundred species and tens of thousands of cultivars. They form a group of plants that can be erect shrubs, climbing, or trailing, with stems that are often armed with sharp prickles., \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index c0d72d4852..40c952a052 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,11 +10,32 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_06_10_074429) do +ActiveRecord::Schema.define(version: 2020_06_10_192239) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "active_storage_attachments", force: :cascade do |t| + t.string "name", null: false + t.string "record_type", null: false + t.bigint "record_id", null: false + t.bigint "blob_id", null: false + t.datetime "created_at", null: false + t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" + t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true + end + + create_table "active_storage_blobs", force: :cascade do |t| + t.string "key", null: false + t.string "filename", null: false + t.string "content_type" + t.text "metadata" + t.bigint "byte_size", null: false + t.string "checksum", null: false + t.datetime "created_at", null: false + t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true + end + create_table "categories", force: :cascade do |t| t.string "name" t.string "description" @@ -86,6 +107,7 @@ t.index ["product_id"], name: "index_reviews_on_product_id" end + add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "products", "merchants" add_foreign_key "reviews", "products" end From ef6c4f239512ba1c57674da18e112fd2c1b25b43 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Wed, 10 Jun 2020 13:54:41 -0700 Subject: [PATCH 043/367] created seed data for products and merchants --- db/product_seeds.csv | 2 - .../categories.csv} | 0 db/seed_data/merchants.csv | 3 + db/seed_data/products.csv | 3 + db/seeds.rb | 61 ++++++++++++++++--- 5 files changed, 60 insertions(+), 9 deletions(-) delete mode 100644 db/product_seeds.csv rename db/{category_seeds.csv => seed_data/categories.csv} (100%) create mode 100644 db/seed_data/merchants.csv create mode 100644 db/seed_data/products.csv diff --git a/db/product_seeds.csv b/db/product_seeds.csv deleted file mode 100644 index ff3ebca309..0000000000 --- a/db/product_seeds.csv +++ /dev/null @@ -1,2 +0,0 @@ -id, name, description, photo, stock, active, price, merchant -1, Rose, A rose is a woody perennial flowering plant of the genus Rosa, in the family Rosaceae, or the flower it bears. There are over three hundred species and tens of thousands of cultivars. They form a group of plants that can be erect shrubs, climbing, or trailing, with stems that are often armed with sharp prickles., \ No newline at end of file diff --git a/db/category_seeds.csv b/db/seed_data/categories.csv similarity index 100% rename from db/category_seeds.csv rename to db/seed_data/categories.csv diff --git a/db/seed_data/merchants.csv b/db/seed_data/merchants.csv new file mode 100644 index 0000000000..080d3195bb --- /dev/null +++ b/db/seed_data/merchants.csv @@ -0,0 +1,3 @@ +id,email,username +1,joe.com,Joe +2,bob.com,Bob \ No newline at end of file diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv new file mode 100644 index 0000000000..5bef87e9bd --- /dev/null +++ b/db/seed_data/products.csv @@ -0,0 +1,3 @@ +id,name,description,photo,stock,active,price,merchant_id +1,Rose,A rose is a woody perennial flowering plant of the genus Rosa in the family Rosaceae.,nil,5,true,100,1 +2,Aloe Vera,Aloe vera is a succulent plant species of the genus Aloe.,nil,5,true,20,1 diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2accd..ad8ba21e96 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,7 +1,54 @@ -# 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) +require 'csv' + +MERCHANT_FILE = Rails.root.join('db', 'seed_data', 'merchants.csv') +puts "Loading raw product data from #{MERCHANT_FILE}" + +merchant_failures = [] +CSV.foreach(MERCHANT_FILE, :headers => true) do |row| + merchant = Merchant.new + merchant.id = row['id'] + merchant.email = row['email'] + merchant.username = row['username'] + p row['username'] + + p merchant + successful = merchant.save + if !successful + merchant_failures << merchant + end +end + +puts "Added #{Merchant.count} merchant records" +puts "#{merchant_failures.length} merchants failed to save" + +PRODUCT_FILE = Rails.root.join('db', 'seed_data', 'products.csv') +puts "Loading raw product data from #{PRODUCT_FILE}" + +product_failures = [] +CSV.foreach(PRODUCT_FILE, :headers => true) do |row| + product = Product.new + product.id = row['id'] + product.name = row['name'] + product.description = row['description'] + product.photo = row['photo'] + product.stock = row['stock'] + product.active = row['active'] + product.price = row['price'] + product.merchant_id = row['merchant_id'] + + successful = product.save + if !successful + product_failures << product + end +end + +puts "Added #{Product.count} product records" +puts "#{product_failures.length} products failed to save" + +# reloading postgres for the latest ID +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 de956862d31d126be8ad6b3c5f0398b206099917 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Wed, 10 Jun 2020 14:01:19 -0700 Subject: [PATCH 044/367] Removed Customer Model and added to Order --- app/assets/stylesheets/orders.scss | 3 + app/controllers/orders_controller.rb | 83 +++++++ app/helpers/orders_helper.rb | 2 + app/models/customer.rb | 2 - app/models/order.rb | 3 +- app/models/order_item.rb | 1 + db/migrate/20200610004051_create_customers.rb | 9 - ...0610175743_relate_order_items_to_orders.rb | 5 + db/migrate/20200610204139_remove_customer.rb | 5 + ...04945_remove_order_relation_to_customer.rb | 6 + db/schema.rb | 13 +- test/controllers/orders_controller_test.rb | 209 ++++++++++++++++++ test/models/customer_test.rb | 9 - test/models/order_test.rb | 27 ++- 14 files changed, 334 insertions(+), 43 deletions(-) create mode 100644 app/assets/stylesheets/orders.scss create mode 100644 app/controllers/orders_controller.rb create mode 100644 app/helpers/orders_helper.rb delete mode 100644 app/models/customer.rb delete mode 100644 db/migrate/20200610004051_create_customers.rb create mode 100644 db/migrate/20200610175743_relate_order_items_to_orders.rb create mode 100644 db/migrate/20200610204139_remove_customer.rb create mode 100644 db/migrate/20200610204945_remove_order_relation_to_customer.rb create mode 100644 test/controllers/orders_controller_test.rb delete mode 100644 test/models/customer_test.rb 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/orders_controller.rb b/app/controllers/orders_controller.rb new file mode 100644 index 0000000000..8e69d9a790 --- /dev/null +++ b/app/controllers/orders_controller.rb @@ -0,0 +1,83 @@ +class OrdersController < ApplicationController + + before_action :status_from_order, except: [:index, :new, :create] + + def index + # TODO should index list orders by customer and by merchant, do I need two indexes? + # who is logged? anonymous, user or merchant? orders only for the merchants that is logged in + @orders = Order.all + end + + def new + @order = Order.new + end + + def create + @order = Order.new(order_params) + @order_status = @order.status + if @order.save + flash[:status] = :success + flash[:result_text] = "Successfully created order #{@order.id}" + redirect_to order_path(@order) + else + flash[:status] = :failure + flash[:result_text] = "Could not create order" + flash[:messages] = @order.errors.messages + render :new, status: :bad_request + end + end + + def show + # TODO should orderitem be sorted? sorted by status + @orderitems = @order.orderitems + end + + def edit + end + + def update + if @order.update(order_params) + flash[:status] = :success + flash[:result_text] = "Successfully updated order #{@order.id}" + redirect_to order_path(@order) + else + flash.now[:status] = :failure + flash.now[:result_text] = "Could not update order" + flash.now[:messages] = @order.errors.messages + render :edit, status: :not_found + end + end + + def destroy + @order.destroy + flash[:status] = :success + flash[:result_text] = "Successfully destroyed order #{@order.id}" + redirect_to root_path + end + + def complete # pay complete cancel + flash[:status] = :failure + if @login_user + vote = Vote.new(user: @login_user, order: @order) + if vote.save + flash[:status] = :success + flash[:result_text] = "Successfully upvoted!" + else + flash[:result_text] = "Could not upvote" + flash[:messages] = vote.errors.messages + end + else + flash[:result_text] = "You must log in to do that" + end + + redirect_back fallback_location: order_path(@order) + end + + private + + def order_params + # TODO update with Orders params + params.require(:order).permit(:title, :status, :creator, :description, :publication_year) + end + +end \ No newline at end of file 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/customer.rb b/app/models/customer.rb deleted file mode 100644 index 0b5277335c..0000000000 --- a/app/models/customer.rb +++ /dev/null @@ -1,2 +0,0 @@ -class Customer < ApplicationRecord -end diff --git a/app/models/order.rb b/app/models/order.rb index d9440113ba..f1a8886d1e 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,6 +1,5 @@ class Order < ApplicationRecord - belongs_to :customer - has_many :orderitems, dependent: :destroy + has_many :orderitems, dependent: :destroy VALID_STATUS = %w(pending paid complete cancelled) validates :status, presence: true, inclusion: {in: VALID_STATUS} diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 23eec43434..fe8c1e34f7 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -1,3 +1,4 @@ class OrderItem < ApplicationRecord + belongs_to :order validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 } end diff --git a/db/migrate/20200610004051_create_customers.rb b/db/migrate/20200610004051_create_customers.rb deleted file mode 100644 index 7546c47412..0000000000 --- a/db/migrate/20200610004051_create_customers.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CreateCustomers < ActiveRecord::Migration[6.0] - def change - create_table :customers do |t| - t.string :email - - t.timestamps - end - end -end diff --git a/db/migrate/20200610175743_relate_order_items_to_orders.rb b/db/migrate/20200610175743_relate_order_items_to_orders.rb new file mode 100644 index 0000000000..9edcc219a2 --- /dev/null +++ b/db/migrate/20200610175743_relate_order_items_to_orders.rb @@ -0,0 +1,5 @@ +class RelateOrderItemsToOrders < ActiveRecord::Migration[6.0] + def change + add_reference :order_items, :order, index: true + end +end diff --git a/db/migrate/20200610204139_remove_customer.rb b/db/migrate/20200610204139_remove_customer.rb new file mode 100644 index 0000000000..7b5a383f59 --- /dev/null +++ b/db/migrate/20200610204139_remove_customer.rb @@ -0,0 +1,5 @@ +class RemoveCustomer < ActiveRecord::Migration[6.0] + def change + drop_table :customers, if_exists: true + end +end diff --git a/db/migrate/20200610204945_remove_order_relation_to_customer.rb b/db/migrate/20200610204945_remove_order_relation_to_customer.rb new file mode 100644 index 0000000000..0633017766 --- /dev/null +++ b/db/migrate/20200610204945_remove_order_relation_to_customer.rb @@ -0,0 +1,6 @@ +class RemoveOrderRelationToCustomer < ActiveRecord::Migration[6.0] + def change + remove_reference :orders, :customer, index: true + add_column :orders, :customer_email, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index c0d72d4852..b7d67b3866 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_06_10_074429) do +ActiveRecord::Schema.define(version: 2020_06_10_204945) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -29,12 +29,6 @@ t.index ["product_id"], name: "index_categories_products_on_product_id" end - create_table "customers", force: :cascade do |t| - t.string "email" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false - end - create_table "merchants", force: :cascade do |t| t.string "email" t.string "username" @@ -46,6 +40,8 @@ t.integer "quantity" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.bigint "order_id" + t.index ["order_id"], name: "index_order_items_on_order_id" end create_table "orders", force: :cascade do |t| @@ -60,8 +56,7 @@ t.datetime "time_submitted" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false - t.bigint "customer_id" - t.index ["customer_id"], name: "index_orders_on_customer_id" + t.string "customer_email" end create_table "products", force: :cascade do |t| diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb new file mode 100644 index 0000000000..03891785f7 --- /dev/null +++ b/test/controllers/orders_controller_test.rb @@ -0,0 +1,209 @@ +require "test_helper" + +describe OrdersController do + + # Arrange + let(:existing_order) { orders(:album) } + valid_statuses = %w(pending paid complete cancelled) + invalid_statuses = ["parrot", "parakeet", "incomplete", "nope", 2021, nil] + + describe "index" do + it "succeeds when there are orders" do + + # Act + get orders_path + + # Assert + must_respond_with :success + end + + it "succeeds when there are no orders" do + Order.all do |order| + order.destroy + end + + # Act + get orders_path + + # Assert + must_respond_with :success + end + end # describe "index" + + describe "new" do + it "succeeds" do + + # Act + get new_order_path + + # Assert + must_respond_with :success + end + end # describe "new" + + describe "create" do + it "creates a order with valid data for a real status" do + new_order = { order: { title: "Dirty Computer", status: "album" } } + + expect { + post orders_path, params: new_order + }.must_change "Order.count", 1 + + new_order_id = Order.find_by(title: "Dirty Computer").id + + # Assert + must_respond_with :redirect + must_redirect_to order_path(new_order_id) + end + + it "renders bad_request and does not update the DB for bogus data" do + bad_order = { order: { title: nil, status: "book" } } + + expect { + post orders_path, params: bad_order + }.wont_change "Order.count" + + # Assert + must_respond_with :bad_request + end + + it "renders 400 bad_request for bogus statuses" do + invalid_statuses.each do |status| + invalid_order = { order: { title: "Invalid Order", status: status } } + + # Assert + expect { post orders_path, params: invalid_order }.wont_change "Order.count" + + expect(Order.find_by(title: "Invalid Order", status: status)).must_be_nil + must_respond_with :bad_request + end + end + end # describe "create" + + describe "show" do + it "succeeds for an extant order ID" do + + # Act + get order_path(existing_order.id) + + # Assert + must_respond_with :success + end + + it "renders 404 not_found for a bogus order ID" do + destroyed_id = existing_order.id + existing_order.destroy + + # Act + get order_path(destroyed_id) + + # Assert + must_respond_with :not_found + end + end # describe "show" + + describe "edit" do + it "succeeds for an extant order ID" do + + # Act + get edit_order_path(existing_order.id) + + # Assert + must_respond_with :success + end + + it "renders 404 not_found for a bogus order ID" do + bogus_id = existing_order.id + existing_order.destroy + + # Act + get edit_order_path(bogus_id) + + # Assert + must_respond_with :not_found + end + end # describe "edit" + + describe "update" do + it "succeeds for valid data and an extant order ID" do + updates = { order: { title: "Dirty Computer" } } + + # Assert + expect { + put order_path(existing_order), params: updates + }.wont_change "Order.count" + updated_order = Order.find_by(id: existing_order.id) + + expect(updated_order.title).must_equal "Dirty Computer" + must_respond_with :redirect + must_redirect_to order_path(existing_order.id) + end + + it "renders bad_request for bogus data" do + updates = { order: { title: nil } } + + expect { + put order_path(existing_order), params: updates + }.wont_change "Order.count" + + order = Order.find_by(id: existing_order.id) + + # Assert + must_respond_with :not_found + end + + it "renders 404 not_found for a bogus order ID" do + bogus_id = existing_order.id + existing_order.destroy + + # Act + put order_path(bogus_id), params: { order: { title: "Test Title" } } + + # Assert + must_respond_with :not_found + end + end # describe "update" + + describe "destroy" do + it "succeeds for an extant order ID" do + expect { + delete order_path(existing_order.id) + }.must_change "Order.count", -1 + + # Assert + must_respond_with :redirect + must_redirect_to root_path + end + + it "renders 404 not_found and does not update the DB for a bogus order ID" do + bogus_id = existing_order.id + existing_order.destroy + + expect { + delete order_path(bogus_id) + }.wont_change "Order.count" + + # Assert + must_respond_with :not_found + end + end # describe "destroy" + + describe "upvote" do + it "redirects to the order page if no user is logged in" do + skip + end + + it "redirects to the order page after the user has logged out" do + skip + end + + it "succeeds for a logged-in user and a fresh user-vote pair" do + skip + end + + it "redirects to the order page if the user has already voted for that order" do + skip + end + end # describe "upvote" + +end diff --git a/test/models/customer_test.rb b/test/models/customer_test.rb deleted file mode 100644 index d106ce477f..0000000000 --- a/test/models/customer_test.rb +++ /dev/null @@ -1,9 +0,0 @@ -require "test_helper" - -describe Customer do - describe 'relationships' do - it 'has many Orders' do - - end - end -end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 131e11bac5..00aa238f23 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -2,49 +2,52 @@ describe Order do + # Arrange let (:new_customer) { Customer.new(email: "jane@gmail.com") } let (:new_order) { Order.new(customer_id: new_customer.id, status: "pending") } describe "relations" do - - it "has a customer" do - new_customer.save! - new_order.save! - expect(new_order).must_respond_to :customer - expect(new_order.customer).must_be_kind_of Customer - end - it "has a list of order_items" do # TODO add order_items here when available # TODO remove comments when order_item relationship available + # Arrange & Act new_customer.save! new_order.save! + + # Assert expect(new_order).must_respond_to :orderitems - # new_order.orderitems.each do |order_item| - # expect(order_item).must_be_kind_of OrderItem - # end + p new_order + new_order.orderitems.each do |order_item| + expect(order_item).must_be_kind_of OrderItem + end end end # describe "relations" describe "validations" do it "allows the four status" do + # Arrange new_customer.save! valid_statuses = %w(pending paid complete cancelled) valid_statuses.each do |status| + # Act order = Order.new(customer_id: new_customer.id, status: status) + # Assert expect(order.valid?).must_equal true end end it "rejects invalid statuses" do + # Arrange new_customer.save! invalid_statuses = ["parrot", "parakeet", "incomplete", 2020, nil] invalid_statuses.each do |status| + # Act order = Order.new(customer_id: new_customer.id, status: status) + # Assert expect(order.valid?).must_equal false expect(order.errors.messages).must_include :status end end end # describe "validations" -end +end # describe Order From dac0d94958d7da17acfbdfff3953c2e89c665fd9 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Wed, 10 Jun 2020 14:50:39 -0700 Subject: [PATCH 045/367] created order seed data --- db/schema.rb | 1 - db/seed_data/orders.csv | 7 +++++-- db/seeds.rb | 30 ++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index efff667426..5aac015069 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_06_10_204945) do # These are extensions that must be enabled in order to support this database diff --git a/db/seed_data/orders.csv b/db/seed_data/orders.csv index 0013492d03..0a675ff965 100644 --- a/db/seed_data/orders.csv +++ b/db/seed_data/orders.csv @@ -1,2 +1,5 @@ -id,status,credit_card_num,credit_card_exp,credit_card_cvv,address,city,state,zip,time_submitted -1,pending,nil,nil,nil,nil,nil,nil, \ No newline at end of file +id,status,credit_card_num,credit_card_exp,credit_card_cvv,address,city,state,zip,time_submitted,customer_email +1,pending,nil,nil,nil,nil,nil,nil,nil,nil,nil +2,paid,6278,10/10,234,123 ada lane,seattle,wa,89234,2001-02-03T04:05:06+00:00,something.com +3,cancelled,nil,nil,nil,nil,nil,nil,nil,nil,nil +4,complete,8390,20/20,234,445 lovelace lane,seattle,wa,67984,2001-02-03T04:05:06+00:00,somethingelse.com diff --git a/db/seeds.rb b/db/seeds.rb index ad8ba21e96..d817a76987 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,5 +1,6 @@ require 'csv' +# Merchant seeds MERCHANT_FILE = Rails.root.join('db', 'seed_data', 'merchants.csv') puts "Loading raw product data from #{MERCHANT_FILE}" @@ -21,6 +22,7 @@ puts "Added #{Merchant.count} merchant records" puts "#{merchant_failures.length} merchants failed to save" +# Product seeds PRODUCT_FILE = Rails.root.join('db', 'seed_data', 'products.csv') puts "Loading raw product data from #{PRODUCT_FILE}" @@ -45,6 +47,34 @@ puts "Added #{Product.count} product records" puts "#{product_failures.length} products failed to save" +# Order seeds +ORDER_FILE = Rails.root.join('db', 'seed_data', 'orders.csv') +puts "Loading raw order data from #{ORDER_FILE}" + +order_failures = [] +CSV.foreach(ORDER_FILE, :headers => true) do |row| + order = Order.new + order.id = row['id'] + order.status = row['status'] + order.credit_card_num = row['credit_card_num'] + order.credit_card_exp = row['credit_card_exp'] + order.credit_card_cvv = row['credit_card_cvv'] + order.address = row['address'] + order.city = row['city'] + order.state = row['state'] + order.zip = row['zip'] + order.time_submitted = row['time_submitted'] + order.customer_email = row['customer_email'] + + successful = order.save + if !successful + order_failures << order + end +end + +puts "Added #{Order.count} order records" +puts "#{order_failures.length} orders failed to save" + # reloading postgres for the latest ID puts "Manually resetting PK sequence on each table" ActiveRecord::Base.connection.tables.each do |t| From 0bed763590e31cb9be27f75386cdfda9e8652d83 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Wed, 10 Jun 2020 14:59:04 -0700 Subject: [PATCH 046/367] created order_item seeds --- db/seed_data/order_items.csv | 3 +++ db/seeds.rb | 22 ++++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 db/seed_data/order_items.csv diff --git a/db/seed_data/order_items.csv b/db/seed_data/order_items.csv new file mode 100644 index 0000000000..0487e4423a --- /dev/null +++ b/db/seed_data/order_items.csv @@ -0,0 +1,3 @@ +id,quantity,order_id +1,2,4 +2,1,2 \ No newline at end of file diff --git a/db/seeds.rb b/db/seeds.rb index d817a76987..1427fa8aea 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -10,9 +10,7 @@ merchant.id = row['id'] merchant.email = row['email'] merchant.username = row['username'] - p row['username'] - p merchant successful = merchant.save if !successful merchant_failures << merchant @@ -75,6 +73,26 @@ puts "Added #{Order.count} order records" puts "#{order_failures.length} orders failed to save" +# OrderItem seeds +ORDER_ITEM_FILE = Rails.root.join('db', 'seed_data', 'order_items.csv') +puts "Loading raw order_item data from #{ORDER_ITEM_FILE}" + +order_item_failures = [] +CSV.foreach(ORDER_ITEM_FILE, :headers => true) do |row| + order_item = OrderItem.new + order_item.id = row['id'] + order_item.quantity = row['quantity'] + order_item.order_id = row['order_id'] + + successful = order_item.save + if !successful + order_item_failures << order_item + end +end + +puts "Added #{OrderItem.count} order item records" +puts "#{order_item_failures.length} order items failed to save" + # reloading postgres for the latest ID puts "Manually resetting PK sequence on each table" ActiveRecord::Base.connection.tables.each do |t| From 9c8e0018139779940cbb0a3f3802e59f3231a6c3 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 16:35:22 -0700 Subject: [PATCH 047/367] review model tests all passing --- test/models/review_test.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 8a9054c49c..045e50e6b7 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -28,7 +28,7 @@ expect(result).must_equal false expect(review.errors.messages).must_include :rating - expect(review.errors.messages[:rating]).must_include " should be between 0 to 5" + expect(review.errors.messages[:rating]).must_include "should be between 0 and 5" end @@ -38,10 +38,9 @@ expect(result).must_equal false expect(review.errors.messages).must_include :rating - expect(review.errors.messages[:rating]).must_include "is not a number" + expect(review.errors.messages[:rating].size).must_be :positive? end - end From 4c27fff26528169dfbad07d73127035790a0778d Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 16:36:01 -0700 Subject: [PATCH 048/367] added .env to gitignore files --- .gitignore | 1 + Gemfile | 1 + Gemfile.lock | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 5c56406a85..f8a7635718 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ yarn-debug.log* .yarn-integrity coverage +.env diff --git a/Gemfile b/Gemfile index b07a5295fb..83656f8e79 100644 --- a/Gemfile +++ b/Gemfile @@ -70,6 +70,7 @@ end group :development do gem 'better_errors' gem 'binding_of_caller' + gem 'dotenv-rails' end group :test do diff --git a/Gemfile.lock b/Gemfile.lock index 88dae8cb98..7fffa0404f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -96,6 +96,10 @@ GEM declarative-option (0.1.0) digest-crc (0.5.1) docile (1.3.2) + dotenv (2.7.5) + dotenv-rails (2.7.5) + dotenv (= 2.7.5) + railties (>= 3.2, < 6.1) erubi (1.9.0) execjs (2.7.0) faraday (1.0.1) @@ -340,6 +344,7 @@ DEPENDENCIES byebug capybara (>= 2.15) debase (>= 0.2.4.1) + dotenv-rails google-cloud-storage (~> 1.11) guard guard-minitest From e3686998e3ea52b07aa36852bf04df1ace5418e4 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 16:36:37 -0700 Subject: [PATCH 049/367] added initializer to omniauth --- config/initializers/omniauth.rb | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 config/initializers/omniauth.rb diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb new file mode 100644 index 0000000000..e32a45234e --- /dev/null +++ b/config/initializers/omniauth.rb @@ -0,0 +1,3 @@ +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 From 72148112c20406c3d7dd2eec93d27a55f0eb4d86 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 16:36:59 -0700 Subject: [PATCH 050/367] merchant model tests passing --- test/models/merchant_test.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 1795ece883..b489b04ae6 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -8,20 +8,20 @@ describe "validations" do it "is valid when a merchant has a username and email" do - expect(merchant.valid?).must_equal true + expect(new_merchant.valid?).must_equal true end it "is invalid without a username" do - merchant.username = nil - expect(merchant.valid?).must_equal false - expect(merchant.errors.messages).must_include :username + new_merchant.username = nil + expect(new_merchant.valid?).must_equal false + expect(new_merchant.errors.messages).must_include :username end it "is invalid without an email" do - merchant.email = nil - expect(merchant.valid?).must_equal false - expect(merchant.errors.messages).must_include :email + new_merchant.email = nil + expect(new_merchant.valid?).must_equal false + expect(new_merchant.errors.messages).must_include :email end end @@ -30,7 +30,7 @@ describe "relationships" do it "has/responds to products" do - expect(merchants.respond_to?(:products)).must_equal true + expect(new_merchant.respond_to?(:products)).must_equal true end end From 2357c00fd22be109db2c4f10dfd419439ace14d3 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 16:37:29 -0700 Subject: [PATCH 051/367] review model validations updated --- app/models/review.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/models/review.rb b/app/models/review.rb index ecc4c794d5..b1e2aef497 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -2,6 +2,5 @@ class Review < ApplicationRecord belongs_to :product - validates :rating, :numericality => { :in => 0..5, :message => " should be between 0 to 5" } - #validates :rating, :numericality: { greater_than: 0, less_than_or_equal_to: 5 } + validates :rating, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 5, message: "should be between 0 and 5" } end From 9279723c951efaddbdbeeb150195010293d7b6e9 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 16:37:50 -0700 Subject: [PATCH 052/367] added merchant model validations --- app/models/merchant.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index e21d4e4250..8072af0c40 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -6,3 +6,4 @@ class Merchant < ApplicationRecord validates :email, presence: true, uniqueness: true end + From e846a6d4bd8f25d3eb6c1e32397b08b8641850c5 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 16:38:08 -0700 Subject: [PATCH 053/367] added routes for oauth --- config/routes.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index c06383a172..65d0d54bd6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,9 @@ Rails.application.routes.draw do - # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + + # Omniauth Login route + get "/auth/github", as: "github_login" + + # Omniauth Github callback route + get "/auth/:provider/callback", to: "merchants#create", as: "omniauth_callback" + end From f5ec2e5a665e9cc7d24542f03e5e6c2c44d98f8b Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 16:38:39 -0700 Subject: [PATCH 054/367] created Merchant controller --- app/assets/stylesheets/merchants.scss | 3 +++ app/controllers/merchants_controller.rb | 2 ++ app/helpers/merchants_helper.rb | 2 ++ test/controllers/merchants_controller_test.rb | 7 +++++++ 4 files changed, 14 insertions(+) create mode 100644 app/assets/stylesheets/merchants.scss create mode 100644 app/controllers/merchants_controller.rb create mode 100644 app/helpers/merchants_helper.rb create mode 100644 test/controllers/merchants_controller_test.rb diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss new file mode 100644 index 0000000000..743080c521 --- /dev/null +++ b/app/assets/stylesheets/merchants.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Merchants 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/merchants_controller.rb b/app/controllers/merchants_controller.rb new file mode 100644 index 0000000000..ae95f7677b --- /dev/null +++ b/app/controllers/merchants_controller.rb @@ -0,0 +1,2 @@ +class MerchantsController < ApplicationController +end diff --git a/app/helpers/merchants_helper.rb b/app/helpers/merchants_helper.rb new file mode 100644 index 0000000000..5337747b0f --- /dev/null +++ b/app/helpers/merchants_helper.rb @@ -0,0 +1,2 @@ +module MerchantsHelper +end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb new file mode 100644 index 0000000000..7861d3b7c5 --- /dev/null +++ b/test/controllers/merchants_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe MerchantsController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 3d24910c503a9090f3ce8e7b8fc2b75284e356a3 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Wed, 10 Jun 2020 17:23:16 -0700 Subject: [PATCH 055/367] Added functionality to upload images --- .env | 2 ++ .gitignore | 4 ++++ Gemfile.lock | 3 +++ app/assets/stylesheets/homepages.scss | 3 +++ app/controllers/homepages_controller.rb | 4 ++++ app/helpers/homepages_helper.rb | 2 ++ app/models/product.rb | 1 + app/views/homepages/index.html.erb | 1 + app/views/layouts/_header.html.erb | 7 +++++++ app/views/layouts/application.html.erb | 1 + config/environments/development.rb | 2 +- config/gce.json | 12 ------------ config/routes.rb | 2 +- config/storage.yml | 8 +++++++- test/controllers/homepages_controller_test.rb | 7 +++++++ 15 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 .env create mode 100644 app/assets/stylesheets/homepages.scss create mode 100644 app/controllers/homepages_controller.rb create mode 100644 app/helpers/homepages_helper.rb create mode 100644 app/views/homepages/index.html.erb create mode 100644 app/views/layouts/_header.html.erb delete mode 100644 config/gce.json create mode 100644 test/controllers/homepages_controller_test.rb diff --git a/.env b/.env new file mode 100644 index 0000000000..93da3f94d6 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +GOOGLE_KEY_ID: "231af1ec696ee750bcfb81bb1fc63b953ba645a4" +GOOGLE_KEY: "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC+bw3A8Ff0b9Yz\nbLMepBVFvQTfRZ6Ln2ZVN1w7yDpqXLOz3Pj0D/rGmhwCdU7QY0btH1BcxhAknFDU\nOQ1KnnETB2LxwZoBtyACdggqtb2eDqraMybsri7lhbklTXzzG6+f47Lnw+8bzgP5\nbupUqh3BAGICKJaPfHU3Edxq22u0rLE5NicuDetzp+sDRKBUgphvsxskjGDO2rbd\ncfBRLVeCaZOVQ69w2nYcYGmlqALInnontw2kRDbBVCIERWTIB4s0Pa8u2bNC5vC9\n58qlxZV91NkEuYL3wccP+1+zatsrYseeCLFUnmGFqq7n9CgDrWjLzVdlNT5Zln/Q\nkI2JYNhRAgMBAAECggEAUTlq411gFolREpQNfkc8L4ekuVqneiQd8MDxHSqVB+LM\nXy4kHW1naCg5RC8m06lUijUuALQWFJd7vlkrOyWDUzt2T2llN9AU3hfb+eOUogLd\nir4AnzjYFdvIkYmQftzTNt5W45XlubVQaqaNWllI4ZY5N3R6a28JS9jZa9Z1BRVa\n4OYCKx9NcLoPCghhxExiNj1+Hu2dQt3CQdL6eQcKHgC2HTOHOu7sKIgzMgzi4oL8\nFHwLVePuNfeg4lzMWDS9mQI7OecnhSg2RcYqOCuRKm22qt1COnx3yhniF2KyPWeV\nBw11uNUJCRYFSCO1easl0dCnejfu4ad/sUb07YhdZQKBgQDnLRCt39sbZGdlQPek\nlAMAKdB/h9M4ivlOJlJX7U9Haluplq8IlP89RmplMFK6GMzf+lwiWeTAr+UJ+zZ3\nhi1R5yaMzIuYwY3OOxPivZRfO5i/BbShbNK6/qprY73Jq+s7zPrnvE0VksT3PiVk\noKJCL1h+t7TxXUBaslTW6x6B3wKBgQDS4gBRe/nl+ZaX+6ekfslnzUrVmSdrrwNn\nPEqEZcuNgaHKeP4rQU9Plv6xWFi6X5gHOExQOVYOBbsw5BI1RwtcCmR94fVK1JSk\nG/oRe3e6LIWPD37Sbxh1SAV2Fw16//MM0qI+lF0J6rfw9KrIuQGTdQHxzyBeCsaK\ncAmrwIbLzwKBgFgNICc59niue3tjjW+QOLxdMN8CWv9UX7TWf9KhvuqSpisoC68X\nIUizg17bUwcy3wYIlAM5fhmuZWyx1IMeBjEF+/bxCdK7FkoQ0ngwgUzspDdN8wjx\nLCqxSTPyH52q78QtRPvzCuFGr+MENrXnQSY4ZlqNmku8mwBwoEPj9hC9AoGBANLJ\nSe4o0LHZ13gU+A2JGYHjBrEYQ/nz1qAC+Kz8HwlTkMeURuIvhroUQII9v3qTAJ/+\n2vC5TtX3TpNg9P5CBA286ZOWHxvr/qNGv59n3VW/GMTVhTuMBlN8aNEP286dNXEU\nvU11+MVn0vJLbMXzfqrIoufz0/OMK8XGlTQS3emrAoGAFw6l+5kMi773RVyMBHuP\nwiRRryJAZ8adgmNVa9TKAViBaYtH8uOvPpsD7puceg2CKdErNYYsEIT+ehSl9tzb\nF5yiPq1CNteouVzzNPHmahDvH2dsZJ0xPawMUIUwrlSbgapdjpmfv3KLVjHCRQ8u\nPdj8F7fP25f59yCA6+Q7fgo=\n-----END PRIVATE KEY-----\n" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5c56406a85..4255b81bb7 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ /public/assets .byebug_history +config/secrets/* # Ignore master key for decrypting credentials and more. /config/master.key @@ -35,3 +36,6 @@ yarn-debug.log* .yarn-integrity coverage + +# Ignore application configuration +/config/application.yml diff --git a/Gemfile.lock b/Gemfile.lock index 88dae8cb98..4edcf72181 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -101,6 +101,8 @@ GEM faraday (1.0.1) multipart-post (>= 1.2, < 3) ffi (1.13.1) + figaro (1.2.0) + thor (>= 0.14.0, < 2) formatador (0.2.5) globalid (0.4.2) activesupport (>= 4.2.0) @@ -340,6 +342,7 @@ DEPENDENCIES byebug capybara (>= 2.15) debase (>= 0.2.4.1) + figaro google-cloud-storage (~> 1.11) guard guard-minitest diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss new file mode 100644 index 0000000000..7a4c0c5bb1 --- /dev/null +++ b/app/assets/stylesheets/homepages.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the homepages 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/homepages_controller.rb b/app/controllers/homepages_controller.rb new file mode 100644 index 0000000000..f200c8ac2e --- /dev/null +++ b/app/controllers/homepages_controller.rb @@ -0,0 +1,4 @@ +class HomepagesController < ApplicationController + def index + end +end diff --git a/app/helpers/homepages_helper.rb b/app/helpers/homepages_helper.rb new file mode 100644 index 0000000000..4bd8098f37 --- /dev/null +++ b/app/helpers/homepages_helper.rb @@ -0,0 +1,2 @@ +module HomepagesHelper +end diff --git a/app/models/product.rb b/app/models/product.rb index 0e8d9827ec..eab5449e6b 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -2,6 +2,7 @@ class Product < ApplicationRecord belongs_to :merchant has_and_belongs_to_many :categories has_many :reviews + has_one_attached :photo validates :name, presence: true, uniqueness: { scope: :merchant_id, message: "Merchant already has product of this name %{value} ." } diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb new file mode 100644 index 0000000000..7515126340 --- /dev/null +++ b/app/views/homepages/index.html.erb @@ -0,0 +1 @@ +

Homepage

\ No newline at end of file diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb new file mode 100644 index 0000000000..9fc74022e1 --- /dev/null +++ b/app/views/layouts/_header.html.erb @@ -0,0 +1,7 @@ +
    +
  • Homepage
  • +
  • Merchant Login
  • +
  • View all products
  • +
  • Create product
  • +
+ diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 74961e61a4..97c8058d72 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,6 +10,7 @@ + <%= render 'layouts/header' %> <%= yield %> diff --git a/config/environments/development.rb b/config/environments/development.rb index 66df51f6fc..5b052fd4f6 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -29,7 +29,7 @@ end # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :local + config.active_storage.service = :google_dev # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false diff --git a/config/gce.json b/config/gce.json deleted file mode 100644 index 915ebe4f92..0000000000 --- a/config/gce.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "service_account", - "project_id": "betsy-279919", - "private_key_id": "1b0da1465cf6bdd683dba9d043f93f71a18c4dc8", - "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC+DC4JA1oH0Kct\ng34R14wCARIcaB++gTOptF+hPzpdX6IEsZQog2z5JSV5XU+95nGmMdzcTPnLYPwA\n97NPOIC+T0oaLrl/NZr8ZcxhQmfpMmVxrxJs2Q3uoSM7I2InMm6Tm8XhYlbIToFC\n68OBCElZ2fdVepsWRi82f6vYb51Q65C1tSPXUGLwxS/YZ4YljxZDfQVorv0xhyjm\ntreL0bEnfASB9hsv0Utwe2XEtsYMGOdgjxng0PehA4u4C8k/amZOL+dxUQrmJybz\nqoUJHqIoxEOgaiLEMBVpa+dvFJ8aR8VRP+37NLzCImnPcOYYVUvNjm2HPXbLvfbc\nX3R2LqRrAgMBAAECggEAASssAUwu+otS69m6JbvwlXaSOPB++Xnr6mg8ik5MOpTC\n90psQc+FFQcgct2bBuzq1/3IgOZMRu7ivdLIHH2ZdRIhv4V4CIs418J8fkCdSPbR\nXuCXuWmgR05gXBW8nccWnPvBPMCRDgxFiTbP7fQyF0Za2gC2AW4PDkO8t8j/66Z0\nc9vItTR9YfdP+xscmActrViVAAFEbbdn5ninoH5mQFxSlFDx+8+8bo3LH1a3uvpr\nif91FULvLAJw3PKOZZzFynIctKCkI9eBQMepBjHkLhUAFrQxD/mv0QqxVBBx4oZw\n825DFRDmyOC82g4vxyhdDFIVXrSPj77YErdRcXqT+QKBgQD1qNj02gJWrd3Q4Vgn\nhiGKw7WD6JkrBkRouMV8M36S5F0Quke/oKY3QqTAWIb1OiqjjV+A4rx25ERAAkvO\nk0v1ZWpmGW3nztxIWSubGHS2VPP7Q1YZpFIqAW5V7wixHll0+onN32QHE+zLOjFL\nOish+Rd4Be9KeUIBYIHeSDttnQKBgQDGDBMW24MIy6xT5nwvhsxh4CunPdnVWwIz\nPDM74soRtbvkw4lS0gvMNpaxaHoYKNzI9X2uIkcL474bL3LlmjmABCX3Bv328/Hg\nVAonpmUT3TpCMvmBE/TrlCItSY90rFG+UNvp57x6G8X9XVLEkx32k5ZIOEwZEhFa\nxAiucoq/pwKBgGCdgo5x+395rAaNyezpfOGlbQsu/KaGNXt2R/08B2jgNZXxnWxJ\nU3XiWQdpCdMCiGiAnnIDOpoL1qfR/1yEY9hkhX8YOzhzDAHMSDEcYjKfoMFOT1uQ\nW9w3adyUQTffttEiA/abCC0ccgHPpjlu7C3VWJyUwPLqU8JU4V65y92lAoGBAKWJ\nlC8n3hfs/ibG4YhsOMuar4JD7Z8rSeR/biehQduZturZEiB610ejXUP+mwc0qI8E\nuz9hAVeLzew1Nel6hpNdZEpdusu/Ta5/MFnB+HypDrgkmW5tuutqT0LhWJpiKpVU\nSuzxORYrvssvRS5v9byT0iqde+X8tyrR7pu5vAXDAoGAfmuewnrIYC9xuWDwA8Wp\nK1MLtXJVCer9vMII89/iAkFoWl/F391cTHMHmP1K+lg0GdN3m1dlndQvT+tnlq7k\nX/uagnqEEqA/kJ1kkE7Xy38VFrExu14GgRJFjZirXZcyRg1wpIlTYVlQvjFrvvPg\n0014TQLmpM8DJK4aHJ3qZJY=\n-----END PRIVATE KEY-----\n", - "client_email": "betsy-816@betsy-279919.iam.gserviceaccount.com", - "client_id": "109836174693392164966", - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/betsy-816%40betsy-279919.iam.gserviceaccount.com" -} diff --git a/config/routes.rb b/config/routes.rb index c06383a172..41310ba7f5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,3 @@ Rails.application.routes.draw do - # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + root 'homepages#index' end diff --git a/config/storage.yml b/config/storage.yml index 65451a5659..e0c339e05b 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -18,7 +18,13 @@ local: google: service: GCS project: bEtsy - credentials: <%= Rails.root.join("config/gcs.json") %> + credentials: <%= ENV['GOOGLE_APPLICATION_CREDENTIALS'].as_json %> + bucket: betsy_product_images + +google_dev: + service: GCS + project: bEtsy + credentials: <%= Rails.root.join("config/secrets/product-pic.json") %> bucket: betsy_product_images # Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) diff --git a/test/controllers/homepages_controller_test.rb b/test/controllers/homepages_controller_test.rb new file mode 100644 index 0000000000..cef86edeae --- /dev/null +++ b/test/controllers/homepages_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe HomepagesController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From 5e79e3cea0270c401119c9f1962905e7d907d00a Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Wed, 10 Jun 2020 17:32:44 -0700 Subject: [PATCH 056/367] Added status processing to Order model and Order controller. Added tests for Order model. --- app/controllers/orders_controller.rb | 71 ++++++++------ app/models/order.rb | 21 +++++ test/models/order_test.rb | 135 ++++++++++++++++++++++++--- 3 files changed, 188 insertions(+), 39 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 8e69d9a790..4b944a5b01 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,34 +1,30 @@ class OrdersController < ApplicationController - before_action :status_from_order, except: [:index, :new, :create] - + before_action :get_order, except: [:index, :new, :create] + def index - # TODO should index list orders by customer and by merchant, do I need two indexes? - # who is logged? anonymous, user or merchant? orders only for the merchants that is logged in - @orders = Order.all + @orders = Order.all.order(:status) end def new - @order = Order.new + @order = Order.new(status: "pending") end def create @order = Order.new(order_params) - @order_status = @order.status if @order.save flash[:status] = :success flash[:result_text] = "Successfully created order #{@order.id}" redirect_to order_path(@order) else - flash[:status] = :failure - flash[:result_text] = "Could not create order" - flash[:messages] = @order.errors.messages + flash.now[:status] = :failure + flash.now[:result_text] = "Could not create order" + flash.now[:messages] = @order.errors.messages render :new, status: :bad_request end end def show - # TODO should orderitem be sorted? sorted by status @orderitems = @order.orderitems end @@ -55,29 +51,52 @@ def destroy redirect_to root_path end - def complete # pay complete cancel - flash[:status] = :failure - if @login_user - vote = Vote.new(user: @login_user, order: @order) - if vote.save - flash[:status] = :success - flash[:result_text] = "Successfully upvoted!" - else - flash[:result_text] = "Could not upvote" - flash[:messages] = vote.errors.messages - end + def pay + if @order.process_payment + flash[:status] = :success + flash[:result_text] = "Successfully paid order #{@order.id}" else - flash[:result_text] = "You must log in to do that" + flash[:status] = :failure + flash[:result_text] = "Payment processing failed!" end + redirect_to order_path(@order) + end - redirect_back fallback_location: order_path(@order) + def complete + if @order.complete_order + flash[:status] = :success + flash[:result_text] = "Successfully completed order #{@order.id}" + else + flash[:status] = :failure + flash[:result_text] = "Failed to complete the order." + end + redirect_to order_path(@order) + end + + def cancel + if @order.cancel_order + flash[:status] = :success + flash[:result_text] = "Successfully cancelled order #{@order.id}" + else + flash[:status] = :failure + flash[:result_text] = "Failed to cancel order." + end + redirect_to order_path(@order) end private def order_params - # TODO update with Orders params - params.require(:order).permit(:title, :status, :creator, :description, :publication_year) + params.require(:order).permit(:status, + :credit_card_num, :credit_card_exp, :credit_card_cvv, + :address, :city, :state, :zip, + :time_submitted, :customer_email + ) end + def get_order + @order = Order.find_by(id: params[:id]) + render_404 unless @order + end + end \ No newline at end of file diff --git a/app/models/order.rb b/app/models/order.rb index f1a8886d1e..e531e72ba4 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -3,4 +3,25 @@ class Order < ApplicationRecord VALID_STATUS = %w(pending paid complete cancelled) validates :status, presence: true, inclusion: {in: VALID_STATUS} + + def process_payment + # TODO implement payment + return false unless self.status == "pending" + return false if self.credit_card_num.nil? || self.credit_card_exp.empty? || + self.credit_card_cvv.nil? || self.customer_email.empty? + self.status = "paid" + return self.save + end + + def complete_order + return false unless self.status == "paid" + self.status = "complete" + return self.save + end + + def cancel_order + self.status = "cancelled" + return self.save + end + end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 00aa238f23..c75b2dd115 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -3,22 +3,18 @@ describe Order do # Arrange - let (:new_customer) { Customer.new(email: "jane@gmail.com") } - let (:new_order) { Order.new(customer_id: new_customer.id, status: "pending") } + let (:new_order) { Order.new(status: "pending") } describe "relations" do it "has a list of order_items" do - # TODO add order_items here when available - # TODO remove comments when order_item relationship available # Arrange & Act - new_customer.save! new_order.save! # Assert expect(new_order).must_respond_to :orderitems - p new_order - new_order.orderitems.each do |order_item| - expect(order_item).must_be_kind_of OrderItem + + new_order.orderitems.each do |orderitem| + expect(orderitem).must_be_kind_of OrderItem end end end # describe "relations" @@ -26,11 +22,10 @@ describe "validations" do it "allows the four status" do # Arrange - new_customer.save! valid_statuses = %w(pending paid complete cancelled) valid_statuses.each do |status| # Act - order = Order.new(customer_id: new_customer.id, status: status) + order = Order.new(status: status) # Assert expect(order.valid?).must_equal true end @@ -38,11 +33,10 @@ it "rejects invalid statuses" do # Arrange - new_customer.save! invalid_statuses = ["parrot", "parakeet", "incomplete", 2020, nil] invalid_statuses.each do |status| # Act - order = Order.new(customer_id: new_customer.id, status: status) + order = Order.new(status: status) # Assert expect(order.valid?).must_equal false expect(order.errors.messages).must_include :status @@ -50,4 +44,119 @@ end end # describe "validations" -end # describe Order + describe "process_payment" do + it "processes a valid payment" do + # Arrange + new_order.credit_card_num = 1234 + new_order.credit_card_exp = "12/20" + new_order.credit_card_cvv = 432 + new_order.customer_email = "ada@gmail.com" + new_order.save! + + # Act + result = new_order.process_payment + new_order.reload + + # Assert + expect(result).must_equal true + expect(new_order.status).must_equal "paid" + end + + it "rejects status not pending" do + # Arrange + new_order.credit_card_num = 1234 + new_order.credit_card_exp = "12/20" + new_order.credit_card_cvv = 432 + new_order.customer_email = "ada@gmail.com" + new_order.status = "cancelled" + new_order.save! + + # Act + result = new_order.process_payment + new_order.reload + + # Assert + expect(result).must_equal false + expect(new_order.status).must_equal "cancelled" + end + + it "requires a credit card" do + # Arrange + new_order.credit_card_num = nil + new_order.credit_card_exp = "12/20" + new_order.credit_card_cvv = 432 + new_order.customer_email = "ada@gmail.com" + new_order.save! + + # Act + result = new_order.process_payment + new_order.reload + + # Assert + expect(result).must_equal false + expect(new_order.status).must_equal "pending" + end + + it "requires a customer email" do + # Arrange + new_order.credit_card_num = 5555 + new_order.credit_card_exp = "12/20" + new_order.credit_card_cvv = 432 + new_order.customer_email = "" + new_order.save! + + # Act + result = new_order.process_payment + new_order.reload + + # Assert + expect(result).must_equal false + expect(new_order.status).must_equal "pending" + end + end # describe "process_payment" + + describe "complete_order" do + it "completes a valid order" do + # Arrange + new_order.status = "paid" + new_order.save! + + # Act + result = new_order.complete_order + new_order.reload + + # Assert + expect(result).must_equal true + expect(new_order.status).must_equal "complete" + end + + it "rejects status not paid" do + # Arrange + new_order.save! + + # Act + result = new_order.process_payment + new_order.reload + + # Assert + expect(result).must_equal false + expect(new_order.status).must_equal "pending" + end + end # describe "complete_order" + + describe "cancel_order" do + it "cancels an order" do + # Arrange + new_order.save! + + # Act + result = new_order.cancel_order + new_order.reload + + # Assert + expect(result).must_equal true + expect(new_order.status).must_equal "cancelled" + end + end # describe "cancel_order" + +end # describe Order \ No newline at end of file From 2270df87798948340239f17f1b62865275c1e81e Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:31:45 -0700 Subject: [PATCH 057/367] added more fixture sample into merchants --- test/fixtures/merchants.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index 8a2da1d4ce..10c1da600b 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -10,3 +10,14 @@ melba: username: Melba Mouton email: melmou@email.com +angela: + provider: github + uid: 2244 + email: angela@adadevelopers.org + username: angie + +suely: + provider: github + uid: 6464 + email: suely.adadevelopers.org + username: zuelly From 57f4a6bc32f4d2f3c40c70594f4133dba49acf42 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:32:29 -0700 Subject: [PATCH 058/367] added auth_callback test, not complete --- test/controllers/merchants_controller_test.rb | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 7861d3b7c5..6c6eddbe87 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -1,7 +1,38 @@ require "test_helper" describe MerchantsController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + + describe "auth_callback" do + it "logs in an existing merchant" do + start_count = Merchant.count + merchant = merchants(:angela) + + perform_login(merchant) + must_redirect_to root_path + session[:merchant_id].must_equal merchant.id + + # Should *not* have created a new merchant + Merchant.count.must_equal start_count + end + + it "creates an account for a new user and redirects to the root route" do + start_count = Merchant.count + merchant = Merchant.new(provider: "github", uid: 2222, name: "test_user", email: "test@user.com") + + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) + get auth_callback_path(:github) + + must_redirect_to root_path + + # Should have created a new merchant + Merchant.count.must_equal start_count + 1 + + # The new merchant's ID should be set in the session + session[:merchant_id].must_equal Merchant.last.id + end + + it "redirects to the login route if given invalid user data" do + end + end + end From fe2cf888803025a981882425afb5e07648d6f0e1 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:33:09 -0700 Subject: [PATCH 059/367] added mock_auth to test_helper --- test/test_helper.rb | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 3050145497..dded9415ca 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -23,4 +23,38 @@ class ActiveSupport::TestCase fixtures :all # Add more helper methods to be used by all tests here... + + 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: merchant.provider, + uid: merchant.uid, + info: { + email: merchant.email, + username: merchant.name + } + } + end + + # Helper method that performs a log-in with either + # a passed-in user of the first test user + + def perform_login(merchant = nil) + merchant ||= Merchant.first + + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) + # Act Try to call the calleback route + get auth_callback_path(:github) + # Verify the user ID was saved - of that didn't work. this test is valid + expect(session[:merchant_id].must_equal merchant.id) + + return merchant + end end + From 7ba6730d8cb907a0ee3ac5008dc0e7467c1e78fb Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:33:45 -0700 Subject: [PATCH 060/367] added uid and provider tables to merchants --- .../20200611001518_add_uid_and_provider_to_merchants.rb | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 db/migrate/20200611001518_add_uid_and_provider_to_merchants.rb diff --git a/db/migrate/20200611001518_add_uid_and_provider_to_merchants.rb b/db/migrate/20200611001518_add_uid_and_provider_to_merchants.rb new file mode 100644 index 0000000000..c4492bfc79 --- /dev/null +++ b/db/migrate/20200611001518_add_uid_and_provider_to_merchants.rb @@ -0,0 +1,7 @@ +class AddUidAndProviderToMerchants < ActiveRecord::Migration[6.0] + def change + add_column :merchants, :uid, :integer + add_column :merchants, :provider, :string + + end +end From beb2b99d77695e7f5bf60a3c3ddb91c60d6d566f Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:34:38 -0700 Subject: [PATCH 061/367] added uid and provider to merchants --- db/schema.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index 5aac015069..b9615d779e 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_06_10_204945) do +ActiveRecord::Schema.define(version: 2020_06_11_001518) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -55,6 +55,8 @@ t.string "username" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.integer "uid" + t.string "provider" end create_table "order_items", force: :cascade do |t| From 8272bdb66df10511b7a67a51865e1830c51b0025 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:35:05 -0700 Subject: [PATCH 062/367] added login and logout links --- app/views/merchants/index.html.erb | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/views/merchants/index.html.erb diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb new file mode 100644 index 0000000000..01d9bac72b --- /dev/null +++ b/app/views/merchants/index.html.erb @@ -0,0 +1,5 @@ +<% if session[:merchant_id] %> + <%= link_to "Log out", logout_path, method: "delete" %> +<% else %> + <%= link_to "Login with Github", github_login_path %> +<% end %> \ No newline at end of file From 34ceff183fe59216c500ae85179d142d51c75020 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:35:34 -0700 Subject: [PATCH 063/367] created show and create actions to merchant controller --- app/controllers/merchants_controller.rb | 57 +++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index ae95f7677b..e3266e8a4e 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,2 +1,59 @@ class MerchantsController < ApplicationController + + def show + @merchant = Merchant.find(params[:id]) + + if @merchant.nil? + head :not_found + return + end + end + + + def create + auth_hash = request.env["omniauth.auth"] + + merchant = Merchant.find_by(uid: auth_hash[:uid], provider: "github") + if merchant + # User was found in the database + flash[:success] = "Logged in as returning user #{merchant.username}" + else + # User doesn't match anything in the DB + # Attempt to create a new user + merchant = Merchant.build_from_github(auth_hash) + + if merchant.save + flash[:success] = "Logged in as new merchant #{merchant.username}" + else + # Couldn't save the user for some reason. If we + # hit this it probably means there's a bug with the + # way we've configured GitHub. Our strategy will + # be to display error messages to make future + # debugging easier. + flash[:error] = "Could not create new user account: #{merchant.errors.messages}" + return redirect_to root_path + end + end + + # If we get here, we have a valid user instance + session[:merchant_id] = merchant.id + return redirect_to root_path + end + + # def current + # unless @current_user + # flash[:error] = "You must be logged in to see this page" + # redirect_to root_path + # return + # end + # end + + # def destroy + # session[:user_id] = nil + # flash[:success] = "Successfully logged out!" + + # redirect_to root_path + # end + + end From da85aef4e2c693b1642628fb858fffc01fccdabe Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:37:17 -0700 Subject: [PATCH 064/367] added helper method to merchant model --- app/models/merchant.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 8072af0c40..c0c974d747 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -5,5 +5,18 @@ class Merchant < ApplicationRecord validates :username, presence: true, uniqueness: true validates :email, presence: true, uniqueness: true + # helper method + def self.build_from_github(auth_hash) + merchant = Merchant.new + merchant.uid = auth_hash[:uid] + merchant.provider = "github" + merchant.username = auth_hash["info"]["name"] + merchant.email = auth_hash["info"]["email"] + + # Note that the merchant has not been saved. + # We'll choose to do the saving outside of this method + return merchant + end + end From 9f3ebaa17a8c29d7e021e45fc679e8449998099b Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:37:28 -0700 Subject: [PATCH 065/367] minor edits --- config/routes.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 65d0d54bd6..276453046b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,9 +1,12 @@ Rails.application.routes.draw do - + +resources :merchants # to be changed later + # Omniauth Login route get "/auth/github", as: "github_login" # Omniauth Github callback route get "/auth/:provider/callback", to: "merchants#create", as: "omniauth_callback" + end From 6c3cdb05191501ed776b388b03bdf48df858a987 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:44:02 -0700 Subject: [PATCH 066/367] added .env to gitignore files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4255b81bb7..30eb88e062 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ coverage # Ignore application configuration /config/application.yml +.env From 8d00c61fc167e8ca14dba186b6440e353dd77244 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:48:01 -0700 Subject: [PATCH 067/367] removed keys --- .env | 2 -- 1 file changed, 2 deletions(-) diff --git a/.env b/.env index 93da3f94d6..e69de29bb2 100644 --- a/.env +++ b/.env @@ -1,2 +0,0 @@ -GOOGLE_KEY_ID: "231af1ec696ee750bcfb81bb1fc63b953ba645a4" -GOOGLE_KEY: "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC+bw3A8Ff0b9Yz\nbLMepBVFvQTfRZ6Ln2ZVN1w7yDpqXLOz3Pj0D/rGmhwCdU7QY0btH1BcxhAknFDU\nOQ1KnnETB2LxwZoBtyACdggqtb2eDqraMybsri7lhbklTXzzG6+f47Lnw+8bzgP5\nbupUqh3BAGICKJaPfHU3Edxq22u0rLE5NicuDetzp+sDRKBUgphvsxskjGDO2rbd\ncfBRLVeCaZOVQ69w2nYcYGmlqALInnontw2kRDbBVCIERWTIB4s0Pa8u2bNC5vC9\n58qlxZV91NkEuYL3wccP+1+zatsrYseeCLFUnmGFqq7n9CgDrWjLzVdlNT5Zln/Q\nkI2JYNhRAgMBAAECggEAUTlq411gFolREpQNfkc8L4ekuVqneiQd8MDxHSqVB+LM\nXy4kHW1naCg5RC8m06lUijUuALQWFJd7vlkrOyWDUzt2T2llN9AU3hfb+eOUogLd\nir4AnzjYFdvIkYmQftzTNt5W45XlubVQaqaNWllI4ZY5N3R6a28JS9jZa9Z1BRVa\n4OYCKx9NcLoPCghhxExiNj1+Hu2dQt3CQdL6eQcKHgC2HTOHOu7sKIgzMgzi4oL8\nFHwLVePuNfeg4lzMWDS9mQI7OecnhSg2RcYqOCuRKm22qt1COnx3yhniF2KyPWeV\nBw11uNUJCRYFSCO1easl0dCnejfu4ad/sUb07YhdZQKBgQDnLRCt39sbZGdlQPek\nlAMAKdB/h9M4ivlOJlJX7U9Haluplq8IlP89RmplMFK6GMzf+lwiWeTAr+UJ+zZ3\nhi1R5yaMzIuYwY3OOxPivZRfO5i/BbShbNK6/qprY73Jq+s7zPrnvE0VksT3PiVk\noKJCL1h+t7TxXUBaslTW6x6B3wKBgQDS4gBRe/nl+ZaX+6ekfslnzUrVmSdrrwNn\nPEqEZcuNgaHKeP4rQU9Plv6xWFi6X5gHOExQOVYOBbsw5BI1RwtcCmR94fVK1JSk\nG/oRe3e6LIWPD37Sbxh1SAV2Fw16//MM0qI+lF0J6rfw9KrIuQGTdQHxzyBeCsaK\ncAmrwIbLzwKBgFgNICc59niue3tjjW+QOLxdMN8CWv9UX7TWf9KhvuqSpisoC68X\nIUizg17bUwcy3wYIlAM5fhmuZWyx1IMeBjEF+/bxCdK7FkoQ0ngwgUzspDdN8wjx\nLCqxSTPyH52q78QtRPvzCuFGr+MENrXnQSY4ZlqNmku8mwBwoEPj9hC9AoGBANLJ\nSe4o0LHZ13gU+A2JGYHjBrEYQ/nz1qAC+Kz8HwlTkMeURuIvhroUQII9v3qTAJ/+\n2vC5TtX3TpNg9P5CBA286ZOWHxvr/qNGv59n3VW/GMTVhTuMBlN8aNEP286dNXEU\nvU11+MVn0vJLbMXzfqrIoufz0/OMK8XGlTQS3emrAoGAFw6l+5kMi773RVyMBHuP\nwiRRryJAZ8adgmNVa9TKAViBaYtH8uOvPpsD7puceg2CKdErNYYsEIT+ehSl9tzb\nF5yiPq1CNteouVzzNPHmahDvH2dsZJ0xPawMUIUwrlSbgapdjpmfv3KLVjHCRQ8u\nPdj8F7fP25f59yCA6+Q7fgo=\n-----END PRIVATE KEY-----\n" \ No newline at end of file From 059774b11bf1815ecd32ebd7a29dc7c42540beba Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:51:46 -0700 Subject: [PATCH 068/367] Removed .env --- .env | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index e69de29bb2..0000000000 From 77bf18cbbf7330c5921a84f212d502751b46d63f Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 10 Jun 2020 18:58:45 -0700 Subject: [PATCH 069/367] added uid and provider table to merchants --- db/schema.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index 5aac015069..b9615d779e 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_06_10_204945) do +ActiveRecord::Schema.define(version: 2020_06_11_001518) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -55,6 +55,8 @@ t.string "username" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.integer "uid" + t.string "provider" end create_table "order_items", force: :cascade do |t| From f4b602647e168ee78b8aacdc17d2fad06b257710 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Wed, 10 Jun 2020 20:15:52 -0700 Subject: [PATCH 070/367] Finished Order model tests. Added shopping cart by session in application controller. --- app/controllers/application_controller.rb | 20 +++ app/controllers/orders_controller.rb | 58 +++----- app/models/order.rb | 18 +-- test/controllers/orders_controller_test.rb | 150 ++++++++++----------- test/models/order_test.rb | 19 +-- 5 files changed, 135 insertions(+), 130 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 09705d12ab..8660262a26 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,2 +1,22 @@ class ApplicationController < ActionController::Base + + protect_from_forgery with: :exception + + before_action :find_order + + def render_404 + raise ActionController::RoutingError.new("Not Found") + end + + private + + def find_order + if session[:order_id] + @shopping_cart = Order.find_by(id: session[:order_id]) + else + @shopping_cart = Order.create(status: "pending") + session[:order_id] = @shopping_cart.id + end + end + end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 4b944a5b01..fcd3da93a2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -6,82 +6,68 @@ def index @orders = Order.all.order(:status) end - def new - @order = Order.new(status: "pending") - end - - def create - @order = Order.new(order_params) - if @order.save - flash[:status] = :success - flash[:result_text] = "Successfully created order #{@order.id}" - redirect_to order_path(@order) - else - flash.now[:status] = :failure - flash.now[:result_text] = "Could not create order" - flash.now[:messages] = @order.errors.messages - render :new, status: :bad_request - end - end - def show - @orderitems = @order.orderitems + @order = Order.find_by(id: params[:id]) end def edit end def update - if @order.update(order_params) + if @shopping_cart.update(order_params) flash[:status] = :success - flash[:result_text] = "Successfully updated order #{@order.id}" - redirect_to order_path(@order) + flash[:result_text] = "Successfully updated order #{@shopping_cart.id}" + redirect_back fallback_location: order_path(@shopping_cart) else flash.now[:status] = :failure flash.now[:result_text] = "Could not update order" - flash.now[:messages] = @order.errors.messages + flash.now[:messages] = @shopping_cart.errors.messages render :edit, status: :not_found end end def destroy - @order.destroy + @shopping_cart.destroy + session[:order_id] = nil flash[:status] = :success - flash[:result_text] = "Successfully destroyed order #{@order.id}" + flash[:result_text] = "Successfully destroyed order #{@shopping_cart.id}" redirect_to root_path end def pay - if @order.process_payment + if @shopping_cart.process_payment! + session[:order_id] = nil # the user went to checkout flash[:status] = :success - flash[:result_text] = "Successfully paid order #{@order.id}" + flash[:result_text] = "Successfully paid order #{@shopping_cart.id}" else flash[:status] = :failure flash[:result_text] = "Payment processing failed!" end - redirect_to order_path(@order) + redirect_to order_path(@shopping_cart) end def complete - if @order.complete_order + order = Order.find_by(id: params[:id]) + if order.complete_order! flash[:status] = :success - flash[:result_text] = "Successfully completed order #{@order.id}" + flash[:result_text] = "Successfully completed order #{order.id}" else flash[:status] = :failure flash[:result_text] = "Failed to complete the order." end - redirect_to order_path(@order) + redirect_back fallback_location: order_path(order) end def cancel - if @order.cancel_order + order = Order.find_by(id: params[:id]) + if order.cancel_order! flash[:status] = :success - flash[:result_text] = "Successfully cancelled order #{@order.id}" + flash[:result_text] = "Successfully cancelled order #{order.id}" else flash[:status] = :failure flash[:result_text] = "Failed to cancel order." end - redirect_to order_path(@order) + redirect_back fallback_location: order_path(order) end private @@ -95,8 +81,8 @@ def order_params end def get_order - @order = Order.find_by(id: params[:id]) - render_404 unless @order + @shopping_cart = Order.find_by(id: params[:id]) + render_404 unless @shopping_cart end end \ No newline at end of file diff --git a/app/models/order.rb b/app/models/order.rb index e531e72ba4..160bcc2f71 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,27 +1,29 @@ class Order < ApplicationRecord - has_many :orderitems, dependent: :destroy + has_many :order_items, dependent: :destroy - VALID_STATUS = %w(pending paid complete cancelled) + VALID_STATUS = %w(pending paid complete cancelled) # ask the instructor when does it go from paid to complete validates :status, presence: true, inclusion: {in: VALID_STATUS} - def process_payment + def process_payment! # TODO implement payment - return false unless self.status == "pending" + return false if self.status != "pending" return false if self.credit_card_num.nil? || self.credit_card_exp.empty? || self.credit_card_cvv.nil? || self.customer_email.empty? self.status = "paid" return self.save end - def complete_order - return false unless self.status == "paid" + def complete_order! + return false if self.status != "paid" self.status = "complete" return self.save end - def cancel_order + def cancel_order! + return false if self.status != "paid" # add a test here! self.status = "cancelled" return self.save end - + # ability to clear the cart, removes the items, erase my cart, the order is a session, always one and only one + # add a total_cost method that returns the total cost for the order, loop thru the order items, find the price of each, multiply and add, and retiurn end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 03891785f7..1a4e204bbe 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -2,13 +2,14 @@ describe OrdersController do - # Arrange - let(:existing_order) { orders(:album) } + let(:existing_order) { Order.new(status: "pending") } valid_statuses = %w(pending paid complete cancelled) invalid_statuses = ["parrot", "parakeet", "incomplete", "nope", 2021, nil] describe "index" do it "succeeds when there are orders" do + # Arrange + existing_order.save! # Act get orders_path @@ -18,6 +19,7 @@ end it "succeeds when there are no orders" do + # Arrange Order.all do |order| order.destroy end @@ -32,7 +34,6 @@ describe "new" do it "succeeds" do - # Act get new_order_path @@ -43,45 +44,38 @@ describe "create" do it "creates a order with valid data for a real status" do - new_order = { order: { title: "Dirty Computer", status: "album" } } + # Arrange + new_order = { order: { status: "pending" } } + # Act & Assert expect { post orders_path, params: new_order }.must_change "Order.count", 1 + new_order_id = Order.last.id - new_order_id = Order.find_by(title: "Dirty Computer").id - - # Assert must_respond_with :redirect must_redirect_to order_path(new_order_id) end - it "renders bad_request and does not update the DB for bogus data" do - bad_order = { order: { title: nil, status: "book" } } - - expect { - post orders_path, params: bad_order - }.wont_change "Order.count" - - # Assert - must_respond_with :bad_request - end - it "renders 400 bad_request for bogus statuses" do invalid_statuses.each do |status| - invalid_order = { order: { title: "Invalid Order", status: status } } + # Arrange + invalid_order = { order: { status: status } } - # Assert - expect { post orders_path, params: invalid_order }.wont_change "Order.count" + # Assert + expect { + post orders_path, params: invalid_order + }.wont_change "Order.count" - expect(Order.find_by(title: "Invalid Order", status: status)).must_be_nil must_respond_with :bad_request end end end # describe "create" describe "show" do - it "succeeds for an extant order ID" do + it "succeeds for an existing order ID" do + # Arrange + existing_order.save! # Act get order_path(existing_order.id) @@ -103,7 +97,7 @@ end # describe "show" describe "edit" do - it "succeeds for an extant order ID" do + it "succeeds for an existing order ID" do # Act get edit_order_path(existing_order.id) @@ -113,11 +107,11 @@ end it "renders 404 not_found for a bogus order ID" do - bogus_id = existing_order.id + destroyed_id = existing_order.id existing_order.destroy # Act - get edit_order_path(bogus_id) + get edit_order_path(destroyed_id) # Assert must_respond_with :not_found @@ -126,84 +120,86 @@ describe "update" do it "succeeds for valid data and an extant order ID" do - updates = { order: { title: "Dirty Computer" } } + # Arrange + updates = { order: {customer_email: "ada@gmail.com" } } - # Assert + # Act & Assert expect { put order_path(existing_order), params: updates }.wont_change "Order.count" - updated_order = Order.find_by(id: existing_order.id) + existing_order.reload - expect(updated_order.title).must_equal "Dirty Computer" + expect(updated_order.customer_email).must_equal "ada@gmail.com" must_respond_with :redirect must_redirect_to order_path(existing_order.id) end it "renders bad_request for bogus data" do - updates = { order: { title: nil } } + # Arrange + updates = { order: { status: nil } } + # Act & Assert expect { put order_path(existing_order), params: updates }.wont_change "Order.count" - order = Order.find_by(id: existing_order.id) + existing_order.reload - # Assert - must_respond_with :not_found + expect(existing_order.status).must_equal "pending" end - it "renders 404 not_found for a bogus order ID" do - bogus_id = existing_order.id - existing_order.destroy +# it "renders 404 not_found for a bogus order ID" do +# bogus_id = existing_order.id +# existing_order.destroy - # Act - put order_path(bogus_id), params: { order: { title: "Test Title" } } +# # Act +# put order_path(bogus_id), params: { order: { title: "Test Title" } } - # Assert - must_respond_with :not_found - end - end # describe "update" +# # Assert +# must_respond_with :not_found +# end +# end # describe "update" - describe "destroy" do - it "succeeds for an extant order ID" do - expect { - delete order_path(existing_order.id) - }.must_change "Order.count", -1 +# describe "destroy" do +# it "succeeds for an extant order ID" do +# expect { +# delete order_path(existing_order.id) +# }.must_change "Order.count", -1 - # Assert - must_respond_with :redirect - must_redirect_to root_path - end +# # Assert +# must_respond_with :redirect +# must_redirect_to root_path +# end - it "renders 404 not_found and does not update the DB for a bogus order ID" do - bogus_id = existing_order.id - existing_order.destroy +# it "renders 404 not_found and does not update the DB for a bogus order ID" do +# bogus_id = existing_order.id +# existing_order.destroy - expect { - delete order_path(bogus_id) - }.wont_change "Order.count" +# expect { +# delete order_path(bogus_id) +# }.wont_change "Order.count" - # Assert - must_respond_with :not_found - end - end # describe "destroy" +# # Assert +# must_respond_with :not_found +# end +# end # describe "destroy" - describe "upvote" do - it "redirects to the order page if no user is logged in" do - skip - end +# describe "upvote" do +# it "redirects to the order page if no user is logged in" do +# skip +# end - it "redirects to the order page after the user has logged out" do - skip - end +# it "redirects to the order page after the user has logged out" do +# skip +# end - it "succeeds for a logged-in user and a fresh user-vote pair" do - skip - end +# it "succeeds for a logged-in user and a fresh user-vote pair" do +# skip +# end - it "redirects to the order page if the user has already voted for that order" do - skip - end - end # describe "upvote" +# it "redirects to the order page if the user has already voted for that order" do +# skip +# end +# end # describe "upvote" -end +# end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index c75b2dd115..61022b8ca2 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -11,9 +11,9 @@ new_order.save! # Assert - expect(new_order).must_respond_to :orderitems + expect(new_order).must_respond_to :order_items - new_order.orderitems.each do |orderitem| + new_order.order_items.each do |orderitem| expect(orderitem).must_be_kind_of OrderItem end end @@ -54,7 +54,7 @@ new_order.save! # Act - result = new_order.process_payment + result = new_order.process_payment! new_order.reload # Assert @@ -72,7 +72,7 @@ new_order.save! # Act - result = new_order.process_payment + result = new_order.process_payment! new_order.reload # Assert @@ -89,7 +89,7 @@ new_order.save! # Act - result = new_order.process_payment + result = new_order.process_payment! new_order.reload # Assert @@ -106,7 +106,7 @@ new_order.save! # Act - result = new_order.process_payment + result = new_order.process_payment! new_order.reload # Assert @@ -122,7 +122,7 @@ new_order.save! # Act - result = new_order.complete_order + result = new_order.complete_order! new_order.reload # Assert @@ -135,7 +135,7 @@ new_order.save! # Act - result = new_order.process_payment + result = new_order.complete_order! new_order.reload # Assert @@ -147,10 +147,11 @@ describe "cancel_order" do it "cancels an order" do # Arrange + new_order.status = "paid" new_order.save! # Act - result = new_order.cancel_order + result = new_order.cancel_order! new_order.reload # Assert From c5612641dc2a2ba65cff61fc0e5a4296e4dae6ea Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Wed, 10 Jun 2020 20:54:19 -0700 Subject: [PATCH 071/367] Added routes for orders, products, merchants, reviews and categories as documented on Google doc. --- config/routes.rb | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index aee458f363..b9f4fc0dc1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,13 +1,25 @@ Rails.application.routes.draw do root 'homepages#index' -resources :merchants # to be changed later + resources :orders, except: [:new, :create] + post "/orders/:id/pay", to: "orders#pay", as: "order_pay" + post "/orders/:id/complete", to: "orders#complete", as: "order_complete" + post "/orders/:id/cancel", to: "orders#cancel", as: "order_cancel" - # Omniauth Login route - get "/auth/github", as: "github_login" + resources :products + post "/products/:id/deactivate", to: "products#deactivate", as: "product_deactivate" - # Omniauth Github callback route - get "/auth/:provider/callback", to: "merchants#create", as: "omniauth_callback" - + resources :merchants, only: [:show, :create] + post "/merchants/:id/deactivate", to: "merchants#deactivate", as: "merchant_deactivate" + get "/merchants/:id/dashboard", to: "merchants#dashboard", as: "merchant_dashboard" + + # Omniauth Login route + get "/auth/github", as: "github_login" + # Omniauth Github callback route + get "/auth/:provider/callback", to: "merchants#create", as: "omniauth_callback" + + resources :reviews, only: [:new, :create] + + resources :categories, except: [:edit, :update, :destroy] end From 7190f0cadafdf4ba74738921e877f17e9bf25829 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 10 Jun 2020 21:18:42 -0700 Subject: [PATCH 072/367] minor edits to seed data --- Gemfile.lock | 3 --- db/seed_data/merchants.csv | 6 +++--- db/seeds.rb | 4 +++- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 128ea0e2b0..7fffa0404f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -105,8 +105,6 @@ GEM faraday (1.0.1) multipart-post (>= 1.2, < 3) ffi (1.13.1) - figaro (1.2.0) - thor (>= 0.14.0, < 2) formatador (0.2.5) globalid (0.4.2) activesupport (>= 4.2.0) @@ -346,7 +344,6 @@ DEPENDENCIES byebug capybara (>= 2.15) debase (>= 0.2.4.1) - figaro dotenv-rails google-cloud-storage (~> 1.11) guard diff --git a/db/seed_data/merchants.csv b/db/seed_data/merchants.csv index 080d3195bb..5f0045e762 100644 --- a/db/seed_data/merchants.csv +++ b/db/seed_data/merchants.csv @@ -1,3 +1,3 @@ -id,email,username -1,joe.com,Joe -2,bob.com,Bob \ No newline at end of file +id,email,username,uid,provider +1,joe.com,Joe,1234,github +2,bob.com,Bob,2234,github \ No newline at end of file diff --git a/db/seeds.rb b/db/seeds.rb index 1427fa8aea..3ca42d8494 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -2,7 +2,7 @@ # Merchant seeds MERCHANT_FILE = Rails.root.join('db', 'seed_data', 'merchants.csv') -puts "Loading raw product data from #{MERCHANT_FILE}" +puts "Loading raw merchant data from #{MERCHANT_FILE}" merchant_failures = [] CSV.foreach(MERCHANT_FILE, :headers => true) do |row| @@ -10,6 +10,8 @@ merchant.id = row['id'] merchant.email = row['email'] merchant.username = row['username'] + merchant.uid = row['uid'] + merchant.provider = row['provider'] successful = merchant.save if !successful From 0edb135991ad58360b17b894b0e514419a3e2d04 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 10 Jun 2020 21:23:38 -0700 Subject: [PATCH 073/367] fixed db seeding --- app/models/product.rb | 2 +- db/seed_data/merchants.csv | 6 +++--- db/seed_data/products.csv | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index eab5449e6b..360d0a345c 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -2,7 +2,7 @@ class Product < ApplicationRecord belongs_to :merchant has_and_belongs_to_many :categories has_many :reviews - has_one_attached :photo + # has_one_attached :photo validates :name, presence: true, uniqueness: { scope: :merchant_id, message: "Merchant already has product of this name %{value} ." } diff --git a/db/seed_data/merchants.csv b/db/seed_data/merchants.csv index 5f0045e762..080d3195bb 100644 --- a/db/seed_data/merchants.csv +++ b/db/seed_data/merchants.csv @@ -1,3 +1,3 @@ -id,email,username,uid,provider -1,joe.com,Joe,1234,github -2,bob.com,Bob,2234,github \ No newline at end of file +id,email,username +1,joe.com,Joe +2,bob.com,Bob \ No newline at end of file diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv index 5bef87e9bd..ba051fb89e 100644 --- a/db/seed_data/products.csv +++ b/db/seed_data/products.csv @@ -1,3 +1,3 @@ id,name,description,photo,stock,active,price,merchant_id -1,Rose,A rose is a woody perennial flowering plant of the genus Rosa in the family Rosaceae.,nil,5,true,100,1 -2,Aloe Vera,Aloe vera is a succulent plant species of the genus Aloe.,nil,5,true,20,1 +1,Rose,A rose is a woody perennial flowering plant of the genus Rosa in the family Rosaceae.,link_here,5,true,100,1 +2,Aloe Vera,Aloe vera is a succulent plant species of the genus Aloe.,link_here,5,true,20,1 From c9faca4814f2dbda43e7fabb64787317d01e7dbf Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Wed, 10 Jun 2020 21:50:24 -0700 Subject: [PATCH 074/367] Added order controller tests, partially completed --- app/controllers/orders_controller.rb | 6 +- app/views/orders/index.html.erb | 22 ++++ config/routes.rb | 6 +- test/controllers/orders_controller_test.rb | 140 ++++----------------- 4 files changed, 55 insertions(+), 119 deletions(-) create mode 100644 app/views/orders/index.html.erb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index fcd3da93a2..71ed5f1c77 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -16,11 +16,11 @@ def edit def update if @shopping_cart.update(order_params) flash[:status] = :success - flash[:result_text] = "Successfully updated order #{@shopping_cart.id}" + flash[:result_text] = "Successfully updated shopping cart." redirect_back fallback_location: order_path(@shopping_cart) else flash.now[:status] = :failure - flash.now[:result_text] = "Could not update order" + flash.now[:result_text] = "Could not update shopping cart." flash.now[:messages] = @shopping_cart.errors.messages render :edit, status: :not_found end @@ -30,7 +30,7 @@ def destroy @shopping_cart.destroy session[:order_id] = nil flash[:status] = :success - flash[:result_text] = "Successfully destroyed order #{@shopping_cart.id}" + flash[:result_text] = "Successfully emptied shopping cart." redirect_to root_path end diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb new file mode 100644 index 0000000000..cdfb4882a0 --- /dev/null +++ b/app/views/orders/index.html.erb @@ -0,0 +1,22 @@ +

List of Works

+ + + + + + + + + + + <% @orders.each do |order| %> + + + + + + <% end %> + +
IdStatusEmail
<%= link_to order.id, order_path(order) %><%= order.status %><%= order.customer_email %>
+ +<%= link_to "Main Menu", root_path %> diff --git a/config/routes.rb b/config/routes.rb index b9f4fc0dc1..a1e1e34f9d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,7 +1,11 @@ Rails.application.routes.draw do root 'homepages#index' - resources :orders, except: [:new, :create] + resources :orders, only: [:index, :show] + # Edit only the shopping cart + get "/orders/edit", to: "orders#edit", as: "order_edit" + post "/orders", to: "orders#update" + delete "/orders", to: "orders#destroy" post "/orders/:id/pay", to: "orders#pay", as: "order_pay" post "/orders/:id/complete", to: "orders#complete", as: "order_complete" post "/orders/:id/cancel", to: "orders#cancel", as: "order_cancel" diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 1a4e204bbe..5e561d5c9b 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -32,46 +32,6 @@ end end # describe "index" - describe "new" do - it "succeeds" do - # Act - get new_order_path - - # Assert - must_respond_with :success - end - end # describe "new" - - describe "create" do - it "creates a order with valid data for a real status" do - # Arrange - new_order = { order: { status: "pending" } } - - # Act & Assert - expect { - post orders_path, params: new_order - }.must_change "Order.count", 1 - new_order_id = Order.last.id - - must_respond_with :redirect - must_redirect_to order_path(new_order_id) - end - - it "renders 400 bad_request for bogus statuses" do - invalid_statuses.each do |status| - # Arrange - invalid_order = { order: { status: status } } - - # Assert - expect { - post orders_path, params: invalid_order - }.wont_change "Order.count" - - must_respond_with :bad_request - end - end - end # describe "create" - describe "show" do it "succeeds for an existing order ID" do # Arrange @@ -97,39 +57,27 @@ end # describe "show" describe "edit" do - it "succeeds for an existing order ID" do + it "edits the shopping cart" do # Act - get edit_order_path(existing_order.id) + get edit_order_path # Assert must_respond_with :success end - - it "renders 404 not_found for a bogus order ID" do - destroyed_id = existing_order.id - existing_order.destroy - - # Act - get edit_order_path(destroyed_id) - - # Assert - must_respond_with :not_found - end end # describe "edit" describe "update" do - it "succeeds for valid data and an extant order ID" do + it "updates the shopping cart" do # Arrange updates = { order: {customer_email: "ada@gmail.com" } } # Act & Assert expect { - put order_path(existing_order), params: updates + put orders_path, params: updates }.wont_change "Order.count" - existing_order.reload - expect(updated_order.customer_email).must_equal "ada@gmail.com" + expect(@shopping_cart.customer_email).must_equal "ada@gmail.com" must_respond_with :redirect must_redirect_to order_path(existing_order.id) end @@ -140,66 +88,28 @@ # Act & Assert expect { - put order_path(existing_order), params: updates + put orders_path, params: updates }.wont_change "Order.count" - existing_order.reload - expect(existing_order.status).must_equal "pending" end + end # describe "update" + + describe "destroy" do + it "empties the shopping cart" do + # Arrange + updates = { order: {customer_email: "ada@gmail.com" } } + put orders_path, params: updates + old_cart_id = @shopping_cart.id + + # Act + delete orders_path + + # Assert + expect(@shopping_cart.id).wont_equal old_cart_id + must_respond_with :redirect + must_redirect_to root_path + end + end # describe "destroy" -# it "renders 404 not_found for a bogus order ID" do -# bogus_id = existing_order.id -# existing_order.destroy - -# # Act -# put order_path(bogus_id), params: { order: { title: "Test Title" } } - -# # Assert -# must_respond_with :not_found -# end -# end # describe "update" - -# describe "destroy" do -# it "succeeds for an extant order ID" do -# expect { -# delete order_path(existing_order.id) -# }.must_change "Order.count", -1 - -# # Assert -# must_respond_with :redirect -# must_redirect_to root_path -# end - -# it "renders 404 not_found and does not update the DB for a bogus order ID" do -# bogus_id = existing_order.id -# existing_order.destroy - -# expect { -# delete order_path(bogus_id) -# }.wont_change "Order.count" - -# # Assert -# must_respond_with :not_found -# end -# end # describe "destroy" - -# describe "upvote" do -# it "redirects to the order page if no user is logged in" do -# skip -# end - -# it "redirects to the order page after the user has logged out" do -# skip -# end - -# it "succeeds for a logged-in user and a fresh user-vote pair" do -# skip -# end - -# it "redirects to the order page if the user has already voted for that order" do -# skip -# end -# end # describe "upvote" - -# end + end From f436aa1f0621683724dcccfdae46f1550af99863 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 11 Jun 2020 00:53:45 -0700 Subject: [PATCH 075/367] generated Categories controller --- app/assets/stylesheets/categories.scss | 3 +++ app/controllers/categories_controller.rb | 2 ++ test/controllers/categories_controller_test.rb | 7 +++++++ 3 files changed, 12 insertions(+) create mode 100644 app/assets/stylesheets/categories.scss create mode 100644 app/controllers/categories_controller.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..f7fd23eef5 --- /dev/null +++ b/app/assets/stylesheets/categories.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Category 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..d7d9784c3e --- /dev/null +++ b/app/controllers/categories_controller.rb @@ -0,0 +1,2 @@ +class CategoryController < ApplicationController +end 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 5265746c674c80c085da8ae2205323775c7b4681 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 11 Jun 2020 00:54:32 -0700 Subject: [PATCH 076/367] generated products controller --- app/controllers/products_controller.rb | 74 ++++++++++++++++++++ app/views/products/_form.html.erb | 17 +++++ app/views/products/edit.html.erb | 6 ++ app/views/products/index.html.erb | 25 +++++++ app/views/products/new.html.erb | 5 ++ app/views/products/show.html.erb | 4 ++ test/controllers/products_controller_test.rb | 46 ++++++++++++ 7 files changed, 177 insertions(+) create mode 100644 app/controllers/products_controller.rb create mode 100644 app/views/products/_form.html.erb 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 test/controllers/products_controller_test.rb diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb new file mode 100644 index 0000000000..cc196a38f7 --- /dev/null +++ b/app/controllers/products_controller.rb @@ -0,0 +1,74 @@ +class ProductsController < ApplicationController + before_action :set_product, only: [:show, :edit, :update, :destroy] + + # GET /products + # GET /products.json + def index + @products = Product.all + end + + # GET /products/1 + # GET /products/1.json + def show + end + + # GET /products/new + def new + @product = Product.new + end + + # GET /products/1/edit + def edit + end + + # POST /products + # POST /products.json + def create + @product = Product.new(product_params) + + respond_to do |format| + if @product.save + format.html { redirect_to @product, notice: 'Product was successfully created.' } + format.json { render :show, status: :created, location: @product } + else + format.html { render :new } + format.json { render json: @product.errors, status: :unprocessable_entity } + end + end + end + + # PATCH/PUT /products/1 + # PATCH/PUT /products/1.json + def update + respond_to do |format| + if @product.update(product_params) + format.html { redirect_to @product, notice: 'Product was successfully updated.' } + format.json { render :show, status: :ok, location: @product } + else + format.html { render :edit } + format.json { render json: @product.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /products/1 + # DELETE /products/1.json + def destroy + @product.destroy + respond_to do |format| + format.html { redirect_to products_url, notice: 'Product was successfully destroyed.' } + format.json { head :no_content } + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_product + @product = Product.find(params[:id]) + end + + # Only allow a list of trusted parameters through. + def product_params + params.fetch(:product, {}) + end +end diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb new file mode 100644 index 0000000000..0f4ce4ef88 --- /dev/null +++ b/app/views/products/_form.html.erb @@ -0,0 +1,17 @@ +<%= form_with(model: product, local: true) do |form| %> + <% if product.errors.any? %> +
+

<%= pluralize(product.errors.count, "error") %> prohibited this product from being saved:

+ +
    + <% product.errors.full_messages.each do |message| %> +
  • <%= message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb new file mode 100644 index 0000000000..fc16e133a0 --- /dev/null +++ b/app/views/products/edit.html.erb @@ -0,0 +1,6 @@ +

Editing Product

+ +<%= render 'form', product: @product %> + +<%= link_to 'Show', @product %> | +<%= link_to 'Back', products_path %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb new file mode 100644 index 0000000000..db5f937870 --- /dev/null +++ b/app/views/products/index.html.erb @@ -0,0 +1,25 @@ +

<%= notice %>

+ +

Products

+ + + + + + + + + + <% @products.each do |product| %> + + + + + + <% end %> + +
<%= link_to 'Show', product %><%= link_to 'Edit', edit_product_path(product) %><%= link_to 'Destroy', product, method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to 'New Product', new_product_path %> diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb new file mode 100644 index 0000000000..a06963dc59 --- /dev/null +++ b/app/views/products/new.html.erb @@ -0,0 +1,5 @@ +

New Product

+ +<%= render 'form', product: @product %> + +<%= link_to 'Back', products_path %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb new file mode 100644 index 0000000000..332e362386 --- /dev/null +++ b/app/views/products/show.html.erb @@ -0,0 +1,4 @@ +

<%= notice %>

+ +<%= link_to 'Edit', edit_product_path(@product) %> | +<%= link_to 'Back', products_path %> diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb new file mode 100644 index 0000000000..70f9e0ec69 --- /dev/null +++ b/test/controllers/products_controller_test.rb @@ -0,0 +1,46 @@ +require "test_helper" + +describe ProductsController do + let(:product) { products(:one) } + + it "should get index" do + get products_url + must_respond_with :success + end + + it "should get new" do + get new_product_url + must_respond_with :success + end + + it "should create product" do + assert_difference("Product.count") do + post products_url, params: { product: { } } + end + + must_redirect_to product_url(Product.last) + end + + it "should show product" do + get product_url(@product) + must_respond_with :success + end + + it "should get edit" do + get edit_product_url(@product) + must_respond_with :success + end + + it "should update product" do + patch product_url(@product), params: { product: { } } + must_redirect_to product_url(product) + end + + it "should destroy product" do + assert_difference("Product.count", -1) do + delete product_url(@product) + end + + must_redirect_to products_url + end +end From 134bbd8c33614b40d1840f195cd3524da040371c Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 11 Jun 2020 12:41:37 -0700 Subject: [PATCH 077/367] helper files for categories and products --- app/helpers/categories_helper.rb | 2 ++ app/helpers/products_helper.rb | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 app/helpers/categories_helper.rb create mode 100644 app/helpers/products_helper.rb diff --git a/app/helpers/categories_helper.rb b/app/helpers/categories_helper.rb new file mode 100644 index 0000000000..ac5cb5bf58 --- /dev/null +++ b/app/helpers/categories_helper.rb @@ -0,0 +1,2 @@ +module CategoryHelper +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 From 51fdab31e8b13aa40b6857e637177a0f2da4b44c Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 11 Jun 2020 13:00:52 -0700 Subject: [PATCH 078/367] removed active storage --- .gitignore | 3 --- Gemfile | 3 +-- app/controllers/products_controller.rb | 2 -- app/models/product.rb | 1 - app/views/layouts/_header.html.erb | 10 ++++--- app/views/products/_form.html.erb | 27 +++++++++++++++++++ config/environments/development.rb | 2 +- config/environments/production.rb | 2 +- config/storage.yml | 16 ++++------- .../20200611194742_drop_active_storage.rb | 6 +++++ db/schema.rb | 24 +---------------- 11 files changed, 48 insertions(+), 48 deletions(-) create mode 100644 db/migrate/20200611194742_drop_active_storage.rb diff --git a/.gitignore b/.gitignore index 30eb88e062..1b09a7f21c 100644 --- a/.gitignore +++ b/.gitignore @@ -36,7 +36,4 @@ config/secrets/* yarn-debug.log* .yarn-integrity coverage - -# Ignore application configuration -/config/application.yml .env diff --git a/Gemfile b/Gemfile index 83656f8e79..cc678b12b7 100644 --- a/Gemfile +++ b/Gemfile @@ -80,5 +80,4 @@ group :test do end gem "omniauth" -gem "omniauth-github" -gem "google-cloud-storage", "~> 1.11", require: false \ No newline at end of file +gem "omniauth-github" \ No newline at end of file diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index cc196a38f7..3c551814c5 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -29,10 +29,8 @@ def create respond_to do |format| if @product.save format.html { redirect_to @product, notice: 'Product was successfully created.' } - format.json { render :show, status: :created, location: @product } else format.html { render :new } - format.json { render json: @product.errors, status: :unprocessable_entity } end end end diff --git a/app/models/product.rb b/app/models/product.rb index 360d0a345c..0e8d9827ec 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -2,7 +2,6 @@ class Product < ApplicationRecord belongs_to :merchant has_and_belongs_to_many :categories has_many :reviews - # has_one_attached :photo validates :name, presence: true, uniqueness: { scope: :merchant_id, message: "Merchant already has product of this name %{value} ." } diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 9fc74022e1..bfb122f0fb 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -1,7 +1,9 @@
    -
  • Homepage
  • -
  • Merchant Login
  • -
  • View all products
  • -
  • Create product
  • +
  • <%= link_to 'Home', root_path %>
  • +
  • <%= link_to 'All Products', products_path %>
  • +
  • <%= link_to 'Categories', categories_path %>
  • +
  • <%= link_to 'Merchant Login' %>
  • +
  • <%= link_to 'New Product', new_product_path %>
  • +
diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index 0f4ce4ef88..05091d9b6c 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -11,6 +11,33 @@ <% end %> + +

Please enter folliwng data for a new product

+
+ <%= form.label :name, class: 'control-label' %> + <%= form.text_field :name, class: 'form-control', placeholder: "Product Name" %> +
+ +
+ <%= form.label :description, class: 'control-label' %> + <%= form.text_area :description, class: 'form-control', placeholder: "Description of Product" %> +
+ +
+ <%= form.label :photo, class: 'control-label' %> + <%= form.text_field :photo, class: 'form-control', placeholder: 'Image URL' %> +
+ +
+ <%= form.label :price, class: 'control-label' %> + <%= form.text_field :price, class: 'form-control', placeholder: "Price" %> +
+ +
+ <%= form.label :stock, class: 'control-label' %> + <%= form.text_field :stock, class: 'form-control', placeholder: "Number of products in stock" %> +
+
<%= form.submit %>
diff --git a/config/environments/development.rb b/config/environments/development.rb index 5b052fd4f6..66df51f6fc 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -29,7 +29,7 @@ end # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :google_dev + config.active_storage.service = :local # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false diff --git a/config/environments/production.rb b/config/environments/production.rb index 24b7557cdb..cd0d255545 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -36,7 +36,7 @@ # 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 = :google + config.active_storage.service = :local # Mount Action Cable outside main process or domain. # config.action_cable.mount_path = nil diff --git a/config/storage.yml b/config/storage.yml index e0c339e05b..d32f76e8fb 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -15,17 +15,11 @@ local: # bucket: your_own_bucket # Remember not to checkin your GCS keyfile to a repository -google: - service: GCS - project: bEtsy - credentials: <%= ENV['GOOGLE_APPLICATION_CREDENTIALS'].as_json %> - bucket: betsy_product_images - -google_dev: - service: GCS - project: bEtsy - credentials: <%= Rails.root.join("config/secrets/product-pic.json") %> - bucket: betsy_product_images +# 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: diff --git a/db/migrate/20200611194742_drop_active_storage.rb b/db/migrate/20200611194742_drop_active_storage.rb new file mode 100644 index 0000000000..aa4f0ea11c --- /dev/null +++ b/db/migrate/20200611194742_drop_active_storage.rb @@ -0,0 +1,6 @@ +class DropActiveStorage < ActiveRecord::Migration[6.0] + def change + drop_table :active_storage_attachments + drop_table :active_storage_blobs + end +end diff --git a/db/schema.rb b/db/schema.rb index b9615d779e..e9252041e3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,32 +10,11 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_06_11_001518) do +ActiveRecord::Schema.define(version: 2020_06_11_194742) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" - create_table "active_storage_attachments", force: :cascade do |t| - t.string "name", null: false - t.string "record_type", null: false - t.bigint "record_id", null: false - t.bigint "blob_id", null: false - t.datetime "created_at", null: false - t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" - t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true - end - - create_table "active_storage_blobs", force: :cascade do |t| - t.string "key", null: false - t.string "filename", null: false - t.string "content_type" - t.text "metadata" - t.bigint "byte_size", null: false - t.string "checksum", null: false - t.datetime "created_at", null: false - t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true - end - create_table "categories", force: :cascade do |t| t.string "name" t.string "description" @@ -104,7 +83,6 @@ t.index ["product_id"], name: "index_reviews_on_product_id" end - add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "products", "merchants" add_foreign_key "reviews", "products" end From da2fe65645859bb49259f7fef3ea71df5e27f165 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 11 Jun 2020 13:03:53 -0700 Subject: [PATCH 079/367] fixed categories naming --- app/controllers/categories_controller.rb | 2 +- app/helpers/categories_helper.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index d7d9784c3e..a14959525a 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,2 +1,2 @@ -class CategoryController < ApplicationController +class CategoriesController < ApplicationController end diff --git a/app/helpers/categories_helper.rb b/app/helpers/categories_helper.rb index ac5cb5bf58..e06f31554c 100644 --- a/app/helpers/categories_helper.rb +++ b/app/helpers/categories_helper.rb @@ -1,2 +1,2 @@ -module CategoryHelper +module CategoriesHelper end From de69254276e9707888e528f3fe5a9e83038ed56b Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 11 Jun 2020 13:05:07 -0700 Subject: [PATCH 080/367] setting up landing page views --- app/controllers/homepages_controller.rb | 2 +- app/views/homepages/index.html.erb | 1 - app/views/homepages/landing.html.erb | 2 ++ app/views/layouts/application.html.erb | 11 ++++++++++- config/routes.rb | 2 +- 5 files changed, 14 insertions(+), 4 deletions(-) delete mode 100644 app/views/homepages/index.html.erb create mode 100644 app/views/homepages/landing.html.erb diff --git a/app/controllers/homepages_controller.rb b/app/controllers/homepages_controller.rb index f200c8ac2e..39d5b5964d 100644 --- a/app/controllers/homepages_controller.rb +++ b/app/controllers/homepages_controller.rb @@ -1,4 +1,4 @@ class HomepagesController < ApplicationController - def index + def landing end end diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb deleted file mode 100644 index 7515126340..0000000000 --- a/app/views/homepages/index.html.erb +++ /dev/null @@ -1 +0,0 @@ -

Homepage

\ No newline at end of file diff --git a/app/views/homepages/landing.html.erb b/app/views/homepages/landing.html.erb new file mode 100644 index 0000000000..962cfa1e2c --- /dev/null +++ b/app/views/homepages/landing.html.erb @@ -0,0 +1,2 @@ +

Homepage

+

testing

\ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 97c8058d72..171c1eb01d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,7 +10,16 @@ - <%= render 'layouts/header' %> + + + <% flash.each do |name, message| %> + + <% end %> + + <%= render 'layouts/header' unless action_name == "landing" %> <%= yield %> + diff --git a/config/routes.rb b/config/routes.rb index a1e1e34f9d..215aa86487 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Rails.application.routes.draw do - root 'homepages#index' + root 'homepages#landing' resources :orders, only: [:index, :show] # Edit only the shopping cart From 16ef980f4209a8d44f474be53b51fd1d010f01f9 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 11 Jun 2020 13:22:54 -0700 Subject: [PATCH 081/367] renamed homepages to pages --- app/assets/stylesheets/{homepages.scss => pages.scss} | 0 app/controllers/homepages_controller.rb | 4 ---- app/controllers/pages_controller.rb | 4 ++++ app/helpers/homepages_helper.rb | 2 -- app/helpers/pages_helper.rb | 2 ++ app/views/homepages/landing.html.erb | 2 -- app/views/pages/landing.html.erb | 2 ++ ...{homepages_controller_test.rb => pages_controller_test.rb} | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) rename app/assets/stylesheets/{homepages.scss => pages.scss} (100%) delete mode 100644 app/controllers/homepages_controller.rb create mode 100644 app/controllers/pages_controller.rb delete mode 100644 app/helpers/homepages_helper.rb create mode 100644 app/helpers/pages_helper.rb delete mode 100644 app/views/homepages/landing.html.erb create mode 100644 app/views/pages/landing.html.erb rename test/controllers/{homepages_controller_test.rb => pages_controller_test.rb} (73%) diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/pages.scss similarity index 100% rename from app/assets/stylesheets/homepages.scss rename to app/assets/stylesheets/pages.scss diff --git a/app/controllers/homepages_controller.rb b/app/controllers/homepages_controller.rb deleted file mode 100644 index 39d5b5964d..0000000000 --- a/app/controllers/homepages_controller.rb +++ /dev/null @@ -1,4 +0,0 @@ -class HomepagesController < ApplicationController - def landing - end -end diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb new file mode 100644 index 0000000000..260f970ac9 --- /dev/null +++ b/app/controllers/pages_controller.rb @@ -0,0 +1,4 @@ +class PagesController < ApplicationController + def landing + end +end diff --git a/app/helpers/homepages_helper.rb b/app/helpers/homepages_helper.rb deleted file mode 100644 index 4bd8098f37..0000000000 --- a/app/helpers/homepages_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module HomepagesHelper -end diff --git a/app/helpers/pages_helper.rb b/app/helpers/pages_helper.rb new file mode 100644 index 0000000000..2c057fd054 --- /dev/null +++ b/app/helpers/pages_helper.rb @@ -0,0 +1,2 @@ +module PagesHelper +end diff --git a/app/views/homepages/landing.html.erb b/app/views/homepages/landing.html.erb deleted file mode 100644 index 962cfa1e2c..0000000000 --- a/app/views/homepages/landing.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

Homepage

-

testing

\ No newline at end of file diff --git a/app/views/pages/landing.html.erb b/app/views/pages/landing.html.erb new file mode 100644 index 0000000000..b009aa3579 --- /dev/null +++ b/app/views/pages/landing.html.erb @@ -0,0 +1,2 @@ +

Welcome to Evergreenery

+Browse all plants \ No newline at end of file diff --git a/test/controllers/homepages_controller_test.rb b/test/controllers/pages_controller_test.rb similarity index 73% rename from test/controllers/homepages_controller_test.rb rename to test/controllers/pages_controller_test.rb index cef86edeae..3120874cc7 100644 --- a/test/controllers/homepages_controller_test.rb +++ b/test/controllers/pages_controller_test.rb @@ -1,6 +1,6 @@ require "test_helper" -describe HomepagesController do +describe PagesController do # it "does a thing" do # value(1+1).must_equal 2 # end From f3c10e620dabfbd80d94d71305f2995803663cff Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 11 Jun 2020 13:23:12 -0700 Subject: [PATCH 082/367] rerouted landing page --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 215aa86487..2c699ab1b0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Rails.application.routes.draw do - root 'homepages#landing' + root 'pages#landing' resources :orders, only: [:index, :show] # Edit only the shopping cart From 2b64c4487dab7e176a3c8ecca02626e38bbed479 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 11 Jun 2020 13:37:33 -0700 Subject: [PATCH 083/367] Seed data for categories --- .vscode/settings.json | 11 ++++++ Gemfile.lock | 46 -------------------------- app/controllers/products_controller.rb | 16 +-------- app/views/products/_form.html.erb | 5 +++ db/seeds.rb | 20 +++++++++++ 5 files changed, 37 insertions(+), 61 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..64c597d52b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "spellright.language": [ + "en" + ], + "spellright.documentTypes": [ + "markdown", + "latex", + "plaintext", + "javascript" + ] +} \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 7fffa0404f..287a5b43f5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -92,9 +92,6 @@ GEM debase-ruby_core_source (>= 0.10.2) debase-ruby_core_source (0.10.9) debug_inspector (0.0.3) - declarative (0.0.10) - declarative-option (0.1.0) - digest-crc (0.5.1) docile (1.3.2) dotenv (2.7.5) dotenv-rails (2.7.5) @@ -108,34 +105,6 @@ GEM formatador (0.2.5) globalid (0.4.2) activesupport (>= 4.2.0) - google-api-client (0.40.1) - addressable (~> 2.5, >= 2.5.1) - googleauth (~> 0.9) - httpclient (>= 2.8.1, < 3.0) - mini_mime (~> 1.0) - representable (~> 3.0) - retriable (>= 2.0, < 4.0) - signet (~> 0.12) - google-cloud-core (1.5.0) - google-cloud-env (~> 1.0) - google-cloud-errors (~> 1.0) - google-cloud-env (1.3.2) - faraday (>= 0.17.3, < 2.0) - google-cloud-errors (1.0.1) - google-cloud-storage (1.26.2) - addressable (~> 2.5) - digest-crc (~> 0.4) - google-api-client (~> 0.33) - google-cloud-core (~> 1.2) - googleauth (~> 0.9) - mini_mime (~> 1.0) - googleauth (0.12.0) - faraday (>= 0.17.3, < 2.0) - jwt (>= 1.4, < 3.0) - memoist (~> 0.16) - multi_json (~> 1.11) - os (>= 0.9, < 2.0) - signet (~> 0.14) guard (2.16.2) formatador (>= 0.2.4) listen (>= 2.7, < 4.0) @@ -150,7 +119,6 @@ GEM guard-compat (~> 1.2) minitest (>= 3.0) hashie (4.1.0) - httpclient (2.8.3) i18n (1.8.3) concurrent-ruby (~> 1.0) jbuilder (2.10.0) @@ -174,7 +142,6 @@ GEM mini_mime (>= 0.1.1) marcel (0.3.3) mimemagic (~> 0.3.2) - memoist (0.16.2) method_source (1.0.0) mimemagic (0.3.5) mini_mime (1.0.2) @@ -214,7 +181,6 @@ GEM omniauth-oauth2 (1.6.0) oauth2 (~> 1.1) omniauth (~> 1.9) - os (1.1.0) pg (1.2.3) popper_js (1.16.0) pry (0.13.1) @@ -261,11 +227,6 @@ GEM rb-inotify (0.10.1) ffi (~> 1.0) regexp_parser (1.7.1) - representable (3.0.4) - declarative (< 0.1.0) - declarative-option (< 0.2.0) - uber (< 0.2.0) - retriable (3.1.2) ruby-debug-ide (0.7.2) rake (>= 0.8.1) ruby-progressbar (1.10.1) @@ -284,11 +245,6 @@ GEM childprocess (>= 0.5, < 4.0) rubyzip (>= 1.2.2) shellany (0.0.1) - signet (0.14.0) - addressable (~> 2.3) - faraday (>= 0.17.3, < 2.0) - jwt (>= 1.5, < 3.0) - multi_json (~> 1.10) simplecov (0.18.5) docile (~> 1.1) simplecov-html (~> 0.11) @@ -312,7 +268,6 @@ GEM turbolinks-source (5.2.0) tzinfo (1.2.7) thread_safe (~> 0.1) - uber (0.1.0) web-console (4.0.2) actionview (>= 6.0.0) activemodel (>= 6.0.0) @@ -345,7 +300,6 @@ DEPENDENCIES capybara (>= 2.15) debase (>= 0.2.4.1) dotenv-rails - google-cloud-storage (~> 1.11) guard guard-minitest jbuilder (~> 2.7) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 3c551814c5..0b12c40be7 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -21,18 +21,9 @@ def new def edit end - # POST /products - # POST /products.json def create @product = Product.new(product_params) - respond_to do |format| - if @product.save - format.html { redirect_to @product, notice: 'Product was successfully created.' } - else - format.html { render :new } - end - end end # PATCH/PUT /products/1 @@ -60,13 +51,8 @@ def destroy end private - # Use callbacks to share common setup or constraints between actions. - def set_product - @product = Product.find(params[:id]) - end - # Only allow a list of trusted parameters through. def product_params - params.fetch(:product, {}) + return params.require(:product).permit(:name, :description, :photo, :stock, :price, category_ids: []) end end diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index 05091d9b6c..f2f1dfed2c 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -38,6 +38,11 @@ <%= form.text_field :stock, class: 'form-control', placeholder: "Number of products in stock" %> +
+ <%= form.label :categories %> + <%= collection_check_boxes(:product, :category_ids, Category.all, :id, :name) %> +
+
<%= form.submit %>
diff --git a/db/seeds.rb b/db/seeds.rb index 3ca42d8494..72069e7f8e 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -95,6 +95,26 @@ puts "Added #{OrderItem.count} order item records" puts "#{order_item_failures.length} order items failed to save" +# Category seeds +CATEGORY_FILE = Rails.root.join('db', 'seed_data', 'categories.csv') +puts "Loading raw category data from #{CATEGORY_FILE}" + +category_failures = [] +CSV.foreach(CATEGORY_FILE, :headers => true) do |row| + category = Category.new + category.id = row['id'] + category.name = row['name'] + category.description = row['description'] + + successful = category.save + if !successful + category_failures << category + end +end + +puts "Added #{Category.count} category records" +puts "#{category_failures.length} categories failed to save" + # reloading postgres for the latest ID puts "Manually resetting PK sequence on each table" ActiveRecord::Base.connection.tables.each do |t| From 22bca547ba20184fe033743b71e3045cf58196f1 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 11 Jun 2020 13:40:51 -0700 Subject: [PATCH 084/367] initial styling of landing --- app/assets/stylesheets/landing.scss | 19 +++++++++++++++++++ app/views/layouts/application.html.erb | 1 - app/views/pages/landing.html.erb | 4 +++- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 app/assets/stylesheets/landing.scss diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss new file mode 100644 index 0000000000..2c1217f848 --- /dev/null +++ b/app/assets/stylesheets/landing.scss @@ -0,0 +1,19 @@ +.landing { + width: 100vw; + height: 100vh; + background-image: url(https://i.imgur.com/I6Kl9oY.jpg); + background-size: cover; + padding: 20px; + text-align: center; + margin: 0 auto; + + h1 { + margin: 0 auto; + } + + .browse { + margin-top: 40vh; + } + + +} diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 171c1eb01d..712a38a36f 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -11,7 +11,6 @@ - <% flash.each do |name, message| %> - - <%= link_to 'New Product', new_product_path %> From f17d39b55489baa5cf1dca950c3c211c751d519e Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Mon, 15 Jun 2020 21:29:21 -0700 Subject: [PATCH 188/367] Add/update/remove item added to OrderItem model. Multiple checks/validation on items. Checkout updates stock. --- app/controllers/order_items_controller.rb | 14 +++--- app/models/order.rb | 13 ++++++ app/models/order_item.rb | 43 ++++++++++++++++++- .../order_items_controller_test.rb | 32 ++++++++++++-- 4 files changed, 91 insertions(+), 11 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 8339dce7dd..d3281e09b2 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,18 +1,18 @@ class OrderItemsController < ApplicationController def create - @order_item = OrderItem.new(order_id: session[:order_id], product_id: params[:id], quantity: 1) - if @order_item.save - flash[:success] = "Saved to shopping cart" + message = OrderItem.add_item(@shopping_cart.id, params[:id], 1) + if message.nil? + flash[:success] = "Product added to shopping cart" else - flash[:warning] = 'Unable to save to shopping cart' - flash[:details] = @order_item.errors.full_messages + flash[:warning] = "Unable to add product to shopping cart" + flash[:details] = [message] end - redirect_back fallback_location: products_path(@order_item) + redirect_back fallback_location: cart_path end def destroy @order_item = OrderItem.find_by(id: params[:id]) - @order_item.destroy + @order_item.remove_item redirect_to cart_path end end diff --git a/app/models/order.rb b/app/models/order.rb index 3c4ed3e3d9..bcd8fcdf78 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -16,7 +16,20 @@ def checkout_order! self.credit_card_exp.nil? || self.credit_card_cvv.nil? || self.customer_email.nil? || self.address.nil? || self.city.nil? || self.state.nil? || self.zip.nil? + # checking if stock is still available + self.order_items.each do |item| + return false if item.quantity > item.product.stock + end + # begin transaction + self.order_items.each do |item| + item.product.stock -= item.quantity + item.product.save + puts "debugging ------> " + p item.product + end self.status = "paid" + result = self.save + # end transaction return self.save end diff --git a/app/models/order_item.rb b/app/models/order_item.rb index f0e442a421..c5bdb9c13a 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -2,11 +2,52 @@ class OrderItem < ApplicationRecord belongs_to :order belongs_to :product - validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 } + validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 } def subtotal return 0 if !self.product return self.quantity * self.product.price end + def self.add_item(order_id, product_id, quantity) # TODO add test for this method + order = Order.find_by(id: order_id) + return "Order not found" if !order + product = Product.find_by(id: product_id) + return "Product not found" if !product + order_item = OrderItem.find_by(order_id: order_id, product_id: product_id) + if !order_item + return "Quantity not available in stock" if quantity > product.stock + order_item = OrderItem.new(order_id: order_id, product_id: product_id, quantity: quantity) + else + return "Quantity not available in stock" if quantity + order_item.quantity > product.stock + order_item.quantity += quantity + end + if order_item.save + return nil + else + return "Error saving the order item" + end + end + + def update_item(quantity) # TODO add test for this method + return "Order cannot be changed" if self.order.status != "pending" + return "Product not found" if !self.product + return "Quantity not available in stock" if quantity > self.product.stock + self.quantity = quantity + if self.save + return nil + else + return "Error updating the order item" + end + end + + def remove_item # TODO add test for this method + return "Order cannot be changed" if self.order.status != "pending" + if self.destroy + return nil + else + return "Error removing the order item" + end + end + end diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 17457ab944..5d1dac2eaa 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -1,7 +1,33 @@ require "test_helper" describe OrderItemsController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + it "Can add a good product" do + + end + + it "Can't add a product w/o enough stock" do + + end + + + it "Can't add a retired product" do + + end + + + it "Can't add to an order that's not in pending status" do + + end + + it "updates quantity if product already in cart" do + + end + + it "can't add a bad product ID" do + + end + + it "can't add quantity above stock" do + + end end From ee7b61c05e45e52529504cff8c1f4fb807f744e8 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 00:29:51 -0700 Subject: [PATCH 189/367] refactored Order methods to work via Merchant instead --- app/controllers/merchants_controller.rb | 2 -- app/controllers/orders_controller.rb | 16 +++++++++------- app/models/merchant.rb | 7 +++++++ app/models/order.rb | 13 ++++++++----- app/views/merchants/manage_orders.html.erb | 7 ++++--- app/views/merchants/manage_products.html.erb | 8 ++++---- 6 files changed, 32 insertions(+), 21 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 63924f3ab5..68a733ae1b 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -27,11 +27,9 @@ def dashboard end def manage_orders - @merchant = Merchant.find(session[:merchant_id]) end def manage_products - @merchant_id = session[:merchant_id] end def logout diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index c567b99efe..1d7afc2305 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -3,14 +3,16 @@ class OrdersController < ApplicationController before_action :require_login, only: [:index, :show] before_action :find_order, only: [:show, :complete, :cancel, :confirmation] - def index - # List orders for a Merchant (Merchant only) - @orders = Order.by_merchant(current_merchant) - end + # TODO: remove index route because we can get orders from Merchant model + # def index + # # List orders for a Merchant (Merchant only) + # @orders = Order.by_merchant(current_merchant) + # end - def show - # Shows any orders from the Merchant (Merchant only) - end + # TODO: remove show route because we can get orders from Merchant model + # def show + # # Shows any orders from the Merchant (Merchant only) + # end def edit # Shows cart, updates credit card/address/email and confirms checkout (User) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 69563e94e7..1ef31a9a52 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -19,6 +19,13 @@ def self.build_from_github(auth_hash) return merchant end + + + + #returns all products belonging to this merchant + # def self.all_products + # return self.products.where(merchant_id: self.id) + # end end diff --git a/app/models/order.rb b/app/models/order.rb index 3c4ed3e3d9..dbde1f23b5 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,6 +1,7 @@ class Order < ApplicationRecord has_many :order_items, dependent: :destroy + belongs_to :merchant VALID_STATUS = %w(pending paid complete cancelled) validates :status, presence: true, inclusion: {in: VALID_STATUS} @@ -40,10 +41,12 @@ def total_cost return total end - def self.by_merchant(merchant_id) # TODO move to merchant - merchant = Merchant.find_by(id: merchant_id) - return [] if merchant.nil? - return merchant.orders - end + # TODO: move to merchant / remove because merchant.orders + # already returns all orders belonging to the merchant + # def self.by_merchant(merchant_id) + # merchant = Merchant.find_by(id: merchant_id) + # return [] if merchant.nil? + # return merchant.orders + # end end diff --git a/app/views/merchants/manage_orders.html.erb b/app/views/merchants/manage_orders.html.erb index 0635aa1b8e..886cde5939 100644 --- a/app/views/merchants/manage_orders.html.erb +++ b/app/views/merchants/manage_orders.html.erb @@ -1,6 +1,6 @@

manage orders

-
+

Manage Orders

@@ -13,8 +13,9 @@ +

<%= @current_merchant.username %>

- <% @merchant.orders.uniq.each do |order| %> + <% @current_merchant.orders.uniq.each do |order| %> @@ -25,7 +26,7 @@ <% end %> - <% end %> + <% end %>
<%= link_to order.id, orders_path(order) %> <%= order.time_submitted %><%= button_to "Complete Order", order_complete_path(order) %>
\ No newline at end of file diff --git a/app/views/merchants/manage_products.html.erb b/app/views/merchants/manage_products.html.erb index 1eb1536df8..9f7b66380d 100644 --- a/app/views/merchants/manage_products.html.erb +++ b/app/views/merchants/manage_products.html.erb @@ -1,8 +1,8 @@

manage products

-

Merchant ID: <%= @merchant_id %>

+

Merchant ID: <%= @current_merchant.id %>

    -<% Product.where(merchant_id: @merchant_id).each do |product| %> -
  • <%= product.name %>
  • +<% @current_merchant.products.each do |product| %> +
  • <%= product.name %>
  • <% end %> -
\ No newline at end of file + From 2855ebe3ecc5fd02cb08a45c051d0da595507cde Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 00:41:06 -0700 Subject: [PATCH 190/367] minor clean up of comments on Merchant and Order models --- app/models/merchant.rb | 7 ------- app/models/order.rb | 1 - 2 files changed, 8 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 1ef31a9a52..69563e94e7 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -19,13 +19,6 @@ def self.build_from_github(auth_hash) return merchant end - - - - #returns all products belonging to this merchant - # def self.all_products - # return self.products.where(merchant_id: self.id) - # end end diff --git a/app/models/order.rb b/app/models/order.rb index e7d2942f59..69ee12d966 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,7 +1,6 @@ class Order < ApplicationRecord has_many :order_items, dependent: :destroy - belongs_to :merchant VALID_STATUS = %w(pending paid complete cancelled) validates :status, presence: true, inclusion: {in: VALID_STATUS} From 7741e6b0f6b7c58c036bfd68a70fe6ebfe0919e2 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 00:41:39 -0700 Subject: [PATCH 191/367] refactor orders view to use Merchant methods --- app/views/merchants/manage_orders.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/merchants/manage_orders.html.erb b/app/views/merchants/manage_orders.html.erb index 886cde5939..05a8d91d00 100644 --- a/app/views/merchants/manage_orders.html.erb +++ b/app/views/merchants/manage_orders.html.erb @@ -19,7 +19,7 @@ <%= link_to order.id, orders_path(order) %> <%= order.time_submitted %> - <%= OrderItem.where(order_id: order.id).count%> + <%= order.order_items.count %> <%= order.total_cost %> <%= order.status %> <% if order.status == 'paid' %> From 4f78a35405bf908eb422baffb1fb268b3f6efe6c Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Tue, 16 Jun 2020 08:38:13 -0700 Subject: [PATCH 192/367] Changes to Index ans Show Orders controlletr --- app/controllers/orders_controller.rb | 2 +- app/models/order.rb | 2 - config/routes.rb | 3 +- test/controllers/orders_controller_test.rb | 106 ++++++++++----------- 4 files changed, 56 insertions(+), 57 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 1d7afc2305..9751d1bb54 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,6 +1,6 @@ class OrdersController < ApplicationController - before_action :require_login, only: [:index, :show] + # before_action :require_login, only: [:index, :show] before_action :find_order, only: [:show, :complete, :cancel, :confirmation] # TODO: remove index route because we can get orders from Merchant model diff --git a/app/models/order.rb b/app/models/order.rb index 69ee12d966..17afa82250 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -24,8 +24,6 @@ def checkout_order! self.order_items.each do |item| item.product.stock -= item.quantity item.product.save - puts "debugging ------> " - p item.product end self.status = "paid" result = self.save diff --git a/config/routes.rb b/config/routes.rb index d9194ce9ae..043d8d3757 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,8 @@ Rails.application.routes.draw do root 'pages#landing' + resources :orders, only: [:index, :show] + # Index – List orders for a Merchant (Merchant only) # Show – Shows any orders from the Merchant (Merchant only) get "/cart", to: "orders#edit", as: "cart" @@ -12,7 +14,6 @@ post "/orders/:id/complete", to: "orders#complete", as: "order_complete" # Complete – Ships the order, changes status to “complete” (Merchant only) post "/orders/:id/cancel", to: "orders#cancel", as: "order_cancel" - resources :orders, only: [:index, :show, :update] # Cancel – Cancels the order, changes status to “cancelled” (Merchant only) get "/orders/:id/confirmation", to: "orders#confirmation", as: "order_confirmation" diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 2e08618f2c..3da01f488f 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -40,64 +40,64 @@ valid_statuses = %w(pending paid complete cancelled) invalid_statuses = ["parrot", "parakeet", "incomplete", "nope", 2021, nil] - describe "index" do - it "succeeds when there are orders" do - # Arrange - merchant = perform_login(merchants(:suely)) - # Act - get orders_path - # Assert - must_respond_with :success - end + # describe "index" do + # it "succeeds when there are orders" do + # # Arrange + # merchant = perform_login(merchants(:suely)) + # # Act + # get orders_path + # # Assert + # must_respond_with :success + # end - it "succeeds when there are no orders" do - # Arrange - merchant = perform_login(merchants(:suely)) - Order.all do |order| - order.destroy - end - # Act - get orders_path - # Assert - must_respond_with :success - end + # it "succeeds when there are no orders" do + # # Arrange + # merchant = perform_login(merchants(:suely)) + # Order.all do |order| + # order.destroy + # end + # # Act + # get orders_path + # # Assert + # must_respond_with :success + # end - it "fails if no merchant is logged in" do - # Act - get orders_path - # Assert - must_redirect_to root_path - end - end # describe "index" + # it "fails if no merchant is logged in" do + # # Act + # get orders_path + # # Assert + # must_redirect_to root_path + # end + # end # describe "index" - describe "show" do - it "succeeds for an existing order ID" do - # Arrange - merchant = perform_login(merchants(:suely)) - # Act - get order_path(pending_order.id) - # Assert - must_respond_with :success - end + # describe "show" do + # it "succeeds for an existing order ID" do + # # Arrange + # merchant = perform_login(merchants(:suely)) + # # Act + # get order_path(pending_order.id) + # # Assert + # must_respond_with :success + # end - it "redirects to order list if order not found" do - # Arrange - merchant = perform_login(merchants(:suely)) - destroyed_id = pending_order.id - pending_order.destroy - # Act - get order_path(destroyed_id) - # Assert - must_redirect_to orders_path - end + # it "redirects to order list if order not found" do + # # Arrange + # merchant = perform_login(merchants(:suely)) + # destroyed_id = pending_order.id + # pending_order.destroy + # # Act + # get order_path(destroyed_id) + # # Assert + # must_redirect_to orders_path + # end - it "redirects to root if merchant not logged in" do - # Act - get order_path(pending_order.id) - # Assert - must_redirect_to root_path - end - end # describe "show" + # it "redirects to root if merchant not logged in" do + # # Act + # get order_path(pending_order.id) + # # Assert + # must_redirect_to root_path + # end + # end # describe "show" describe "edit" do it "edits the shopping cart" do From 7657d875bbd5439eed4229886a58037a45b66825 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 11:49:28 -0700 Subject: [PATCH 193/367] updated new action test for review controller --- test/controllers/reviews_controller_test.rb | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index e8733633de..65ab4a4870 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -3,11 +3,24 @@ describe ReviewsController do let(:product) { products(:daisy) } - it "should get new" do - get new_review_url - must_respond_with :success + + describe "new" do + it "can get the review_path" do + get review_path + + must_respond_with :success + end + + it "can get the roduct_review_path" do + get product_review_path(Product.first.id) + + must_respond_with :success + end end + + + it "should create new review" do assert_difference("Review.count") do post reviews_url, params: { review: { rating: 5, comment: "I was happy with my daisies!", product_id: product.id } } From f2758d7e863a2a20d8d949410d15e324d96e1ae0 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 11:49:48 -0700 Subject: [PATCH 194/367] added routes for review --- config/routes.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index c9406f4497..143477610b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -23,7 +23,8 @@ resources :products post "/products/:id/deactivate", to: "products#deactivate", as: "product_deactivate" - post "/products/:product_id/reviews/new", to: "reviews#new", as: "new_review" + post "/products/:product_id/reviews/new", to: "products#show", as: "create_review" + get "/products/:product_id/reviews/new", to: "reviews#new", as: "new_review" resources :categories, except: [:edit, :update, :destroy] From c058f0ce1364bd72203b89b7d4bda360250ee8f3 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 11:50:58 -0700 Subject: [PATCH 195/367] minore edit to new form for review --- app/views/reviews/new.html.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index e8d3f8fb84..bf33b06120 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -1,3 +1,4 @@

Add Review

+<%# <%= render 'form', review: @review %> <%= render 'form', review: @review %> \ No newline at end of file From b33fc24b5b09c662ea7313c01cab6e3a8abc9ea3 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 11:51:50 -0700 Subject: [PATCH 196/367] merchant review logic, not complete --- app/controllers/reviews_controller.rb | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 140ac4ac1a..dcf6e64a08 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -13,13 +13,18 @@ def new def create + # if there is a merchant logged in - # and that merchant ID matchs the product id - # merchant can't review their own product + # if session[:merchant_id]? + + # # and that merchant ID matchs the product id + # if @product_id == session[:merchant_id] + # # merchant can't review their own product + # end + # end + @review = Review.new(review_params) - review = Review.new(review_params) - - if review.save + if @review.save flash[:success] = "Thank you! Your review has been successfully added" redirect_to product_path(review_params[:product_id]) return @@ -34,7 +39,7 @@ def create private def review_params - return params.require(:review).permit(:rating, :comment) + return params.permit(:rating, :comment) end end From bd4ef54d79d5f3b2d11d27fe8b598b4aeee20137 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 11:52:40 -0700 Subject: [PATCH 197/367] added rateyo for styling review to use stars --- Gemfile.lock | 2 -- app/javascript/packs/application.js | 2 +- app/javascript/rateyo/index.js | 7 +++++++ app/views/layouts/application.html.erb | 5 +++++ 4 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 app/javascript/rateyo/index.js diff --git a/Gemfile.lock b/Gemfile.lock index 0a56bc0ca1..287a5b43f5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -85,7 +85,6 @@ GEM regexp_parser (~> 1.5) xpath (~> 3.2) childprocess (3.0.0) - chronic (0.10.2) coderay (1.1.3) concurrent-ruby (1.1.6) crass (1.0.6) @@ -299,7 +298,6 @@ DEPENDENCIES bootstrap byebug capybara (>= 2.15) - chronic debase (>= 0.2.4.1) dotenv-rails guard diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 529f85b082..6e12c9ddbc 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -7,7 +7,7 @@ require("@rails/ujs").start() require("turbolinks").start() require("@rails/activestorage").start() require("channels") - +require("rateyo") import "bootstrap" diff --git a/app/javascript/rateyo/index.js b/app/javascript/rateyo/index.js new file mode 100644 index 0000000000..45ed748d36 --- /dev/null +++ b/app/javascript/rateyo/index.js @@ -0,0 +1,7 @@ +$(function () { + + $("#rateYo").rateYo({ + starWidth: "40px" + }); + +}); \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index c47391c012..5bce160251 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -4,6 +4,11 @@ <%= content_for?(:title) ? yield(:title) : "Evergreenery - 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' %> From 624f623a7db0b9bb04c0f64b0af24a46e01560b0 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 11:53:17 -0700 Subject: [PATCH 198/367] added button to add new review --- app/views/products/show.html.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 916b5d6a2e..7798f6db88 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -10,6 +10,7 @@

<%= @product.description %>

<%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary' %> <%= button_to 'Edit', edit_product_path(@product), method: :get, class: 'btn btn-info btn-sm' %> + <%= button_to 'Add Review', new_review_path(@product), method: :get, class: 'btn btn-info btn-sm' %> From d2871fe3f5694753970475ee29f5750b78fcda42 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 11:53:47 -0700 Subject: [PATCH 199/367] added form paritial for review view --- app/views/reviews/_form.html.erb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 app/views/reviews/_form.html.erb diff --git a/app/views/reviews/_form.html.erb b/app/views/reviews/_form.html.erb new file mode 100644 index 0000000000..65f20b6c8d --- /dev/null +++ b/app/views/reviews/_form.html.erb @@ -0,0 +1,26 @@ + + + +<%= form_with(model: review, local: true) do |form| %> +

Please enter your review

+
+ <%= form.label :rating, class: 'control-label' %> + <%= form.text_field :rating, class: 'form-control' %> +
+
+
+ <%= form.label :comment, class: 'control-label' %> + <%= form.text_area :comment, class: 'form-control' %> +
+ +
+ <%= form.submit %> +
+<% end %> + + + + + + + From 4d3114e88b5d09ffc8c74db05a9e0656381f6bb8 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 11:54:15 -0700 Subject: [PATCH 200/367] added new view for review --- app/views/reviews/_review.html.erb | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 app/views/reviews/_review.html.erb diff --git a/app/views/reviews/_review.html.erb b/app/views/reviews/_review.html.erb new file mode 100644 index 0000000000..59c4e12065 --- /dev/null +++ b/app/views/reviews/_review.html.erb @@ -0,0 +1,4 @@ + +
+

<%= review.comment %>

+ From 0d164f41a904769db92fb0a48ec1cecf315c08d1 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 11:54:47 -0700 Subject: [PATCH 201/367] minor edit for new action Review --- app/views/reviews/new.html.erb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index bf33b06120..e8d3f8fb84 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -1,4 +1,3 @@

Add Review

-<%# <%= render 'form', review: @review %> <%= render 'form', review: @review %> \ No newline at end of file From b6c07a9823d7b203028b676d0986418faaf2bb30 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 11:55:23 -0700 Subject: [PATCH 202/367] deleted form view for Review --- app/views/reviews/form.html.erb | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 app/views/reviews/form.html.erb diff --git a/app/views/reviews/form.html.erb b/app/views/reviews/form.html.erb deleted file mode 100644 index f1fc9465de..0000000000 --- a/app/views/reviews/form.html.erb +++ /dev/null @@ -1,24 +0,0 @@ -<% if @review.errors.any? %> -
    - <% @review.errors.each do |column, message| %> -
  • - <%= column.capitalize %> <%= message %> -
  • - <% end %> -
-<% end %> - -<%= form_with model: @review, class: 'create-review' do |f| %> -

Please fill in the following information to create your review about <%= "#{@product}"%>:

- - <%= f.label :rating %> - <%= f.text_field :rating %> - - - <%= f.label :comment %> - <%= f.text_field :comment %> - - - - <%= f.submit "Review", class: "book-button" %> -<% end %> \ No newline at end of file From 0a137db51289ae15a7b747206160968921673c54 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 11:59:41 -0700 Subject: [PATCH 203/367] fixed merge conflict in reviews controller --- app/controllers/reviews_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index dcf6e64a08..2e34aaabd0 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -39,7 +39,7 @@ def create private def review_params - return params.permit(:rating, :comment) + return params.require(:review).permit(:rating, :comment, :product_id) end end From c425064066b1115e613ce68145f86721420f0d60 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 12:19:49 -0700 Subject: [PATCH 204/367] updated review routes --- config/routes.rb | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 762634c68e..96d1b07364 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,11 +1,11 @@ Rails.application.routes.draw do - root 'pages#landing' + root "pages#landing" resources :orders, only: [:index, :show] # Index – List orders for a Merchant (Merchant only) # Show – Shows any orders from the Merchant (Merchant only) - get "/cart", to: "orders#edit", as: "cart" + get "/cart", to: "orders#edit", as: "cart" # Edit – Shows cart, updates credit card/address/email and confirms checkout (User) patch "/cart", to: "orders#update" # Update – Process checkout, change status to “paid” (User) @@ -21,16 +21,15 @@ post "/order_items/:id/create", to: "order_items#create", as: "create_order_items" - resources :products + resources :products do + resources :reviews, only: [:new, :create] + end + get "/products/:id/by_category", to: "products#by_category", as: "by_category" get "/products/:id/by_merchant", to: "products#by_merchant", as: "by_merchant" post "/products/:id/deactivate", to: "products#deactivate", as: "product_deactivate" - post "/products/:product_id/reviews/new", to: "products#show", as: "create_review" - get "/products/:product_id/reviews/new", to: "reviews#new", as: "new_review" - - resources :categories, except: [:edit, :update, :destroy] - resources :reviews, only: [:new, :create] + resources :categories, except: [:edit, :update, :destroy] resources :merchants, only: [:index, :show] do member do @@ -39,8 +38,8 @@ post "logout" end end - get 'merchants/:id/dashboard/manage_orders', to: 'merchants#manage_orders', as: "manage_orders" - get 'merchants/:id/dashboard/manage_products', to: 'merchants#manage_products', as: "manage_products" + get "merchants/:id/dashboard/manage_orders", to: "merchants#manage_orders", as: "manage_orders" + get "merchants/:id/dashboard/manage_products", to: "merchants#manage_products", as: "manage_products" # Omniauth Login route get "/auth/github", as: "github_login" From fde06708637042154f783edca53c9f963148b9c7 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 12:20:38 -0700 Subject: [PATCH 205/367] updated review path for Add Review --- 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 7798f6db88..29792bb24a 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -10,7 +10,7 @@

<%= @product.description %>

<%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary' %> <%= button_to 'Edit', edit_product_path(@product), method: :get, class: 'btn btn-info btn-sm' %> - <%= button_to 'Add Review', new_review_path(@product), method: :get, class: 'btn btn-info btn-sm' %> + <%= button_to 'Add Review', new_product_review_path(@product_id), method: :get, class: 'btn btn-info btn-sm' %> @@ -18,4 +18,4 @@ <%= link_to 'Edit', edit_product_path(@product) %> | -<%= link_to 'Back', products_path %> +<%= link_to 'Back', products_path %> \ No newline at end of file From e66f1ff7c78d6de8e05bd2ab8250f6aafa97e3fc Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 13:14:56 -0700 Subject: [PATCH 206/367] refactored reviews routing to be nested under product --- app/controllers/reviews_controller.rb | 12 +++-- app/models/review.rb | 2 +- config/routes.rb | 1 + test/controllers/reviews_controller_test.rb | 58 ++++++++++----------- 4 files changed, 38 insertions(+), 35 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 2e34aaabd0..243929d9fb 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -4,10 +4,10 @@ def new if params[:product_id] # Nested route: /product/:product_id/reviews/new product = Product.find_by(id: params[:product_id]) - @review = product.reviews.new - else - # Else, create a new one @review = Review.new + else + redirect_to root_path + flash[:danger] = "Something went wrong with the reviewing process." end end @@ -23,13 +23,15 @@ def create # end # end @review = Review.new(review_params) + @review.product_id = params[:product_id] if @review.save flash[:success] = "Thank you! Your review has been successfully added" - redirect_to product_path(review_params[:product_id]) + redirect_to product_path(params[:product_id]) return else - flash.now[:error] = "Your review hasn't been added." + flash.now[:danger] = request.params + flash[:details] = @review.errors.full_messages render :new, status: :bad_request return end diff --git a/app/models/review.rb b/app/models/review.rb index b1e2aef497..a55e131e88 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,6 +1,6 @@ class Review < ApplicationRecord belongs_to :product - validates :rating, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 5, message: "should be between 0 and 5" } + end diff --git a/config/routes.rb b/config/routes.rb index 96d1b07364..0c310fe1d7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -38,6 +38,7 @@ post "logout" end end + get "merchants/:id/dashboard/manage_orders", to: "merchants#manage_orders", as: "manage_orders" get "merchants/:id/dashboard/manage_products", to: "merchants#manage_products", as: "manage_products" diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 65ab4a4870..3a7297bda4 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -1,47 +1,47 @@ require "test_helper" describe ReviewsController do - let(:product) { products(:daisy) } + # let(:product) { products(:daisy) } - describe "new" do - it "can get the review_path" do - get review_path + # describe "new" do + # # it "can get the review_path" do + # # get review_path - must_respond_with :success - end + # # must_respond_with :success + # # end - it "can get the roduct_review_path" do - get product_review_path(Product.first.id) + # # it "can get the roduct_review_path" do + # # get product_review_path(Product.first.id) - must_respond_with :success - end - end + # # must_respond_with :success + # # end + # end - it "should create new review" do - assert_difference("Review.count") do - post reviews_url, params: { review: { rating: 5, comment: "I was happy with my daisies!", product_id: product.id } } - end + # it "should create new review" do + # # assert_difference("Review.count") do + # # post reviews_url, params: { review: { rating: 5, comment: "I was happy with my daisies!", product_id: product.id } } + # # end - must_redirect_to review_url(Review.last) - end + # # must_redirect_to review_url(Review.last) + # end - it "can't create with out rating" do - assert_no_difference("Review.count") do - post reviews_url, params: { review: { rating: nil, comment: "I wasn't happy with my daisies!", product_id: product.id } } - end + # it "can't create with out rating" do + # assert_no_difference("Review.count") do + # post reviews_url, params: { review: { rating: nil, comment: "I wasn't happy with my daisies!", product_id: product.id } } + # end - must_redirect_to review_path - end + # must_redirect_to review_path + # end - it "can't create when rating that is above 5" do - assert_no_difference("Review.count") do - post reviews_url, params: { review: { rating: 8, comment: "I was really happy with my daisies!", product_id: product.id } } - end + # it "can't create when rating that is above 5" do + # assert_no_difference("Review.count") do + # post reviews_url, params: { review: { rating: 8, comment: "I was really happy with my daisies!", product_id: product.id } } + # end - must_redirect_to review_path - end + # must_redirect_to review_path + # end end From 7672b41447b84f5a2b83b7207fbd636a34f96071 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 13:16:13 -0700 Subject: [PATCH 207/367] reviews are now being saved and posted correctly --- app/views/layouts/_alert.html.erb | 13 +++++++++++++ app/views/products/show.html.erb | 17 +++++++++++++++-- app/views/reviews/_form.html.erb | 26 -------------------------- app/views/reviews/_review.html.erb | 4 ---- app/views/reviews/new.html.erb | 20 +++++++++++++++++++- 5 files changed, 47 insertions(+), 33 deletions(-) delete mode 100644 app/views/reviews/_form.html.erb delete mode 100644 app/views/reviews/_review.html.erb diff --git a/app/views/layouts/_alert.html.erb b/app/views/layouts/_alert.html.erb index 581d4065b1..57095de310 100644 --- a/app/views/layouts/_alert.html.erb +++ b/app/views/layouts/_alert.html.erb @@ -13,6 +13,19 @@ <% end %> <% end %> + + <% if flash[:errors] %> +
    + <% flash[:errors].each do |error| %> +
  • <%= error %>
  • + + <% end %> +
+ <% end %> + + + + <% end %> \ No newline at end of file diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 29792bb24a..af9c653f59 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -10,12 +10,25 @@

<%= @product.description %>

<%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary' %> <%= button_to 'Edit', edit_product_path(@product), method: :get, class: 'btn btn-info btn-sm' %> - <%= button_to 'Add Review', new_product_review_path(@product_id), method: :get, class: 'btn btn-info btn-sm' %> + <%= link_to "add review", new_product_review_path(@product) %> + +
+ <% @product.reviews.each do |review| %> +

<%= review.rating %>

+

<%# rating_as_stars(review.rating) %>

+

<%= review.comment %> + <% end %> + +

+ <%= link_to 'Edit', edit_product_path(@product) %> | -<%= link_to 'Back', products_path %> \ No newline at end of file +<%= link_to 'Back', products_path %> + + + diff --git a/app/views/reviews/_form.html.erb b/app/views/reviews/_form.html.erb deleted file mode 100644 index 65f20b6c8d..0000000000 --- a/app/views/reviews/_form.html.erb +++ /dev/null @@ -1,26 +0,0 @@ - - - -<%= form_with(model: review, local: true) do |form| %> -

Please enter your review

-
- <%= form.label :rating, class: 'control-label' %> - <%= form.text_field :rating, class: 'form-control' %> -
-
-
- <%= form.label :comment, class: 'control-label' %> - <%= form.text_area :comment, class: 'form-control' %> -
- -
- <%= form.submit %> -
-<% end %> - - - - - - - diff --git a/app/views/reviews/_review.html.erb b/app/views/reviews/_review.html.erb deleted file mode 100644 index 59c4e12065..0000000000 --- a/app/views/reviews/_review.html.erb +++ /dev/null @@ -1,4 +0,0 @@ - -
-

<%= review.comment %>

- diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index e8d3f8fb84..3e475a2b32 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -1,3 +1,21 @@

Add Review

-<%= render 'form', review: @review %> \ No newline at end of file +
+<%= form_with(model: @review, url: product_reviews_path) do |form| %> +

Please enter your review for product: <%= params[:product_id] %>

+
+ <%= form.label :rating, class: 'control-label' %> + <%= form.text_field :rating, class: 'form-control' %> +
+
+
+ <%= form.label :comment, class: 'control-label' %> + <%= form.text_area :comment, class: 'form-control' %> +
+ +
+ <%# form.submit %> + <%= form.submit("#{action_name} review") %> +
+<% end %> +
\ No newline at end of file From 8dff931fb6d7a81aef4bed4e9e6120beef8e9b53 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 13:16:34 -0700 Subject: [PATCH 208/367] added scaffolding to support stars helper --- app/helpers/application_helper.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index de6be7945c..d853dedbbf 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,2 +1,19 @@ module ApplicationHelper + + +# ---------- + +# review.rating = 3 + + +# rating.times do +# +# end + + # rating_as_stars do + # return content_tag(:span, "✭") + # # for each number in the rating (0-5) + # # print a star within a span tag + # end + end From f35ca9b409c2a17a9d1b816b25fcaada6f738397 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 17:12:52 -0700 Subject: [PATCH 209/367] modified merchants controller test for dashboard --- test/controllers/merchants_controller_test.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 60a3174e58..20ce44df1a 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -81,21 +81,21 @@ get dashboard_merchant_url(@incorrect_id) must_respond_with :redirect must_redirect_to dashboard_merchant_url(@correct_id) - expect(flash[:warning]).must_equal "Tried to access a resource that isn't yours." + expect(flash[:warning]).must_equal "Tried to access a resource that isn't yours. Returning to your dashboard." end it "responds with redirect when retrieving merchant orders" do get manage_orders_url(@incorrect_id) must_respond_with :redirect must_redirect_to dashboard_merchant_url(@correct_id) - expect(flash[:warning]).must_equal "Tried to access a resource that isn't yours." + expect(flash[:warning]).must_equal "Tried to access a resource that isn't yours. Returning to your dashboard." end it "responds with redirect when retrieving merchant products" do get manage_products_url(@incorrect_id) must_respond_with :redirect must_redirect_to dashboard_merchant_url(@correct_id) - expect(flash[:warning]).must_equal "Tried to access a resource that isn't yours." + expect(flash[:warning]).must_equal "Tried to access a resource that isn't yours. Returning to your dashboard." end end From f4f3da771899334f2b08c5a99921f0822d6b7d47 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Tue, 16 Jun 2020 17:48:57 -0700 Subject: [PATCH 210/367] Added lots of tests to OrderItem model. --- app/models/order.rb | 14 +- app/models/order_item.rb | 43 +++--- test/models/order_item_test.rb | 259 +++++++++++++++++++++++++++++++-- 3 files changed, 270 insertions(+), 46 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index 69ee12d966..6f37600d23 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -8,7 +8,7 @@ class Order < ApplicationRecord validates :credit_card_num, presence: true, on: :update validates :credit_card_exp, presence: true, on: :update validates :credit_card_cvv, presence: true, on: :update - validates :customer_email, presence: true, on: :update + validates :customer_email, presence: true, on: :update def checkout_order! return false if self.status != "pending" @@ -24,8 +24,6 @@ def checkout_order! self.order_items.each do |item| item.product.stock -= item.quantity item.product.save - puts "debugging ------> " - p item.product end self.status = "paid" result = self.save @@ -53,12 +51,4 @@ def total_cost return total end - # TODO: move to merchant / remove because merchant.orders - # already returns all orders belonging to the merchant - # def self.by_merchant(merchant_id) - # merchant = Merchant.find_by(id: merchant_id) - # return [] if merchant.nil? - # return merchant.orders - # end - -end +end \ No newline at end of file diff --git a/app/models/order_item.rb b/app/models/order_item.rb index c5bdb9c13a..b14ed9c252 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -5,49 +5,48 @@ class OrderItem < ApplicationRecord validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 } def subtotal - return 0 if !self.product - return self.quantity * self.product.price + return self.product ? self.quantity * self.product.price : 0 end - def self.add_item(order_id, product_id, quantity) # TODO add test for this method + def self.add_item(order_id, product_id, quantity) order = Order.find_by(id: order_id) return "Order not found" if !order + return "Order cannot be changed" if order.status != "pending" product = Product.find_by(id: product_id) return "Product not found" if !product - order_item = OrderItem.find_by(order_id: order_id, product_id: product_id) + return "Product is retired" if !product.active + return "Invalid quantity" if !quantity || quantity < 1 + order_item = OrderItem.find_by( + order_id: order_id, + product_id: product_id + ) if !order_item return "Quantity not available in stock" if quantity > product.stock - order_item = OrderItem.new(order_id: order_id, product_id: product_id, quantity: quantity) + order_item = OrderItem.new( + order_id: order_id, + product_id: product_id, + quantity: quantity + ) else return "Quantity not available in stock" if quantity + order_item.quantity > product.stock order_item.quantity += quantity end - if order_item.save - return nil - else - return "Error saving the order item" - end + return order_item.save ? nil : "Error saving the order item" end - def update_item(quantity) # TODO add test for this method + def update_item(quantity) return "Order cannot be changed" if self.order.status != "pending" return "Product not found" if !self.product + return "Product is retired" if !product.active + return "Invalid quantity" if !quantity || quantity < 1 return "Quantity not available in stock" if quantity > self.product.stock self.quantity = quantity - if self.save - return nil - else - return "Error updating the order item" - end + return self.save ? nil : "Error updating the order item" end - def remove_item # TODO add test for this method + def remove_item return "Order cannot be changed" if self.order.status != "pending" - if self.destroy - return nil - else - return "Error removing the order item" - end + return self.destroy ? nil : "Error removing the order item" end end diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index beeb0adbfd..d6e84a3359 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -22,8 +22,8 @@ @item.save! end - describe 'relationships' do - it 'must belong to a Product' do + describe "relationships" do + it "must belong to a Product" do # Arrange & Act # in the before block # Assert @@ -31,17 +31,17 @@ expect(@item.product).must_be_kind_of Product end - it 'must belong to an Order' do + it "must belong to an Order" do # Arrange & Act # in the before block # Assert expect(@item).must_respond_to :order expect(@item.order).must_be_kind_of Order end - end # describe 'relationships' + end # describe "relationships" - describe 'validations' do - it 'is valid if quantity is greater than 0' do + describe "validations" do + it "is valid if quantity is greater than 0" do # Arrange # in the before block # Act @@ -50,7 +50,7 @@ expect(result).must_equal true end - it 'is not valid if quantity is less than or equal to 0' do + it "is not valid if quantity is less than or equal to 0" do # Arrange @item.quantity = 0 # Act @@ -61,7 +61,7 @@ expect(@item.errors.messages[:quantity]).must_include "must be greater than 0" end - it 'is not valid if quantity is not present' do + it "is not valid if quantity is not present" do # Arrange @item.quantity = nil # Act @@ -72,7 +72,7 @@ expect(@item.errors.messages[:quantity]).must_include "can't be blank" end - it 'is not valid if quantity is not a number' do + it "is not valid if quantity is not a number" do # Arrange @item.quantity = "not a number" # Act @@ -82,7 +82,7 @@ expect(@item.errors.messages).must_include :quantity expect(@item.errors.messages[:quantity]).must_include "is not a number" end - end + end # describe 'validations' describe "subtotal" do it "calculates the subtotal" do @@ -114,6 +114,241 @@ expect(result).must_be_kind_of Numeric expect(result).must_equal 0 end - end + end # describe "subtotal" + + describe "self.add_item" do + + let (:order1) { Order.new(status: "pending") } + let (:merchant1) { merchants(:suely) } + let (:product1) { products(:tulip) } + + before do + order1.save! + merchant1.save! + product1.merchant_id = merchant1.id + product1.price = 100 + product1.save! + end + + it "adds a new item to the order" do + # Arrange + # in the before block + # Act + message = OrderItem.add_item(order1.id, product1.id, quantity = 2) + item1 = OrderItem.find_by(order_id: order1.id, product_id: product1.id) + # Assert + expect(message).must_be_nil + expect(item1).must_be_kind_of OrderItem + expect(item1.quantity).must_be_kind_of Numeric + expect(item1.quantity).must_equal 2 + end + + it "adds to an existing item in the order" do + # Arrange + # in the before block + # Act + message1 = OrderItem.add_item(order1.id, product1.id, quantity = 2) + message2 = OrderItem.add_item(order1.id, product1.id, quantity = 3) + item1 = OrderItem.find_by(order_id: order1.id, product_id: product1.id) + # Assert + expect(message1).must_be_nil + expect(message2).must_be_nil + expect(item1).must_be_kind_of OrderItem + expect(item1.quantity).must_be_kind_of Numeric + expect(item1.quantity).must_equal 5 + end + + it "returns error if the order is invalid" do + # Arrange + # in the before block + # Act + message = OrderItem.add_item(-1, product1.id, quantity = 1) + item1 = OrderItem.find_by(order_id: order1.id, product_id: product1.id) + # Assert + expect(message).must_be_kind_of String + expect(message.downcase).must_include "order" + expect(item1).must_be_nil + end + + it "returns error if the order is not pending" do + # Arrange + order2 = Order.new(status: "cancelled") + order2.save! + # Act + message = OrderItem.add_item(order2.id, product1.id, quantity = 1) + item1 = OrderItem.find_by(order_id: order2.id, product_id: product1.id) + # Assert + expect(message).must_be_kind_of String + expect(message.downcase).must_include "cannot be changed" + expect(item1).must_be_nil + end + + it "returns error if the product is invalid" do + # Arrange + # in the before block + # Act + message = OrderItem.add_item(order1.id, nil, quantity = 1) + item1 = OrderItem.find_by(order_id: order1.id, product_id: product1.id) + # Assert + expect(message).must_be_kind_of String + expect(message.downcase).must_include "product" + expect(item1).must_be_nil + end + + it "returns error if the product is retired" do + # Arrange + product1.active = false + product1.save! + # Act + message = OrderItem.add_item(order1.id, product1.id, quantity = 1) + item1 = OrderItem.find_by(order_id: order1.id, product_id: product1.id) + # Assert + expect(message).must_be_kind_of String + expect(message.downcase).must_include "retired" + expect(item1).must_be_nil + end + + it "returns error if quantity is invalid" do + # Arrange + # in the before block + # Act + message = OrderItem.add_item(order1.id, product1.id, quantity = 0) + item1 = OrderItem.find_by(order_id: order1.id, product_id: product1.id) + # Assert + expect(message).must_be_kind_of String + expect(message.downcase).must_include "quantity" + expect(item1).must_be_nil + end + + it "return error if quantity is higher than stock" do + # Arrange + product1.stock = 2 + product1.save! + # Act + message = OrderItem.add_item(order1.id, product1.id, quantity = 3) + item1 = OrderItem.find_by(order_id: order1.id, product_id: product1.id) + # Assert + expect(message).must_be_kind_of String + expect(message.downcase).must_include "stock" + expect(item1).must_be_nil + end + + it "return error if added quantity higher than stock" do + # Arrange + product1.stock = 2 + product1.save! + # Act + message1 = OrderItem.add_item(order1.id, product1.id, quantity = 2) + message2 = OrderItem.add_item(order1.id, product1.id, quantity = 1) + item1 = OrderItem.find_by(order_id: order1.id, product_id: product1.id) + # Assert + expect(message1).must_be_nil + expect(message2).must_be_kind_of String + expect(message2.downcase).must_include "stock" + expect(item1).must_be_kind_of OrderItem + expect(item1.quantity).must_be_kind_of Numeric + expect(item1.quantity).must_equal 2 + end + end # describe "self.add_item" + + describe "update_item" do + it "updates the quantity on an item" do + # Arrange + # in the before block + # Act + message = @item.update_item(1) + # Assert + expect(message).must_be_nil + expect(@item).must_be_kind_of OrderItem + expect(@item.quantity).must_be_kind_of Numeric + expect(@item.quantity).must_equal 1 + end + + it "returns error if the order is not pending" do + # Arrange + order.checkout_order! + @item.reload + # Act + message = @item.update_item(1) + # Assert + expect(message).must_be_kind_of String + expect(message.downcase).must_include "cannot be changed" + expect(@item).must_be_kind_of OrderItem + expect(@item.quantity).must_be_kind_of Numeric + expect(@item.quantity).must_equal 2 + end + + it "returns error if the product is retired" do + # Arrange + product.active = false + product.save! + @item.reload + # Act + message = @item.update_item(1) + # Assert + expect(message).must_be_kind_of String + expect(message.downcase).must_include "retired" + expect(@item).must_be_kind_of OrderItem + expect(@item.quantity).must_be_kind_of Numeric + expect(@item.quantity).must_equal 2 + end + + it "returns error if quantity is invalid" do + # Arrange + # in the before block + # Act + message = @item.update_item(0) + # Assert + expect(message).must_be_kind_of String + expect(message.downcase).must_include "quantity" + expect(@item).must_be_kind_of OrderItem + expect(@item.quantity).must_be_kind_of Numeric + expect(@item.quantity).must_equal 2 + end + + it "return error if quantity is higher than stock" do + # Arrange + product.stock = 3 + product.save! + @item.reload + # Act + message = @item.update_item(4) + # Assert + expect(message).must_be_kind_of String + expect(message.downcase).must_include "stock" + expect(@item).must_be_kind_of OrderItem + expect(@item.quantity).must_be_kind_of Numeric + expect(@item.quantity).must_equal 2 + end + end # describe "update_item" + + describe "remove_item" do + it "removes an item" do + # Arrange + old_item_id = @item.id + # Act + message = @item.remove_item + old_item = OrderItem.find_by(id: old_item_id) + # Assert + expect(message).must_be_nil + expect(old_item).must_be_nil + end + + it "returns error if the order is not pending" do + # Arrange + order.checkout_order! + @item.reload + old_item_id = @item.id + # Act + message = @item.remove_item + old_item = OrderItem.find_by(id: old_item_id) + # Assert + expect(message).must_be_kind_of String + expect(message.downcase).must_include "cannot be changed" + expect(@item).must_be_kind_of OrderItem + expect(@item.quantity).must_be_kind_of Numeric + expect(@item.quantity).must_equal 2 + end + end # describe "remove_item" -end +end # describe OrderItem \ No newline at end of file From aec5d9083d1b558408e543b21da166020ea15aba Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 18:04:48 -0700 Subject: [PATCH 211/367] added stye for rating-stars Reviews --- app/assets/stylesheets/reviews.scss | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss index 6457abefb6..ce67bce08f 100644 --- a/app/assets/stylesheets/reviews.scss +++ b/app/assets/stylesheets/reviews.scss @@ -1,3 +1,11 @@ // 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/ + +span.rating-stars { + color: orange; +} + +span.rating-empty-stars { + color: rgb(141, 135, 135); +} From 65f62f0c21c5d828e9e742dafad3975c35cc29e4 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 18:05:48 -0700 Subject: [PATCH 212/367] minor edit to app controller --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 8caec65757..993edf78d5 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -23,7 +23,7 @@ def find_cart def current_merchant @current_merchant ||= session[:merchant_id] && - Merchant.find_by(id: session[:merchant_id]) + Merchant.find_by(id: session[:merchant_id]) end def require_login From 51282a04387cdd7ed1ca956cbb3491728f092388 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 18:07:10 -0700 Subject: [PATCH 213/367] added private method to prohibit merchant from reviewing own product --- app/controllers/reviews_controller.rb | 32 +++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 243929d9fb..4d698b18f0 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,9 +1,11 @@ class ReviewsController < ApplicationController + before_action :merchant_reviews, only:[:new, :create] def new - if params[:product_id] + + if params[:product_id] && Product.find_by(id: params[:product_id]) # Nested route: /product/:product_id/reviews/new - product = Product.find_by(id: params[:product_id]) + @review = Review.new else redirect_to root_path @@ -13,15 +15,7 @@ def new def create - - # if there is a merchant logged in - # if session[:merchant_id]? - - # # and that merchant ID matchs the product id - # if @product_id == session[:merchant_id] - # # merchant can't review their own product - # end - # end + @review = Review.new(review_params) @review.product_id = params[:product_id] @@ -39,9 +33,23 @@ def create private + + def merchant_reviews + + product = Product.find_by(id: merchant_review_params) + # if there is a merchant logged in + if product&.merchant == @current_merchant + flash[:warning] = "You can't review your own product!" + redirect_to product_path(product) + end + end + + def merchant_review_params + params.require(:product_id) + end def review_params - return params.require(:review).permit(:rating, :comment, :product_id) + params.require(:review).permit(:rating, :comment, :product_id) end end From 807a598be84eb5ddb06910b720a842eb0e469ef1 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 18:07:32 -0700 Subject: [PATCH 214/367] added helper method to make rating to stars --- app/helpers/application_helper.rb | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index d853dedbbf..7515a8366c 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,19 +1,14 @@ module ApplicationHelper - - -# ---------- - -# review.rating = 3 - - -# rating.times do -# -# end - - # rating_as_stars do - # return content_tag(:span, "✭") - # # for each number in the rating (0-5) - # # print a star within a span tag - # end + def rating_as_stars(rating) + stars = '★' * rating + empty_stars = '★' * (5 - rating) + stars_span = content_tag(:span, stars, class:"rating-filled-stars") + empty_stars_span = content_tag(:span, empty_stars, class:"rating-empty-stars") + content_tag(:span, "#{stars_span}#{empty_stars_span}".html_safe, class:"rating-stars") + end + + def generate_select_options(range) + (range).to_a.map{|r| [r,r]} + end end From 68760677ce3c3e694e6f35306ff59ea5290cc37d Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 18:08:27 -0700 Subject: [PATCH 215/367] added helper method for review by merchant to own product --- app/helpers/products_helper.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb index ab5c42b325..4e5b1c7b20 100644 --- a/app/helpers/products_helper.rb +++ b/app/helpers/products_helper.rb @@ -1,2 +1,6 @@ module ProductsHelper + + def product_owned_by_merchant?(product) + product.merchant == @current_merchant + end end From 54aeb3fa60a1feee5c6db64679d43ae9a67b1e0c Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 18:09:10 -0700 Subject: [PATCH 216/367] updated rating from 0 -5 to 1-5 --- app/models/review.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/review.rb b/app/models/review.rb index a55e131e88..7430a299d5 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,6 +1,6 @@ class Review < ApplicationRecord belongs_to :product - validates :rating, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 5, message: "should be between 0 and 5" } + validates :rating, numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 5, message: "should be between 1 and 5" } end From 6eb27440269dea0ba259f0b8a08d5901a387b5d6 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 18:10:07 -0700 Subject: [PATCH 217/367] added logic to not display review button to products created by merchant --- app/views/products/show.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index af9c653f59..3763fda4cf 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -10,7 +10,9 @@

<%= @product.description %>

<%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary' %> <%= button_to 'Edit', edit_product_path(@product), method: :get, class: 'btn btn-info btn-sm' %> + <% unless product_owned_by_merchant?(@product) %> <%= link_to "add review", new_product_review_path(@product) %> + <% end %> @@ -18,9 +20,7 @@
<% @product.reviews.each do |review| %> -

<%= review.rating %>

-

<%# rating_as_stars(review.rating) %>

-

<%= review.comment %> +

<%= rating_as_stars(review.rating) %> on <%= review.created_at.strftime('%-d %B %Y') %> <%= review.comment %> <% end %>

From a92c814e45fd52ff17484fc2f35a84cf650f9872 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 18:10:25 -0700 Subject: [PATCH 218/367] added drop down option to rating --- app/views/reviews/new.html.erb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index 3e475a2b32..ea14f0ea9a 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -5,16 +5,15 @@

Please enter your review for product: <%= params[:product_id] %>

<%= form.label :rating, class: 'control-label' %> - <%= form.text_field :rating, class: 'form-control' %> + <%= form.select :rating, generate_select_options(1..5), {selected:5}, class: 'form-control' %>
-
+
<%= form.label :comment, class: 'control-label' %> <%= form.text_area :comment, class: 'form-control' %>
- <%# form.submit %> <%= form.submit("#{action_name} review") %>
<% end %> From 7778ac895496ff29c45e0e9043436a957044b39b Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 18:10:49 -0700 Subject: [PATCH 219/367] updated review controller tests --- test/controllers/reviews_controller_test.rb | 66 ++++++++++++--------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 3a7297bda4..f9cd9b96ce 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -1,47 +1,57 @@ require "test_helper" describe ReviewsController do - # let(:product) { products(:daisy) } + let(:product) { products(:daisy) } - # describe "new" do - # # it "can get the review_path" do - # # get review_path + describe "new" do + it "can get the review_path" do + + get new_product_review_path(product) + must_respond_with :success + end - # # must_respond_with :success - # # end + it "can't review own product" do + perform_login(product.merchant) - # # it "can get the roduct_review_path" do - # # get product_review_path(Product.first.id) + get new_product_review_path(product) + expect(flash[:warning]).must_equal "You can't review your own product!" + must_redirect_to product_path(product) + + end - # # must_respond_with :success - # # end - # end + end + it "should create new review" do + assert_difference("Review.count") do + post product_reviews_path(product), params: { review: { rating: 5, comment: "I was happy with my daisies!", product_id: product.id } } + end + must_redirect_to product_path(product) + end + it "can't create with out rating" do + assert_no_difference("Review.count") do + post product_reviews_path(product), params: { review: { rating: nil, comment: "I wasn't happy with my daisies!", product_id: product.id } } + end - # it "should create new review" do - # # assert_difference("Review.count") do - # # post reviews_url, params: { review: { rating: 5, comment: "I was happy with my daisies!", product_id: product.id } } - # # end + must_respond_with :bad_request + end - # # must_redirect_to review_url(Review.last) - # end + it "can't create when rating that is above 5" do + assert_no_difference("Review.count") do + post product_reviews_path(product), params: { review: { rating: 8, comment: "I was really happy with my daisies!", product_id: product.id } } + end - # it "can't create with out rating" do - # assert_no_difference("Review.count") do - # post reviews_url, params: { review: { rating: nil, comment: "I wasn't happy with my daisies!", product_id: product.id } } - # end + must_respond_with :bad_request + end - # must_redirect_to review_path - # end + # it "can't review own product" do + # perform_login(product.merchant) - # it "can't create when rating that is above 5" do - # assert_no_difference("Review.count") do - # post reviews_url, params: { review: { rating: 8, comment: "I was really happy with my daisies!", product_id: product.id } } - # end + # post product_reviews_path(product), params: { review: { rating: 8, comment: "I was really happy with my daisies!", product_id: product.id } } - # must_redirect_to review_path + # must_respond_with :bad_request + # end end From b9d34603db1f32512651d5ca10d4ff47a45e38ec Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 18:11:33 -0700 Subject: [PATCH 220/367] updated merchant_id to merchant in product fixture --- test/fixtures/products.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 413390c77e..79fc7e9a47 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -5,7 +5,7 @@ tulip: stock: 6 active: true price: 12.50 - merchant_id: 1 + merchant: katherine daisy: name: daisy @@ -14,7 +14,7 @@ daisy: stock: 2 active: true price: 3.75 - merchant_id: 1 + merchant: melba onion: name: onion @@ -23,7 +23,7 @@ onion: stock: 10 active: true price: .50 - merchant_id: 2 + merchant: annie cilantro: name: cilantro @@ -32,5 +32,5 @@ cilantro: stock: 1 active: false price: 100 - merchant_id: 3 + merchant: angela From b0505a957d569c828220843107c75689cdf91524 Mon Sep 17 00:00:00 2001 From: Haben Date: Tue, 16 Jun 2020 18:12:11 -0700 Subject: [PATCH 221/367] updated rating from 0-5 to 1-5 --- test/models/review_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 045e50e6b7..812bda874b 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -22,13 +22,13 @@ end - it "is not valid if the rating isn't between 0-5" do + it "is not valid if the rating isn't between 1-5" do review.rating = 7 result = review.valid? expect(result).must_equal false expect(review.errors.messages).must_include :rating - expect(review.errors.messages[:rating]).must_include "should be between 0 and 5" + expect(review.errors.messages[:rating]).must_include "should be between 1 and 5" end From 31a644d6c7424eb64d3425900e5c2865026d402d Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 16 Jun 2020 20:19:39 -0700 Subject: [PATCH 222/367] able to view products by selecting multiple options --- app/assets/stylesheets/nav.scss | 8 ------ app/assets/stylesheets/products.scss | 3 +++ app/controllers/products_controller.rb | 30 +++++++++++++++++++++- app/views/products/_select.html.erb | 35 ++++++++++++++++++++++++++ app/views/products/index.html.erb | 13 +++++++--- 5 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 app/assets/stylesheets/products.scss create mode 100644 app/views/products/_select.html.erb diff --git a/app/assets/stylesheets/nav.scss b/app/assets/stylesheets/nav.scss index 55caf07695..82a96bf3ae 100644 --- a/app/assets/stylesheets/nav.scss +++ b/app/assets/stylesheets/nav.scss @@ -10,12 +10,4 @@ width: 80px; background-image: image-url(asset_path("icons/shopping-cart.svg")); background-repeat: no-repeat; -} - -.side_nav_bar { - border: red 3px solid, -} - -.products__container { - border: green 3px solid, } \ No newline at end of file diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss new file mode 100644 index 0000000000..6b83343b05 --- /dev/null +++ b/app/assets/stylesheets/products.scss @@ -0,0 +1,3 @@ +.product-show-page__container { + display: flex; +} \ No newline at end of file diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index dce16924e2..de9a82c82b 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -4,7 +4,34 @@ class ProductsController < ApplicationController # GET /products # GET /products.json def index - @products = Product.all + @filters = [] + @products = [] + + if params[:categories] + params[:categories].each do |c| + if Category.exists?(c) + category = Category.find(c) + @products << category.products + @filters << category.name + end + end + end + + if params[:merchants] + params[:merchants].each do |m| + if Merchant.exists?(m) + @products << Product.where(merchant: m) + @filters << Merchant.find(m).username + end + end + end + + if (!params[:categories] && !params[:merchants]) || (params[:categories].one? && params[:merchants].one?) + @products = Product.all + else + @products.flatten!.uniq! + end + end # GET /products/1 @@ -86,6 +113,7 @@ def set_product end def product_params + raise return params.require(:product).permit(:name, :description, :photo, :stock, :price, category_ids: []) end end diff --git a/app/views/products/_select.html.erb b/app/views/products/_select.html.erb new file mode 100644 index 0000000000..7838d3378d --- /dev/null +++ b/app/views/products/_select.html.erb @@ -0,0 +1,35 @@ +
+
+ +
+ +
+ <%= form_with url: products_path, method: :get, class:'form-group' do |f| %> +

Categories

+ <%= f.collection_check_boxes( :categories, Category.all, :id, :name) do |c| %> +
+ <%= c.check_box class:"form-check-input" %> + <%= c.label class:"form-check-label"%> +
+ <% end %> + + + +

Merchants

+ <%= f.collection_check_boxes( :merchants, Merchant.all, :id, :username) do |c| %> +
+ <%= c.check_box class:"form-check-input" %> + <%= c.label class:"form-check-label"%> +
+ <% end %> + + <%= f.submit %> + <% end %> +
+
+
+
diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 8f9f2a7f84..1a3026110a 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,8 +1,14 @@ <% content_for(:title) { 'Evergreenery - Browse Products' } %> -

Products

+

<%= @filters.count > 0 ? "Showing Products for #{@filters.join(', ')}" : "Products"%>

-
+
+ +
+ <%= render 'select' %> +
+ +

Session debug panel

[:session_id] = <%= session[:session_id] %> ***** @@ -10,9 +16,8 @@ [:merchant_id] = <%= session[:merchant_id] ? session[:merchant_id] : "Not logged in as merchant" %>

-
-
+

<%= "No products to view" if @products.empty? %>

<% @products.in_groups_of(4).each do |group| %>
<% group.each do |product| %> From 031243e940ac497c9d0cf774ce2d2c16fffda561 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 16 Jun 2020 20:25:45 -0700 Subject: [PATCH 223/367] removed routes and controller actions for filtering products --- app/controllers/products_controller.rb | 8 -------- config/routes.rb | 2 -- 2 files changed, 10 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index de9a82c82b..9a2186b1d0 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -39,14 +39,6 @@ def index def show end - def by_merchant - @merchant = Merchant.find(params[:id]) - end - - def by_category - @category = Category.find(params[:id]) - end - # GET /products/new def new @product = Product.new diff --git a/config/routes.rb b/config/routes.rb index 043d8d3757..2303b9a007 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -22,8 +22,6 @@ resources :products - get "/products/:id/by_category", to: "products#by_category", as: "by_category" - get "/products/:id/by_merchant", to: "products#by_merchant", as: "by_merchant" post "/products/:id/deactivate", to: "products#deactivate", as: "product_deactivate" post "/products/:product_id/reviews/new", to: "reviews#new", as: "new_review" From da1cad49993e4d08cee3831b01da8027c1215484 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 16 Jun 2020 20:27:50 -0700 Subject: [PATCH 224/367] removed nav dropdown links for filtering products --- app/views/layouts/_header.html.erb | 14 -------------- app/views/shared/_dropdown.html.erb | 19 ------------------- 2 files changed, 33 deletions(-) delete mode 100644 app/views/shared/_dropdown.html.erb diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 9c892ea41b..84af59aaa1 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -11,20 +11,6 @@ navbar structure based on https://stackoverflow.com/questions/19733447/bootstrap - - <%# dropdown box for Categories %> - <% if Category.all.length > 0 %> - - <% end %> - - <%# dropdown box for Merchants %> - <% if Merchant.all.length > 0 %> - - <% end %> <% end %>
diff --git a/app/views/shared/_dropdown.html.erb b/app/views/shared/_dropdown.html.erb deleted file mode 100644 index e65acf516f..0000000000 --- a/app/views/shared/_dropdown.html.erb +++ /dev/null @@ -1,19 +0,0 @@ -<%# -This partial renders a dropdown link box to be used in navbars. -LOCALS: -label - the label for the dropdown -items - list of items to be rendered as dropdown options -%> - - - \ No newline at end of file From bddff4147a0f0bd3b03233cf15fc284bb2111270 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 16 Jun 2020 20:33:45 -0700 Subject: [PATCH 225/367] deleted uncessary files for viewing filtered products --- app/controllers/products_controller.rb | 1 + app/views/products/by_category.html.erb | 11 ----------- app/views/products/by_merchant.html.erb | 11 ----------- 3 files changed, 1 insertion(+), 22 deletions(-) delete mode 100644 app/views/products/by_category.html.erb delete mode 100644 app/views/products/by_merchant.html.erb diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 9a2186b1d0..20b5c2a430 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -54,6 +54,7 @@ def create @product = Product.new(product_params) @product.merchant_id = session[:merchant_id] @product.photo = 'https://i.imgur.com/OR9WgUb.png' if @product.photo = '' + @product.active = true if @product.save flash[:success] = "Successfully created #{@product.name}" redirect_to products_path diff --git a/app/views/products/by_category.html.erb b/app/views/products/by_category.html.erb deleted file mode 100644 index f1c2e0b8a6..0000000000 --- a/app/views/products/by_category.html.erb +++ /dev/null @@ -1,11 +0,0 @@ -

Products under category <%= @category.name.upcase %>

- -
- <% @category.products.in_groups_of(4).each do |group| %> -
- <% group.each do |product| %> - <%= render partial: "shared/product", locals: { product: product } %> - <% end %> -
- <% end %> -
\ No newline at end of file diff --git a/app/views/products/by_merchant.html.erb b/app/views/products/by_merchant.html.erb deleted file mode 100644 index 376f917644..0000000000 --- a/app/views/products/by_merchant.html.erb +++ /dev/null @@ -1,11 +0,0 @@ -

Products under merchant <%= @merchant.username.upcase %>

- -
- <% @merchant.products.in_groups_of(4).each do |group| %> -
- <% group.each do |product| %> - <%= render partial: "shared/product", locals: { product: product } %> - <% end %> -
- <% end %> -
\ No newline at end of file From 6cbf6b746580a9a22d2c75e2d079001a053631a3 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 20:40:55 -0700 Subject: [PATCH 226/367] updated product actions to use ownership filters --- app/controllers/application_controller.rb | 26 +++++++++------- app/controllers/products_controller.rb | 30 ++++++++----------- test/controllers/merchants_controller_test.rb | 7 +++++ 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 993edf78d5..4ca292e3db 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,12 +5,10 @@ class ApplicationController < ActionController::Base before_action :find_cart before_action :current_merchant - def render_404 - # DPR: this will actually render a 404 page in production - raise ActionController::RoutingError.new("Not Found") - end - - private + # def render_404 + # # DPR: this will actually render a 404 page in production + # raise ActionController::RoutingError.new("Not Found") + # end def find_cart if session[:order_id] @@ -35,10 +33,17 @@ def require_login end def require_ownership - if params[:id].to_i != current_merchant.id - if request.get? - redirect_to dashboard_merchant_url(current_merchant.id) - flash[:warning] = "Tried to access a resource that isn't yours." + if params[:controller] == "merchants" + requester = params[:id].to_i # when params id references a merchant + else + requester = Product.find_by(id: params[:id]).merchant.id # when params id references a product + end + + if requester != current_merchant.id + if request.get? # merchant trying to GET ownership-locked resources + redirect_to dashboard_merchant_path(@current_merchant.id) + flash[:warning] = "Tried to access a resource that isn't yours. Returning to your dashboard." + flash[:danger] = request.params return else redirect_back(fallback_location: root_path) @@ -47,5 +52,4 @@ def require_ownership end end end - end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 20b5c2a430..d38997982d 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,5 +1,7 @@ class ProductsController < ApplicationController before_action :set_product, only: [:show, :edit, :update, :destroy] + before_action :require_login, only: [:new, :edit, :update, :destroy] + before_action :require_ownership, only: [:edit, :update, :destroy] # GET /products # GET /products.json @@ -49,24 +51,18 @@ def edit end def create - # checking if a merchant is signed in - if session[:merchant_id] - @product = Product.new(product_params) - @product.merchant_id = session[:merchant_id] - @product.photo = 'https://i.imgur.com/OR9WgUb.png' if @product.photo = '' - @product.active = true - if @product.save - flash[:success] = "Successfully created #{@product.name}" - redirect_to products_path - else - flash.now[:warning] = 'Unable to save product' - flash.now[:details] = @product.errors.full_messages - render :new, status: :bad_request - return - end + @product = Product.new(product_params) + @product.merchant_id = session[:merchant_id] + @product.photo = 'https://i.imgur.com/OR9WgUb.png' if @product.photo = '' + @product.active = true + if @product.save + flash[:success] = "Successfully created #{@product.name}" + redirect_to products_path else - #say you must be loged in as a merchant to create product - flash.now[:warning] = 'Must be logged in as Merchant to create a product' + flash.now[:warning] = "Unable to save product." + flash.now[:details] = @product.errors.full_messages + render :new, status: :bad_request + return end end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 20ce44df1a..47d8d700a8 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -97,6 +97,13 @@ must_redirect_to dashboard_merchant_url(@correct_id) expect(flash[:warning]).must_equal "Tried to access a resource that isn't yours. Returning to your dashboard." end + + it "responds with redirect when posting merchant products" do + post manage_products_url(@incorrect_id) + must_respond_with :redirect + must_redirect_to dashboard_merchant_url(@correct_id) + expect(flash[:warning]).must_equal "Tried to access a resource that isn't yours. Returning to your dashboard." + end end describe "with no merchant logged in" do From 4f4da09f9763dd9ccf8a940682dfcbf82208925f Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 20:41:27 -0700 Subject: [PATCH 227/367] added footer to landing --- app/assets/stylesheets/landing.scss | 10 ++++++++++ app/views/pages/landing.html.erb | 8 +++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 46597dfee1..2c2ff6502b 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -13,3 +13,13 @@ } } + +.footer { + text-align: right; + position: absolute; + bottom: 0; + width: 100%; + /* Set the fixed height of the footer here */ + height: 60px; + line-height: 60px; /* Vertically center the text there */ +} diff --git a/app/views/pages/landing.html.erb b/app/views/pages/landing.html.erb index 82c758559c..214e50b004 100644 --- a/app/views/pages/landing.html.erb +++ b/app/views/pages/landing.html.erb @@ -2,4 +2,10 @@

Welcome to Evergreenery

<%= link_to products_path, class: "btn btn-outline-primary browse" do %>Browse all products<% end %> -
\ No newline at end of file + + +
+
+ Meet the team +
+
\ No newline at end of file From b54148b542210f2acc9ce1e373e21052f803a263 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 20:48:43 -0700 Subject: [PATCH 228/367] removed debug panel from products index --- app/views/products/index.html.erb | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 1a3026110a..506ea53cbd 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -9,13 +9,6 @@
-
-

Session debug panel

-

[:session_id] = <%= session[:session_id] %> ***** - [:order_id] = <%= session[:order_id] %> ***** - [:merchant_id] = <%= session[:merchant_id] ? session[:merchant_id] : "Not logged in as merchant" %> -

-

<%= "No products to view" if @products.empty? %>

<% @products.in_groups_of(4).each do |group| %> From db18259cba396236116da1a83ed02415f44dbbf7 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Tue, 16 Jun 2020 21:16:21 -0700 Subject: [PATCH 229/367] Added tests for OrderItem controller. Improved error messages. --- app/controllers/order_items_controller.rb | 19 ++- app/controllers/orders_controller.rb | 27 ++-- app/models/order.rb | 24 +-- config/routes.rb | 1 - .../order_items_controller_test.rb | 140 ++++++++++++++++-- test/models/order_test.rb | 30 +++- 6 files changed, 184 insertions(+), 57 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index d3281e09b2..9b5c68afaa 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,6 +1,8 @@ class OrderItemsController < ApplicationController def create - message = OrderItem.add_item(@shopping_cart.id, params[:id], 1) + product_id = params[:id] + quantity = params[:order_item][:quantity] ? params[:order_item][:quantity].to_i : 1 + message = OrderItem.add_item(@shopping_cart.id, product_id, quantity) if message.nil? flash[:success] = "Product added to shopping cart" else @@ -12,7 +14,18 @@ def create def destroy @order_item = OrderItem.find_by(id: params[:id]) - @order_item.remove_item - redirect_to cart_path + if !@order_item + flash[:warning] = "Unable to find item in shopping cart" + redirect_back fallback_location: cart_path + return + end + message = @order_item.remove_item + if message.nil? + flash[:success] = "Product removed from shopping cart" + else + flash[:warning] = "Unable to remove product from shopping cart" + flash[:details] = [message] + end + redirect_back fallback_location: cart_path end end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 9751d1bb54..3481d99b6b 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,19 +1,7 @@ class OrdersController < ApplicationController - # before_action :require_login, only: [:index, :show] before_action :find_order, only: [:show, :complete, :cancel, :confirmation] - # TODO: remove index route because we can get orders from Merchant model - # def index - # # List orders for a Merchant (Merchant only) - # @orders = Order.by_merchant(current_merchant) - # end - - # TODO: remove show route because we can get orders from Merchant model - # def show - # # Shows any orders from the Merchant (Merchant only) - # end - def edit # Shows cart, updates credit card/address/email and confirms checkout (User) end @@ -22,12 +10,13 @@ def update # Process checkout, changes status to “paid”, show confirmation (User) @shopping_cart.time_submitted = DateTime.now if @shopping_cart.update(order_params) - if @shopping_cart.checkout_order! + result = @shopping_cart.checkout_order! + if result.nil? session[:order_id] = nil flash[:success] = "Successfully checked out order #{@shopping_cart.id}" redirect_to order_confirmation_path(@shopping_cart) else - flash[:warning] = "Checkout has failed!" + flash[:warning] = "Checkout has failed: #{result}" flash[:details] = @shopping_cart.errors.full_messages render :edit, status: :bad_request end @@ -50,10 +39,11 @@ def destroy def complete # Ships the order, changes status to “complete” (Merchant only) - if @order.ship_order! + result = @order.ship_order! + if result.nil? flash[:success] = "Successfully completed order #{@order.id}" else - flash[:warning] = "Failed to complete order #{@order.id}." + flash[:warning] = "Failed to complete order #{@order.id}: #{result}" flash[:details] = @order.errors.full_messages end redirect_back fallback_location: order_path(@order) @@ -61,12 +51,13 @@ def complete def cancel # Cancels the order, changes status to “cancelled” (Merchant only) - if @order.cancel_order! + result = @order.cancel_order! + if result.nil? flash[:status] = :success flash[:result_text] = "Successfully cancelled order #{@order.id}" else flash[:status] = :failure - flash[:result_text] = "Failed to cancel order." + flash[:result_text] = "Failed to cancel order: #{result}" end redirect_back fallback_location: order_path(@order) end diff --git a/app/models/order.rb b/app/models/order.rb index 6f37600d23..6d844a8df7 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -11,16 +11,16 @@ class Order < ApplicationRecord validates :customer_email, presence: true, on: :update def checkout_order! - return false if self.status != "pending" - return false if self.name.nil? || self.credit_card_num.nil? || - self.credit_card_exp.nil? || self.credit_card_cvv.nil? || - self.customer_email.nil? || self.address.nil? || - self.city.nil? || self.state.nil? || self.zip.nil? + return "Invalid cart" if self.status != "pending" + return "Missing credit card information" if self.name.nil? || + self.credit_card_num.nil? || self.credit_card_exp.nil? || self.credit_card_cvv.nil? + return "Missing customer email" if self.customer_email.nil? + return "Missing address" if self.address.nil? || self.city.nil? || self.state.nil? || self.zip.nil? + # begin transaction # checking if stock is still available self.order_items.each do |item| - return false if item.quantity > item.product.stock + return "Quantity not available in stock" if item.quantity > item.product.stock end - # begin transaction self.order_items.each do |item| item.product.stock -= item.quantity item.product.save @@ -28,19 +28,19 @@ def checkout_order! self.status = "paid" result = self.save # end transaction - return self.save + return result ? nil : "Error saving the order" end def ship_order! - return false if self.status != "paid" + return "Order not paid" if self.status != "paid" self.status = "complete" - return self.save + return self.save ? nil : "Error saving the order" end def cancel_order! - return false if self.status != "paid" + return "Order not paid" if self.status != "paid" self.status = "cancelled" - return self.save + return self.save ? nil : "Error saving the order" end def total_cost diff --git a/config/routes.rb b/config/routes.rb index 0c310fe1d7..0d99f71817 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -20,7 +20,6 @@ resources :order_items, only: [:edit, :update, :destroy] post "/order_items/:id/create", to: "order_items#create", as: "create_order_items" - resources :products do resources :reviews, only: [:new, :create] end diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 5d1dac2eaa..5c99dd2c54 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -1,33 +1,141 @@ require "test_helper" describe OrderItemsController do - it "Can add a good product" do - end + let (:order) { orders(:order_pending) } + let (:merchant) { merchants(:suely) } + let (:product) { products(:tulip) } - it "Can't add a product w/o enough stock" do + before do + order.save! + merchant.save! + product.merchant_id = merchant.id + product.price = 100 + product.save! end + describe "create" do + it "Can add a valid item" do + # Arrange + # in the before block + # Act & Assert + expect { + post create_order_items_path(product.id), params: { order_item: { quantity: 2 } } + }.must_change "OrderItem.count", 1 + new_item = OrderItem.last + expect(new_item).wont_be_nil + expect(new_item.product.id).must_equal product.id + expect(new_item.quantity).must_equal 2 + must_respond_with :redirect + must_redirect_to cart_path + end - it "Can't add a retired product" do + it "updates quantity if product already in cart" do + # Arrange + expect { + post create_order_items_path(product.id), params: { order_item: { quantity: 2 } } + }.must_change "OrderItem.count", 1 + new_item = OrderItem.last + expect(new_item).wont_be_nil + expect(new_item.product.id).must_equal product.id + expect(new_item.quantity).must_equal 2 + must_respond_with :redirect + must_redirect_to cart_path + # Act & Assert + expect { + post create_order_items_path(product.id), params: { order_item: { quantity: 2 } } + }.wont_change "OrderItem.count" + new_item.reload + expect(new_item.quantity).must_equal 4 + must_respond_with :redirect + must_redirect_to cart_path + end - end + it "can't add a bad product ID" do + # Arrange + # in the before block + # Act & Assert + expect { + post create_order_items_path(0), params: { order_item: { quantity: 2 } } + }.wont_change "OrderItem.count" + must_respond_with :redirect + must_redirect_to cart_path + end + it "Can't add a product w/o enough stock" do + # Arrange + product.stock = 3 + product.save! + # Act & Assert + expect { + post create_order_items_path(product.id), params: { order_item: { quantity: 4 } } + }.wont_change "OrderItem.count" + must_respond_with :redirect + must_redirect_to cart_path + end - it "Can't add to an order that's not in pending status" do + it "Can't add a retired product" do + # Arrange + product.active = false + product.save! + # Act & Assert + expect { + post create_order_items_path(product.id), params: { order_item: { quantity: 2 } } + }.wont_change "OrderItem.count" + must_respond_with :redirect + must_redirect_to cart_path + end - end + it "can't add quantity above stock" do + # Arrange + product.stock = 3 + product.save! + expect { + post create_order_items_path(product.id), params: { order_item: { quantity: 2 } } + }.must_change "OrderItem.count", 1 + new_item = OrderItem.last + expect(new_item).wont_be_nil + expect(new_item.product.id).must_equal product.id + expect(new_item.quantity).must_equal 2 + must_respond_with :redirect + must_redirect_to cart_path - it "updates quantity if product already in cart" do + # Act & Assert + expect { + post create_order_items_path(product.id), params: { order_item: { quantity: 2 } } + }.wont_change "OrderItem.count" + must_respond_with :redirect + must_redirect_to cart_path + end + end # describe "create" - end + describe "destroy" do + it "removes an existing item" do + # Arrange + item1 = OrderItem.new( + order_id: order.id, + product_id: product.id, + quantity: 2 + ) + item1.save! + current_count = OrderItem.count + # Act & Assert + delete order_item_path(item1) + expect(OrderItem.count).must_equal current_count - 1 + must_respond_with :redirect + must_redirect_to cart_path + end - it "can't add a bad product ID" do - - end + it "fails to remove a bad item" do + # Arrange + current_count = OrderItem.count + # Act & Assert + delete order_item_path(0) + expect(OrderItem.count).must_equal current_count + must_respond_with :redirect + must_redirect_to cart_path + end + end # describe "destroy" - it "can't add quantity above stock" do - - end -end +end # describe OrderItemsController diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 1ce628c2f5..3ab2bc5b6e 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -51,7 +51,7 @@ result = pending_order.checkout_order! pending_order.reload # Assert - expect(result).must_equal true + expect(result).must_be_nil expect(pending_order.status).must_equal "paid" end @@ -62,7 +62,8 @@ result = complete_order.checkout_order! complete_order.reload # Assert - expect(result).must_equal false + expect(result).must_be_kind_of String + expect(result.downcase).must_include "invalid" expect(complete_order.status).must_equal "complete" end @@ -78,7 +79,8 @@ result = incomplete_order.checkout_order! incomplete_order.reload # Assert - expect(result).must_equal false + expect(result).must_be_kind_of String + expect(result.downcase).must_include "credit card" expect(incomplete_order.status).must_equal "pending" end @@ -94,7 +96,8 @@ result = incomplete_order.checkout_order! incomplete_order.reload # Assert - expect(result).must_equal false + expect(result).must_be_kind_of String + expect(result.downcase).must_include "email" expect(incomplete_order.status).must_equal "pending" end end # describe "checkout_order!" @@ -107,7 +110,7 @@ result = paid_order.ship_order! paid_order.reload # Assert - expect(result).must_equal true + expect(result).must_be_nil expect(paid_order.status).must_equal "complete" end @@ -118,7 +121,8 @@ result = pending_order.ship_order! pending_order.reload # Assert - expect(result).must_equal false + expect(result).must_be_kind_of String + expect(result.downcase).must_include "not paid" expect(pending_order.status).must_equal "pending" end end # describe "ship_order!" @@ -131,9 +135,21 @@ result = paid_order.cancel_order! paid_order.reload # Assert - expect(result).must_equal true + expect(result).must_be_nil expect(paid_order.status).must_equal "cancelled" end + + it "rejects status not paid" do + # Arrange + pending_order.save! + # Act + result = pending_order.cancel_order! + pending_order.reload + # Assert + expect(result).must_be_kind_of String + expect(result.downcase).must_include "not paid" + expect(pending_order.status).must_equal "pending" + end end # describe "cancel_order!" describe "total_cost" do From 1b9f9c7e231c82ff1b9313746a88e964d04769ba Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Tue, 16 Jun 2020 21:32:15 -0700 Subject: [PATCH 230/367] Fixed bug in OrderItem controller --- app/controllers/order_items_controller.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 9b5c68afaa..9bd1b569b1 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,7 +1,12 @@ class OrderItemsController < ApplicationController def create product_id = params[:id] - quantity = params[:order_item][:quantity] ? params[:order_item][:quantity].to_i : 1 + order_item_params = params[:order_item] + if order_item_params.nil? + quantity = 1 + else + quantity = params[:order_item][:quantity].to_i + end message = OrderItem.add_item(@shopping_cart.id, product_id, quantity) if message.nil? flash[:success] = "Product added to shopping cart" From 22f3bbba41e0170e423c04381a3e4ff72e922ef7 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 16 Jun 2020 21:33:05 -0700 Subject: [PATCH 231/367] created an update_quantity controller action --- app/assets/stylesheets/orders.scss | 4 ++ app/controllers/order_items_controller.rb | 7 ++ app/views/orders/edit.html.erb | 79 +++++++++++++---------- config/routes.rb | 1 + 4 files changed, 58 insertions(+), 33 deletions(-) diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss index e8c23c2250..957ea257f5 100644 --- a/app/assets/stylesheets/orders.scss +++ b/app/assets/stylesheets/orders.scss @@ -1,3 +1,7 @@ // 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/ + +.shopping-cart { + display: flex; +} \ No newline at end of file diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index d3281e09b2..84b817a29e 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -10,6 +10,13 @@ def create redirect_back fallback_location: cart_path end + def update_quantity + @order_item = OrderItem.find(params[:id]) + quantity = params[:quantity].to_i + @order_item.update_item(quantity) + redirect_to cart_path + end + def destroy @order_item = OrderItem.find_by(id: params[:id]) @order_item.remove_item diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index fc432dd6e2..f30838988c 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -1,37 +1,50 @@

Shopping Cart

-

Status: <%= @shopping_cart.status %>

-

Items: <%= @shopping_cart.order_items.size %>

-

Total Cost: <%= @shopping_cart.total_cost %>

-
-

Items

- - - - - - - - - - - - <% @shopping_cart.order_items.each do |order_item| %> - - - - - - - - <% end %> - -
Product NameQuantityPriceSubtotalDelete
<%= link_to order_item.product.name, product_path(order_item.product) %><%= order_item.quantity %><%= order_item.product.price %><%= order_item.subtotal %><%= link_to 'Delete', order_item_path(order_item), class: 'btn btn-danger', method: 'delete' %>
-
+
+
+

Status: <%= @shopping_cart.status %>

+

Items: <%= @shopping_cart.order_items.size %>

+

Total Cost: <%= @shopping_cart.total_cost %>

+ + +
+

Items

+ + + + + + + + + + + + <% @shopping_cart.order_items.each do |order_item| %> + +

order item id <%= order_item.id %>

+ + <%= order_item.product.stock %> + + + + + + <% end %> + +
Product NameQuantityPriceSubtotalDelete
<%= link_to order_item.product.name, product_path(order_item.product) %> + <%= order_item.quantity %> + <%= order_item.product.price %><%= order_item.subtotal %><%= link_to 'Delete', order_item_path(order_item), class: 'btn btn-danger', method: 'delete' %>
+
+ <%= link_to "Empty Shopping Cart", cart_path, class: 'btn btn-danger', method: 'delete' %> + <%= link_to "Back to Main Menu", root_path, class: "btn btn-primary" %> +
+ +
+ <% if @shopping_cart.order_items.size > 0 %> + <%= render 'payment_form' %> + <% end %> +
+
-<% if @shopping_cart.order_items.size > 0 %> - <%= render 'payment_form' %> -<% end %> -<%= link_to "Empty Shopping Cart", cart_path, class: 'btn btn-danger', method: 'delete' %> -<%= link_to "Back to Main Menu", root_path, class: "btn btn-primary" %> diff --git a/config/routes.rb b/config/routes.rb index a91d79747f..e7835d3d71 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -19,6 +19,7 @@ resources :order_items, only: [:edit, :update, :destroy] post "/order_items/:id/create", to: "order_items#create", as: "create_order_items" + get "/order_items/:id/", to: "order_items#update_quantity" resources :products do resources :reviews, only: [:new, :create] From 96417602bb39fa6b2c5fcbe44416a9632c7d1ac0 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 16 Jun 2020 22:33:48 -0700 Subject: [PATCH 232/367] added buttons to increase and decrease quantity of a order item --- app/controllers/order_items_controller.rb | 13 +++++++++---- app/views/orders/edit.html.erb | 4 +++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 84b817a29e..df2d578403 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -11,10 +11,15 @@ def create end def update_quantity - @order_item = OrderItem.find(params[:id]) - quantity = params[:quantity].to_i - @order_item.update_item(quantity) - redirect_to cart_path + @order_item = OrderItem.find_by(id: params[:id]) + if @order_item + quantity = params[:quantity].to_i + @order_item.update_item(quantity) + redirect_to cart_path + else + flash[:warning] = "Item in cart does not exist" + redirect_to cart_path + end end def destroy diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index f30838988c..928c5c8bb9 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -26,7 +26,9 @@ <%= link_to order_item.product.name, product_path(order_item.product) %> <%= order_item.product.stock %> - <%= order_item.quantity %> + <%= link_to "+", order_item_path(id: order_item, quantity: order_item.quantity + 1)%> + <%= order_item.quantity %> + <%= link_to "-", order_item_path(id: order_item, quantity: order_item.quantity - 1) %> <%= order_item.product.price %> <%= order_item.subtotal %> From c565df438471407d2fd2bbeaff13f8eecec5963e Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 16 Jun 2020 22:41:05 -0700 Subject: [PATCH 233/367] cleaned up the view for cart --- app/views/orders/edit.html.erb | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index 928c5c8bb9..0fc413fbef 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -22,9 +22,7 @@ <% @shopping_cart.order_items.each do |order_item| %> -

order item id <%= order_item.id %>

<%= link_to order_item.product.name, product_path(order_item.product) %> - <%= order_item.product.stock %> <%= link_to "+", order_item_path(id: order_item, quantity: order_item.quantity + 1)%> <%= order_item.quantity %> From c502e5db7a4f367db0aaa12297574506d798562d Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 16 Jun 2020 22:44:44 -0700 Subject: [PATCH 234/367] still cleaning --- app/controllers/products_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index d38997982d..4804a9297a 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -102,7 +102,6 @@ def set_product end def product_params - raise return params.require(:product).permit(:name, :description, :photo, :stock, :price, category_ids: []) end end From ffccd0c29da81af42676fcc29457020bc8259948 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 22:50:18 -0700 Subject: [PATCH 235/367] filled out products controller tests --- app/controllers/application_controller.rb | 2 +- app/controllers/products_controller.rb | 4 +- app/models/product.rb | 2 +- test/controllers/products_controller_test.rb | 108 +++++++++++++------ 4 files changed, 77 insertions(+), 39 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4ca292e3db..d81c52de66 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -47,7 +47,7 @@ def require_ownership return else redirect_back(fallback_location: root_path) - flash[:danger] = "Could not post that request with invalid credentials." + flash[:danger] = "Could not complete that request with invalid credentials." return end end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index d38997982d..e502989b92 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -57,7 +57,7 @@ def create @product.active = true if @product.save flash[:success] = "Successfully created #{@product.name}" - redirect_to products_path + redirect_to @product else flash.now[:warning] = "Unable to save product." flash.now[:details] = @product.errors.full_messages @@ -102,7 +102,7 @@ def set_product end def product_params - raise + # raise return params.require(:product).permit(:name, :description, :photo, :stock, :price, category_ids: []) end end diff --git a/app/models/product.rb b/app/models/product.rb index 18c79b30dd..edad218999 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -8,5 +8,5 @@ class Product < ApplicationRecord message: "%{value} has already been taken." } validates :price, presence: true, numericality: { greater_than: 0, message: "must be a number greater than $0" } - + validates :stock, presence: true, numericality: { greater_than: 0 } end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 79d92d1368..2fce2962ac 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -15,29 +15,83 @@ describe "managing products" do + let(:new_product) { + { + name: "Something Shiny New", + stock: 2, + price: 5, + } + } + describe "with correct merchant logged in" do + + before do + perform_login + merchant = @current_merchant + end + it "should get new product form" do + get new_product_url + must_respond_with :success end - it "should create product" do + it "should create product and redirect to its product page" do + assert_difference("Product.count") do + post products_url, params: { product: new_product } + end + latest_product = Product.last + must_redirect_to product_url(latest_product) + expect(flash[:success]).must_equal "Successfully created #{latest_product.name}" + expect(latest_product.merchant.id).must_equal session[:merchant_id] end it "should get edit product form" do + post products_url, params: { product: new_product } + get edit_product_url(Product.last.id) + must_respond_with :success end - it "should respond with success when updating a product" do + it "should redirect to product and flash success on valid update" do + post products_url, params: { product: new_product } + latest_product = Product.last + patch product_url(latest_product), params: { product: { name: "Updated Name" } } + must_redirect_to latest_product + expect(flash[:success]).must_equal "Successfully updated product." end - it "should respond with success when deactivating a product" do + it "should respond with bad request on invalid update attempt" do + post products_url, params: { product: new_product } + updated_product = Product.last + updated_product.name = nil + updated_product.stock = -1 + patch product_url(updated_product), params: { product: { name: updated_product.name, stock: updated_product.stock } } + must_respond_with :bad_request + updated_product.valid? + expect(updated_product.errors.messages[:name]).must_equal ["can't be blank"] + expect(updated_product.errors.messages[:stock]).must_equal ["must be greater than 0"] end + it "should respond with success when deactivating a product" do + end end describe "with incorrect merchant logged in" do + + before do + perform_login + @current_merchant = session[:merchant_id] + end + it "should not let merchants edit products they don't own" do + get edit_product_url(Product.last.id) + must_redirect_to dashboard_merchant_url(@current_merchant) + expect(flash[:warning]).must_equal "Tried to access a resource that isn't yours. Returning to your dashboard." end it "should not update a product the merchant does not own" do + patch product_url(Product.last.id), params: { product: { name: "Updated Name" } } + must_redirect_to root_path + expect(flash[:danger]).must_equal "Could not complete that request with invalid credentials." end it "should not deactivate a product the merchant does not own" do @@ -45,13 +99,29 @@ end describe "with no merchant logged in" do + + before do + perform_login + perform_logout + end + it "should fail to get new product form" do + get new_product_url + must_redirect_to root_path + expect(flash[:danger]).must_equal "Must be logged in as a merchant." end it "should not create new product" do + assert_no_difference("Product.count") do + post products_url, params: { product: new_product } + end + must_respond_with :bad_request end it "should not edit a product" do + patch product_url(Product.last.id), params: { product: { name: "Updated Name" } } + must_redirect_to root_path + expect(flash[:danger]).must_equal "Must be logged in as a merchant." end it "should not deactivate a product" do @@ -60,36 +130,4 @@ end - # it "should get new" do - # get new_product_url - # must_respond_with :success - # end - - # it "should create product" do - # assert_difference("Product.count") do - # post products_url, params: { product: { } } - # end - - # must_redirect_to product_url(Product.last) - # end - - - - # it "should get edit" do - # get edit_product_url(@product) - # must_respond_with :success - # end - - # it "should update product" do - # patch product_url(@product), params: { product: { } } - # must_redirect_to product_url(product) - # end - - # it "should destroy product" do - # assert_difference("Product.count", -1) do - # delete product_url(@product) - # end - - # must_redirect_to products_url - # end end From ee2c470eeb855c190ea3cf5c95701182d8d1ed59 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 22:56:35 -0700 Subject: [PATCH 236/367] removed unneeded post test on merchant controller --- test/controllers/merchants_controller_test.rb | 7 ------- 1 file changed, 7 deletions(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 47d8d700a8..20ce44df1a 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -97,13 +97,6 @@ must_redirect_to dashboard_merchant_url(@correct_id) expect(flash[:warning]).must_equal "Tried to access a resource that isn't yours. Returning to your dashboard." end - - it "responds with redirect when posting merchant products" do - post manage_products_url(@incorrect_id) - must_respond_with :redirect - must_redirect_to dashboard_merchant_url(@correct_id) - expect(flash[:warning]).must_equal "Tried to access a resource that isn't yours. Returning to your dashboard." - end end describe "with no merchant logged in" do From 19c56b8ed6820adb81742f57628eb32e7acc00ea Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Tue, 16 Jun 2020 23:07:49 -0700 Subject: [PATCH 237/367] styled product form --- app/views/products/_form.html.erb | 8 ++++++-- app/views/products/new.html.erb | 8 +++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index dd1fcbc23d..b22e058557 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -26,8 +26,12 @@
- <%= form.label :categories %> - <%= collection_check_boxes(:product, :category_ids, Category.all, :id, :name) %> + <%= form.collection_check_boxes(:category_ids, Category.all, :id, :name) do |c| %> +
+ <%= c.check_box class:"form-check-input" %> + <%= c.label class:"form-check-label"%> +
+ <% end %>
diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index a06963dc59..55c801895e 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -1,5 +1,7 @@ -

New Product

+
+

New Product

-<%= render 'form', product: @product %> + <%= render 'form', product: @product %> -<%= link_to 'Back', products_path %> + <%= link_to 'Back', products_path %> +
From 8f8e702d17423c2c5d080349d37edfe8d4a2c090 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 23:21:55 -0700 Subject: [PATCH 238/367] converted headers into content_for helper --- app/views/layouts/application.html.erb | 1 + app/views/merchants/current.html.erb | 0 app/views/merchants/dashboard.html.erb | 8 +++----- app/views/merchants/index.html.erb | 5 ----- app/views/merchants/manage_orders.html.erb | 2 +- app/views/merchants/manage_products.html.erb | 2 +- app/views/orders/confirmation.html.erb | 2 ++ app/views/orders/edit.html.erb | 2 +- app/views/orders/show.html.erb | 2 ++ app/views/products/edit.html.erb | 2 +- app/views/products/index.html.erb | 3 +-- app/views/products/new.html.erb | 4 ++-- app/views/products/show.html.erb | 2 ++ 13 files changed, 17 insertions(+), 18 deletions(-) delete mode 100644 app/views/merchants/current.html.erb delete mode 100644 app/views/merchants/index.html.erb diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 5bce160251..d282d2a029 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -16,6 +16,7 @@ > <%= render 'layouts/header' %> +

<%= content_for?(:headline) ? yield(:headline) : "" %>

<%= render 'layouts/alert' %> <%= yield %> diff --git a/app/views/merchants/current.html.erb b/app/views/merchants/current.html.erb deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb index 0b881d6be5..63e39925c0 100644 --- a/app/views/merchants/dashboard.html.erb +++ b/app/views/merchants/dashboard.html.erb @@ -1,14 +1,12 @@ -<% content_for(:title) { 'Evergreenery - Welcome' } %> - - -

Merchant Dashboard (id: <%= @current_merchant.id %>)

+<% content_for(:title) { "Merchant id: #{@current_merchant.id}" } %> +<% content_for(:headline) { "Merchant Dashboard"} %>

Stats at a glance

    -
  • Name: <%= @current_merchant.username %>
  • +
  • Username: <%= @current_merchant.username %>
  • Orders awaiting shipment:
  • Completed orders:
  • Number of product listings:
  • diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb deleted file mode 100644 index e9e4853a88..0000000000 --- a/app/views/merchants/index.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -<% if @current_merchant %> - <%= link_to "Log out", logout_merchant_url(@current_merchant.id), method: "delete" %> -<% else %> - <%= link_to "Login with Github", github_login_path %> -<% end %> \ No newline at end of file diff --git a/app/views/merchants/manage_orders.html.erb b/app/views/merchants/manage_orders.html.erb index 05a8d91d00..17bd3dd84a 100644 --- a/app/views/merchants/manage_orders.html.erb +++ b/app/views/merchants/manage_orders.html.erb @@ -1,4 +1,4 @@ -

    manage orders

    +<% content_for(:headline) { "Manage Orders"} %>

    Manage Orders

    diff --git a/app/views/merchants/manage_products.html.erb b/app/views/merchants/manage_products.html.erb index 9f7b66380d..bdbef77af2 100644 --- a/app/views/merchants/manage_products.html.erb +++ b/app/views/merchants/manage_products.html.erb @@ -1,4 +1,4 @@ -

    manage products

    +<% content_for(:headline) { "Manage Products"} %>

    Merchant ID: <%= @current_merchant.id %>

      diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index ee5df4a843..ff44581cb6 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -1,3 +1,5 @@ +<% content_for(:headline) { "Order Confirmation"} %> +

      Thank you for your order!

      Receipt for Order #

      diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index 0fc413fbef..30256a9155 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -1,4 +1,4 @@ -

      Shopping Cart

      +<% content_for(:headline) { "Shopping Cart"} %>
      diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 5d64e15712..9a34dc13ef 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -1,3 +1,5 @@ +<% content_for(:headline) { "Order Details"} %> +

      Order: <%= link_to @order.id, order_path(@order) %>

      Status: <%= @order.status %>

      Items: <%= @order.order_items.size %>

      diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb index fc16e133a0..fdc7f903e8 100644 --- a/app/views/products/edit.html.erb +++ b/app/views/products/edit.html.erb @@ -1,4 +1,4 @@ -

      Editing Product

      +<% content_for(:headline) { "Editing Product"} %> <%= render 'form', product: @product %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 506ea53cbd..9158047764 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,6 +1,5 @@ <% content_for(:title) { 'Evergreenery - Browse Products' } %> - -

      <%= @filters.count > 0 ? "Showing Products for #{@filters.join(', ')}" : "Products"%>

      +<% content_for(:headline) { @filters.count > 0 ? "Showing Products for #{@filters.join(', ')}" : "Products" } %>
      diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index 55c801895e..5032dd23ff 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -1,6 +1,6 @@ -
      -

      New Product

      +<% content_for(:headline) { "New Product"} %> +
      <%= render 'form', product: @product %> <%= link_to 'Back', products_path %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 3763fda4cf..9a3646a5b0 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,3 +1,5 @@ +<% content_for(:headline) { "Product Details"} %> +
      From d5d342eea038495220f6e8b831021baf01a65a0c Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 23:27:08 -0700 Subject: [PATCH 239/367] removed debug styling --- app/assets/stylesheets/application.scss | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 60a1f099fd..45e114abed 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -31,10 +31,3 @@ h2 { margin: 20px 0 50px; } -.debug { - margin: 0 auto; - width: 60vw; - background: lightgrey; - padding: 10px; -} - From c1546a26cced58130e4032f038c2b5cce52e3dda Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 16 Jun 2020 23:40:54 -0700 Subject: [PATCH 240/367] restyled nav and header --- app/assets/stylesheets/application.scss | 7 +++++++ app/assets/stylesheets/nav.scss | 8 ++++++++ app/views/layouts/_header.html.erb | 2 +- app/views/layouts/application.html.erb | 4 +++- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 45e114abed..015b2e0981 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -31,3 +31,10 @@ h2 { margin: 20px 0 50px; } +.headline { + color: #fff; + margin: 0 auto 20px; + padding: 20px 0; + background-color: lightslategray; +} + diff --git a/app/assets/stylesheets/nav.scss b/app/assets/stylesheets/nav.scss index 82a96bf3ae..db22717d4b 100644 --- a/app/assets/stylesheets/nav.scss +++ b/app/assets/stylesheets/nav.scss @@ -1,3 +1,11 @@ +nav { + background-color: lightslategray; +} + +nav.landing { + background-color: transparent; +} + .app-header__nav { display: flex; flex-direction: row; diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 84af59aaa1..2bcf0575f2 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -2,7 +2,7 @@ navbar structure based on https://stackoverflow.com/questions/19733447/bootstrap-navbar-with-left-center-or-right-aligned-items %> -
      \ No newline at end of file From 2f6593eecbb74863fc4a152e484e5d27c6b734a6 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Wed, 17 Jun 2020 10:56:14 -0700 Subject: [PATCH 246/367] new form view for category --- app/views/categories/new.html.erb | 18 ++++++++++++++++++ app/views/merchants/dashboard.html.erb | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 app/views/categories/new.html.erb diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb new file mode 100644 index 0000000000..6599b29bac --- /dev/null +++ b/app/views/categories/new.html.erb @@ -0,0 +1,18 @@ +<% content_for(:headline) { "New Category"} %> + +<%= form_with(model: category, local: true) do |form| %> +

      Please enter folliwng data for a new category

      +
      + <%= form.label :name, class: 'control-label' %> + <%= form.text_field :name, class: 'form-control', placeholder: "Category Name" %> +
      + +
      + <%= form.label :description, class: 'control-label' %> + <%= form.text_area :description, class: 'form-control', placeholder: "Description of Category" %> +
      + +
      + <%= form.submit %> +
      +<% end %> diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb index 06f9dadb73..515e5c2724 100644 --- a/app/views/merchants/dashboard.html.erb +++ b/app/views/merchants/dashboard.html.erb @@ -36,7 +36,7 @@ <%= link_to new_category_path do %>
      -

      Create a Category

      +

      Create a category

      <% end %>
      From 30f47f70a1d57a1bfc99553cb45059067719e693 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Wed, 17 Jun 2020 11:13:39 -0700 Subject: [PATCH 247/367] fixed some bugs --- app/controllers/categories_controller.rb | 7 +++--- app/views/categories/new.html.erb | 30 +++++++++++++----------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 0215550cda..4f2fd4a3ae 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,15 +1,16 @@ class CategoriesController < ApplicationController def new + @category = Category.new end def create - @category = Category.new(params[:id]) + @category = Category.new(category_params) if @category.save flash[:success] = "Successfuly created #{@category.name} category" - redirect_to dashboard_merchant(params[:id]) + redirect_to dashboard_merchant_path(@current_merchant) else flash.now[:warning] = "Unable to save category." - flash.now[:details] = @product.errors.full_messages + flash.now[:details] = @category.errors.full_messages render :new, status: :bad_request end end diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb index 6599b29bac..209abbdda4 100644 --- a/app/views/categories/new.html.erb +++ b/app/views/categories/new.html.erb @@ -1,18 +1,20 @@ <% content_for(:headline) { "New Category"} %> -<%= form_with(model: category, local: true) do |form| %> -

      Please enter folliwng data for a new category

      -
      - <%= form.label :name, class: 'control-label' %> - <%= form.text_field :name, class: 'form-control', placeholder: "Category Name" %> -
      +
      + <%= form_with(model: @category, local: true) do |form| %> +

      Please enter folliwng data for a new category

      +
      + <%= form.label :name, class: 'control-label' %> + <%= form.text_field :name, class: 'form-control', placeholder: "Category Name" %> +
      -
      - <%= form.label :description, class: 'control-label' %> - <%= form.text_area :description, class: 'form-control', placeholder: "Description of Category" %> -
      +
      + <%= form.label :description, class: 'control-label' %> + <%= form.text_area :description, class: 'form-control', placeholder: "Description of Category" %> +
      -
      - <%= form.submit %> -
      -<% end %> +
      + <%= form.submit %> +
      + <% end %> +
      From f0a7704967bb7f1746819fa5de513e74e2e45921 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 17 Jun 2020 11:14:56 -0700 Subject: [PATCH 248/367] updated redirect test for Review controller --- test/controllers/reviews_controller_test.rb | 22 ++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index f9cd9b96ce..3796200de9 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -38,7 +38,7 @@ must_respond_with :bad_request end - it "can't create when rating that is above 5" do + it "can't create with rating that is above 5" do assert_no_difference("Review.count") do post product_reviews_path(product), params: { review: { rating: 8, comment: "I was really happy with my daisies!", product_id: product.id } } end @@ -46,12 +46,16 @@ must_respond_with :bad_request end - # it "can't review own product" do - # perform_login(product.merchant) - - # post product_reviews_path(product), params: { review: { rating: 8, comment: "I was really happy with my daisies!", product_id: product.id } } - - # must_respond_with :bad_request - - # end +# hello + it "should redirect to products_path" do + bad_review = { + rating: 8, + comment: "bad review", + product_id: -1 + } + + post new_product_review_path(-1), params: { review: bad_review } + #expect(flash[:danger]).must_equal "Something went wrong with the reviewing process." + must_redirect_to products_path + end end From 3f3fa39d150af912e557abfec3923eda5f745682 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 17 Jun 2020 11:15:20 -0700 Subject: [PATCH 249/367] updated redirect path to products from root --- app/controllers/reviews_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 4d698b18f0..ce86ccd361 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -8,7 +8,7 @@ def new @review = Review.new else - redirect_to root_path + redirect_to products_path flash[:danger] = "Something went wrong with the reviewing process." end end From 7819d0cecdbd3e6d9fd6cff9260a293bd8a9784a Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 17 Jun 2020 12:13:07 -0700 Subject: [PATCH 250/367] removed comments --- test/controllers/merchants_controller_test.rb | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 20ce44df1a..fd25d0cc82 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -1,22 +1,6 @@ require "test_helper" describe MerchantsController do - -# describe "show" do -# it "succeeds for an existing merchant ID" do -# get merchants_path(merchants(:angela)) -# ​ -# must_respond_with :success -# end -# ​ -# it "renders 404 not_found for merchants with invalid ID" do -# invalid_id_merchant = -1 - -# get merchant_path(invalid_id_merchant) -# ​ -# must_respond_with :not_found -# end -# end describe "login" do it "can login in a new merchant" do From 730eed91f7e370c9f76777364a16f3d27d8e28e7 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 17 Jun 2020 12:13:52 -0700 Subject: [PATCH 251/367] changed header to be fixed --- app/assets/stylesheets/application.scss | 2 +- app/assets/stylesheets/landing.scss | 2 +- app/controllers/merchants_controller.rb | 15 +---- app/views/layouts/_header.html.erb | 88 ++++++++++++------------- 4 files changed, 49 insertions(+), 58 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 015b2e0981..a57264bbe5 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -34,7 +34,7 @@ h2 { .headline { color: #fff; margin: 0 auto 20px; - padding: 20px 0; + padding: 80px 0 20px; background-color: lightslategray; } diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 7e9f1f4d1d..48b8f74e14 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -14,7 +14,7 @@ } .spotlight { - margin: 10vh auto 0; + margin: 26vh auto 0; width: 300px; height: 300px; background-color: goldenrod; diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 68a733ae1b..399b3f9262 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -22,24 +22,15 @@ def login #create return redirect_to root_path end - def dashboard - - end + def dashboard; end - def manage_orders - end + def manage_orders; end - def manage_products - end + def manage_products; end def logout session.delete(:merchant_id) redirect_to root_path flash[:success] = "Successfully logged out!" end - - private - - - end diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 7008bb2be6..db6d5e2dbc 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -2,57 +2,57 @@ navbar structure based on https://stackoverflow.com/questions/19733447/bootstrap-navbar-with-left-center-or-right-aligned-items %> -
      From 01c6bcc5692044c4a2133e51f0c3125c46d5db05 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Wed, 17 Jun 2020 18:40:51 -0700 Subject: [PATCH 266/367] added tests for deactivating a product --- app/controllers/products_controller.rb | 11 +++-- app/views/products/show.html.erb | 2 +- test/controllers/products_controller_test.rb | 43 +++++++++++++++++++- 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 872b08acc8..bcaf6b0351 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,7 +1,7 @@ class ProductsController < ApplicationController before_action :set_product, only: [:show, :edit, :update, :deactivate] - before_action :require_login, only: [:new, :edit, :update] - before_action :require_ownership, only: [:edit, :update] + before_action :require_login, only: [:new, :edit, :update, :deactivate] + before_action :require_ownership, only: [:edit, :update, :deactivate] # GET /products # GET /products.json @@ -82,7 +82,12 @@ def update end def deactivate - + @product.active = !@product.active + if @product.save + redirect_to product_path(@product) + else + flash[:warning] = "Unable to #{!@product.active} product" + end end private diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 3b75479f09..75e97cefb3 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -11,7 +11,7 @@

      <%= @product.name %> - <%= number_to_currency(@product.price) %>

      <%= @product.description %>

      <%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary' %> - <% if @current_merchant %> + <% if @current_merchant == @product.merchant %> <%= button_to 'Edit', edit_product_path(@product), method: :get, class: 'btn btn-info btn-sm' %> <%= button_to @product.active == true ? 'Deactivate' : "Activate", product_deactivate_path(@product), diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 05497d4768..3cca4b8b95 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -64,7 +64,7 @@ before do perform_login - merchant = @current_merchant + @current_merchant = session[:merchant_id] end it "should get new product form" do @@ -108,7 +108,28 @@ expect(updated_product.errors.messages[:stock]).must_equal ["must be greater than 0"] end - it "should respond with success when deactivating a product" do + it "should change active from true to false when deactivating a product" do + daisy = products(:daisy) + expect( daisy.active ).must_equal true + + post product_deactivate_path(daisy) + must_redirect_to product_path(daisy) + + daisy.reload + expect( daisy.active ).must_equal false + end + + it "should change active from false to true when deactivating a product" do + daisy = products(:daisy) + daisy.active = false + daisy.save + expect( daisy.active ).must_equal false + + post product_deactivate_path(daisy) + must_redirect_to product_path(daisy) + + daisy.reload + expect( daisy.active ).must_equal true end it "should respond with not found if product is not given" do @@ -137,6 +158,15 @@ end it "should not deactivate a product the merchant does not own" do + onion = products(:onion) + expect( onion.active ).must_equal true + + post product_deactivate_path(onion) + must_redirect_to root_path + + onion.reload + expect( onion.active ).must_equal true + expect(flash[:danger]).must_equal "Could not complete that request with invalid credentials." end end @@ -167,6 +197,15 @@ end it "should not deactivate a product" do + onion = products(:onion) + expect( onion.active ).must_equal true + + post product_deactivate_path(onion) + must_redirect_to root_path + + onion.reload + expect( onion.active ).must_equal true + expect(flash[:danger]).must_equal "Must be logged in as a merchant." end end From 293006ffb380836a4dd5c1f382db9066686b483e Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Wed, 17 Jun 2020 18:53:49 -0700 Subject: [PATCH 267/367] Fixed the plus and minus quantity links in shopping cart view --- app/controllers/order_items_controller.rb | 8 ++++---- app/views/orders/edit.html.erb | 4 ++-- config/routes.rb | 2 +- test/controllers/order_items_controller_test.rb | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index e73ef0232d..c2a0f9a692 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -18,10 +18,10 @@ def create end def update - @order_item = OrderItem.find_by(id: params[:id]) - if @order_item + order_item = OrderItem.find_by(id: params[:id]) + if order_item quantity = params[:order_item][:quantity].to_i - message = @order_item.update_item(quantity) + message = order_item.update_item(quantity) if message.nil? flash[:success] = "Product quantity updated" else @@ -31,7 +31,7 @@ def update redirect_to cart_path else flash[:warning] = "Item in cart does not exist" - redirect_to cart_path + redirect_to cart_path, :status => 304 end end diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index 30256a9155..7c1eb34179 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -24,9 +24,9 @@ <%= link_to order_item.product.name, product_path(order_item.product) %> - <%= link_to "+", order_item_path(id: order_item, quantity: order_item.quantity + 1)%> + <%= link_to "+", order_item_path(id: order_item, order_item: { quantity: order_item.quantity + 1 } ), method: "patch"%> <%= order_item.quantity %> - <%= link_to "-", order_item_path(id: order_item, quantity: order_item.quantity - 1) %> + <%= link_to "-", order_item_path(id: order_item, order_item: { quantity: order_item.quantity - 1 } ), method: "patch" %> <%= order_item.product.price %> <%= order_item.subtotal %> diff --git a/config/routes.rb b/config/routes.rb index f28d1e787c..0743adb603 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -21,7 +21,7 @@ resources :order_items, only: [:edit, :update, :destroy] post "/order_items/:id/create", to: "order_items#create", as: "create_order_items" - # get "/order_items/:id/", to: "order_items#update_quantity" + patch "/order_items/:id/", to: "order_items#update_quantity" resources :products, except: [:destroy] do resources :reviews, only: [:new, :create] diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 32f8ce82c7..a4bfdbbf92 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -147,12 +147,12 @@ must_redirect_to cart_path end - it "fails to update quantity if item does not exist" do # ????? + it "fails to update quantity if item does not exist" do # Act & Assert expect { patch order_item_path(0), params: { order_item: { quantity: 3 } } }.wont_change "OrderItem.count" - must_respond_with :redirect + must_respond_with 304 must_redirect_to cart_path end From f55181e118771b163971ae78d98b24e75a6532f7 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Wed, 17 Jun 2020 19:29:25 -0700 Subject: [PATCH 268/367] small styling on product detail page --- app/assets/stylesheets/merchants.scss | 4 ++ app/views/merchants/manage_products.html.erb | 49 +++++++++++++++++--- app/views/products/show.html.erb | 7 --- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss index 743080c521..bdf335124e 100644 --- a/app/assets/stylesheets/merchants.scss +++ b/app/assets/stylesheets/merchants.scss @@ -1,3 +1,7 @@ // Place all the styles related to the Merchants controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: https://sass-lang.com/ + +.thumbnail { + height: 80px; +} \ No newline at end of file diff --git a/app/views/merchants/manage_products.html.erb b/app/views/merchants/manage_products.html.erb index a68e367cfc..e14a4505f3 100644 --- a/app/views/merchants/manage_products.html.erb +++ b/app/views/merchants/manage_products.html.erb @@ -3,11 +3,46 @@

      <%= "No products to view" if @current_merchant.products.empty? %>

      - <% @current_merchant.products.in_groups_of(4).each do |group| %> -
      - <% group.each do |product| %> - <%= render partial: "shared/product", locals: { product: product } %> + + + + + + + + + + + + <% @current_merchant.products.each do |item| %> + + + + + + + <% end %> - - <% end %> - + +
      ImageNameInventory +
      <%= image_tag(item.photo, class: " thumbnail img-thumbnail img-fluid") %><%= link_to item.name, product_path(item) %><%= item.stock %> + <%= button_to 'Edit', + edit_product_path(item), + method: :get, + class: 'btn btn-info btn-md' + %> + + <% if item.active %> + <%= button_to 'Deactivate', + product_deactivate_path(item), + method: :post, + class: 'btn btn-danger btn-md' + %> + <% else %> + <%= button_to 'Activate', + product_deactivate_path(item), + method: :post, + class: 'btn btn-info btn-md' + %> + <% end %> +
      \ No newline at end of file diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 75e97cefb3..0445d58179 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -11,13 +11,6 @@

      <%= @product.name %> - <%= number_to_currency(@product.price) %>

      <%= @product.description %>

      <%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary' %> - <% if @current_merchant == @product.merchant %> - <%= button_to 'Edit', edit_product_path(@product), method: :get, class: 'btn btn-info btn-sm' %> - <%= button_to @product.active == true ? 'Deactivate' : "Activate", - product_deactivate_path(@product), - method: :post, - class: 'btn btn-info btn-sm' %> - <% end %> <% unless product_owned_by_merchant?(@product) %> <%= link_to "add review", new_product_review_path(@product), class: 'btn btn-secondary' %> <% end %> From ccacf2b3dc92fad5660f53df7c65632d718a4fad Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Wed, 17 Jun 2020 19:30:03 -0700 Subject: [PATCH 269/367] Fixed bug for login and logout for merchant --- app/assets/stylesheets/landing.scss | 4 ++-- app/controllers/merchants_controller.rb | 2 +- app/views/layouts/_header.html.erb | 6 +++--- app/views/orders/edit.html.erb | 6 +++--- app/views/pages/landing.html.erb | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index ace66b831a..62fbcff8dc 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -38,8 +38,8 @@ line-height: 47px; .footer { text-align: right; - position: absolute; - bottom: 0; + // position: absolute; # to fix bug + // bottom: 0; width: 100%; /* Set the fixed height of the footer here */ height: 60px; diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 399b3f9262..54e66902e7 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -30,7 +30,7 @@ def manage_products; end def logout session.delete(:merchant_id) - redirect_to root_path flash[:success] = "Successfully logged out!" + redirect_to root_path end end diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 3dd82a8597..801507c5be 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -31,13 +31,13 @@ navbar structure based on https://stackoverflow.com/questions/19733447/bootstrap <%# merchant login button %> <% if @current_merchant.nil? %> <% else %> <%# merchant log out button %> + @@ -46,7 +46,7 @@ navbar structure based on https://stackoverflow.com/questions/19733447/bootstrap <% unless action_name == "landing" %> <% end %> diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index 7c1eb34179..68bc130ce5 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -24,9 +24,9 @@ <%= link_to order_item.product.name, product_path(order_item.product) %> - <%= link_to "+", order_item_path(id: order_item, order_item: { quantity: order_item.quantity + 1 } ), method: "patch"%> - <%= order_item.quantity %> - <%= link_to "-", order_item_path(id: order_item, order_item: { quantity: order_item.quantity - 1 } ), method: "patch" %> + <%= link_to "+", order_item_path(id: order_item, order_item: { quantity: order_item.quantity + 1 } ), method: "patch"%> + <%= order_item.quantity %> + <%= link_to "-", order_item_path(id: order_item, order_item: { quantity: order_item.quantity - 1 } ), method: "patch" %> <%= order_item.product.price %> <%= order_item.subtotal %> diff --git a/app/views/pages/landing.html.erb b/app/views/pages/landing.html.erb index f1f6467fad..df6a3878d1 100644 --- a/app/views/pages/landing.html.erb +++ b/app/views/pages/landing.html.erb @@ -9,7 +9,7 @@ product_hero
      -<%= link_to products_path, class: "btn btn-primary browse" do %>Browse all products<% end %> +<%= link_to "Browse all products", products_path, class: "btn btn-primary browse" %>
      From 5105f7a6cf297b325ceb7fd2bfdcfc177923bf33 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 17 Jun 2020 19:33:48 -0700 Subject: [PATCH 270/367] added a helper method to get average rating --- app/views/products/show.html.erb | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 9a3646a5b0..e9fa4cf36b 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -12,23 +12,32 @@

      <%= @product.description %>

      <%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary' %> <%= button_to 'Edit', edit_product_path(@product), method: :get, class: 'btn btn-info btn-sm' %> - <% unless product_owned_by_merchant?(@product) %> - <%= link_to "add review", new_product_review_path(@product) %> - <% end %> +
      -
      - <% @product.reviews.each do |review| %> -

      <%= rating_as_stars(review.rating) %> on <%= review.created_at.strftime('%-d %B %Y') %> <%= review.comment %> +

      + <% unless product_owned_by_merchant?(@product) %> + <%# <% text = "Add Review for " + @product.name%> +

      + <%= rating_as_stars(rating_average(@product.reviews)) %> + (<%= rating_count(@product.reviews) %>) + Add Review for <%= link_to @product.name, new_product_review_path(@product) %> +

      <% end %> + <% @product.reviews.each do |review| %> +
      +

      <%= rating_as_stars(review.rating) %> on <%= review.created_at.strftime('%-d %B %Y') %> <%= review.comment %>

      - +

      + <% end %> +
      + <%= link_to 'Edit', edit_product_path(@product) %> | <%= link_to 'Back', products_path %> From e2db25d6f749fb93c19a81be546b47d4c0345fb7 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Wed, 17 Jun 2020 19:34:57 -0700 Subject: [PATCH 271/367] updated products controller tests for reroute update --- app/controllers/products_controller.rb | 2 +- test/controllers/products_controller_test.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index bcaf6b0351..dc2596ef52 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -84,7 +84,7 @@ def update def deactivate @product.active = !@product.active if @product.save - redirect_to product_path(@product) + redirect_to manage_products_path(@current_merchant) else flash[:warning] = "Unable to #{!@product.active} product" end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 3cca4b8b95..16882cc6ab 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -113,7 +113,7 @@ expect( daisy.active ).must_equal true post product_deactivate_path(daisy) - must_redirect_to product_path(daisy) + must_redirect_to manage_products_path(@current_merchant) daisy.reload expect( daisy.active ).must_equal false @@ -126,7 +126,7 @@ expect( daisy.active ).must_equal false post product_deactivate_path(daisy) - must_redirect_to product_path(daisy) + must_redirect_to manage_products_path(@current_merchant) daisy.reload expect( daisy.active ).must_equal true From 883dedc6f1ace957062d08698700b3e79e98b260 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 17 Jun 2020 19:35:00 -0700 Subject: [PATCH 272/367] added styling for ratings --- app/assets/stylesheets/reviews.scss | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss index ce67bce08f..fa846f42d3 100644 --- a/app/assets/stylesheets/reviews.scss +++ b/app/assets/stylesheets/reviews.scss @@ -9,3 +9,17 @@ span.rating-stars { span.rating-empty-stars { color: rgb(141, 135, 135); } + +.review_container { + border-radius: 1em; + padding: 1em; +} + + + +.reviews { + background-color: lightgray; + padding: 1em; + border-radius: 1em; + +} \ No newline at end of file From af6fbb34df48b95b76edf61ca20f0aaa70171b90 Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 17 Jun 2020 19:35:48 -0700 Subject: [PATCH 273/367] added helper method to get rating_average and rating_count --- app/helpers/application_helper.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 7515a8366c..c3f37b278c 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -11,4 +11,22 @@ def generate_select_options(range) (range).to_a.map{|r| [r,r]} end + def rating_average(reviews) + sum = 0 + count = 0 + reviews.each do |review| + sum += review.rating + count += 1 + end + return sum / count + end + + def rating_count(reviews) + count = 0 + reviews.each do |review| + count += 1 + end + return count + end + end From 9d70c62c9cc1a9fe78c7703c6ed6a71f13a871eb Mon Sep 17 00:00:00 2001 From: Haben Date: Wed, 17 Jun 2020 19:36:45 -0700 Subject: [PATCH 274/367] more review tests --- test/controllers/reviews_controller_test.rb | 42 +++++++++++---------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 3796200de9..b5cf2ea423 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -3,10 +3,8 @@ describe ReviewsController do let(:product) { products(:daisy) } - describe "new" do it "can get the review_path" do - get new_product_review_path(product) must_respond_with :success end @@ -17,14 +15,33 @@ get new_product_review_path(product) expect(flash[:warning]).must_equal "You can't review your own product!" must_redirect_to product_path(product) - end + # # hello + # it "should redirect to products_path" do + # bad_review = { + # rating: 8, + # comment: "bad review", + # product_id: -1 + # } + + # post new_product_review_path(-1), params: { review: bad_review } + # #expect(flash[:danger]).must_equal "Something went wrong with the reviewing process." + # must_redirect_to products_path + # end + it "can't get the review_path for a non-existent product" do + product = Product.new( + id: 1000, + name: "fake", + ) + get new_product_review_path(product) + expect(flash[:danger]).must_equal "Something went wrong with the reviewing process." + end end it "should create new review" do assert_difference("Review.count") do - post product_reviews_path(product), params: { review: { rating: 5, comment: "I was happy with my daisies!", product_id: product.id } } + post product_reviews_path(product), params: { review: { rating: 5, comment: "I was happy with my daisies!", product_id: product.id } } end must_redirect_to product_path(product) @@ -32,7 +49,7 @@ it "can't create with out rating" do assert_no_difference("Review.count") do - post product_reviews_path(product), params: { review: { rating: nil, comment: "I wasn't happy with my daisies!", product_id: product.id } } + post product_reviews_path(product), params: { review: { rating: nil, comment: "I wasn't happy with my daisies!", product_id: product.id } } end must_respond_with :bad_request @@ -40,22 +57,9 @@ it "can't create with rating that is above 5" do assert_no_difference("Review.count") do - post product_reviews_path(product), params: { review: { rating: 8, comment: "I was really happy with my daisies!", product_id: product.id } } + post product_reviews_path(product), params: { review: { rating: 8, comment: "I was really happy with my daisies!", product_id: product.id } } end must_respond_with :bad_request end - -# hello - it "should redirect to products_path" do - bad_review = { - rating: 8, - comment: "bad review", - product_id: -1 - } - - post new_product_review_path(-1), params: { review: bad_review } - #expect(flash[:danger]).must_equal "Something went wrong with the reviewing process." - must_redirect_to products_path - end end From dd039996de15397c02b3fe46d67f55bb15747a80 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 17 Jun 2020 19:53:39 -0700 Subject: [PATCH 275/367] added more seed data --- db/seed_data/categories.csv | 17 +++++++------- db/seed_data/products.csv | 47 +++++++++++++++++++++++++------------ 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/db/seed_data/categories.csv b/db/seed_data/categories.csv index 75099a861d..2e4cc737e8 100644 --- a/db/seed_data/categories.csv +++ b/db/seed_data/categories.csv @@ -1,9 +1,10 @@ id,name,description -1, flowering, annual flowering plants that look great anywhere -2, cactus, low maintenance but high value -3, vine, plants that grow and stretch out along support systems -4, fern, beautiful green foliage with abundant growth -5, hanging, suitable for suspension and hanging -6, foliage, low maintenance plants that don't need a lot of attention -7, herb, all sorts of culinary and health uses -8, low light, plants that thrive in even the lowest light +1, fruit, sweaters for fruits +2, animal, super cute babies wearing super cozy sweaters +3, household, extra cozy for the home for any season +4, drinks, handheld comfort and warmth +5, personal, express your personal style and love for sweaters +6, tech, high tech gear with high tech cozy +7, utility, practical and comfortable +8, unusual, not exactly a sweater but we love it +9, plant, they grow better when they're happy and cozy \ No newline at end of file diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv index 9ce2537bcc..624c4303ed 100644 --- a/db/seed_data/products.csv +++ b/db/seed_data/products.csv @@ -1,16 +1,33 @@ id,name,description,photo,stock,active,price,merchant_id,category_ids -1,Rose,A rose is a woody perennial flowering plant of the genus Rosa in the family Rosaceae.,https://i.imgur.com/QFyZBAo.jpg,5,true,100,1,145 -2,Aloe Vera,Aloe vera is a succulent plant species of the genus Aloe.,https://i.imgur.com/iIpfDQH.jpg,5,true,20,1,26 -3,Rosemary,"Rosemary is an aromatic evergreen shrub with leaves similar to hemlock needles. It is native to the Mediterranean and Asia, but is reasonably hardy in cool climates. It can withstand droughts, surviving a severe lack of water for lengthy periods.",https://i.imgur.com/TmN3LtO.jpg,10,true,3,5,7 -4,Pepperomia,"If you haven't experienced much luck with flowering houseplants, you will appreciate that the peperomia sports foliage that is highly ornamental in its own right. Leaves may be textured or smooth; red, green, gray, or purple; variegated, marbled, or solid; large, heart-shaped, or tiny. Plants throughout the peperomia genus may look so different from one to the next, that it's difficult to discern if they are even related, but one thing all peperomia plants have in common is that they are slow-growing and low maintenance.",https://i.imgur.com/5OJtwFT.jpg,3,true,10.50,2,84 -5,Succulent Trio,A great set of succulents to give as a gift... even if it's a gift to yourself!,https://i.imgur.com/QUE0KPl.jpg,12,true,35.99,2,26 -6,Pink Bouquet,A beautiful collection of seasonal flowers in shades of pink. Flowers are sent via courier overnight so they arrive fresh and ready to brighten up any room.,https://i.imgur.com/422pFSM.jpg,20,true,75,3,1 -7,Lavender,"These distinctively scented purple blossoms have a variety of culinary and aromatherapy uses. Once dried, their purple shade remains eternal and can be used as decoration or garnish.",https://i.imgur.com/RnQjPN0.jpg,2,true,14.99,2,71 -8,Butterleaf,"A cactus variety known for its clusters of wide buttery-flavored leaves. Best grown in warm temperatures with occasional watering and bright sunlight.",https://i.imgur.com/lZG0gf8.jpg,5,true,23,7,2 -9,Fiddlefern,"Part of the fern family, this low-maintenance plant makes a wonderful beginner houseplant. It grows quickly and can be propogated without hassle.",https://i.imgur.com/kA3R89Y.jpg,6,true,20,6 -10,Phalenopsis,"Phalenopsis orchids are a classic mainstay of many indoor gardens due to their friendly maintenance requirements. Blossoms once a year under the right conditions. We ship our phals without flowers to keep their vibrant coloring a surprise!",https://i.imgur.com/obaVjxq.jpg,20,true,13.50,7 -11,Tulips,"A bouquet of freshly cut tulips. Long-lasting and guaranteed to blossom within 2-3 days. Cared for properly, this bouqet remains vividly colored for up to two weeks. Shipped via overnight express to ensure freshness. Trim the bouquet ends on arrival for best chance of thriving.",https://i.imgur.com/4zpdRNC.jpg,22,true,20,6 -12,Parsley,"Known in some circles as the 'herb of the gods', parsley is a popular herb in cooking and medicinal remedies. This listing is for a single parsley sprig.",https://i.imgur.com/kc0bZWU.jpg,50,true,3,4 -13,Daisies,"Brightly colored and hardy even in the most extreme climates, it's easy to see why daisies are some of the most popular flowers. Our daisies are grown with lots of love and care, making them some of the biggest and most vibrant blooms available on the market. Order a bundle in time for the next holiday to ensure your centerpiece is the talk of the town.",https://i.imgur.com/tSkwbWB.jpg,4,true,10,6 -14,Chives,"Easy to grow in soil or water, chives have earned their spot as a culinary mainstay. Great on steamed potatoes or in an omelette, these aromatic plants will elevate your cooking and provide cheery decor for a sunny windowsill.",https://i.imgur.com/I8koPIS.jpg,10,true,6,1 -15,Herb Trio,"Can't decide which herbs to purchase? Let us make it easy on you with this surprise pack of three high-value herbs. Every plant is guaranteed to be ready for transplant into your garden. Selection is completely random. Exciting!",https://i.imgur.com/Mlcghyq.jpg,12,true,30,5 \ No newline at end of file +1,Sphynx sweater,grey with pompoms,https://i.imgur.com/0aPXiCh.jpg,5,true,100,1,28 +2,Tito's Vodka sweater,vodka sweater,https://i.imgur.com/hMcGBdX.jpg,5,true,20,1,435 +3,Pear sweater,pear sweater,https://i.imgur.com/UUy6Zgl.jpg,10,true,3,5,15 +4,Traffic cone sweater,traffic cones get cold too,https://i.imgur.com/oepFWln.png,3,true,10.50,2,78 +5,Teapot sweater,for keeping your tea warm,https://i.imgur.com/7fEu0Iq.jpg,12,true,35.99,2,345 +6,Laptop sweater,for laptops,https://i.imgur.com/IiIGJmm.jpg,20,true,75,3,56 +7,Jar sweater,now with a pocket!,https://i.imgur.com/HsKpvyl.jpg,2,true,14.99,2,3 +8,Pumpkin spice latte sweater,you know what season it is,https://i.imgur.com/oV0IIzY.png,5,true,23,7,45 +9,Snake sweater,with sleeves,https://i.imgur.com/VipCUDK.jpg,6,true,20,6,28 +10,Cell phone sweater,pink ombre wow,https://i.imgur.com/RfH1meY.jpg,20,true,13.50,7,56 +11,Drink glass sweater,chill your drinks warm your soul,https://i.imgur.com/iZGmpi9.jpg,22,true,20,6,45 +12,Lawn flamingo sweater,year round festivity,https://i.imgur.com/FNF1yvy.jpg,50,true,3,4,378 +13,Cake sweater,this definitely counts,https://i.imgur.com/uujvsAw.jpg,4,true,10,6,8 +14,Cold brew sweater,for ice coffee in December,https://i.imgur.com/iiGV5Au.jpg,10,true,6,1,45 +15,Keys sweater,keys also get cold,https://i.imgur.com/wd4etxh.jpg,12,true,30,5,567 +16,Ice cream pint sweater,ice cream should be cold,https://i.imgur.com/qrQXaQF.jpg,10,true,49.99,1,3 +17,Sequoia tree sweater,grow big n strong lil buddy,https://i.imgur.com/ip6D2CB.jpg,10,true,15.99,2,93 +18,Soda can sweater,what flavor soda is this? who knows! it's wearing a sweater!,https://i.imgur.com/lePK3ig.jpg,10,true,10.5,3,34 +19,Beer sweater,sold in pairs so you can enjoy with a pal,https://i.imgur.com/Ewu6uNB.jpg,10,true,20,4,34 +20,Long sleeved mug sweater,for extra cold days and extra hot tea,https://i.imgur.com/BJVxg0i.jpg,10,true,50,5,345 +21,Egg sweater,keep the yolks nice and toasty,https://i.imgur.com/TTxB1n4.jpg,10,true,10.5,6,35 +22,Kleenex sweater,a handsome sweater,https://i.imgur.com/n9oucfw.jpg,10,true,10.5,4,3 +23,Wine sweater,dapper and delicious,https://i.imgur.com/WpwsxiR.jpg,10,true,19.99,3,34 +24,Penguin sweater,they need 'em,https://i.imgur.com/CGcuJ6Q.jpg,10,true,10.5,2,2 +25,Snail sweater,possibly also a hat for a mouse,https://i.imgur.com/avhUZ6E.jpg,10,true,20.99,3,2 +26,Potted plant sweater,plant not included.,https://i.imgur.com/OPdj0kf.jpg,10,true,12.5,3,93 +27,Hot bottle sweater,keep your hot water bottle extra warm,https://i.imgur.com/59fmaYu.jpg,10,true,11.5,4,57 +28,French press sweater,rumor has it this makes your coffee taste even better,https://i.imgur.com/wkBWB5h.jpg,10,true,12.5,5,34 +29,Banana sweater,keep your breakfast cozy,https://i.imgur.com/yakLhKh.jpg,10,true,7.99,6,1 +30,Toilet Roll sweater,what a happy color,https://i.imgur.com/EbGakCS.jpg,10,true,14.5,7,378 +31,Maker's Mark sweater,refined and cozy,https://i.imgur.com/jKmfiea.jpg,10,true,9.99,4,34 +32,Bonsai sweater,bonsai tree,https://i.imgur.com/tbkYW7H.jpg,10,true,150,2,398 \ No newline at end of file From 626f2e1413bfb055c637d0926742396180b5d3ce Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 17 Jun 2020 20:25:53 -0700 Subject: [PATCH 276/367] fixed manifest file to compile css and scss --- app/assets/config/manifest.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js index 591819335f..8b0353f7e6 100644 --- a/app/assets/config/manifest.js +++ b/app/assets/config/manifest.js @@ -1,2 +1,3 @@ //= link_tree ../images -//= link_directory ../stylesheets .css +//= link application.css +//= link application.scss \ No newline at end of file From 056fc1385f5baa01a0d17321073df05c5976744a Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Wed, 17 Jun 2020 20:47:21 -0700 Subject: [PATCH 277/367] made some changes --- .DS_Store | Bin 0 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Wed, 17 Jun 2020 20:55:13 -0700 Subject: [PATCH 278/367] fixed merchant uid seed data --- db/seed_data/merchants.csv | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/db/seed_data/merchants.csv b/db/seed_data/merchants.csv index 3707924675..82619efd0b 100644 --- a/db/seed_data/merchants.csv +++ b/db/seed_data/merchants.csv @@ -1,8 +1,8 @@ id,email,username,uid,provider -1,joe@email.com,joe3928,1,github -2,bob@email.com,bob2948,2,github -3,plant_witch@email.com,plantwitch,3,github -4,jimothy_jameson@email.com,jimothy_jameson,4,github -5,elvy@email.com,meowfromspace,5,github -6,picchu@email.com,picchuuu,6,github -7,tatertot@email.com,tatertot123,7,github \ No newline at end of file +1,joe@email.com,joe3928,joeuid,github +2,bob@email.com,bob2948,bobuid,github +3,plant_witch@email.com,plantwitch,witchuid,github +4,jimothy_jameson@email.com,jimothy_jameson,jimothyuid,github +5,elvy@email.com,meowfromspace,elvyuid,github +6,picchu@email.com,picchuuu,picchuuid,github +7,tatertot@email.com,tatertot123,tateruid,github \ No newline at end of file From 1ddbf3a5966d507b12e99d5b53ecea5558922c71 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 17 Jun 2020 21:06:07 -0700 Subject: [PATCH 279/367] removed id from merchant seed data --- db/seed_data/merchants.csv | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/db/seed_data/merchants.csv b/db/seed_data/merchants.csv index 82619efd0b..7baa15faf8 100644 --- a/db/seed_data/merchants.csv +++ b/db/seed_data/merchants.csv @@ -1,8 +1,8 @@ -id,email,username,uid,provider -1,joe@email.com,joe3928,joeuid,github -2,bob@email.com,bob2948,bobuid,github -3,plant_witch@email.com,plantwitch,witchuid,github -4,jimothy_jameson@email.com,jimothy_jameson,jimothyuid,github -5,elvy@email.com,meowfromspace,elvyuid,github -6,picchu@email.com,picchuuu,picchuuid,github -7,tatertot@email.com,tatertot123,tateruid,github \ No newline at end of file +email,username,uid,provider +joe@email.com,joe3928,joeuid,github +bob@email.com,bob2948,bobuid,github +plant_witch@email.com,plantwitch,witchuid,github +jimothy_jameson@email.com,jimothy_jameson,jimothyuid,github +elvy@email.com,meowfromspace,elvyuid,github +picchu@email.com,picchuuu,picchuuid,github +tatertot@email.com,tatertot123,tateruid,github \ No newline at end of file From 108c02812df55787fefe68cfe092984cf8105b35 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 17 Jun 2020 21:27:22 -0700 Subject: [PATCH 280/367] add ds_store to gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 26db76bb61..1b6069c887 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,6 @@ config/secrets/* yarn-debug.log* .yarn-integrity coverage -.env \ No newline at end of file +.env + +.DS_Store \ No newline at end of file From 5f3507c36c97029aec66eb77839c016abf0467e1 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Wed, 17 Jun 2020 21:38:39 -0700 Subject: [PATCH 281/367] Fixed bugs in Review controller. --- app/assets/stylesheets/dashboard.scss | 4 ++-- app/controllers/reviews_controller.rb | 6 ++++++ test/controllers/reviews_controller_test.rb | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/dashboard.scss b/app/assets/stylesheets/dashboard.scss index c271793856..3dc9147849 100644 --- a/app/assets/stylesheets/dashboard.scss +++ b/app/assets/stylesheets/dashboard.scss @@ -4,11 +4,11 @@ } .col-md-4 { - background: lighten($merchants-tertiary-color,1%); + background: lighten($merchants-tertiary-color, 1%); } .col-md-8 { - background: lighten($merchants-tertiary-color,2%); + background: lighten($merchants-tertiary-color, 2%); } li { diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index ce86ccd361..430d78bcd6 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -37,6 +37,12 @@ def create def merchant_reviews product = Product.find_by(id: merchant_review_params) + if !product + flash[:warning] = "Product not found!" + redirect_to products_path + return + end + # if there is a merchant logged in if product&.merchant == @current_merchant flash[:warning] = "You can't review your own product!" diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 3796200de9..1af7f5387b 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -54,7 +54,7 @@ product_id: -1 } - post new_product_review_path(-1), params: { review: bad_review } + post product_reviews_path(-1), params: { review: bad_review } #expect(flash[:danger]).must_equal "Something went wrong with the reviewing process." must_redirect_to products_path end From c2e53ba36fdbaa75c4ee88b27a7e074efff95169 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 17 Jun 2020 22:04:09 -0700 Subject: [PATCH 282/367] added close button to alerts, fixed landing spacing --- app/assets/stylesheets/landing.scss | 2 +- app/views/layouts/_alert.html.erb | 33 ++++++++++++-------------- app/views/layouts/application.html.erb | 16 ++++++++++--- app/views/pages/landing.html.erb | 10 ++------ 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 62fbcff8dc..69f987732e 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -32,7 +32,7 @@ font-weight: normal; font-size: 36px; line-height: 47px; - margin: 16vh; + margin: 10vh; text-align: right; } diff --git a/app/views/layouts/_alert.html.erb b/app/views/layouts/_alert.html.erb index 57095de310..25aa0fbc29 100644 --- a/app/views/layouts/_alert.html.erb +++ b/app/views/layouts/_alert.html.erb @@ -1,31 +1,28 @@ <% flash.each do |type, message| %> <% next if type == 'details' %> -
      -
      - <%= message %> - <% if flash[:details] %> +
      + <%= message %> + <% if flash[:details] %>
        - <% flash[:details].each do |msg| %> - <% msg %> - <% if !msg[1].empty? %> -
      • <%= msg %>
      • + <% flash[:details].each do |msg| %> + <% msg %> + <% if !msg[1].empty? %> +
      • <%= msg %>
      • + <% end %> <% end %> - <% end %>
      <% end %> <% if flash[:errors] %>
        - <% flash[:errors].each do |error| %> -
      • <%= error %>
      • - - <% end %> + <% flash[:errors].each do |error| %> +
      • <%= error %>
      • + <% end %>
      <% end %> - - - -
      -
      + +
      <% end %> \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 8e92973857..6ee70f2746 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -13,14 +13,24 @@ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> - - <%= render 'layouts/header' %> - <% if content_for?(:headline) %> +
      + <%= render 'layouts/header' %> + <% if content_for?(:headline) %>

      <%= yield(:headline) %>

      <% end %> +
      + +
      <%= render 'layouts/alert' %> <%= yield %> +
      + +
      +
      + <%= link_to raw("Meet the team ❤"), team_path %> +
      +
      diff --git a/app/views/pages/landing.html.erb b/app/views/pages/landing.html.erb index df6a3878d1..d930f9cf5c 100644 --- a/app/views/pages/landing.html.erb +++ b/app/views/pages/landing.html.erb @@ -1,5 +1,4 @@ -<% content_for(:title) { 'Evergreenery - Welcome' } %> -
      +<% content_for(:title) { 'Agasalho - Welcome' } %>

      Cozy sweaters for everything,
      and we do mean everything.

      @@ -10,10 +9,5 @@
      <%= link_to "Browse all products", products_path, class: "btn btn-primary browse" %> -
      -
      -
      - <%= link_to raw("Meet the team ❤"), team_path %> -
      -
      \ No newline at end of file + From 1db236c368554d36c03e5db40108f8e241a53b5c Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 17 Jun 2020 22:05:05 -0700 Subject: [PATCH 283/367] styled header --- app/assets/stylesheets/_config.scss | 1 - app/assets/stylesheets/application.scss | 2 +- app/views/layouts/_header.html.erb | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/_config.scss b/app/assets/stylesheets/_config.scss index f95299ac42..15161800d0 100644 --- a/app/assets/stylesheets/_config.scss +++ b/app/assets/stylesheets/_config.scss @@ -22,7 +22,6 @@ $primary-color: $blue ; $secondary-color: $soft-salmon; $tertiary-color: $lilac; $highlight-color: $electric; - $merchants-tertiary-color: $dusk; diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index a2f7169270..5fa36afaac 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -51,7 +51,7 @@ h2 { .headline { color: #fff; margin: 0 auto; - padding: 80px 0 20px; + padding: 10px 0 20px; background-color: $tertiary-color; } diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 801507c5be..b0009e4c27 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -2,7 +2,7 @@ navbar structure based on https://stackoverflow.com/questions/19733447/bootstrap-navbar-with-left-center-or-right-aligned-items %> -
      -
      \ No newline at end of file + \ No newline at end of file From 92dba3808817f4527a3244aa52002022a145aaf9 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 17 Jun 2020 22:12:04 -0700 Subject: [PATCH 286/367] repositioned alert on landing --- app/assets/stylesheets/application.scss | 4 ++++ app/assets/stylesheets/landing.scss | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index e0db11c51e..84b3edc3b4 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -63,3 +63,7 @@ h4 { background-color: $merchants-tertiary-color; } +.alert { + margin-bottom: -6vh; +} + diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 69f987732e..671d9b96bd 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -10,7 +10,6 @@ .browse { margin-top: 25vh; } - } .spotlight { From 9463c1aa88bafdee9474c2cceb2b68b60a05c4cf Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 17 Jun 2020 22:15:12 -0700 Subject: [PATCH 287/367] fixed overlap of main and nav sections --- app/assets/stylesheets/application.scss | 4 ++++ app/views/layouts/application.html.erb | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 84b3edc3b4..0dadc734ed 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -42,6 +42,10 @@ body { background-color: #fff ; } +main { + margin-top: 7vh; +} + h2 { color: #1a7d6b; text-align: center; diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 6ee70f2746..bbce642fb2 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -21,8 +21,9 @@ <% end %> -
      <%= render 'layouts/alert' %> + +
      <%= yield %>
      From 8ff37c7c28bb9cc540366311dca3bd97904f4ca3 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 17 Jun 2020 22:19:48 -0700 Subject: [PATCH 288/367] removed footer from everything except landing --- app/views/layouts/application.html.erb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index bbce642fb2..9b082e8aea 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -27,11 +27,13 @@ <%= yield %>
      + <% if action_name == "landing"%>
      <%= link_to raw("Meet the team ❤"), team_path %>
      + <% end %> From 67ea2f351337f69e46ba0480706163d90f6d4fa4 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 00:05:09 -0700 Subject: [PATCH 289/367] fixed seed errors --- db/seed_data/merchants.csv | 14 +++++------ db/seed_data/products.csv | 48 +++++++++++++++++++------------------- db/seeds.rb | 1 - 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/db/seed_data/merchants.csv b/db/seed_data/merchants.csv index 7baa15faf8..c82cb74342 100644 --- a/db/seed_data/merchants.csv +++ b/db/seed_data/merchants.csv @@ -1,8 +1,8 @@ email,username,uid,provider -joe@email.com,joe3928,joeuid,github -bob@email.com,bob2948,bobuid,github -plant_witch@email.com,plantwitch,witchuid,github -jimothy_jameson@email.com,jimothy_jameson,jimothyuid,github -elvy@email.com,meowfromspace,elvyuid,github -picchu@email.com,picchuuu,picchuuid,github -tatertot@email.com,tatertot123,tateruid,github \ No newline at end of file +joe@email.com,joe3928,1234567891,github +bob@email.com,bob2948,1234567892,github +plant_witch@email.com,plantwitch,1234567893,github +jimothy_jameson@email.com,jimothy_jameson,1234567894,github +elvy@email.com,meowfromspace,1234567895,github +picchu@email.com,picchuuu,1234567896,github +tatertot@email.com,tatertot123,1234567897,github \ No newline at end of file diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv index 624c4303ed..2f4f5449b8 100644 --- a/db/seed_data/products.csv +++ b/db/seed_data/products.csv @@ -1,33 +1,33 @@ id,name,description,photo,stock,active,price,merchant_id,category_ids -1,Sphynx sweater,grey with pompoms,https://i.imgur.com/0aPXiCh.jpg,5,true,100,1,28 -2,Tito's Vodka sweater,vodka sweater,https://i.imgur.com/hMcGBdX.jpg,5,true,20,1,435 -3,Pear sweater,pear sweater,https://i.imgur.com/UUy6Zgl.jpg,10,true,3,5,15 -4,Traffic cone sweater,traffic cones get cold too,https://i.imgur.com/oepFWln.png,3,true,10.50,2,78 -5,Teapot sweater,for keeping your tea warm,https://i.imgur.com/7fEu0Iq.jpg,12,true,35.99,2,345 -6,Laptop sweater,for laptops,https://i.imgur.com/IiIGJmm.jpg,20,true,75,3,56 -7,Jar sweater,now with a pocket!,https://i.imgur.com/HsKpvyl.jpg,2,true,14.99,2,3 -8,Pumpkin spice latte sweater,you know what season it is,https://i.imgur.com/oV0IIzY.png,5,true,23,7,45 -9,Snake sweater,with sleeves,https://i.imgur.com/VipCUDK.jpg,6,true,20,6,28 -10,Cell phone sweater,pink ombre wow,https://i.imgur.com/RfH1meY.jpg,20,true,13.50,7,56 -11,Drink glass sweater,chill your drinks warm your soul,https://i.imgur.com/iZGmpi9.jpg,22,true,20,6,45 -12,Lawn flamingo sweater,year round festivity,https://i.imgur.com/FNF1yvy.jpg,50,true,3,4,378 -13,Cake sweater,this definitely counts,https://i.imgur.com/uujvsAw.jpg,4,true,10,6,8 -14,Cold brew sweater,for ice coffee in December,https://i.imgur.com/iiGV5Au.jpg,10,true,6,1,45 -15,Keys sweater,keys also get cold,https://i.imgur.com/wd4etxh.jpg,12,true,30,5,567 -16,Ice cream pint sweater,ice cream should be cold,https://i.imgur.com/qrQXaQF.jpg,10,true,49.99,1,3 -17,Sequoia tree sweater,grow big n strong lil buddy,https://i.imgur.com/ip6D2CB.jpg,10,true,15.99,2,93 +1,Sphynx sweater,"99% cotton, 1% catnip. For cats who need to chill out and warm up at the same time.",https://i.imgur.com/0aPXiCh.jpg,5,true,100,1,28 +2,Tito's Vodka sweater,"What's better than a vodka martini? A vodka martini made with a bottle of Tito's wearing a sweater. Time to shake AND stir.",https://i.imgur.com/hMcGBdX.jpg,5,true,20,1,435 +3,Pear sweater,"The fibers in this pear sweater were specially selected to ensure the best possible pairing for your pear...",https://i.imgur.com/UUy6Zgl.jpg,10,true,3,5,15 +4,Traffic cone sweater,Traffic cones wearing sweaters are 3x more visible and 200% cuter.,https://i.imgur.com/oepFWln.png,3,true,10.50,2,78 +5,Teapot sweater,I'm a little teapot short and cozy,https://i.imgur.com/7fEu0Iq.jpg,12,true,35.99,2,345 +6,Laptop sweater,The turtleneck area (???) of the sweater is perfect for storing your charger.,https://i.imgur.com/IiIGJmm.jpg,20,true,75,3,56 +7,Jar sweater,LOOK IT HAS A POCKET! Keep the contents of your jam jar a surprise. Is it strawberry? Is it grape? Is it actually a jar of pickles? No one will know and that's what makes it fun.,https://i.imgur.com/HsKpvyl.jpg,2,true,14.99,2,3 +8,Pumpkin spice latte sweater,you know what season it is and so does this seasonably available sweater,https://i.imgur.com/oV0IIzY.png,5,true,23,7,45 +9,Snake sweater,For the discerning snake who appreciates the aesthetic of sweater sleeves,https://i.imgur.com/VipCUDK.jpg,6,true,20,6,28 +10,Cell phone sweater,"Protects your phone from damage, prying eyes, and cold weather.",https://i.imgur.com/RfH1meY.jpg,20,true,13.50,7,56 +11,Drink glass sweater,Chill your drinks warm your soul with this handcrafted sweater for drinking glasses.,https://i.imgur.com/iZGmpi9.jpg?1,22,true,20,6,45 +12,Lawn flamingo sweater,"Year round festivity. Weatherproof. Fits all sizes of lawn flamingo.",https://i.imgur.com/FNF1yvy.jpg,50,true,3,4,378 +13,Cake sweater,this definitely counts as a sweater except don't put it in the wash,https://i.imgur.com/uujvsAw.jpg,4,true,10,6,8 +14,Cold brew sweater,Sometimes you want an iced coffee in the winter and sometimes you'd like that iced coffee to be cozy too.,https://i.imgur.com/iiGV5Au.jpg?1,10,true,6,1,45 +15,Keys sweater,Never fumble for the right key again with this assortment of sweaters for your keys.,https://i.imgur.com/wd4etxh.jpg,12,true,30,5,567 +16,Ice cream pint sweater,A sweater-tuxedo for a pint of your favorite ice cream.,https://i.imgur.com/qrQXaQF.jpg,10,true,49.99,1,3 +17,Sequoia tree sweater,Enough sleeves to support baby trees so that they can grow big and strong and cozy.,https://i.imgur.com/ip6D2CB.jpg,10,true,15.99,2,93 18,Soda can sweater,what flavor soda is this? who knows! it's wearing a sweater!,https://i.imgur.com/lePK3ig.jpg,10,true,10.5,3,34 19,Beer sweater,sold in pairs so you can enjoy with a pal,https://i.imgur.com/Ewu6uNB.jpg,10,true,20,4,34 20,Long sleeved mug sweater,for extra cold days and extra hot tea,https://i.imgur.com/BJVxg0i.jpg,10,true,50,5,345 21,Egg sweater,keep the yolks nice and toasty,https://i.imgur.com/TTxB1n4.jpg,10,true,10.5,6,35 -22,Kleenex sweater,a handsome sweater,https://i.imgur.com/n9oucfw.jpg,10,true,10.5,4,3 +22,Kleenex sweater,Finally a tissue box that you can hug,https://i.imgur.com/n9oucfw.jpg,10,true,10.5,4,3 23,Wine sweater,dapper and delicious,https://i.imgur.com/WpwsxiR.jpg,10,true,19.99,3,34 -24,Penguin sweater,they need 'em,https://i.imgur.com/CGcuJ6Q.jpg,10,true,10.5,2,2 +24,Penguin sweater,Please measure your penguin carefully before ordering to ensure proper fit.,https://i.imgur.com/CGcuJ6Q.jpg,10,true,10.5,2,2 25,Snail sweater,possibly also a hat for a mouse,https://i.imgur.com/avhUZ6E.jpg,10,true,20.99,3,2 -26,Potted plant sweater,plant not included.,https://i.imgur.com/OPdj0kf.jpg,10,true,12.5,3,93 +26,Potted plant sweater,Plant not included but cozy vibes are absolutely included.,https://i.imgur.com/OPdj0kf.jpg,10,true,12.5,3,93 27,Hot bottle sweater,keep your hot water bottle extra warm,https://i.imgur.com/59fmaYu.jpg,10,true,11.5,4,57 28,French press sweater,rumor has it this makes your coffee taste even better,https://i.imgur.com/wkBWB5h.jpg,10,true,12.5,5,34 -29,Banana sweater,keep your breakfast cozy,https://i.imgur.com/yakLhKh.jpg,10,true,7.99,6,1 -30,Toilet Roll sweater,what a happy color,https://i.imgur.com/EbGakCS.jpg,10,true,14.5,7,378 -31,Maker's Mark sweater,refined and cozy,https://i.imgur.com/jKmfiea.jpg,10,true,9.99,4,34 -32,Bonsai sweater,bonsai tree,https://i.imgur.com/tbkYW7H.jpg,10,true,150,2,398 \ No newline at end of file +29,Banana sweater,"Sold as single units, so be sure to stock up for that bunch of bananas sitting in your fruit basket.",https://i.imgur.com/yakLhKh.jpg,10,true,7.99,6,1 +30,Toilet roll sweater,This sweater is almost as precious as the toilet paper inside of it.,https://i.imgur.com/EbGakCS.jpg,10,true,14.5,7,378 +31,Maker's Mark sweater,I like my whiskey the way I like my bananas: wearing a sweater.,https://i.imgur.com/jKmfiea.jpg,10,true,9.99,4,34 +32,Bonsai sweater,Meticulously crafted to match the elegant grace of any bonsai tree.,https://i.imgur.com/tbkYW7H.jpg,10,true,150,2,398 \ No newline at end of file diff --git a/db/seeds.rb b/db/seeds.rb index a6097500d0..1e3d4e8761 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -7,7 +7,6 @@ merchant_failures = [] CSV.foreach(MERCHANT_FILE, :headers => true) do |row| merchant = Merchant.new - merchant.id = row['id'] merchant.email = row['email'] merchant.username = row['username'] merchant.uid = row['uid'] From 2eeee6133714c42e785212abe10bdf9f67eb5528 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 00:19:00 -0700 Subject: [PATCH 290/367] minor styling edits --- app/assets/stylesheets/application.scss | 4 ---- app/assets/stylesheets/dashboard.scss | 1 + 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 0dadc734ed..028843421c 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -52,10 +52,6 @@ h2 { margin: 20px 0 50px; } -h4 { - text-align: center; -} - .headline { color: #fff; margin: 0 auto; diff --git a/app/assets/stylesheets/dashboard.scss b/app/assets/stylesheets/dashboard.scss index c238ea91be..b9b21db019 100644 --- a/app/assets/stylesheets/dashboard.scss +++ b/app/assets/stylesheets/dashboard.scss @@ -30,6 +30,7 @@ } h4 { + text-align: center; margin: 20px; color: darken($merchants-tertiary-color,20%) } From 4668dcf3256d54ec389fa51dd086c204a8de2725 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 00:19:52 -0700 Subject: [PATCH 291/367] fixed titles and details display --- app/controllers/application_controller.rb | 5 +++++ app/views/products/index.html.erb | 2 +- app/views/reviews/new.html.erb | 5 +++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d81c52de66..a4d61232b9 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -24,6 +24,11 @@ def current_merchant Merchant.find_by(id: session[:merchant_id]) end + def current_product + @current_product ||= params[:product_id] && + Product.find_by(id: params[:product_id]) + end + def require_login if current_merchant.nil? redirect_to root_path diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 9158047764..b5224af691 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,4 +1,4 @@ -<% content_for(:title) { 'Evergreenery - Browse Products' } %> +<% content_for(:title) { 'Browse Products' } %> <% content_for(:headline) { @filters.count > 0 ? "Showing Products for #{@filters.join(', ')}" : "Products" } %>
      diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index ea14f0ea9a..ac494759d5 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -1,8 +1,9 @@ -

      Add Review

      +<% content_for(:title) { "Write A Review" } %> +<% content_for(:headline) { "Write A Review" } %>
      <%= form_with(model: @review, url: product_reviews_path) do |form| %> -

      Please enter your review for product: <%= params[:product_id] %>

      +

      Please enter your review for product: <%= Product.find_by(id: params[:product_id]).name %>

      <%= form.label :rating, class: 'control-label' %> <%= form.select :rating, generate_select_options(1..5), {selected:5}, class: 'form-control' %> From e1a9ed39ef0d7d17f69184d8f505f0411b5ecdc5 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 00:22:34 -0700 Subject: [PATCH 292/367] merchant login now redirects to their dashboard --- app/controllers/merchants_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 54e66902e7..8e8ab5effc 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -19,7 +19,7 @@ def login #create end session[:merchant_id] = merchant.id - return redirect_to root_path + return redirect_to dashboard_merchant_url(merchant) end def dashboard; end From c3f95c7a6477435dffe3b53243d6c8a0340a8876 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 00:42:40 -0700 Subject: [PATCH 293/367] added view details for merchants and styling --- app/assets/stylesheets/dashboard.scss | 17 +++++------- app/views/merchants/dashboard.html.erb | 2 +- app/views/merchants/manage_orders.html.erb | 30 ++++++++++++++++++---- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/app/assets/stylesheets/dashboard.scss b/app/assets/stylesheets/dashboard.scss index b9b21db019..6b7bfdc2ea 100644 --- a/app/assets/stylesheets/dashboard.scss +++ b/app/assets/stylesheets/dashboard.scss @@ -1,17 +1,12 @@ -.merchants .dashboard { - - .row:first-child{ - height: 80vh; - } +.merchants { + background-color: lighten($merchants-tertiary-color, 2%); +} +.merchants .dashboard { .col-md-4 { background: lighten($merchants-tertiary-color, 1%); } - .col-md-8 { - background: lighten($merchants-tertiary-color, 2%); - } - li { list-style: none; } @@ -20,8 +15,8 @@ border-radius: 4px; background: lighten($secondary-color, 1%); width: 70%; - margin: 4vh auto; - padding: 3vh; + margin: 3vh auto; + padding: 2vh; p { text-align: center; diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb index 02ed249e2c..14dd391b67 100644 --- a/app/views/merchants/dashboard.html.erb +++ b/app/views/merchants/dashboard.html.erb @@ -65,4 +65,4 @@
      - \ No newline at end of file +
      \ No newline at end of file diff --git a/app/views/merchants/manage_orders.html.erb b/app/views/merchants/manage_orders.html.erb index 17bd3dd84a..e292a152ae 100644 --- a/app/views/merchants/manage_orders.html.erb +++ b/app/views/merchants/manage_orders.html.erb @@ -1,8 +1,29 @@ <% content_for(:headline) { "Manage Orders"} %> -
      -

      Manage Orders

      - + +
      +
      +
      +

      <%= number_to_currency(@current_merchant.revenue)%>

      +

      Total Orders

      +
      +
      +

      0

      +

      Orders Pending

      +
      +
      +

      0

      +

      Orders Paid

      +
      +
      +

      0

      +

      Orders Shipped

      +
      +
      + +
      +
      +
      @@ -13,7 +34,6 @@ -

      <%= @current_merchant.username %>

      <% @current_merchant.orders.uniq.each do |order| %> @@ -29,4 +49,4 @@ <% end %>
      Order Number
      -
      \ No newline at end of file +
      \ No newline at end of file From 23ba903ab0c20b1c7bc60dc1afb936d1a88748ee Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 00:49:42 -0700 Subject: [PATCH 294/367] minor styling on products browse --- app/assets/stylesheets/products.scss | 8 ++++++++ app/views/products/index.html.erb | 2 +- app/views/shared/_product.html.erb | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index 6b83343b05..c114157772 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -1,3 +1,11 @@ .product-show-page__container { display: flex; +} + +.product-grid__product { + margin: 0 auto 6vh; + + h5 { + margin-top: 10px; + } } \ No newline at end of file diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index b5224af691..13077ac968 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,5 +1,5 @@ <% content_for(:title) { 'Browse Products' } %> -<% content_for(:headline) { @filters.count > 0 ? "Showing Products for #{@filters.join(', ')}" : "Products" } %> +<% content_for(:headline) { @filters.count > 0 ? "Showing Products for #{@filters.join(', ')}" : "Some Really Great Sweaters" } %>
      diff --git a/app/views/shared/_product.html.erb b/app/views/shared/_product.html.erb index bbf48fcb6c..f555c596f3 100644 --- a/app/views/shared/_product.html.erb +++ b/app/views/shared/_product.html.erb @@ -3,7 +3,7 @@
      <%= link_to product_url(product.id) do %> <%= image_tag(product.photo, class: "img-fluid") %> -

      <%= product.name %>

      +
      <%= product.name %>
      <%= number_to_currency(product.price) %>
      <% end %>
      From b82ea950002b8c7846fbe6b476e40324e0a1376a Mon Sep 17 00:00:00 2001 From: Haben Date: Thu, 18 Jun 2020 10:50:23 -0700 Subject: [PATCH 295/367] minor test edits --- test/controllers/reviews_controller_test.rb | 70 +++++++++++---------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index b5cf2ea423..75a316bc78 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -17,49 +17,51 @@ must_redirect_to product_path(product) end - # # hello - # it "should redirect to products_path" do - # bad_review = { - # rating: 8, - # comment: "bad review", - # product_id: -1 - # } - - # post new_product_review_path(-1), params: { review: bad_review } - # #expect(flash[:danger]).must_equal "Something went wrong with the reviewing process." - # must_redirect_to products_path - # end - it "can't get the review_path for a non-existent product" do - product = Product.new( - id: 1000, - name: "fake", - ) - get new_product_review_path(product) - expect(flash[:danger]).must_equal "Something went wrong with the reviewing process." - end + # it "can't get the review_path for a non-existent product" do + # product = Product.new( + # id: 1000, + # name: "fake", + # ) + # get new_product_review_path(product) + # expect(flash[:danger]).must_equal "Something went wrong with the reviewing process." + # end end - it "should create new review" do - assert_difference("Review.count") do - post product_reviews_path(product), params: { review: { rating: 5, comment: "I was happy with my daisies!", product_id: product.id } } + describe "create new review" do + it "should create new review" do + assert_difference("Review.count") do + post product_reviews_path(product), params: { review: { rating: 5, comment: "I was happy with my daisies!", product_id: product.id } } + end + + must_redirect_to product_path(product) end - must_redirect_to product_path(product) - end + it "can't create with out rating" do + assert_no_difference("Review.count") do + post product_reviews_path(product), params: { review: { rating: nil, comment: "I wasn't happy with my daisies!", product_id: product.id } } + end - it "can't create with out rating" do - assert_no_difference("Review.count") do - post product_reviews_path(product), params: { review: { rating: nil, comment: "I wasn't happy with my daisies!", product_id: product.id } } + must_respond_with :bad_request end - must_respond_with :bad_request - end + it "can't create with rating that is above 5" do + assert_no_difference("Review.count") do + post product_reviews_path(product), params: { review: { rating: 8, comment: "I was really happy with my daisies!", product_id: product.id } } + end - it "can't create with rating that is above 5" do - assert_no_difference("Review.count") do - post product_reviews_path(product), params: { review: { rating: 8, comment: "I was really happy with my daisies!", product_id: product.id } } + must_respond_with :bad_request end - must_respond_with :bad_request + it "should redirect to products_path" do + bad_review = { + rating: 8, + comment: "bad review", + product_id: 1000 + } + + post product_reviews_path(1000), params: { review: bad_review } + expect(flash[:danger]).must_equal "Something went wrong with the reviewing process." + must_redirect_to products_path + end end end From b2f199842860df2ccb47ce166e45ba17c255687e Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 10:55:31 -0700 Subject: [PATCH 296/367] minor fix to reviews controller test --- test/controllers/reviews_controller_test.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 36dda2f542..1814bb7cdd 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -58,6 +58,8 @@ comment: "bad review", product_id: 1000 } + end + end # hello it "should redirect to products_path" do From d5513400d568137bee1b63c5de47b40045fd9d39 Mon Sep 17 00:00:00 2001 From: Haben Date: Thu, 18 Jun 2020 11:02:36 -0700 Subject: [PATCH 297/367] updated rating_average helper method --- app/helpers/application_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c3f37b278c..6a40d602a6 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -18,6 +18,7 @@ def rating_average(reviews) sum += review.rating count += 1 end + return 0 if count == 0 return sum / count end From c18245b43af812fcb119878b7b318bfb9f3326c0 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 11:21:15 -0700 Subject: [PATCH 298/367] added merchant method to get orders by status --- app/models/merchant.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index dc73d8a813..d6152eb6bb 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -22,6 +22,10 @@ def self.build_from_github(auth_hash) def revenue return orders.map { |order| order.status == "pending" ? 0 : order.total_cost }.sum end + + def orders_by_status(status) + return self.orders.where(status: status) + end end From 12093cf8138d4191719f3b1ee0b32ea136ce9c0d Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 11:31:20 -0700 Subject: [PATCH 299/367] added merchant methods to calculate revenue by status --- app/models/merchant.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index d6152eb6bb..c1cbe7b9a4 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -26,6 +26,10 @@ def revenue def orders_by_status(status) return self.orders.where(status: status) end + + def revenue_by_status(status) + return orders_by_status(status).map { |order| order.total_cost }.sum + end end From 909603175fe0872a0a73575705a4c3e0235c5a88 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 11:33:33 -0700 Subject: [PATCH 300/367] updated products controller indexaction to use model functions --- app/controllers/products_controller.rb | 28 +++++--------------------- app/models/product.rb | 26 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index dc2596ef52..6ef0f57888 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -9,31 +9,13 @@ def index @filters = [] @products = [] - if params[:categories] - params[:categories].each do |c| - if Category.exists?(c) - category = Category.find(c) - @products << category.products.where(active: true) - @filters << category.name - end - end - end - - if params[:merchants] - params[:merchants].each do |m| - if Merchant.exists?(m) - @products << Product.where(merchant: m, active: true) - @filters << Merchant.find(m).username - end - end - end - - if @products.empty? - @products = Product.all.where(active: true) + if params[:categories] || params[:merchants] + results = Product.filter_products(params[:categories], params[:merchants]) + @products = results[:products] + @filters = results[:filters] else - @products.flatten!.uniq! + @products = Product.active_products end - end # GET /products/1 diff --git a/app/models/product.rb b/app/models/product.rb index edad218999..9a1265914a 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -9,4 +9,30 @@ class Product < ApplicationRecord validates :price, presence: true, numericality: { greater_than: 0, message: "must be a number greater than $0" } validates :stock, presence: true, numericality: { greater_than: 0 } + + def self.filter_products(categories, merchants) + products = [] + filters = [] + + categories.each do |c| + if Category.exists?(c) + category = Category.find(c) + products << category.products.where(active: true) + filters << category.name + end + end + + merchants.each do |m| + if Merchant.exists?(m) + products << Product.where(merchant: m, active: true) + filters << Merchant.find(m).username + end + end + + return {products: products.flatten.uniq, filters: filters} + end + + def self.active_products + Product.all.where(active: true) + end end From a2714be677d09a3e33f3a42e0e92795d8fcaa103 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 11:39:12 -0700 Subject: [PATCH 301/367] minor styling to team page --- app/views/pages/team.html.erb | 51 ++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/app/views/pages/team.html.erb b/app/views/pages/team.html.erb index a0bfe7c60b..1ff16909ff 100644 --- a/app/views/pages/team.html.erb +++ b/app/views/pages/team.html.erb @@ -1,2 +1,51 @@ <% content_for(:title) { 'About Us' } %> -<% content_for(:headline) { "About Us - Team Agasalho"} %> \ No newline at end of file +<% content_for(:headline) { "About Us - Team Agasalho"} %> + +
      + +
      + +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      + +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      + + +
      \ No newline at end of file From 77cd17b175e2ffacf0f9c1d600ea57998b37fade Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Thu, 18 Jun 2020 11:48:42 -0700 Subject: [PATCH 302/367] Fixed Confirmation html button --- app/views/orders/confirmation.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index ff44581cb6..db6ee02169 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -30,4 +30,4 @@
    • Total: <%= number_to_currency(@order.total_cost) %>
    -<%= button_to 'Browse more plants', products_path, method: :get %> \ No newline at end of file +<%= button_to 'Browse more sweaters', products_path, method: :get %> \ No newline at end of file From bc2317166826e482a64818289dbbef8f29589cc4 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 12:23:42 -0700 Subject: [PATCH 303/367] structure and style for team page --- app/assets/stylesheets/team.scss | 34 ++++++++++++++++++++++++++++++ app/views/pages/team.html.erb | 36 +++++++++++++++++++++----------- 2 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 app/assets/stylesheets/team.scss diff --git a/app/assets/stylesheets/team.scss b/app/assets/stylesheets/team.scss new file mode 100644 index 0000000000..23a8ab07fb --- /dev/null +++ b/app/assets/stylesheets/team.scss @@ -0,0 +1,34 @@ +.team { + main { + margin-top: -1vh; + background-color: $salmon; + } + .col-md-6 { + padding: 5% 5%; + } + + img { + border: 1px solid darken($salmon,30%); + border-radius: 100%; + } + + //Nikki box + .top-left { + background-color: darken($secondary-color, 10%); + } + + //Suely box + .top-right { + background-color: darken($secondary-color, 2%); + } + + //Haben box + .bottom-left { + background-color: darken($secondary-color, 20%); + } + + //Angela box + .bottom-right { + background-color: lighten($secondary-color, 2%); + } +} \ No newline at end of file diff --git a/app/views/pages/team.html.erb b/app/views/pages/team.html.erb index 1ff16909ff..3057c1c57f 100644 --- a/app/views/pages/team.html.erb +++ b/app/views/pages/team.html.erb @@ -5,21 +5,27 @@
    -
    +
    -
    +
    + nikki
    -
    +
    +
    Nikki
    +

    bio here

    -
    +
    -
    +
    + suely
    -
    +
    +
    Suely
    +

    bio here

    @@ -27,21 +33,27 @@
    -
    +
    -
    +
    + haben
    -
    +
    +
    Haben
    +

    bio here

    -
    +
    -
    +
    + angela
    -
    +
    +
    Angela
    +

    bio here

    From 48994ae873bfe29867eafba52f43008206a4e562 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 12:23:53 -0700 Subject: [PATCH 304/367] tests for new products model functions --- test/models/product_test.rb | 68 +++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 4a1db6b680..6b51f54402 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -81,4 +81,72 @@ end end + + describe "filter_products function" do + before do + @categories_ids = [categories(:flower).id, categories(:herb).id] + @merchant_ids = [merchants(:annie).id, merchants(:melba).id, merchants(:katherine).id] + end + + it 'can filter products with only category input' do + @merchant_ids = [] + results = Product.filter_products(@categories_ids, @merchant_ids) + products = results[:products] + expect( products.count ).must_equal 3 + end + + it 'can filter products with only merchant input' do + @categories_ids = [] + results = Product.filter_products(@categories_ids, @merchant_ids) + products = results[:products] + expect( products.count ).must_equal 4 + end + + it 'can filter products with category and merchant input' do + results = Product.filter_products(@categories_ids, @merchant_ids) + products = results[:products] + expect( products.count ).must_equal 4 + end + + it 'will return an empty array with no valid ids' do + results = Product.filter_products(["hi", 'cool'], ['ada', 'betsy']) + products = results[:products] + expect( products ).must_equal [] + end + + it 'will return a list of category and filter names' do + results = Product.filter_products(@categories_ids, @merchant_ids) + products = results[:products] + filter_names = results[:filters] + expect( products ).must_be_kind_of Array + expect( filter_names ).must_be_kind_of Array + expect( filter_names ).must_include "flower" + end + + it 'will return all products that are uniq' do + results = Product.filter_products(@categories_ids, @merchant_ids) + products = results[:products] + expect( products ).must_equal products.uniq + end + + it 'will only return products that are currently active' do + results = Product.filter_products(@categories_ids, @merchant_ids) + products = results[:products] + expect( products ).wont_include "cilantro" + end + end + + describe "active_products function" do + it 'can get all products that are currently active' do + products = Product.active_products + expect( products ).wont_include products(:cilantro) + expect( products ).must_include products(:mint) + expect( products.count ).must_equal 4 + end + + it 'will return all products that are uniq' do + products = Product.active_products + expect( products ).must_equal products.uniq + end + end end From e3b43eeac4451828a1fcc07afbd6d97b832f4bb9 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Thu, 18 Jun 2020 12:56:44 -0700 Subject: [PATCH 305/367] CSS background --- app/assets/stylesheets/team.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/team.scss b/app/assets/stylesheets/team.scss index 23a8ab07fb..9d6504ea67 100644 --- a/app/assets/stylesheets/team.scss +++ b/app/assets/stylesheets/team.scss @@ -19,7 +19,7 @@ //Suely box .top-right { - background-color: darken($secondary-color, 2%); + background-color: #cce6ff; } //Haben box From 277c1f0a928f74bb789e72a37a9b1f8fb9ca8c1e Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Thu, 18 Jun 2020 13:21:04 -0700 Subject: [PATCH 306/367] Border color --- app/assets/stylesheets/team.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/assets/stylesheets/team.scss b/app/assets/stylesheets/team.scss index 9d6504ea67..d5a12391f3 100644 --- a/app/assets/stylesheets/team.scss +++ b/app/assets/stylesheets/team.scss @@ -21,6 +21,9 @@ .top-right { background-color: #cce6ff; } + .top-right img { + border-color: whitesmoke; + } //Haben box .bottom-left { From 4b7f04f0b34058ece669eaf17427c68ebf204a77 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Thu, 18 Jun 2020 13:45:51 -0700 Subject: [PATCH 307/367] Changed cart view to hide the "-" link if quantity is 1, since quantity 0 is invalid. --- app/views/orders/edit.html.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index 68bc130ce5..bafce0236b 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -26,7 +26,9 @@ <%= link_to "+", order_item_path(id: order_item, order_item: { quantity: order_item.quantity + 1 } ), method: "patch"%> <%= order_item.quantity %> - <%= link_to "-", order_item_path(id: order_item, order_item: { quantity: order_item.quantity - 1 } ), method: "patch" %> + <% if order_item.quantity > 1 %> + <%= link_to "-", order_item_path(id: order_item, order_item: { quantity: order_item.quantity - 1 } ), method: "patch" %> + <% end %> <%= order_item.product.price %> <%= order_item.subtotal %> From 7c2253a6f6b0ad5f3bb43bb1bc6a26bcc4dfceb1 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Thu, 18 Jun 2020 13:50:24 -0700 Subject: [PATCH 308/367] Fixed message after emptying the shopping cart. --- 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 3481d99b6b..f3def820a2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -32,7 +32,6 @@ def destroy # Empties cart (User) @shopping_cart.destroy session[:order_id] = nil - flash[:status] = :success flash[:result_text] = "Successfully emptied shopping cart." redirect_to root_path end From f6805a4dde5829762b28786956b47290ab87a288 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 16:18:38 -0700 Subject: [PATCH 309/367] styled order confirmation page --- app/assets/stylesheets/confirmation.scss | 13 +++++ app/views/orders/confirmation.html.erb | 72 ++++++++++++++---------- 2 files changed, 56 insertions(+), 29 deletions(-) create mode 100644 app/assets/stylesheets/confirmation.scss diff --git a/app/assets/stylesheets/confirmation.scss b/app/assets/stylesheets/confirmation.scss new file mode 100644 index 0000000000..531a6c678f --- /dev/null +++ b/app/assets/stylesheets/confirmation.scss @@ -0,0 +1,13 @@ +.receipt_container { + max-width: 500px; +} + +.card-header { + background-color: pink; +} + +.card { + border-radius: 2%; + border: $electric 2px solid; +} + diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index db6ee02169..85351d3cd9 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -1,33 +1,47 @@ <% content_for(:headline) { "Order Confirmation"} %> -

    Thank you for your order!

    +

    Thank you for your order!

    +
    -

    Receipt for Order #

    -
      -
    • Submitted on: <%= @order.time_submitted %>
    • -
    • Status: <%= @order.status %>
    • -
    • - Item(s) bought: - - - - - - - - - - <% @order.order_items.each do |item| %> - - - - - - <% end %> - -
      Item NameQuantitySubtotal
      <%= link_to item.product.name, product_path(item.product) %><%= item.quantity %><%= number_to_currency(item.subtotal) %>
      -
    • -
    • Total: <%= number_to_currency(@order.total_cost) %>
    • -
    +
    +
    +
    +

    Receipt for Order #<%= @order.id %>

    +
    +
    +
    +

    + Submitted on: <%= @order.time_submitted.strftime("%A, %b %d") %> +
    + Status: <%= @order.status.capitalize %> +
    + Total: <%= number_to_currency(@order.total_cost) %> +

    + Items purchased: + + + + + + + + + + + <% @order.order_items.each do |item| %> + + + + + + <% end %> + +
    Item NameQuantitySubtotal
    <%= link_to item.product.name, product_path(item.product) %><%= item.quantity %><%= number_to_currency(item.subtotal) %>
    +
    +
    -<%= button_to 'Browse more sweaters', products_path, method: :get %> \ No newline at end of file +
    +
    + <%= button_to 'Browse more sweaters', products_path, method: :get, class:"btn btn-outline-primary btn-lg btn-block" %> +
    +
    \ No newline at end of file From d67daf298aec279dcf548d591945aabddf42f306 Mon Sep 17 00:00:00 2001 From: Haben Date: Thu, 18 Jun 2020 16:36:54 -0700 Subject: [PATCH 310/367] redirect to products_path test in reviews controller passing --- test/controllers/reviews_controller_test.rb | 33 ++++----------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 1814bb7cdd..1e24f1c402 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -12,19 +12,10 @@ it "can't review own product" do perform_login(product.merchant) - get new_product_review_path(product) + get new_product_review_path(product) # /products/{product.id}/reviews/new expect(flash[:warning]).must_equal "You can't review your own product!" must_redirect_to product_path(product) end - - # it "can't get the review_path for a non-existent product" do - # product = Product.new( - # id: 1000, - # name: "fake", - # ) - # get new_product_review_path(product) - # expect(flash[:danger]).must_equal "Something went wrong with the reviewing process." - # end end describe "create new review" do @@ -53,24 +44,10 @@ end it "should redirect to products_path" do - bad_review = { - rating: 8, - comment: "bad review", - product_id: 1000 - } + + get new_product_review_path(1000) + expect(flash[:warning]).must_equal "Product not found!" + must_redirect_to products_path end end - -# hello - it "should redirect to products_path" do - bad_review = { - rating: 8, - comment: "bad review", - product_id: -1 - } - - post product_reviews_path(-1), params: { review: bad_review } - #expect(flash[:danger]).must_equal "Something went wrong with the reviewing process." - must_redirect_to products_path - end end From b17b1f5a3820a358ae073bba1ec1bfc18076a570 Mon Sep 17 00:00:00 2001 From: Haben Date: Thu, 18 Jun 2020 16:37:28 -0700 Subject: [PATCH 311/367] added more styling to reviews view --- app/assets/stylesheets/reviews.scss | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss index fa846f42d3..34074cf7ae 100644 --- a/app/assets/stylesheets/reviews.scss +++ b/app/assets/stylesheets/reviews.scss @@ -15,11 +15,14 @@ span.rating-empty-stars { padding: 1em; } - - -.reviews { +.review { background-color: lightgray; padding: 1em; border-radius: 1em; + margin-bottom: 1em; + +} +form.button_to { + display: inline; } \ No newline at end of file From df733e1cbac43632975677b19787bab2aabf5c22 Mon Sep 17 00:00:00 2001 From: Haben Date: Thu, 18 Jun 2020 16:37:46 -0700 Subject: [PATCH 312/367] refactored new action for review controller --- app/controllers/reviews_controller.rb | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 430d78bcd6..7c8eb434a7 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -2,26 +2,18 @@ class ReviewsController < ApplicationController before_action :merchant_reviews, only:[:new, :create] def new - - if params[:product_id] && Product.find_by(id: params[:product_id]) - # Nested route: /product/:product_id/reviews/new - - @review = Review.new - else - redirect_to products_path - flash[:danger] = "Something went wrong with the reviewing process." - end + @review = Review.new end def create @review = Review.new(review_params) - @review.product_id = params[:product_id] + @review.product = @product if @review.save flash[:success] = "Thank you! Your review has been successfully added" - redirect_to product_path(params[:product_id]) + redirect_to product_path(@product) return else flash.now[:danger] = request.params @@ -36,17 +28,16 @@ def create def merchant_reviews - product = Product.find_by(id: merchant_review_params) - if !product + @product = Product.find_by(id: merchant_review_params) + unless @product flash[:warning] = "Product not found!" redirect_to products_path return end - # if there is a merchant logged in - if product&.merchant == @current_merchant + if @product&.merchant == @current_merchant flash[:warning] = "You can't review your own product!" - redirect_to product_path(product) + redirect_to product_path(@product) end end From d3b005ec4f0f370950995f70fd146690f63318e9 Mon Sep 17 00:00:00 2001 From: Haben Date: Thu, 18 Jun 2020 16:39:47 -0700 Subject: [PATCH 313/367] refactored rating_average helper method --- app/helpers/application_helper.rb | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 6a40d602a6..4d7cd7967e 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -12,22 +12,12 @@ def generate_select_options(range) end def rating_average(reviews) - sum = 0 - count = 0 - reviews.each do |review| - sum += review.rating - count += 1 + return 0 if reviews.empty? + + sum = reviews.reduce(0)do |sum,review| + sum + review.rating end - return 0 if count == 0 - return sum / count - end - - def rating_count(reviews) - count = 0 - reviews.each do |review| - count += 1 - end - return count + sum / reviews.count end end From e2019fcddc5c7ed61d5c07039b4c5441487ee77c Mon Sep 17 00:00:00 2001 From: Haben Date: Thu, 18 Jun 2020 16:40:18 -0700 Subject: [PATCH 314/367] deleted js file for styling stars --- app/javascript/rateyo/index.js | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 app/javascript/rateyo/index.js diff --git a/app/javascript/rateyo/index.js b/app/javascript/rateyo/index.js deleted file mode 100644 index 45ed748d36..0000000000 --- a/app/javascript/rateyo/index.js +++ /dev/null @@ -1,7 +0,0 @@ -$(function () { - - $("#rateYo").rateYo({ - starWidth: "40px" - }); - -}); \ No newline at end of file From 7226b20027fba21a40504b803f4aa35492edfcca Mon Sep 17 00:00:00 2001 From: Haben Date: Thu, 18 Jun 2020 16:41:10 -0700 Subject: [PATCH 315/367] refactored reviews show method --- app/views/products/show.html.erb | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index e6d614ab94..c45e682f4e 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -11,26 +11,29 @@

    <%= @product.name %> - <%= number_to_currency(@product.price) %>

    <%= @product.description %>

    <%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary' %> - <%= button_to 'Edit', edit_product_path(@product), method: :get, class: 'btn btn-info btn-sm' %> + <%= button_to 'Edit Product', edit_product_path(@product), method: :get, class: 'btn btn-info' %>
    <% unless product_owned_by_merchant?(@product) %> - <%# <% text = "Add Review for " + @product.name%> +

    + <% if @product.reviews.count > 1 %> <%= rating_as_stars(rating_average(@product.reviews)) %> - (<%= rating_count(@product.reviews) %>) - Add Review for <%= link_to @product.name, new_product_review_path(@product) %> -

    + (Average of <%= @product.reviews.count %> reviews) + <% end %> + <%= link_to "Add Review", new_product_review_path(@product) %> + +

    <% end %> <% @product.reviews.each do |review| %> -
    +

    <%= rating_as_stars(review.rating) %> on <%= review.created_at.strftime('%-d %B %Y') %> <%= review.comment %>

    -

    + <% end %>
    From 1ca16995ab5d57f80088c40ed427f04dc89bf5ae Mon Sep 17 00:00:00 2001 From: Haben Date: Thu, 18 Jun 2020 16:42:17 -0700 Subject: [PATCH 316/367] refactored reviews new view --- app/views/reviews/new.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index ac494759d5..42095ccb6b 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -2,8 +2,8 @@ <% content_for(:headline) { "Write A Review" } %>
    -<%= form_with(model: @review, url: product_reviews_path) do |form| %> -

    Please enter your review for product: <%= Product.find_by(id: params[:product_id]).name %>

    +<%= form_with(model: @review, url: product_reviews_path(@product)) do |form| %> +

    Please enter your review for product: <%= @product.name %>

    <%= form.label :rating, class: 'control-label' %> <%= form.select :rating, generate_select_options(1..5), {selected:5}, class: 'form-control' %> From 3cddc60e4af998a4d683f31dae8f5f5e3b65677d Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 16:57:01 -0700 Subject: [PATCH 317/367] adding Order model method for filtering items by merchants --- app/controllers/orders_controller.rb | 6 +++++- app/models/order.rb | 12 +++++++++++- app/views/orders/show.html.erb | 3 ++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 3481d99b6b..ceb113ac1c 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -2,6 +2,10 @@ class OrdersController < ApplicationController before_action :find_order, only: [:show, :complete, :cancel, :confirmation] + + def show + end + def edit # Shows cart, updates credit card/address/email and confirms checkout (User) end @@ -82,7 +86,7 @@ def find_order if !@order flash[:status] = :failure flash[:result_text] = "Could not find order." - redirect_to orders_path + redirect_to orders_path end end diff --git a/app/models/order.rb b/app/models/order.rb index 6d844a8df7..2d9cbb3f22 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -50,5 +50,15 @@ def total_cost end return total end - + + def empty? + return order_items.count == 0 + end + + + # this method should return a list of Order Items in this Order + # where the Order Item contains a Product that belongs to the current_merchant + def order_items_by_merchant(current_merchant) + # return self.order_items.where(product inside that Order_Item belongs to current_merchant) + end end \ No newline at end of file diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 9a34dc13ef..31f90dc38e 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -4,7 +4,7 @@

    Status: <%= @order.status %>

    Items: <%= @order.order_items.size %>

    Total Cost: <%= @order.total_cost %>

    - +

    Current merchant: <%= @current_merchant.username %>

    Items

    @@ -17,6 +17,7 @@ + <% @order.order_items.each do |order_item| %> From b62714d097c8a5bfe9e49724a9dec42478eb5356 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 16:57:40 -0700 Subject: [PATCH 318/367] more dashboard styling --- app/assets/stylesheets/_config.scss | 5 ++- app/assets/stylesheets/application.scss | 4 ++ app/views/merchants/_orders_table.html.erb | 26 +++++++++++++ app/views/merchants/manage_orders.html.erb | 43 +++++++--------------- 4 files changed, 47 insertions(+), 31 deletions(-) create mode 100644 app/views/merchants/_orders_table.html.erb diff --git a/app/assets/stylesheets/_config.scss b/app/assets/stylesheets/_config.scss index 15161800d0..f39c6fc7c3 100644 --- a/app/assets/stylesheets/_config.scss +++ b/app/assets/stylesheets/_config.scss @@ -12,7 +12,7 @@ $electric: #0DD7F2; // Derivative colors //----------------------------- $light-dusk: lighten($dusk, 50%); //#B6C1E7 -$light-strawberry: lighten($strawberry, 50%); +$light-strawberry: saturate($strawberry, 20%); @@ -21,7 +21,10 @@ $light-strawberry: lighten($strawberry, 50%); $primary-color: $blue ; $secondary-color: $soft-salmon; $tertiary-color: $lilac; + $highlight-color: $electric; +$highlight-warning-color: $light-strawberry; + $merchants-tertiary-color: $dusk; diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 028843421c..dd7d35c36d 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -67,3 +67,7 @@ h2 { margin-bottom: -6vh; } +.warning { + color: $highlight-warning-color; +} + diff --git a/app/views/merchants/_orders_table.html.erb b/app/views/merchants/_orders_table.html.erb new file mode 100644 index 0000000000..7d25fd618b --- /dev/null +++ b/app/views/merchants/_orders_table.html.erb @@ -0,0 +1,26 @@ +
    <%= link_to order_item.product.name, product_path(order_item.product) %>
    + + + + + + + + + + + + <% @current_merchant.orders.uniq.each do |order| %> + + + + + + + <% if order.status == 'paid' %> + + <% end %> + + <% end %> + +
    Order NumberOrder TimeItems CountTotal CostStatus
    <%= link_to "##{order.id}", order_path(order) %><%= order.time_submitted %><%= order.order_items.count %> <%= number_to_currency(order.total_cost) %><%= order.status %><%= button_to "Complete Order", order_complete_path(order) %>
    \ No newline at end of file diff --git a/app/views/merchants/manage_orders.html.erb b/app/views/merchants/manage_orders.html.erb index e292a152ae..b9353c7357 100644 --- a/app/views/merchants/manage_orders.html.erb +++ b/app/views/merchants/manage_orders.html.erb @@ -4,49 +4,32 @@
    -

    <%= number_to_currency(@current_merchant.revenue)%>

    +

    <%= @current_merchant.orders.count %>

    Total Orders

    +

    <%= number_to_currency(@current_merchant.revenue)%>

    -

    0

    +

    <%= @current_merchant.orders_by_status(:pending).count%>

    Orders Pending

    +

    0%>"><%= number_to_currency(@current_merchant.revenue_by_status(:pending)) %>

    -

    0

    +

    <%= @current_merchant.orders_by_status(:paid).count%>

    Orders Paid

    +

    <%= number_to_currency(@current_merchant.revenue_by_status(:paid)) %>

    -

    0

    +

    <%= @current_merchant.orders_by_status(:complete).count%>

    Orders Shipped

    +

    <%= number_to_currency(@current_merchant.revenue_by_status(:complete)) %>

    - - - - - - - - - - - - - <% @current_merchant.orders.uniq.each do |order| %> - - - - - - <% if order.status == 'paid' %> - - <% end %> - - <% end %> - -
    Order NumberOrder TimeItems CountTotal $Status
    <%= link_to order.id, orders_path(order) %><%= order.time_submitted %><%= order.order_items.count %> - <%= order.total_cost %><%= order.status %><%= button_to "Complete Order", order_complete_path(order) %>
    + <% if @current_merchant.orders.count == 0 %> +

    No orders to display.

    + <% else %> + <%= render "orders_table" %> + <% end %>
    \ No newline at end of file From 0543a847c248b6850396669735ff1c95a399e877 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 16:58:59 -0700 Subject: [PATCH 319/367] styled product details page --- app/assets/stylesheets/products.scss | 21 ++++++++++++++- app/views/products/show.html.erb | 38 +++++++++++++--------------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index c114157772..2a838786b5 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -8,4 +8,23 @@ h5 { margin-top: 10px; } -} \ No newline at end of file +} + +.top_buttons { + max-width: 300px; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: flex-end; +} + +.btn-secondary { + border-color: $secondary-color; + background-color: $secondary-color; +} + +.btn-secondary:hover { + border-color: darken($secondary-color, 10%); + background-color: darken($secondary-color, 5%); +} + diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index e6d614ab94..f94b265856 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -8,36 +8,32 @@
    -

    <%= @product.name %> - <%= number_to_currency(@product.price) %>

    -

    <%= @product.description %>

    - <%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary' %> - <%= button_to 'Edit', edit_product_path(@product), method: :get, class: 'btn btn-info btn-sm' %> +

    <%= @product.name %> - <%= number_to_currency(@product.price) %>

    +

    <%= @product.description %>

    +
    + <%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary btn-lg' %> + <%= button_to 'Leave a Review', new_product_review_path(@product), method: :get, class: 'btn btn-secondary btn-md' %> +
    +
    + <%= button_to 'Back to Products', products_path, class: 'btn btn-outline-secondary btn-md' %> +
    <% unless product_owned_by_merchant?(@product) %> - <%# <% text = "Add Review for " + @product.name%> -

    - <%= rating_as_stars(rating_average(@product.reviews)) %> - (<%= rating_count(@product.reviews) %>) - Add Review for <%= link_to @product.name, new_product_review_path(@product) %> +

    + <%= rating_as_stars(rating_average(@product.reviews)) %> + (<%= rating_count(@product.reviews) %>) + <%= rating_count(@product.reviews) == 0 ? "No reviews for " : "Reviews for "%><%= @product.name %>

    <% end %> <% @product.reviews.each do |review| %> -
    -

    <%= rating_as_stars(review.rating) %> on <%= review.created_at.strftime('%-d %B %Y') %> <%= review.comment %>

    +
    +

    <%= rating_as_stars(review.rating) %> on <%= review.created_at.strftime('%-d %B %Y') %> <%= review.comment %>

    +
    + <% end %>
    -

    - <% end %> -
    - - -<%= link_to 'Edit', edit_product_path(@product) %> | -<%= link_to 'Back', products_path %> - - - From 6e4834829f8663950343b743c64f4ad9bfcdc81b Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 17:26:41 -0700 Subject: [PATCH 320/367] added customer names to Orders seed file --- db/seed_data/orders.csv | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/db/seed_data/orders.csv b/db/seed_data/orders.csv index 0a675ff965..a9035c9914 100644 --- a/db/seed_data/orders.csv +++ b/db/seed_data/orders.csv @@ -1,5 +1,5 @@ -id,status,credit_card_num,credit_card_exp,credit_card_cvv,address,city,state,zip,time_submitted,customer_email -1,pending,nil,nil,nil,nil,nil,nil,nil,nil,nil -2,paid,6278,10/10,234,123 ada lane,seattle,wa,89234,2001-02-03T04:05:06+00:00,something.com -3,cancelled,nil,nil,nil,nil,nil,nil,nil,nil,nil -4,complete,8390,20/20,234,445 lovelace lane,seattle,wa,67984,2001-02-03T04:05:06+00:00,somethingelse.com +id,status,credit_card_num,credit_card_exp,credit_card_cvv,address,city,state,zip,time_submitted,customer_email,name +1,pending,nil,nil,nil,nil,nil,nil,nil,nil,nil,Ada Lovelace +2,paid,6278,10/10,234,123 ada lane,seattle,wa,89234,2001-02-03T04:05:06+00:00,something.com,Sugar Bee +3,cancelled,nil,nil,nil,nil,nil,nil,nil,nil,nil,Super Shopper +4,complete,8390,20/20,234,445 lovelace lane,seattle,wa,67984,2001-02-03T04:05:06+00:00,somethingelse.com,Mister Buyer From 1d506c41b57b9b00c19c7138ec5e2e696f6894c7 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 17:27:04 -0700 Subject: [PATCH 321/367] added column to show customer name in merchant dashboard --- app/views/merchants/_orders_table.html.erb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/views/merchants/_orders_table.html.erb b/app/views/merchants/_orders_table.html.erb index 7d25fd618b..3ace9e5382 100644 --- a/app/views/merchants/_orders_table.html.erb +++ b/app/views/merchants/_orders_table.html.erb @@ -2,6 +2,7 @@ Order Number + Customer Order Time Items Count Total Cost @@ -13,6 +14,11 @@ <% @current_merchant.orders.uniq.each do |order| %> <%= link_to "##{order.id}", order_path(order) %> + <% if order.name %> + <%= order.name %> + <% else %> + pending still + <% end %> <%= order.time_submitted %> <%= order.order_items.count %> <%= number_to_currency(order.total_cost) %> From 9ed24f5ae25da6b4e6eae826773dd4f9b04af240 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 17:27:44 -0700 Subject: [PATCH 322/367] minor info change on order detail page --- app/views/orders/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 31f90dc38e..b91052fa01 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -22,7 +22,7 @@ <%= link_to order_item.product.name, product_path(order_item.product) %> <%= order_item.quantity %> - <%= order_item.product.price %> + <%= order_item.product.price %> | owner is <%= order_item.product.merchant.username %> <%= order_item.subtotal %> <% end %> From e2bc7068b2493e31321d45ba62cfb952083a4ab1 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 18:02:36 -0700 Subject: [PATCH 323/367] removed unneeded js files --- app/javascript/packs/application.js | 1 - app/views/layouts/application.html.erb | 5 ----- 2 files changed, 6 deletions(-) diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 6e12c9ddbc..b2f85adf51 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -7,7 +7,6 @@ require("@rails/ujs").start() require("turbolinks").start() require("@rails/activestorage").start() require("channels") -require("rateyo") import "bootstrap" diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 9b082e8aea..57b0089755 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -4,11 +4,6 @@ <%= content_for?(:title) ? yield(:title) : "Agasalho - 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' %> From edb2920f7796b44816b17c4cb14dd5cc2802ea84 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 18:08:35 -0700 Subject: [PATCH 324/367] logic for showing a table if there are products to manage --- app/views/merchants/manage_products.html.erb | 81 ++++++++++---------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/app/views/merchants/manage_products.html.erb b/app/views/merchants/manage_products.html.erb index e14a4505f3..83d3cd7ad2 100644 --- a/app/views/merchants/manage_products.html.erb +++ b/app/views/merchants/manage_products.html.erb @@ -2,47 +2,50 @@
    -

    <%= "No products to view" if @current_merchant.products.empty? %>

    - - - - - - - - - - - - <% @current_merchant.products.each do |item| %> +<% if @current_merchant.products.empty? %> +

    You have no products to manage

    +
    + <%= button_to "Create Product", new_product_path, method: :get, class: 'btn btn-secondary btn-md'%> +<% else %> +
    ImageNameInventory -
    + - - - - - + + + + + + <% @current_merchant.products.each do |item| %> + + + + + + - - <% end %> - -
    <%= image_tag(item.photo, class: " thumbnail img-thumbnail img-fluid") %><%= link_to item.name, product_path(item) %><%= item.stock %> - <%= button_to 'Edit', - edit_product_path(item), - method: :get, - class: 'btn btn-info btn-md' - %> - - <% if item.active %> - <%= button_to 'Deactivate', - product_deactivate_path(item), - method: :post, - class: 'btn btn-danger btn-md' + ImageNameInventory +
    <%= image_tag(item.photo, class: " thumbnail img-thumbnail img-fluid") %><%= link_to item.name, product_path(item) %><%= item.stock %> + <%= button_to 'Edit', + edit_product_path(item), + method: :get, + class: 'btn btn-info btn-md' %> - <% else %> - <%= button_to 'Activate', + + <% if item.active %> + <%= button_to 'Deactivate', product_deactivate_path(item), method: :post, - class: 'btn btn-info btn-md' + class: 'btn btn-danger btn-md' %> - <% end %> -
    \ No newline at end of file + <% else %> + <%= button_to 'Activate', + product_deactivate_path(item), + method: :post, + class: 'btn btn-info btn-md' + %> + <% end %> + + + <% end %> + + +<% end %> \ No newline at end of file From 4376d360f09e105f48677249ccf37292afc82720 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 18:20:59 -0700 Subject: [PATCH 325/367] modified buttons on new product page --- app/assets/stylesheets/products.scss | 9 --------- app/views/products/_form.html.erb | 5 +++-- app/views/products/new.html.erb | 2 -- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index a109abfc4d..2e19c3e121 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -27,12 +27,3 @@ border-color: darken($secondary-color, 10%); background-color: darken($secondary-color, 5%); } - -// .reviews { -// max-width: 540px; -// margin: 5px; -// // margin-bottom: 5px; -// border: blue solid 3px; -// padding: 15px 10px 0px 10px; -// background-color: $tertiary-color; -// } \ No newline at end of file diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index b22e058557..3790fc7cdf 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -34,7 +34,8 @@ <% end %>
    -
    - <%= form.submit %> +
    + <%= form.submit class: "btn btn-primary btn-md" %> + <%= button_to "Cancel", merchant_path(@current_merchant), class:"btn btn-danger btn-md"%>
    <% end %> diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index 5032dd23ff..02dacea26e 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -2,6 +2,4 @@
    <%= render 'form', product: @product %> - - <%= link_to 'Back', products_path %>
    From 02ce294e85db6f110f807084b5101f640c8c85f3 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 18:24:41 -0700 Subject: [PATCH 326/367] Adjusted review button bug --- app/views/products/show.html.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index eb825a8f6c..281ffbc080 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -12,7 +12,9 @@

    <%= @product.description %>

    <%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary btn-lg' %> - <%= button_to 'Leave a Review', new_product_review_path(@product), method: :get, class: 'btn btn-secondary btn-md' %> + <% if @product.merchant_id != @current_merchant.id %> + <%= button_to 'Leave a Review', new_product_review_path(@product), method: :get, class: 'btn btn-secondary btn-md' %> + <% end %>

    <%= button_to 'Back to Products', products_path, method: :get, class: 'btn btn-outline-secondary btn-md' %> From 3946e35b65d7262719f470d9509abc8b05587d1b Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 18:46:25 -0700 Subject: [PATCH 327/367] fixed table style for managing products --- app/views/categories/new.html.erb | 7 ++++--- app/views/merchants/manage_products.html.erb | 12 ++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb index 209abbdda4..6a361833ac 100644 --- a/app/views/categories/new.html.erb +++ b/app/views/categories/new.html.erb @@ -13,8 +13,9 @@ <%= form.text_area :description, class: 'form-control', placeholder: "Description of Category" %>
    -
    - <%= form.submit %> -
    +
    + <%= form.submit class: "btn btn-primary btn-md" %> + <%= button_to "Cancel", merchant_path(@current_merchant), class:"btn btn-danger btn-md"%> +
    <% end %>
    diff --git a/app/views/merchants/manage_products.html.erb b/app/views/merchants/manage_products.html.erb index 83d3cd7ad2..af1c59647e 100644 --- a/app/views/merchants/manage_products.html.erb +++ b/app/views/merchants/manage_products.html.erb @@ -10,18 +10,18 @@ - - - + + + <% @current_merchant.products.each do |item| %> - - - + + +
    ImageNameInventoryImageNameInventory
    <%= image_tag(item.photo, class: " thumbnail img-thumbnail img-fluid") %><%= link_to item.name, product_path(item) %><%= item.stock %><%= image_tag(item.photo, class: "thumbnail img-thumbnail") %><%= link_to item.name, product_path(item) %><%= item.stock %> <%= button_to 'Edit', edit_product_path(item), From 46532bcc73ce5f06b98a661d55ea8354b81fbe0d Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 18:51:35 -0700 Subject: [PATCH 328/367] styled shopping cart table --- app/views/orders/edit.html.erb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index bafce0236b..fd09dd0039 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -4,7 +4,7 @@

    Status: <%= @shopping_cart.status %>

    Items: <%= @shopping_cart.order_items.size %>

    -

    Total Cost: <%= @shopping_cart.total_cost %>

    +

    Total Cost: $<%= @shopping_cart.total_cost %>

    @@ -12,27 +12,27 @@ - - - - - + + + + + <% @shopping_cart.order_items.each do |order_item| %> - - + - - - + + + <% end %> From a8659e7f521c0b1bafdf04a5d28aebf15dafb07b Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 19:08:15 -0700 Subject: [PATCH 329/367] updated bio --- app/views/pages/team.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/pages/team.html.erb b/app/views/pages/team.html.erb index 3057c1c57f..a003fa8567 100644 --- a/app/views/pages/team.html.erb +++ b/app/views/pages/team.html.erb @@ -8,11 +8,11 @@
    - nikki + nikki
    -
    +
    Nikki
    -

    bio here

    +

    Dosn't own a single sweater

    From b1c7954a86239bd1a64c21e204105f3c677a4445 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Thu, 18 Jun 2020 19:10:43 -0700 Subject: [PATCH 330/367] Filtered order items and total cost by merchant. --- app/controllers/order_items_controller.rb | 2 ++ app/models/merchant.rb | 4 ++-- app/models/order.rb | 15 +++++++++------ app/views/merchants/_orders_table.html.erb | 4 ++-- app/views/orders/confirmation.html.erb | 2 +- app/views/orders/edit.html.erb | 2 +- app/views/orders/index.html.erb | 3 ++- app/views/orders/show.html.erb | 6 +++--- test/models/order_test.rb | 6 +++--- 9 files changed, 25 insertions(+), 19 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index c2a0f9a692..3d175d0835 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,4 +1,5 @@ class OrderItemsController < ApplicationController + def create product_id = params[:id] order_item_params = params[:order_item] @@ -51,4 +52,5 @@ def destroy end redirect_back fallback_location: cart_path end + end diff --git a/app/models/merchant.rb b/app/models/merchant.rb index c1cbe7b9a4..fd8b28c3ba 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -20,7 +20,7 @@ def self.build_from_github(auth_hash) end def revenue - return orders.map { |order| order.status == "pending" ? 0 : order.total_cost }.sum + return orders.map { |order| order.status == "pending" ? 0 : order.total_cost(self) }.sum end def orders_by_status(status) @@ -28,7 +28,7 @@ def orders_by_status(status) end def revenue_by_status(status) - return orders_by_status(status).map { |order| order.total_cost }.sum + return orders_by_status(status).map { |order| order.total_cost(self) }.sum end end diff --git a/app/models/order.rb b/app/models/order.rb index 2d9cbb3f22..48a70674ef 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -43,10 +43,14 @@ def cancel_order! return self.save ? nil : "Error saving the order" end - def total_cost + # returns total cost per merchant OR + # overall cost if merchant is nil + def total_cost(current_merchant) total = 0 self.order_items.each do |item| - total += item.subtotal + if !current_merchant || item.product.merchant.id == current_merchant.id + total += item.subtotal + end end return total end @@ -55,10 +59,9 @@ def empty? return order_items.count == 0 end - - # this method should return a list of Order Items in this Order - # where the Order Item contains a Product that belongs to the current_merchant + # returns list of order items in this order from a specified merchant def order_items_by_merchant(current_merchant) - # return self.order_items.where(product inside that Order_Item belongs to current_merchant) + return self.order_items.select { |item| item.product.merchant.id == current_merchant.id } end + end \ No newline at end of file diff --git a/app/views/merchants/_orders_table.html.erb b/app/views/merchants/_orders_table.html.erb index 3ace9e5382..c2c293a6e6 100644 --- a/app/views/merchants/_orders_table.html.erb +++ b/app/views/merchants/_orders_table.html.erb @@ -20,8 +20,8 @@
    <% end %> - - + + <% if order.status == 'paid' %> diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index 85351d3cd9..eecabd4070 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -15,7 +15,7 @@
    Status: <%= @order.status.capitalize %>
    - Total: <%= number_to_currency(@order.total_cost) %> + Total: <%= number_to_currency(@order.total_cost(nil)) %>

    Items purchased:
    Product NameQuantityPriceSubtotalDeleteProduct NameQuantityPriceSubtotalDelete
    <%= link_to order_item.product.name, product_path(order_item.product) %> + <%= link_to order_item.product.name, product_path(order_item.product) %> <%= link_to "+", order_item_path(id: order_item, order_item: { quantity: order_item.quantity + 1 } ), method: "patch"%> <%= order_item.quantity %> <% if order_item.quantity > 1 %> <%= link_to "-", order_item_path(id: order_item, order_item: { quantity: order_item.quantity - 1 } ), method: "patch" %> <% end %> <%= order_item.product.price %><%= order_item.subtotal %><%= link_to 'Delete', order_item_path(order_item), class: 'btn btn-danger', method: 'delete' %><%= order_item.product.price %><%= order_item.subtotal %><%= link_to 'Delete', order_item_path(order_item), class: 'btn btn-danger', method: 'delete' %>
    pending still<%= order.time_submitted %><%= order.order_items.count %> <%= number_to_currency(order.total_cost) %><%= order.order_items_by_merchant(@current_merchant).count %> <%= number_to_currency(order.total_cost(@current_merchant)) %> <%= order.status %><%= button_to "Complete Order", order_complete_path(order) %>
    diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index bafce0236b..faaff09787 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -4,7 +4,7 @@

    Status: <%= @shopping_cart.status %>

    Items: <%= @shopping_cart.order_items.size %>

    -

    Total Cost: <%= @shopping_cart.total_cost %>

    +

    Total Cost: <%= @shopping_cart.total_cost(nil) %>

    diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index 2322e7f2ee..039a7ec853 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -15,7 +15,8 @@
    - + + <%# we might need to pass the merchant instead of nil above %> <% end %> diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index b91052fa01..21cfb51b0e 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -2,8 +2,8 @@

    Order: <%= link_to @order.id, order_path(@order) %>

    Status: <%= @order.status %>

    -

    Items: <%= @order.order_items.size %>

    -

    Total Cost: <%= @order.total_cost %>

    +

    Items: <%= @order.order_items_by_merchant(@current_merchant).size %>

    +

    Total Cost: <%= @order.total_cost(@current_merchant) %>

    Current merchant: <%= @current_merchant.username %>

    Items

    @@ -18,7 +18,7 @@
    - <% @order.order_items.each do |order_item| %> + <% @order.order_items_by_merchant(@current_merchant).each do |order_item| %> diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 3ab2bc5b6e..af7b2dba49 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -171,7 +171,7 @@ ) item1.save! # Act - total = pending_order.total_cost + total = pending_order.total_cost(nil) # Assert expect(total).must_be_kind_of Numeric expect(total).must_equal 200 @@ -204,7 +204,7 @@ ) item2.save! # Act - total = pending_order.total_cost + total = pending_order.total_cost(nil) # Assert expect(total).must_be_kind_of Numeric expect(total).must_equal 240 @@ -214,7 +214,7 @@ # Arrange paid_order.save! # Act - total = paid_order.total_cost + total = paid_order.total_cost(nil) # Assert expect(total).must_be_kind_of Numeric expect(total).must_equal 0 From f2d136aaff5fea2cf3b7cd30df79e8aed1d58932 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Thu, 18 Jun 2020 19:12:24 -0700 Subject: [PATCH 331/367] Fixed Edit html.rb --- app/views/orders/edit.html.erb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index 1c79d02a6a..54f28c8a10 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -4,11 +4,7 @@

    Status: <%= @shopping_cart.status %>

    Items: <%= @shopping_cart.order_items.size %>

    -<<<<<<< HEAD

    Total Cost: <%= @shopping_cart.total_cost(nil) %>

    -======= -

    Total Cost: $<%= @shopping_cart.total_cost %>

    ->>>>>>> a8659e7f521c0b1bafdf04a5d28aebf15dafb07b
    From 338a2cb88e91debeb4054ca9fb3b41ea36adf204 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 20:42:30 -0700 Subject: [PATCH 332/367] updated product contoller photo bug' --- app/controllers/products_controller.rb | 2 +- app/views/products/_form.html.erb | 2 +- app/views/products/_select.html.erb | 2 +- app/views/products/show.html.erb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 6ef0f57888..4cecc61743 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -35,7 +35,7 @@ def edit def create @product = Product.new(product_params) @product.merchant_id = session[:merchant_id] - @product.photo = 'https://i.imgur.com/OR9WgUb.png' if @product.photo = '' + @product.photo = 'https://i.imgur.com/OR9WgUb.png' if @product.photo == '' @product.active = true if @product.save flash[:success] = "Successfully created #{@product.name}" diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index 3790fc7cdf..65b777284c 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -36,6 +36,6 @@
    <%= form.submit class: "btn btn-primary btn-md" %> - <%= button_to "Cancel", merchant_path(@current_merchant), class:"btn btn-danger btn-md"%> + <%# <%= button_to "Cancel", merchant_path(@current_merchant), class:"btn btn-danger btn-md"%> %>
    <% end %> diff --git a/app/views/products/_select.html.erb b/app/views/products/_select.html.erb index 7838d3378d..062456acec 100644 --- a/app/views/products/_select.html.erb +++ b/app/views/products/_select.html.erb @@ -27,7 +27,7 @@
    <% end %> - <%= f.submit %> + <%= f.submit "Enter", class:'btn btn-primary' %> <% end %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 281ffbc080..1046d78a94 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -12,7 +12,7 @@

    <%= @product.description %>

    <%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary btn-lg' %> - <% if @product.merchant_id != @current_merchant.id %> + <% if @current_merchant.nil? || @product.merchant_id != @current_merchant.id %> <%= button_to 'Leave a Review', new_product_review_path(@product), method: :get, class: 'btn btn-secondary btn-md' %> <% end %>
    From 464fe8f7b57c0ac47a9bcd1c36228acfbf865116 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 20:49:49 -0700 Subject: [PATCH 333/367] repositioned cancel button --- app/views/products/_form.html.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index 65b777284c..0b2ce6c1af 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -36,6 +36,8 @@
    <%= form.submit class: "btn btn-primary btn-md" %> - <%# <%= button_to "Cancel", merchant_path(@current_merchant), class:"btn btn-danger btn-md"%> %>
    <% end %> +
    +<%= button_to "Cancel", merchant_path(@current_merchant), class:"btn btn-danger btn-md" %> + From 1d06231a465d7487b7b20d32c8ea197f41c9a1f4 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 20:52:27 -0700 Subject: [PATCH 334/367] fixed other form bug I created :/ --- app/views/categories/new.html.erb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb index 6a361833ac..651501a783 100644 --- a/app/views/categories/new.html.erb +++ b/app/views/categories/new.html.erb @@ -15,7 +15,8 @@
    <%= form.submit class: "btn btn-primary btn-md" %> - <%= button_to "Cancel", merchant_path(@current_merchant), class:"btn btn-danger btn-md"%>
    <% end %> +
    + <%= button_to "Cancel", merchant_path(@current_merchant), class:"btn btn-danger btn-md"%>
    From e7ffc329dce9d9f41708a166a9146d1b0010c070 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 20:58:52 -0700 Subject: [PATCH 335/367] fixed other button bugs I made :? --- app/views/categories/new.html.erb | 2 +- app/views/products/_form.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb index 651501a783..db70418b30 100644 --- a/app/views/categories/new.html.erb +++ b/app/views/categories/new.html.erb @@ -18,5 +18,5 @@
    <% end %>
    - <%= button_to "Cancel", merchant_path(@current_merchant), class:"btn btn-danger btn-md"%> + <%= button_to "Cancel", dashboard_merchant_path(@current_merchant), method: :get, class:"btn btn-danger btn-md"%>
    diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index 0b2ce6c1af..7e0cda8c06 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -39,5 +39,5 @@
    <% end %>
    -<%= button_to "Cancel", merchant_path(@current_merchant), class:"btn btn-danger btn-md" %> +<%= button_to "Cancel", dashboard_merchant_path(@current_merchant), method: :get, class:"btn btn-danger btn-md"%> From bdcb6aec058ae8b6ed0bc79115a4969669939eb7 Mon Sep 17 00:00:00 2001 From: SuelyBarreto Date: Thu, 18 Jun 2020 21:11:28 -0700 Subject: [PATCH 336/367] Added tests for new Order model methods: total_cost(merchant), order_items_by_merchant, empty? --- test/models/order_test.rb | 125 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 120 insertions(+), 5 deletions(-) diff --git a/test/models/order_test.rb b/test/models/order_test.rb index af7b2dba49..5259606028 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,10 +1,14 @@ require "test_helper" describe Order do - + let (:pending_order) { orders(:order_pending) } let (:paid_order) { orders(:order_paid) } let (:complete_order) { orders(:order_complete) } + let (:merchant1) { merchants(:suely) } + let (:merchant2) { merchants(:annie) } + let (:product1) { products(:tulip) } + let (:product2) { products(:daisy) } describe "relations" do it "has a list of order_items" do @@ -153,10 +157,6 @@ end # describe "cancel_order!" describe "total_cost" do - let (:merchant1) { merchants(:suely) } - let (:product1) { products(:tulip) } - let (:product2) { products(:daisy) } - it "calculates the cost for a one product order" do # Arrange pending_order.save! @@ -210,6 +210,43 @@ expect(total).must_equal 240 end + it "calculates the cost per merchant" do + # Arrange + pending_order.save! + merchant1.save! + product1.merchant_id = merchant1.id + product1.price = 100 + product1.save! + + item1 = OrderItem.new( + order_id: pending_order.id, + product_id: product1.id, + quantity: 2 + ) + item1.save! + + merchant2.save! + product2.merchant_id = merchant2.id + product2.price = 10 + product2.save! + + item2 = OrderItem.new( + order_id: pending_order.id, + product_id: product2.id, + quantity: 4 + ) + item2.save! + # Act + total1 = pending_order.total_cost(merchant1) + total2 = pending_order.total_cost(merchant2) + + # Assert + expect(total1).must_be_kind_of Numeric + expect(total1).must_equal 200 + expect(total2).must_be_kind_of Numeric + expect(total2).must_equal 40 + end + it "calculates the cost for an empty order" do # Arrange paid_order.save! @@ -221,4 +258,82 @@ end end # describe "total_cost" + describe "empty?" do + it "returns true if there are no order items" do + # Arrange + pending_order.save! + # Act + empty = pending_order.empty? + # Assert + expect(empty).must_equal true + end + + it "returns false if there are order items" do + # Arrange + pending_order.save! + merchant1.save! + product1.merchant_id = merchant1.id + product1.save! + item1 = OrderItem.new( + order_id: pending_order.id, + product_id: product1.id, + quantity: 2 + ) + item1.save! + # Act + empty = pending_order.empty? + # Assert + expect(empty).must_equal false + end + end # describe "empty?" + + describe "order_items_by_merchant" do + it "returns all order_items for a merchant" do + # Arrange + pending_order.save! + merchant1.save! + product1.merchant_id = merchant1.id + product1.save! + item1 = OrderItem.new( + order_id: pending_order.id, + product_id: product1.id, + quantity: 2 + ) + item1.save! + + merchant2.save! + product2.merchant_id = merchant2.id + product2.save! + item2 = OrderItem.new( + order_id: pending_order.id, + product_id: product2.id, + quantity: 3 + ) + item2.save! + # Act + items = pending_order.order_items_by_merchant(merchant1) + # Assert + expect(items.count).must_equal 1 + expect(items.first.product_id).must_equal product1.id + end + + it "returns no order_items if merchant has none" do + # Arrange + pending_order.save! + merchant1.save! + product1.merchant_id = merchant1.id + product1.save! + item1 = OrderItem.new( + order_id: pending_order.id, + product_id: product1.id, + quantity: 2 + ) + item1.save! + # Act + items = pending_order.order_items_by_merchant(merchant2) + # Assert + expect(items.count).must_equal 0 + end + end # describe "order_items_by_merchant" + end # describe Order \ No newline at end of file From 4b44c03b7d29444f09f4f002e5dc705b762cce12 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 21:37:50 -0700 Subject: [PATCH 337/367] fixed some error styling for payment validations' --- app/assets/stylesheets/confirmation.scss | 1 - app/assets/stylesheets/products.scss | 18 ++-- app/controllers/orders_controller.rb | 9 +- app/views/orders/edit.html.erb | 102 ++++++++++++----------- app/views/reviews/new.html.erb | 2 +- 5 files changed, 71 insertions(+), 61 deletions(-) diff --git a/app/assets/stylesheets/confirmation.scss b/app/assets/stylesheets/confirmation.scss index 531a6c678f..2e6c983a44 100644 --- a/app/assets/stylesheets/confirmation.scss +++ b/app/assets/stylesheets/confirmation.scss @@ -8,6 +8,5 @@ .card { border-radius: 2%; - border: $electric 2px solid; } diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index 2e19c3e121..ce0834253b 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -18,12 +18,16 @@ align-items: flex-end; } -.btn-secondary { - border-color: $secondary-color; - background-color: $secondary-color; -} +// .btn-secondary { +// border-color: $secondary-color; +// background-color: $secondary-color; +// } + +// .btn-secondary:hover { +// border-color: darken($secondary-color, 10%); +// background-color: darken($secondary-color, 5%); +// } -.btn-secondary:hover { - border-color: darken($secondary-color, 10%); - background-color: darken($secondary-color, 5%); +.payment_form { + border-left: $soft-salmon 2px solid; } diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index e6ee6680e2..33f4935da2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -25,9 +25,8 @@ def update render :edit, status: :bad_request end else - flash.now[:status] = :failure - flash.now[:result_text] = "Please enter required info before checkout." - flash.now[:messages] = @shopping_cart.errors.full_messages + flash.now[:warning] = "Please enter required info before checkout." + flash.now[:details] = @shopping_cart.errors.full_messages render :edit, status: :bad_request end end @@ -36,8 +35,8 @@ def destroy # Empties cart (User) @shopping_cart.destroy session[:order_id] = nil - flash[:result_text] = "Successfully emptied shopping cart." - redirect_to root_path + flash[:success] = "Successfully emptied shopping cart." + redirect_to cart_path end def complete diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index 54f28c8a10..2368f63019 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -1,52 +1,60 @@ <% content_for(:headline) { "Shopping Cart"} %> -
    -
    -

    Status: <%= @shopping_cart.status %>

    -

    Items: <%= @shopping_cart.order_items.size %>

    -

    Total Cost: <%= @shopping_cart.total_cost(nil) %>

    - - -
    -

    Items

    -
    <%= link_to order.id, order_path(order) %> <%= order.status %> <%= order.customer_email %><%= order.total_cost %><%= order.total_cost(nil) %>
    <%= link_to order_item.product.name, product_path(order_item.product) %> <%= order_item.quantity %>
    - - - - - - - - - - - <% @shopping_cart.order_items.each do |order_item| %> - - - - - - - - <% end %> - -
    Product NameQuantityPriceSubtotalDelete
    <%= link_to order_item.product.name, product_path(order_item.product) %> - <%= link_to "+", order_item_path(id: order_item, order_item: { quantity: order_item.quantity + 1 } ), method: "patch"%> - <%= order_item.quantity %> - <% if order_item.quantity > 1 %> - <%= link_to "-", order_item_path(id: order_item, order_item: { quantity: order_item.quantity - 1 } ), method: "patch" %> - <% end %> - <%= order_item.product.price %><%= order_item.subtotal %><%= link_to 'Delete', order_item_path(order_item), class: 'btn btn-danger', method: 'delete' %>
    -
    - <%= link_to "Empty Shopping Cart", cart_path, class: 'btn btn-danger', method: 'delete' %> - <%= link_to "Back to Main Menu", root_path, class: "btn btn-primary" %> -
    - -
    - <% if @shopping_cart.order_items.size > 0 %> - <%= render 'payment_form' %> - <% end %> -
    + +
    + <% if @shopping_cart.order_items.size == 0 %> +

    Shopping cart is empty

    +
    + <%= button_to "View products", products_path, method: :get, class:"btn btn-primary"%> + <% else %> +
    +
    +

    Status: <%= @shopping_cart.status %>

    +

    Items: <%= @shopping_cart.order_items.size %>

    +

    Total Cost: <%= @shopping_cart.total_cost(nil) %>

    + + +
    +

    Items

    + + + + + + + + + + + + <% @shopping_cart.order_items.each do |order_item| %> + + + + + + + + <% end %> + +
    Product NameQuantityPriceSubtotalDelete
    <%= link_to order_item.product.name, product_path(order_item.product) %> + <%= link_to "+", order_item_path(id: order_item, order_item: { quantity: order_item.quantity + 1 } ), method: "patch"%> + <%= order_item.quantity %> + <% if order_item.quantity > 1 %> + <%= link_to "-", order_item_path(id: order_item, order_item: { quantity: order_item.quantity - 1 } ), method: "patch" %> + <% end %> + <%= order_item.product.price %><%= order_item.subtotal %><%= link_to 'Delete', order_item_path(order_item), class: 'btn btn-danger', method: 'delete' %>
    +
    + <%= link_to "Empty Shopping Cart", cart_path, class: 'btn btn-danger', method: 'delete' %> + <%= button_to 'Back to main menu', products_path, method: :get, class:"btn btn-outline-primary" %> +
    + +
    + <%= render 'payment_form' %> +
    +
    + <% end %>
    + diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index 42095ccb6b..59fe194cde 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -15,7 +15,7 @@
    - <%= form.submit("#{action_name} review") %> + <%= form.submit class:'btn btn-primary'%>
    <% end %> \ No newline at end of file From 2eb545469aceabd560e518e1d228102bd861cfed Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 21:52:36 -0700 Subject: [PATCH 338/367] restyled flash alerts --- app/assets/stylesheets/application.scss | 1 - app/views/layouts/_alert.html.erb | 24 ++++++++++++------------ app/views/layouts/application.html.erb | 7 ++++++- app/views/pages/team.html.erb | 2 +- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index dd7d35c36d..1a1a374d7f 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -64,7 +64,6 @@ h2 { } .alert { - margin-bottom: -6vh; } .warning { diff --git a/app/views/layouts/_alert.html.erb b/app/views/layouts/_alert.html.erb index 25aa0fbc29..80c434e9b3 100644 --- a/app/views/layouts/_alert.html.erb +++ b/app/views/layouts/_alert.html.erb @@ -1,8 +1,15 @@ +
    + <% flash.each do |type, message| %> <% next if type == 'details' %>
    <%= message %> + + <% if flash[:details] %> +
      <% flash[:details].each do |msg| %> <% msg %> @@ -13,16 +20,9 @@
    <% end %> - <% if flash[:errors] %> -
      - <% flash[:errors].each do |error| %> -
    • <%= error %>
    • - <% end %> -
    - <% end %> - - +
    -<% end %> \ No newline at end of file +<% end %> + +
    + diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 57b0089755..246ff1d102 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -5,6 +5,9 @@ <%= csrf_meta_tags %> <%= csp_meta_tag %> + + + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> @@ -16,7 +19,9 @@ <% end %> - <%= render 'layouts/alert' %> + + <%= render 'layouts/alert' if !flash.empty? %> +
    <%= yield %> diff --git a/app/views/pages/team.html.erb b/app/views/pages/team.html.erb index a003fa8567..e6f9408673 100644 --- a/app/views/pages/team.html.erb +++ b/app/views/pages/team.html.erb @@ -25,7 +25,7 @@
    Suely
    -

    bio here

    +

    Moved from a sunny beach in Brazil to the US where I bought my first sweater and never stopped since.

    From 1a06108397cdd2425139764d8bf41bd936c0a057 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 21:53:07 -0700 Subject: [PATCH 339/367] refactored flash errors --- app/controllers/orders_controller.rb | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index e6ee6680e2..b9aa7b0700 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -25,9 +25,8 @@ def update render :edit, status: :bad_request end else - flash.now[:status] = :failure - flash.now[:result_text] = "Please enter required info before checkout." - flash.now[:messages] = @shopping_cart.errors.full_messages + flash.now[:warning] = "Please enter required info before checkout." + flash.now[:details] = @shopping_cart.errors.full_messages render :edit, status: :bad_request end end @@ -36,7 +35,7 @@ def destroy # Empties cart (User) @shopping_cart.destroy session[:order_id] = nil - flash[:result_text] = "Successfully emptied shopping cart." + flash[:success] = "Successfully emptied shopping cart." redirect_to root_path end @@ -46,7 +45,7 @@ def complete if result.nil? flash[:success] = "Successfully completed order #{@order.id}" else - flash[:warning] = "Failed to complete order #{@order.id}: #{result}" + flash[:danger] = "Failed to complete order #{@order.id}: #{result}" flash[:details] = @order.errors.full_messages end redirect_back fallback_location: order_path(@order) @@ -56,11 +55,9 @@ def cancel # Cancels the order, changes status to “cancelled” (Merchant only) result = @order.cancel_order! if result.nil? - flash[:status] = :success - flash[:result_text] = "Successfully cancelled order #{@order.id}" + flash[:success] = "Successfully cancelled order #{@order.id}" else - flash[:status] = :failure - flash[:result_text] = "Failed to cancel order: #{result}" + flash[:danger] = "Failed to cancel order: #{result}" end redirect_back fallback_location: order_path(@order) end @@ -83,8 +80,7 @@ def order_params def find_order @order = Order.find_by(id: params[:id]) if !@order - flash[:status] = :failure - flash[:result_text] = "Could not find order." + flash[:danger] = "Could not find order." redirect_to orders_path end end From f047deb9d1c7c3a566fcc649074d87fe3742b059 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 22:42:33 -0700 Subject: [PATCH 340/367] fixed failing test in products controller --- app/controllers/products_controller.rb | 11 +++++++++-- test/controllers/products_controller_test.rb | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 4cecc61743..ecc72c213a 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -3,6 +3,7 @@ class ProductsController < ApplicationController before_action :require_login, only: [:new, :edit, :update, :deactivate] before_action :require_ownership, only: [:edit, :update, :deactivate] + # GET /products # GET /products.json def index @@ -33,6 +34,12 @@ def edit end def create + unless session[:merchant_id] + flash[:danger] = "Only merchants can create a new product." + head :forbidden + return + end + @product = Product.new(product_params) @product.merchant_id = session[:merchant_id] @product.photo = 'https://i.imgur.com/OR9WgUb.png' if @product.photo == '' @@ -41,8 +48,8 @@ def create flash[:success] = "Successfully created #{@product.name}" redirect_to product_path(@product) else - flash.now[:warning] = "Unable to save product." - flash.now[:details] = @product.errors.full_messages + flash.now[:danger] = "Unable to save product." + flash.now[:danger] = @product.errors.full_messages render :new, status: :bad_request return end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 16882cc6ab..15ead146f6 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -187,7 +187,7 @@ assert_no_difference("Product.count") do post products_url, params: { product: new_product } end - must_respond_with :bad_request + must_respond_with :forbidden end it "should not edit a product" do From 95b7982bfd8fc422191ad39e94983f53eb3751a2 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 22:43:58 -0700 Subject: [PATCH 341/367] changed test in merchants controller --- app/controllers/application_controller.rb | 2 +- app/controllers/merchants_controller.rb | 3 ++- test/controllers/merchants_controller_test.rb | 5 ++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a4d61232b9..ec016e49fb 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -30,7 +30,7 @@ def current_product end def require_login - if current_merchant.nil? + unless current_merchant redirect_to root_path flash[:danger] = "Must be logged in as a merchant." return diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 8e8ab5effc..fb3e6b5d5b 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -13,7 +13,8 @@ def login #create if merchant.save flash[:success] = "Logged in as new merchant #{merchant.username}" else - flash[:error] = "Could not create new merchant account: #{merchant.errors.messages}" + flash[:danger] = "Could not create new merchant account." + flash[:details] = merchant.errors.messages return redirect_to root_path end end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index fd25d0cc82..8a5b16bf8b 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -23,9 +23,8 @@ perform_login(invalid_merchant) invalid_merchant.valid? - expect(invalid_merchant.errors.messages[:username]).must_equal ["can't be blank"] - expect(flash[:error]).must_equal "Could not create new merchant account: #{invalid_merchant.errors.messages}" - must_redirect_to root_path + expect(flash[:danger]).must_equal "Could not create new merchant account." + expect(flash[:details][:username]).must_equal ["can't be blank"] end end From 92655578c8ea55f98c708e01fab4bc7685f96e35 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 22:45:50 -0700 Subject: [PATCH 342/367] typo fixes --- app/controllers/merchants_controller.rb | 2 +- app/views/categories/new.html.erb | 2 +- app/views/products/_form.html.erb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index fb3e6b5d5b..7c6a6afdb3 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -6,7 +6,7 @@ def login #create auth_hash = request.env["omniauth.auth"] merchant = Merchant.find_by(uid: auth_hash[:uid], provider: "github") if merchant - flash[:success] = "Welome back #{merchant.username}!" + flash[:success] = "Welcome back #{merchant.username}!" else merchant = Merchant.build_from_github(auth_hash) diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb index db70418b30..2e6b0f24aa 100644 --- a/app/views/categories/new.html.erb +++ b/app/views/categories/new.html.erb @@ -2,7 +2,7 @@
    <%= form_with(model: @category, local: true) do |form| %> -

    Please enter folliwng data for a new category

    +

    Please enter following data for a new category

    <%= form.label :name, class: 'control-label' %> <%= form.text_field :name, class: 'form-control', placeholder: "Category Name" %> diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index 7e0cda8c06..8ac0b3e1da 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -1,5 +1,5 @@ <%= form_with(model: product, local: true) do |form| %> -

    Please enter folliwng data for a new product

    +

    Please enter following data for a new product

    <%= form.label :name, class: 'control-label' %> <%= form.text_field :name, class: 'form-control', placeholder: "Product Name" %> From a3bc95f8762d3ae808015c607efff1f9957e6fa5 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 22:51:46 -0700 Subject: [PATCH 343/367] updated tests and all are green --- app/controllers/products_controller.rb | 6 +++--- test/controllers/orders_controller_test.rb | 2 +- test/controllers/products_controller_test.rb | 7 +++---- test/fixtures/orders.yml | 2 ++ 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 4cecc61743..89c37c1808 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,6 +1,6 @@ class ProductsController < ApplicationController before_action :set_product, only: [:show, :edit, :update, :deactivate] - before_action :require_login, only: [:new, :edit, :update, :deactivate] + before_action :require_login, only: [:new, :create, :edit, :update, :deactivate] before_action :require_ownership, only: [:edit, :update, :deactivate] # GET /products @@ -43,8 +43,8 @@ def create else flash.now[:warning] = "Unable to save product." flash.now[:details] = @product.errors.full_messages - render :new, status: :bad_request - return + # render :new, status: :bad_request + end end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 3da01f488f..7957572123 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -196,7 +196,7 @@ # Assert expect(old_cart.id).wont_equal new_cart.id must_respond_with :redirect - must_redirect_to root_path + must_redirect_to cart_path end end # describe "destroy" diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 16882cc6ab..048386d2cd 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -184,10 +184,9 @@ end it "should not create new product" do - assert_no_difference("Product.count") do - post products_url, params: { product: new_product } - end - must_respond_with :bad_request + post products_url, params: { product: new_product } + must_redirect_to root_path + expect(flash[:danger]).must_equal "Must be logged in as a merchant." end it "should not edit a product" do diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 86a2f3f758..0d5ef2839b 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -18,8 +18,10 @@ order_paid: credit_card_cvv: 429 address: 8691 East Fulton Street city: Casselberry + time_submitted: 2020-06-19 02:59:11 state: FL zip: 32707-237 + customer_email: barbara@gmail.com order_complete: From 4a8bb99aee595d301bc44f3230007de57aa760a7 Mon Sep 17 00:00:00 2001 From: Haben Date: Thu, 18 Jun 2020 22:51:56 -0700 Subject: [PATCH 344/367] fixed indention and comments --- app/controllers/application_controller.rb | 14 ++++---------- app/controllers/categories_controller.rb | 2 +- app/controllers/merchants_controller.rb | 4 ++-- app/controllers/order_items_controller.rb | 2 -- app/controllers/orders_controller.rb | 15 ++++++--------- app/controllers/products_controller.rb | 22 +++++++++++----------- app/controllers/reviews_controller.rb | 15 +++++---------- app/helpers/application_helper.rb | 17 ++++++++--------- 8 files changed, 37 insertions(+), 54 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a4d61232b9..d557044416 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,15 +1,9 @@ class ApplicationController < ActionController::Base - protect_from_forgery with: :exception before_action :find_cart before_action :current_merchant - # def render_404 - # # DPR: this will actually render a 404 page in production - # raise ActionController::RoutingError.new("Not Found") - # end - def find_cart if session[:order_id] @shopping_cart = Order.find_by(id: session[:order_id]) @@ -21,12 +15,12 @@ def find_cart def current_merchant @current_merchant ||= session[:merchant_id] && - Merchant.find_by(id: session[:merchant_id]) + Merchant.find_by(id: session[:merchant_id]) end - def current_product + def current_product @current_product ||= params[:product_id] && - Product.find_by(id: params[:product_id]) + Product.find_by(id: params[:product_id]) end def require_login @@ -42,7 +36,7 @@ def require_ownership requester = params[:id].to_i # when params id references a merchant else requester = Product.find_by(id: params[:id]).merchant.id # when params id references a product - end + end if requester != current_merchant.id if request.get? # merchant trying to GET ownership-locked resources diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 1402f59d12..4c71da4050 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -20,6 +20,6 @@ def create private def category_params - return params.require(:category).permit(:name, :description) + return params.require(:category).permit(:name, :description) end end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 8e8ab5effc..22beffaa72 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -2,14 +2,14 @@ class MerchantsController < ApplicationController before_action :require_login, only: [:dashboard, :manage_orders, :manage_products, :logout] before_action :require_ownership, only: [:dashboard, :manage_orders, :manage_products] - def login #create + def login auth_hash = request.env["omniauth.auth"] merchant = Merchant.find_by(uid: auth_hash[:uid], provider: "github") if merchant flash[:success] = "Welome back #{merchant.username}!" else merchant = Merchant.build_from_github(auth_hash) - + if merchant.save flash[:success] = "Logged in as new merchant #{merchant.username}" else diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 3d175d0835..c2a0f9a692 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,5 +1,4 @@ class OrderItemsController < ApplicationController - def create product_id = params[:id] order_item_params = params[:order_item] @@ -52,5 +51,4 @@ def destroy end redirect_back fallback_location: cart_path end - end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index e6ee6680e2..8472d170df 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,11 +1,9 @@ class OrdersController < ApplicationController - before_action :find_order, only: [:show, :complete, :cancel, :confirmation] + def show + end - def show - end - def edit # Shows cart, updates credit card/address/email and confirms checkout (User) end @@ -49,7 +47,7 @@ def complete flash[:warning] = "Failed to complete order #{@order.id}: #{result}" flash[:details] = @order.errors.full_messages end - redirect_back fallback_location: order_path(@order) + redirect_back fallback_location: order_path(@order) end def cancel @@ -62,7 +60,7 @@ def cancel flash[:status] = :failure flash[:result_text] = "Failed to cancel order: #{result}" end - redirect_back fallback_location: order_path(@order) + redirect_back fallback_location: order_path(@order) end def confirmation @@ -84,9 +82,8 @@ def find_order @order = Order.find_by(id: params[:id]) if !@order flash[:status] = :failure - flash[:result_text] = "Could not find order." - redirect_to orders_path + flash[:result_text] = "Could not find order." + redirect_to orders_path end end - end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 6ef0f57888..d309422e49 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -35,7 +35,7 @@ def edit def create @product = Product.new(product_params) @product.merchant_id = session[:merchant_id] - @product.photo = 'https://i.imgur.com/OR9WgUb.png' if @product.photo = '' + @product.photo = "https://i.imgur.com/OR9WgUb.png" if @product.photo = "" @product.active = true if @product.save flash[:success] = "Successfully created #{@product.name}" @@ -55,7 +55,7 @@ def update redirect_to @product flash[:success] = "Successfully updated product." return - else + else flash.now[:warning] = "Product update failed" flash.now[:details] = @product.errors.full_messages render :edit, status: :bad_request @@ -74,15 +74,15 @@ def deactivate private - def set_product - @product = Product.find_by(id: params[:id]) - if @product.nil? - head :not_found - return - end + def set_product + @product = Product.find_by(id: params[:id]) + if @product.nil? + head :not_found + return end + end - def product_params - return params.require(:product).permit(:name, :description, :photo, :stock, :price, category_ids: []) - end + def product_params + return params.require(:product).permit(:name, :description, :photo, :stock, :price, category_ids: []) + end end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 7c8eb434a7..3ed28f1518 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,15 +1,13 @@ class ReviewsController < ApplicationController - before_action :merchant_reviews, only:[:new, :create] + before_action :merchant_reviews, only: [:new, :create] def new @review = Review.new end - def create - - @review = Review.new(review_params) - @review.product = @product + @review = Review.new(review_params) + @review.product = @product if @review.save flash[:success] = "Thank you! Your review has been successfully added" @@ -23,18 +21,16 @@ def create end end - private def merchant_reviews - @product = Product.find_by(id: merchant_review_params) unless @product flash[:warning] = "Product not found!" redirect_to products_path return end - + if @product&.merchant == @current_merchant flash[:warning] = "You can't review your own product!" redirect_to product_path(@product) @@ -44,9 +40,8 @@ def merchant_reviews def merchant_review_params params.require(:product_id) end - + def review_params params.require(:review).permit(:rating, :comment, :product_id) end - end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4d7cd7967e..b674cf93ba 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,23 +1,22 @@ module ApplicationHelper def rating_as_stars(rating) - stars = '★' * rating - empty_stars = '★' * (5 - rating) - stars_span = content_tag(:span, stars, class:"rating-filled-stars") - empty_stars_span = content_tag(:span, empty_stars, class:"rating-empty-stars") - content_tag(:span, "#{stars_span}#{empty_stars_span}".html_safe, class:"rating-stars") + stars = "★" * rating + empty_stars = "★" * (5 - rating) + stars_span = content_tag(:span, stars, class: "rating-filled-stars") + empty_stars_span = content_tag(:span, empty_stars, class: "rating-empty-stars") + content_tag(:span, "#{stars_span}#{empty_stars_span}".html_safe, class: "rating-stars") end def generate_select_options(range) - (range).to_a.map{|r| [r,r]} + (range).to_a.map { |r| [r, r] } end def rating_average(reviews) return 0 if reviews.empty? - - sum = reviews.reduce(0)do |sum,review| + + sum = reviews.reduce(0) do |sum, review| sum + review.rating end sum / reviews.count end - end From c19dd8559d39f902f08b2c444b80d5bb05701f5c Mon Sep 17 00:00:00 2001 From: Haben Date: Thu, 18 Jun 2020 23:04:56 -0700 Subject: [PATCH 345/367] added team picture --- app/views/pages/team.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/pages/team.html.erb b/app/views/pages/team.html.erb index e6f9408673..b3d78fedce 100644 --- a/app/views/pages/team.html.erb +++ b/app/views/pages/team.html.erb @@ -40,7 +40,7 @@
    Haben
    -

    bio here

    +

    This picture was not easy to take neither was putting the sweaters on my kids when it was 73 degrees outside.

    From 37544a5ab14670ced411a5ae08f16a4e4be40509 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 23:05:12 -0700 Subject: [PATCH 346/367] added habens image --- app/views/pages/team.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/pages/team.html.erb b/app/views/pages/team.html.erb index e6f9408673..7a6bd50fb3 100644 --- a/app/views/pages/team.html.erb +++ b/app/views/pages/team.html.erb @@ -36,7 +36,7 @@
    - haben + haben
    Haben
    From c11ea6b57d7bc5cbcff1504478a29247e23b1e71 Mon Sep 17 00:00:00 2001 From: Nikki Vaughan Date: Thu, 18 Jun 2020 23:11:26 -0700 Subject: [PATCH 347/367] styled cart --- app/assets/stylesheets/products.scss | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index ce0834253b..e2d1ba8ee4 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -18,16 +18,6 @@ align-items: flex-end; } -// .btn-secondary { -// border-color: $secondary-color; -// background-color: $secondary-color; -// } - -// .btn-secondary:hover { -// border-color: darken($secondary-color, 10%); -// background-color: darken($secondary-color, 5%); -// } - .payment_form { - border-left: $soft-salmon 2px solid; + border-left: $salmon 1px solid; } From 8d8327aa75ff76f6da419181d9b273e2894e9dbe Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 23:48:52 -0700 Subject: [PATCH 348/367] fixed resizing bug on products browse with filters --- app/assets/stylesheets/application.scss | 1 - app/assets/stylesheets/products.scss | 4 ---- 2 files changed, 5 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 1a1a374d7f..b91d946608 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -69,4 +69,3 @@ h2 { .warning { color: $highlight-warning-color; } - diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index e2d1ba8ee4..14b5f18730 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -1,7 +1,3 @@ -.product-show-page__container { - display: flex; -} - .product-grid__product { margin: 0 auto 6vh; From 282f11dac4f9316d784b0f787c92ff2802c47a49 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Thu, 18 Jun 2020 23:51:45 -0700 Subject: [PATCH 349/367] moved empty photo logic into view --- app/controllers/products_controller.rb | 1 - app/views/products/index.html.erb | 27 +++++++++++++++----------- app/views/shared/_product.html.erb | 6 +++++- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index ed14ec7b11..9f5037e100 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -42,7 +42,6 @@ def create @product = Product.new(product_params) @product.merchant_id = session[:merchant_id] - @product.photo = 'https://i.imgur.com/OR9WgUb.png' if @product.photo == '' @product.active = true if @product.save flash[:success] = "Successfully created #{@product.name}" diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 13077ac968..c5acab835c 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -3,19 +3,24 @@
    -
    - <%= render 'select' %> -
    - -
    +
    +
    + <%= render 'select' %> +
    -

    <%= "No products to view" if @products.empty? %>

    - <% @products.in_groups_of(4).each do |group| %> -
    - <% group.each do |product| %> - <%= render partial: "shared/product", locals: { product: product } %> +
    + <% if @products.empty? %> +
    No products to view.
    + <% else %> + <% @products.in_groups_of(4).each do |group| %> +
    + <% group.each do |product| %> + <%= render partial: "shared/product", locals: { product: product } %> + <% end %> +
    <% end %> -
    <% end %> +
    + diff --git a/app/views/shared/_product.html.erb b/app/views/shared/_product.html.erb index f555c596f3..6f9e2ab614 100644 --- a/app/views/shared/_product.html.erb +++ b/app/views/shared/_product.html.erb @@ -2,7 +2,11 @@ <% if !product.nil? %>
    <%= link_to product_url(product.id) do %> - <%= image_tag(product.photo, class: "img-fluid") %> + <% if product.photo == "" %> + <%= image_tag("no_photo.png", class: "img-fluid") %> + <% else %> + <%= image_tag(product.photo, class: "img-fluid") %> + <% end %>
    <%= product.name %>
    <%= number_to_currency(product.price) %>
    <% end %> From 9f2b362c7917492d53d8c80e9eb12d3c849647f1 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 00:20:36 -0700 Subject: [PATCH 350/367] added default product image to views --- app/assets/stylesheets/confirmation.scss | 2 +- app/views/merchants/manage_orders.html.erb | 31 +++----------------- app/views/merchants/manage_products.html.erb | 12 ++++++-- app/views/products/show.html.erb | 9 ++++-- 4 files changed, 21 insertions(+), 33 deletions(-) diff --git a/app/assets/stylesheets/confirmation.scss b/app/assets/stylesheets/confirmation.scss index 2e6c983a44..0c94adc370 100644 --- a/app/assets/stylesheets/confirmation.scss +++ b/app/assets/stylesheets/confirmation.scss @@ -3,7 +3,7 @@ } .card-header { - background-color: pink; + background-color: $soft-salmon; } .card { diff --git a/app/views/merchants/manage_orders.html.erb b/app/views/merchants/manage_orders.html.erb index b9353c7357..cf04a73ae9 100644 --- a/app/views/merchants/manage_orders.html.erb +++ b/app/views/merchants/manage_orders.html.erb @@ -2,34 +2,11 @@
    -
    -
    -

    <%= @current_merchant.orders.count %>

    -

    Total Orders

    -

    <%= number_to_currency(@current_merchant.revenue)%>

    -
    -
    -

    <%= @current_merchant.orders_by_status(:pending).count%>

    -

    Orders Pending

    -

    0%>"><%= number_to_currency(@current_merchant.revenue_by_status(:pending)) %>

    -
    -
    -

    <%= @current_merchant.orders_by_status(:paid).count%>

    -

    Orders Paid

    -

    <%= number_to_currency(@current_merchant.revenue_by_status(:paid)) %>

    -
    -
    -

    <%= @current_merchant.orders_by_status(:complete).count%>

    -

    Orders Shipped

    -

    <%= number_to_currency(@current_merchant.revenue_by_status(:complete)) %>

    -
    -
    - -
    -
    - <% if @current_merchant.orders.count == 0 %> -

    No orders to display.

    + <% if @current_merchant.orders.empty? %> +

    You have no orders to manage

    +
    <% else %> + <%= render "orders_stats" %> <%= render "orders_table" %> <% end %>
    \ No newline at end of file diff --git a/app/views/merchants/manage_products.html.erb b/app/views/merchants/manage_products.html.erb index af1c59647e..893550bfa8 100644 --- a/app/views/merchants/manage_products.html.erb +++ b/app/views/merchants/manage_products.html.erb @@ -5,9 +5,9 @@ <% if @current_merchant.products.empty? %>

    You have no products to manage


    - <%= button_to "Create Product", new_product_path, method: :get, class: 'btn btn-secondary btn-md'%> + <%= button_to "Create New Product", new_product_path, method: :get, class: 'btn btn-primary btn-md'%> <% else %> - +
    @@ -19,7 +19,13 @@ <% @current_merchant.products.each do |item| %> - +
    Image
    <%= image_tag(item.photo, class: "thumbnail img-thumbnail") %> + <% if item.photo == "" %> + <%= image_tag("no_photo.png", class: "thumbnail img-thumbnail") %> + <% else %> + <%= image_tag(item.photo, class: "thumbnail img-thumbnail") %> + <% end %> + <%= link_to item.name, product_path(item) %> <%= item.stock %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 1046d78a94..58b9c51c9a 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -4,7 +4,11 @@
    - <%= image_tag(@product.photo, class: "img-fluid") %> + <% if @product.photo == "" %> + <%= image_tag("no_photo.png", class: "img-fluid") %> + <% else %> + <%= image_tag(@product.photo, class: "img-fluid") %> + <% end %>
    @@ -33,7 +37,8 @@ <% @product.reviews.each do |review| %>
    -

    <%= rating_as_stars(review.rating) %> on <%= review.created_at.strftime('%-d %B %Y') %> <%= review.comment %>

    +

    <%= rating_as_stars(review.rating) %> from Guest User on <%= review.created_at.strftime('%B %-d, %Y') %>

    +

    <%= review.comment %>

    <% end %>
    From a6e109faf95811498be6b9e5d6d8457a3b557a59 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 00:43:24 -0700 Subject: [PATCH 351/367] added view helper for date display --- app/helpers/application_helper.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index b674cf93ba..5afc8ef9b3 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -19,4 +19,9 @@ def rating_average(reviews) end sum / reviews.count end + + def pretty_date(date) + return "[unknown]" unless date + return content_tag(:span, date.strftime("%b %d, %Y"), class: 'date', title: date.to_s) + end end From 7be4d8c6bca1d378e09f544eb8aebb7abbdaf2ea Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 00:44:28 -0700 Subject: [PATCH 352/367] minor structure and styling for orders and dashboard --- app/views/merchants/_orders_table.html.erb | 6 +++--- app/views/merchants/dashboard.html.erb | 6 +++--- app/views/merchants/manage_orders.html.erb | 1 - app/views/orders/show.html.erb | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/views/merchants/_orders_table.html.erb b/app/views/merchants/_orders_table.html.erb index c2c293a6e6..d3f6dc940c 100644 --- a/app/views/merchants/_orders_table.html.erb +++ b/app/views/merchants/_orders_table.html.erb @@ -1,10 +1,10 @@ - + - + @@ -19,7 +19,7 @@ <% else %> <% end %> - + diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb index 14dd391b67..296b9d4aae 100644 --- a/app/views/merchants/dashboard.html.erb +++ b/app/views/merchants/dashboard.html.erb @@ -50,15 +50,15 @@
    -

    0

    +

    <%= @current_merchant.products.count%>

    Listings

    -

    0

    +

    <%= @current_merchant.products_out_of_stock%>

    Out of Stock

    -

    0

    +

    <%= @current_merchant.orders_by_status(:paid).count%>

    Awaiting Shipment

    diff --git a/app/views/merchants/manage_orders.html.erb b/app/views/merchants/manage_orders.html.erb index cf04a73ae9..dd4ab9daad 100644 --- a/app/views/merchants/manage_orders.html.erb +++ b/app/views/merchants/manage_orders.html.erb @@ -6,7 +6,6 @@

    You have no orders to manage


    <% else %> - <%= render "orders_stats" %> <%= render "orders_table" %> <% end %> \ No newline at end of file diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 21cfb51b0e..81524b2c73 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -22,7 +22,7 @@ - + <% end %> From 292cf195dd70b409308e85a3a3cfbf7bdc7faa73 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 01:04:37 -0700 Subject: [PATCH 353/367] cart now shows inventory dot --- app/assets/stylesheets/application.scss | 3 --- app/assets/stylesheets/nav.scss | 15 +++++++++++++-- app/models/merchant.rb | 4 ++++ app/models/order.rb | 4 ++++ app/views/layouts/_header.html.erb | 11 +++++++++-- 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index b91d946608..9b8cd0310a 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -63,9 +63,6 @@ h2 { background-color: $merchants-tertiary-color; } -.alert { -} - .warning { color: $highlight-warning-color; } diff --git a/app/assets/stylesheets/nav.scss b/app/assets/stylesheets/nav.scss index 2e9d8fa95c..ad9cf39e79 100644 --- a/app/assets/stylesheets/nav.scss +++ b/app/assets/stylesheets/nav.scss @@ -17,13 +17,24 @@ nav.landing { } .cart { + margin: -5px 0 0 20px; text-align: right; - margin-left: 20px; - width: 80px; +} + +.cart-icon { + width: 36px; + height: 36px; background-image: image-url(asset_path("icons/shopping-cart.svg")); background-repeat: no-repeat; } +.cart-dot { + padding: 0 6px; + background-color: $highlight-warning-color; + border-radius: 10px; + font-weight: 500; +} + .navbar-brand.landing { font-size: 2em; background-color: transparent; diff --git a/app/models/merchant.rb b/app/models/merchant.rb index fd8b28c3ba..48733a0429 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -31,5 +31,9 @@ def revenue_by_status(status) return orders_by_status(status).map { |order| order.total_cost(self) }.sum end + def products_out_of_stock + return self.products.where(stock: 0).count + end + end diff --git a/app/models/order.rb b/app/models/order.rb index 48a70674ef..8cfc063888 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -64,4 +64,8 @@ def order_items_by_merchant(current_merchant) return self.order_items.select { |item| item.product.merchant.id == current_merchant.id } end + def all_items_count + return self.order_items.map { |order_item| order_item.quantity }.sum + end + end \ No newline at end of file diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index b0009e4c27..bd78db0a92 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -45,10 +45,17 @@ navbar structure based on https://stackoverflow.com/questions/19733447/bootstrap <%# cart link %> <% unless action_name == "landing" %> - <% end %> + <% end %> From 435cfdd1bcf6e28df03df46c0d081cf9483a6ecd Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 01:05:04 -0700 Subject: [PATCH 354/367] added default image to asset pipeline --- app/assets/images/no_photo.png | Bin 0 -> 52799 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/assets/images/no_photo.png diff --git a/app/assets/images/no_photo.png b/app/assets/images/no_photo.png new file mode 100644 index 0000000000000000000000000000000000000000..bcde890d6150b8cde20dea3ba620584f48f245ab GIT binary patch literal 52799 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
    O?C|K#S8xiScrUq%`79H4kki+S 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 Date: Fri, 19 Jun 2020 01:05:24 -0700 Subject: [PATCH 355/367] pulled order stats into partial --- app/views/merchants/_orders_stats.html.erb | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 app/views/merchants/_orders_stats.html.erb diff --git a/app/views/merchants/_orders_stats.html.erb b/app/views/merchants/_orders_stats.html.erb new file mode 100644 index 0000000000..15e33567aa --- /dev/null +++ b/app/views/merchants/_orders_stats.html.erb @@ -0,0 +1,22 @@ +

    +
    +

    <%= @current_merchant.orders.count %>

    +

    Total Orders

    +

    <%= number_to_currency(@current_merchant.revenue)%>

    +
    +
    +

    <%= @current_merchant.orders_by_status(:pending).count%>

    +

    Orders Pending

    +

    0%>"><%= number_to_currency(@current_merchant.revenue_by_status(:pending)) %>

    +
    +
    +

    <%= @current_merchant.orders_by_status(:paid).count%>

    +

    Orders Paid

    +

    <%= number_to_currency(@current_merchant.revenue_by_status(:paid)) %>

    +
    +
    +

    <%= @current_merchant.orders_by_status(:complete).count%>

    +

    Orders Shipped

    +

    <%= number_to_currency(@current_merchant.revenue_by_status(:complete)) %>

    +
    +
    \ No newline at end of file From 2edfff140c38973461e41ed3abe208b46ce6b475 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 02:06:00 -0700 Subject: [PATCH 356/367] modified cart icon --- app/assets/stylesheets/application.scss | 4 ++++ app/assets/stylesheets/nav.scss | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 9b8cd0310a..4aa0c9144b 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -63,6 +63,10 @@ h2 { background-color: $merchants-tertiary-color; } +.team .headline { + background-color: $dusk; +} + .warning { color: $highlight-warning-color; } diff --git a/app/assets/stylesheets/nav.scss b/app/assets/stylesheets/nav.scss index ad9cf39e79..111c533dca 100644 --- a/app/assets/stylesheets/nav.scss +++ b/app/assets/stylesheets/nav.scss @@ -6,6 +6,10 @@ nav { background-color: $merchants-tertiary-color; } +.team nav { + background-color: $dusk; +} + nav.landing { background-color: #fff; } From 17f0b09d8aedc81f2a7a31711e05bffeb027d7bf Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 02:06:27 -0700 Subject: [PATCH 357/367] changed team page styling --- app/assets/stylesheets/team.scss | 14 ++++++-------- app/views/layouts/_header.html.erb | 1 - app/views/pages/team.html.erb | 24 ++++++++++++------------ 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/app/assets/stylesheets/team.scss b/app/assets/stylesheets/team.scss index d5a12391f3..98b024cbd1 100644 --- a/app/assets/stylesheets/team.scss +++ b/app/assets/stylesheets/team.scss @@ -4,34 +4,32 @@ background-color: $salmon; } .col-md-6 { - padding: 5% 5%; + padding: 2% 5%; } img { - border: 1px solid darken($salmon,30%); + border: 4px solid whitesmoke; border-radius: 100%; } //Nikki box .top-left { - background-color: darken($secondary-color, 10%); + background-color: #E15D41; + } //Suely box .top-right { background-color: #cce6ff; } - .top-right img { - border-color: whitesmoke; - } //Haben box .bottom-left { - background-color: darken($secondary-color, 20%); + background-color: #386C78; } //Angela box .bottom-right { - background-color: lighten($secondary-color, 2%); + background-color: #ff9563; } } \ No newline at end of file diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index bd78db0a92..3cebdc0000 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -52,7 +52,6 @@ navbar structure based on https://stackoverflow.com/questions/19733447/bootstrap <%= @shopping_cart.all_items_count %> <% end %> - <%# link_to 'Cart', cart_path, class:'nav-link' %> <% end %> <% end %> diff --git a/app/views/pages/team.html.erb b/app/views/pages/team.html.erb index e1c16fc895..2fae8a29ab 100644 --- a/app/views/pages/team.html.erb +++ b/app/views/pages/team.html.erb @@ -1,16 +1,16 @@ <% content_for(:title) { 'About Us' } %> <% content_for(:headline) { "About Us - Team Agasalho"} %> -
    +
    -
    +
    nikki
    -
    +
    Nikki

    Dosn't own a single sweater

    @@ -20,10 +20,10 @@
    -
    - suely +
    + suely
    -
    +
    Suely

    Moved from a sunny beach in Brazil to the US where I bought my first sweater and never stopped since.

    @@ -35,10 +35,10 @@
    -
    +
    haben
    -
    +
    Haben

    This picture was not easy to take neither was putting the sweaters on my kids when it was 73 degrees outside.

    @@ -48,12 +48,12 @@
    -
    - angela +
    + angela
    -
    +
    Angela
    -

    bio here

    +

    I think my dog might own more sweaters than I do but we definitely have a set of matching holiday sweaters

    From d1e0629adc396a1d47151af814b603106b85b0cf Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 02:06:55 -0700 Subject: [PATCH 358/367] minor test changes on merchant model --- test/models/merchant_test.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index b489b04ae6..d10a829165 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -27,7 +27,6 @@ end - describe "relationships" do it "has/responds to products" do expect(new_merchant.respond_to?(:products)).must_equal true From 9004a616390b1933adc6729fcc64c5e800592ecc Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 09:27:08 -0700 Subject: [PATCH 359/367] minor styling edits --- app/assets/stylesheets/nav.scss | 2 +- app/views/pages/team.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/nav.scss b/app/assets/stylesheets/nav.scss index 111c533dca..b02f3da34b 100644 --- a/app/assets/stylesheets/nav.scss +++ b/app/assets/stylesheets/nav.scss @@ -34,7 +34,7 @@ nav.landing { .cart-dot { padding: 0 6px; - background-color: $highlight-warning-color; + background-color: white; border-radius: 10px; font-weight: 500; } diff --git a/app/views/pages/team.html.erb b/app/views/pages/team.html.erb index 2fae8a29ab..ea48e2df0e 100644 --- a/app/views/pages/team.html.erb +++ b/app/views/pages/team.html.erb @@ -36,7 +36,7 @@
    - haben + haben
    Haben
    From e26e34b859dc000e10816d89d6d352cc9ea6f9f9 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 09:29:12 -0700 Subject: [PATCH 360/367] no more red dot --- app/assets/stylesheets/nav.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/stylesheets/nav.scss b/app/assets/stylesheets/nav.scss index b02f3da34b..70b4393490 100644 --- a/app/assets/stylesheets/nav.scss +++ b/app/assets/stylesheets/nav.scss @@ -35,8 +35,10 @@ nav.landing { .cart-dot { padding: 0 6px; background-color: white; + border: 2px solid $blue; border-radius: 10px; font-weight: 500; + } .navbar-brand.landing { From 34ff639db1674683a69536f7d56990c5e7d2e31b Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 09:50:14 -0700 Subject: [PATCH 361/367] minor styling changes to currency display and nav --- app/assets/stylesheets/nav.scss | 1 + app/views/orders/edit.html.erb | 2 +- app/views/orders/show.html.erb | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/nav.scss b/app/assets/stylesheets/nav.scss index 70b4393490..1a4b032cbd 100644 --- a/app/assets/stylesheets/nav.scss +++ b/app/assets/stylesheets/nav.scss @@ -33,6 +33,7 @@ nav.landing { } .cart-dot { + margin: 0px -12px 0 0; padding: 0 6px; background-color: white; border: 2px solid $blue; diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index 2368f63019..6f3e6dc009 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -37,7 +37,7 @@ <%= link_to "-", order_item_path(id: order_item, order_item: { quantity: order_item.quantity - 1 } ), method: "patch" %> <% end %> -
    + diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 81524b2c73..fb38953358 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -22,7 +22,7 @@ - + <% end %> From 33c2cd24ced65ba29fc70683967c530054e60f23 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 09:51:35 -0700 Subject: [PATCH 362/367] number as currency edits --- app/views/orders/edit.html.erb | 2 +- app/views/orders/index.html.erb | 2 +- app/views/orders/show.html.erb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index 6f3e6dc009..93ab201c56 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -11,7 +11,7 @@

    Status: <%= @shopping_cart.status %>

    Items: <%= @shopping_cart.order_items.size %>

    -

    Total Cost: <%= @shopping_cart.total_cost(nil) %>

    +

    Total Cost: <%= number_to_currency(@shopping_cart.total_cost(nil)) %>

    diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index 039a7ec853..316329c18d 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -15,7 +15,7 @@
    - + <%# we might need to pass the merchant instead of nil above %> <% end %> diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index fb38953358..ac30d6f456 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -3,7 +3,7 @@

    Order: <%= link_to @order.id, order_path(@order) %>

    Status: <%= @order.status %>

    Items: <%= @order.order_items_by_merchant(@current_merchant).size %>

    -

    Total Cost: <%= @order.total_cost(@current_merchant) %>

    +

    Total Cost: <%= number_to_currency(@order.total_cost(@current_merchant)) %>

    Current merchant: <%= @current_merchant.username %>

    Items

    From d588d3eafacaa67ad353efa9bc2d95ec9365c089 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 10:03:11 -0700 Subject: [PATCH 363/367] sort products by id --- 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 9f5037e100..ff4ef5d9c8 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -15,7 +15,7 @@ def index @products = results[:products] @filters = results[:filters] else - @products = Product.active_products + @products = Product.active_products.order("id") end end From 8551381d99b2ea711ad5db2bd42f6dd4a5191d93 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 10:07:00 -0700 Subject: [PATCH 364/367] show inventory on product page --- app/views/products/show.html.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 58b9c51c9a..da2ebac2de 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -14,6 +14,7 @@

    <%= @product.name %> - <%= number_to_currency(@product.price) %>

    <%= @product.description %>

    +

    <%= @product.stock %> in stock

    <%= button_to 'Add to cart', create_order_items_path(@product), class: 'btn btn-primary btn-lg' %> <% if @current_merchant.nil? || @product.merchant_id != @current_merchant.id %> From 0cb3b5d74f0f659c87ec23017fb70ca68da6189c Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 10:17:38 -0700 Subject: [PATCH 365/367] styling changes to dashboard --- app/assets/stylesheets/dashboard.scss | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/dashboard.scss b/app/assets/stylesheets/dashboard.scss index 6b7bfdc2ea..46725140c7 100644 --- a/app/assets/stylesheets/dashboard.scss +++ b/app/assets/stylesheets/dashboard.scss @@ -1,8 +1,13 @@ .merchants { background-color: lighten($merchants-tertiary-color, 2%); + } + .merchants .dashboard { + + + .col-md-4 { background: lighten($merchants-tertiary-color, 1%); } @@ -27,7 +32,7 @@ h4 { text-align: center; margin: 20px; - color: darken($merchants-tertiary-color,20%) + color: $lilac; } } @@ -46,3 +51,7 @@ color: lighten($secondary-color,2%); } } + +h4 { + color: $lilac; +} From bf0f731c93d80150a52b1bbac2f65f86e4fee479 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 10:25:23 -0700 Subject: [PATCH 366/367] minor edits to bios --- app/views/pages/team.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/pages/team.html.erb b/app/views/pages/team.html.erb index ea48e2df0e..ed3f1bee7b 100644 --- a/app/views/pages/team.html.erb +++ b/app/views/pages/team.html.erb @@ -12,7 +12,7 @@
    Nikki
    -

    Dosn't own a single sweater

    +

    Doesn't own a single sweater

    From 1fe9ac89a0919b2fe8becdb75f7fceb74e6b9bf5 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Fri, 19 Jun 2020 10:30:11 -0700 Subject: [PATCH 367/367] minor orders show page changes --- app/views/orders/show.html.erb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index ac30d6f456..e902a5f914 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -1,5 +1,6 @@ <% content_for(:headline) { "Order Details"} %> +

    Order: <%= link_to @order.id, order_path(@order) %>

    Status: <%= @order.status %>

    Items: <%= @order.order_items_by_merchant(@current_merchant).size %>

    @@ -32,3 +33,5 @@ <%= link_to "See all Orders", orders_path, class: "btn btn-secondary" %> <%= link_to "Back to Main Menu", root_path, class: "btn btn-primary" %> + +
    \ No newline at end of file
    Order Number Customer Order TimeItems CountLine Items Total Cost Status pending still<%= order.time_submitted %><%= pretty_date(order.time_submitted) %> <%= order.order_items_by_merchant(@current_merchant).count %> <%= number_to_currency(order.total_cost(@current_merchant)) %> <%= order.status %>
    <%= link_to order_item.product.name, product_path(order_item.product) %> <%= order_item.quantity %><%= order_item.product.price %> | owner is <%= order_item.product.merchant.username %><%= order_item.product.price %> <%= order_item.subtotal %>
    <%= order_item.product.price %><%= number_to_currency(order_item.product.price) %> <%= order_item.subtotal %> <%= link_to 'Delete', order_item_path(order_item), class: 'btn btn-danger', method: 'delete' %>
    <%= link_to order_item.product.name, product_path(order_item.product) %> <%= order_item.quantity %><%= order_item.product.price %><%= number_to_currency(order_item.product.price) %> <%= order_item.subtotal %>
    <%= link_to order.id, order_path(order) %> <%= order.status %> <%= order.customer_email %><%= order.total_cost(nil) %><%= number_to_currency(order.total_cost(nil)) %>