From e5de2eede3ae64a18ddd3019f44a2dcf290c8748 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Tue, 9 Jun 2020 14:21:46 -0700 Subject: [PATCH 001/234] Ran rails initial setup --- .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 | 16 + 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 | 18 + 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 | 12 + config/webpack/production.js | 5 + config/webpack/test.js | 5 + config/webpacker.yml | 96 + db/schema.rb | 18 + 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 +++++++++++++++++ 94 files changed, 9455 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/schema.rb 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..3d573122ff --- /dev/null +++ b/app/assets/stylesheets/application.scss @@ -0,0 +1,16 @@ +/* + * 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..b2f85adf51 --- /dev/null +++ b/app/javascript/packs/application.js @@ -0,0 +1,18 @@ +// 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..7bccff41dc --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +Nzn1lT9u2IohdQJyghr4Y4xFfXeQbYLPza3jb7Rx4plcIUAwjGGOp+I8LowYxLrlStnggqQaldkZZpaCHW3J8QHku7r9W1CnYhNsBBv2M10YKN7w/EeBHbqTY0cxvxSOq+zJWuxHvS9WkQpdV4bzhnfLP+KMPQu+LdoUtXQTCvTnVy7rU5H0EhOd8UhMZR9ZnQFSzyork5GKoQR2QRgZ58WSUI129krjJ8Aj5A2SFUWtv+lMpor/Z4L1HwyYIjmPP4bR00Gua+PRka4rQijXG6uhsCdZSEvyIv/DnaR9VH4SXgupzUkPxaIxWZBDsfY/nVIW6MwWo2/M1RrQWb7FfZAeZJpKt51Y/K3ZKw5x2E0nZBqg6gc/zr8sAKcPIFOa4m56cNXdr2K1xT/Z7sv0TmfAK/9SsbpP8hf/--8SqgyyDNstZHVUY8--8bXh/bQINQ4Ab6iKCKccfQ== \ 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..48103041f7 --- /dev/null +++ b/config/webpack/environment.js @@ -0,0 +1,12 @@ +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/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..b10373ba60 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,18 @@ +# 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: 0) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + +end 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 271075e4dcd0bf9497f48201ad13d705bffa7d10 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Tue, 9 Jun 2020 14:32:06 -0700 Subject: [PATCH 002/234] Created schema/models and controllers for all high priority objects --- app/assets/stylesheets/merchants.scss | 3 ++ app/assets/stylesheets/orders.scss | 3 ++ app/assets/stylesheets/products.scss | 3 ++ app/controllers/merchants_controller.rb | 2 + app/controllers/orders_controller.rb | 2 + app/controllers/products_controller.rb | 2 + app/helpers/merchants_helper.rb | 2 + app/helpers/orders_helper.rb | 2 + app/helpers/products_helper.rb | 2 + app/models/merchant.rb | 2 + app/models/order.rb | 2 + app/models/order_item.rb | 2 + app/models/product.rb | 2 + db/migrate/20200609212550_create_merchants.rb | 10 +++++ db/migrate/20200609212740_create_products.rb | 12 ++++++ db/migrate/20200609213017_create_orders.rb | 17 ++++++++ .../20200609213117_create_order_items.rb | 11 +++++ db/schema.rb | 40 ++++++++++++++++++- test/controllers/merchants_controller_test.rb | 7 ++++ test/controllers/orders_controller_test.rb | 7 ++++ test/controllers/products_controller_test.rb | 7 ++++ test/models/merchant_test.rb | 7 ++++ test/models/order_item_test.rb | 7 ++++ test/models/order_test.rb | 7 ++++ test/models/product_test.rb | 7 ++++ 25 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 app/assets/stylesheets/merchants.scss create mode 100644 app/assets/stylesheets/orders.scss create mode 100644 app/assets/stylesheets/products.scss create mode 100644 app/controllers/merchants_controller.rb create mode 100644 app/controllers/orders_controller.rb create mode 100644 app/controllers/products_controller.rb create mode 100644 app/helpers/merchants_helper.rb create mode 100644 app/helpers/orders_helper.rb create mode 100644 app/helpers/products_helper.rb create mode 100644 app/models/merchant.rb create mode 100644 app/models/order.rb create mode 100644 app/models/order_item.rb create mode 100644 app/models/product.rb create mode 100644 db/migrate/20200609212550_create_merchants.rb create mode 100644 db/migrate/20200609212740_create_products.rb create mode 100644 db/migrate/20200609213017_create_orders.rb create mode 100644 db/migrate/20200609213117_create_order_items.rb create mode 100644 test/controllers/merchants_controller_test.rb create mode 100644 test/controllers/orders_controller_test.rb create mode 100644 test/controllers/products_controller_test.rb create mode 100644 test/models/merchant_test.rb create mode 100644 test/models/order_item_test.rb create mode 100644 test/models/order_test.rb create mode 100644 test/models/product_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/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/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss new file mode 100644 index 0000000000..8f0ca888eb --- /dev/null +++ b/app/assets/stylesheets/products.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Products controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/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/controllers/orders_controller.rb b/app/controllers/orders_controller.rb new file mode 100644 index 0000000000..8a0e3659ae --- /dev/null +++ b/app/controllers/orders_controller.rb @@ -0,0 +1,2 @@ +class OrdersController < ApplicationController +end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb new file mode 100644 index 0000000000..f1ad12ddea --- /dev/null +++ b/app/controllers/products_controller.rb @@ -0,0 +1,2 @@ +class ProductsController < 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/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/helpers/products_helper.rb b/app/helpers/products_helper.rb new file mode 100644 index 0000000000..ab5c42b325 --- /dev/null +++ b/app/helpers/products_helper.rb @@ -0,0 +1,2 @@ +module ProductsHelper +end diff --git a/app/models/merchant.rb b/app/models/merchant.rb new file mode 100644 index 0000000000..0440407160 --- /dev/null +++ b/app/models/merchant.rb @@ -0,0 +1,2 @@ +class Merchant < ApplicationRecord +end diff --git a/app/models/order.rb b/app/models/order.rb new file mode 100644 index 0000000000..10281b3450 --- /dev/null +++ b/app/models/order.rb @@ -0,0 +1,2 @@ +class Order < ApplicationRecord +end diff --git a/app/models/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/app/models/product.rb b/app/models/product.rb new file mode 100644 index 0000000000..35a85acab3 --- /dev/null +++ b/app/models/product.rb @@ -0,0 +1,2 @@ +class Product < ApplicationRecord +end diff --git a/db/migrate/20200609212550_create_merchants.rb b/db/migrate/20200609212550_create_merchants.rb new file mode 100644 index 0000000000..d7dc18b6f4 --- /dev/null +++ b/db/migrate/20200609212550_create_merchants.rb @@ -0,0 +1,10 @@ +class CreateMerchants < ActiveRecord::Migration[6.0] + def change + create_table :merchants do |t| + t.string :username + t.string :email + + t.timestamps + end + end +end diff --git a/db/migrate/20200609212740_create_products.rb b/db/migrate/20200609212740_create_products.rb new file mode 100644 index 0000000000..ca65c38dcc --- /dev/null +++ b/db/migrate/20200609212740_create_products.rb @@ -0,0 +1,12 @@ +class CreateProducts < ActiveRecord::Migration[6.0] + def change + create_table :products do |t| + t.string :name + t.float :price + t.string :description + t.integer :inventory + + t.timestamps + end + end +end diff --git a/db/migrate/20200609213017_create_orders.rb b/db/migrate/20200609213017_create_orders.rb new file mode 100644 index 0000000000..3131c8bb47 --- /dev/null +++ b/db/migrate/20200609213017_create_orders.rb @@ -0,0 +1,17 @@ +class CreateOrders < ActiveRecord::Migration[6.0] + def change + create_table :orders do |t| + t.string :card_number + t.string :card_expiration_date + t.string :card_cvv + t.string :address + t.string :city + t.string :zip_code + t.string :guest_name + t.string :email + t.string :phone_num + + t.timestamps + end + end +end diff --git a/db/migrate/20200609213117_create_order_items.rb b/db/migrate/20200609213117_create_order_items.rb new file mode 100644 index 0000000000..722ff24785 --- /dev/null +++ b/db/migrate/20200609213117_create_order_items.rb @@ -0,0 +1,11 @@ +class CreateOrderItems < ActiveRecord::Migration[6.0] + def change + create_table :order_items do |t| + t.string :name + t.float :price + t.integer :quantity + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index b10373ba60..e108e7c63c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,9 +10,47 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 0) do +ActiveRecord::Schema.define(version: 2020_06_09_213117) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "merchants", force: :cascade do |t| + t.string "username" + 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.string "name" + t.float "price" + t.integer "quantity" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + + create_table "orders", force: :cascade do |t| + t.string "card_number" + t.string "card_expiration_date" + t.string "card_cvv" + t.string "address" + t.string "city" + t.string "zip_code" + t.string "guest_name" + t.string "email" + t.string "phone_num" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + + create_table "products", force: :cascade do |t| + t.string "name" + t.float "price" + t.string "description" + t.integer "inventory" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + 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 diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb new file mode 100644 index 0000000000..4b01cc1988 --- /dev/null +++ b/test/controllers/orders_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe OrdersController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb new file mode 100644 index 0000000000..1c0716685f --- /dev/null +++ b/test/controllers/products_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe ProductsController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end 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 diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb new file mode 100644 index 0000000000..b2630ff9e9 --- /dev/null +++ b/test/models/order_item_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe OrderItem do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end diff --git a/test/models/order_test.rb b/test/models/order_test.rb new file mode 100644 index 0000000000..59ceb9a253 --- /dev/null +++ b/test/models/order_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe Order do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end diff --git a/test/models/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 0cc53ce6377766e4f6f51ac8a712715ad543d8ed Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Tue, 9 Jun 2020 14:42:32 -0700 Subject: [PATCH 003/234] Added schema relations for all high priority models --- app/models/merchant.rb | 1 + db/migrate/20200609213643_add_products_to_merchant.rb | 5 +++++ db/migrate/20200609213910_add_order_itemto_product.rb | 5 +++++ db/migrate/20200609214125_add_order_items_to_order.rb | 5 +++++ db/schema.rb | 11 ++++++++++- 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20200609213643_add_products_to_merchant.rb create mode 100644 db/migrate/20200609213910_add_order_itemto_product.rb create mode 100644 db/migrate/20200609214125_add_order_items_to_order.rb diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 0440407160..07aacc445d 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,2 +1,3 @@ class Merchant < ApplicationRecord + has_many :products end diff --git a/db/migrate/20200609213643_add_products_to_merchant.rb b/db/migrate/20200609213643_add_products_to_merchant.rb new file mode 100644 index 0000000000..374a260e7e --- /dev/null +++ b/db/migrate/20200609213643_add_products_to_merchant.rb @@ -0,0 +1,5 @@ +class AddProductsToMerchant < ActiveRecord::Migration[6.0] + def change + add_reference :products, :merchant, foreign_key: true + end +end diff --git a/db/migrate/20200609213910_add_order_itemto_product.rb b/db/migrate/20200609213910_add_order_itemto_product.rb new file mode 100644 index 0000000000..b7b1939d04 --- /dev/null +++ b/db/migrate/20200609213910_add_order_itemto_product.rb @@ -0,0 +1,5 @@ +class AddOrderItemtoProduct < ActiveRecord::Migration[6.0] + def change + add_reference :order_items, :product, foreign_key: true + end +end diff --git a/db/migrate/20200609214125_add_order_items_to_order.rb b/db/migrate/20200609214125_add_order_items_to_order.rb new file mode 100644 index 0000000000..c707effc2f --- /dev/null +++ b/db/migrate/20200609214125_add_order_items_to_order.rb @@ -0,0 +1,5 @@ +class AddOrderItemsToOrder < ActiveRecord::Migration[6.0] + def change + add_reference :order_items, :order, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index e108e7c63c..88a7090ec1 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_09_213117) do +ActiveRecord::Schema.define(version: 2020_06_09_214125) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -28,6 +28,10 @@ t.integer "quantity" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.bigint "product_id" + t.bigint "order_id" + t.index ["order_id"], name: "index_order_items_on_order_id" + t.index ["product_id"], name: "index_order_items_on_product_id" end create_table "orders", force: :cascade do |t| @@ -51,6 +55,11 @@ t.integer "inventory" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.bigint "merchant_id" + t.index ["merchant_id"], name: "index_products_on_merchant_id" end + add_foreign_key "order_items", "orders" + add_foreign_key "order_items", "products" + add_foreign_key "products", "merchants" end From 2cd5ce2d496daa29e5e9b94cfcd7b295b391f638 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Tue, 9 Jun 2020 14:50:21 -0700 Subject: [PATCH 004/234] Established model relationships --- app/models/order.rb | 2 ++ app/models/order_item.rb | 2 ++ app/models/product.rb | 2 ++ 3 files changed, 6 insertions(+) diff --git a/app/models/order.rb b/app/models/order.rb index 10281b3450..b36051f45f 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,2 +1,4 @@ class Order < ApplicationRecord + has_many :order_items + has_many :products, through: :order_items end diff --git a/app/models/order_item.rb b/app/models/order_item.rb index acc6099fd0..95b6a76cbb 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -1,2 +1,4 @@ class OrderItem < ApplicationRecord + has_one :product + belongs_to :order end diff --git a/app/models/product.rb b/app/models/product.rb index 35a85acab3..410f0db8d2 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,2 +1,4 @@ class Product < ApplicationRecord + belongs_to :merchant + has_one :order_item end From c01645e3cbc86cfc0595b5affbfb5453afc3019c Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 9 Jun 2020 15:30:36 -0700 Subject: [PATCH 005/234] generate order items controller --- .vscode/settings.json | 1 + app/assets/stylesheets/order_items.scss | 3 +++ app/controllers/order_items_controller.rb | 2 ++ app/controllers/orders_controller.rb | 18 ++++++++++++++++++ app/helpers/order_items_helper.rb | 2 ++ config/routes.rb | 2 ++ .../controllers/order_items_controller_test.rb | 7 +++++++ 7 files changed, 35 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 app/assets/stylesheets/order_items.scss create mode 100644 app/controllers/order_items_controller.rb create mode 100644 app/helpers/order_items_helper.rb create mode 100644 test/controllers/order_items_controller_test.rb diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..2cd8968be8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +123,125 \ No newline at end of file diff --git a/app/assets/stylesheets/order_items.scss b/app/assets/stylesheets/order_items.scss new file mode 100644 index 0000000000..f93be746f6 --- /dev/null +++ b/app/assets/stylesheets/order_items.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Order_Items controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb new file mode 100644 index 0000000000..357e7f5c80 --- /dev/null +++ b/app/controllers/order_items_controller.rb @@ -0,0 +1,2 @@ +class OrderItemsController < ApplicationController +end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 8a0e3659ae..7f8605f10c 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,2 +1,20 @@ class OrdersController < ApplicationController + + def index + @order = orders.all + end + + + def show + if @order.nil? + head :not_found + return + end + end + + def create + @order = Order.new() + + end end + diff --git a/app/helpers/order_items_helper.rb b/app/helpers/order_items_helper.rb new file mode 100644 index 0000000000..e197528ae1 --- /dev/null +++ b/app/helpers/order_items_helper.rb @@ -0,0 +1,2 @@ +module OrderItemsHelper +end diff --git a/config/routes.rb b/config/routes.rb index c06383a172..4207a5ae40 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,5 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + + resources :orders end diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb new file mode 100644 index 0000000000..17457ab944 --- /dev/null +++ b/test/controllers/order_items_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe OrderItemsController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From c5b6efa1db8849c292fdb1b213f307f85e19277f Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 9 Jun 2020 15:35:37 -0700 Subject: [PATCH 006/234] add status column to orders --- app/controllers/order_items_controller.rb | 20 +++++++++++++++++++ config/routes.rb | 1 + .../20200609223426_add_status_to_order.rb | 5 +++++ db/schema.rb | 3 ++- 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20200609223426_add_status_to_order.rb diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 357e7f5c80..95d9b9ecbb 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,2 +1,22 @@ class OrderItemsController < ApplicationController + + def index + @order_items = order_items.all + end + + + def show + if @order_item.nil? + head :not_found + return + end + end + + def create + @order = Order.new() + + end + + + end diff --git a/config/routes.rb b/config/routes.rb index 4207a5ae40..6780c29c84 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,6 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + resources :order_items resources :orders end diff --git a/db/migrate/20200609223426_add_status_to_order.rb b/db/migrate/20200609223426_add_status_to_order.rb new file mode 100644 index 0000000000..f08222d408 --- /dev/null +++ b/db/migrate/20200609223426_add_status_to_order.rb @@ -0,0 +1,5 @@ +class AddStatusToOrder < ActiveRecord::Migration[6.0] + def change + add_column :orders, :status, :boolean + end +end diff --git a/db/schema.rb b/db/schema.rb index 88a7090ec1..0dd74067e6 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_09_214125) do +ActiveRecord::Schema.define(version: 2020_06_09_223426) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -46,6 +46,7 @@ t.string "phone_num" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.boolean "status" end create_table "products", force: :cascade do |t| From 48f6fbc3e98e8707d7366a7ef7668e76745c880e Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 9 Jun 2020 15:44:48 -0700 Subject: [PATCH 007/234] add true default to status --- db/migrate/20200609223426_add_status_to_order.rb | 5 ----- db/migrate/20200609224346_set_default_status_of_order.rb | 5 +++++ db/schema.rb | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 db/migrate/20200609223426_add_status_to_order.rb create mode 100644 db/migrate/20200609224346_set_default_status_of_order.rb diff --git a/db/migrate/20200609223426_add_status_to_order.rb b/db/migrate/20200609223426_add_status_to_order.rb deleted file mode 100644 index f08222d408..0000000000 --- a/db/migrate/20200609223426_add_status_to_order.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddStatusToOrder < ActiveRecord::Migration[6.0] - def change - add_column :orders, :status, :boolean - end -end diff --git a/db/migrate/20200609224346_set_default_status_of_order.rb b/db/migrate/20200609224346_set_default_status_of_order.rb new file mode 100644 index 0000000000..f31087ca19 --- /dev/null +++ b/db/migrate/20200609224346_set_default_status_of_order.rb @@ -0,0 +1,5 @@ +class SetDefaultStatusOfOrder < ActiveRecord::Migration[6.0] + def change + change_column_default(:orders, :status, true) + end +end diff --git a/db/schema.rb b/db/schema.rb index 0dd74067e6..8a2c9ef291 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_09_223426) do +ActiveRecord::Schema.define(version: 2020_06_09_224346) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -46,7 +46,7 @@ t.string "phone_num" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false - t.boolean "status" + t.boolean "status", default: true end create_table "products", force: :cascade do |t| From ea7c0a6dc34a4f233092abe32aca352be3fd5cf9 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 9 Jun 2020 15:51:32 -0700 Subject: [PATCH 008/234] set up create for OrderItem --- app/controllers/order_items_controller.rb | 27 ++++++++++------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 95d9b9ecbb..4ac85ea5a9 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,22 +1,19 @@ class OrderItemsController < ApplicationController - def index - @order_items = order_items.all - end + # def index + # @order_items = order_items.all + # end + # def show + # if @order_item.nil? + # head :not_found + # return + # end + # end - def show - if @order_item.nil? - head :not_found - return - end - end - - def create - @order = Order.new() - - end - + def create + @order = Order.new() + end end From cf6dc65d5e04062b7020dc0a55d659264b068d99 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 9 Jun 2020 16:43:16 -0700 Subject: [PATCH 009/234] nest routes for ordering products, set up create --- app/controllers/order_items_controller.rb | 14 +++++++++++++- config/routes.rb | 4 ++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 4ac85ea5a9..519adbda4a 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -12,7 +12,19 @@ class OrderItemsController < ApplicationController # end def create - @order = Order.new() + + if session[:order] + @open_order = Order.find_by(id: session[:order][:id]) + + else + new_order = Order.new + session[:order] = new_order + + + + # maybe have an array of order_item ids within Order. + # or an array of order_item Objects + end end diff --git a/config/routes.rb b/config/routes.rb index 6780c29c84..4bd083a998 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,10 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + resources :products do + resources :order_items + end + resources :order_items resources :orders end From ecedcbf2e01482943c36c1cb9ae5e0a0a6e6ae37 Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 9 Jun 2020 17:00:47 -0700 Subject: [PATCH 010/234] add product resources to routes --- config/routes.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index c06383a172..cd6a89352f 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 + + resources :products do + resources :order_items, only [:create, :destroy] + end + + end From adca704215cbe7bd551709a00c2d17a349797d80 Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 9 Jun 2020 17:50:51 -0700 Subject: [PATCH 011/234] added fixtures for products and merchants --- test/fixtures/merchants.yml | 6 ++++++ test/fixtures/products.yml | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 test/fixtures/merchants.yml create mode 100644 test/fixtures/products.yml diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml new file mode 100644 index 0000000000..350f35b38b --- /dev/null +++ b/test/fixtures/merchants.yml @@ -0,0 +1,6 @@ +merchant_1: + username: merchant_1 + email: email@email.com +merchant_2: + username: merchant_2 + email: email@webmail.net diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml new file mode 100644 index 0000000000..315bdc1a1f --- /dev/null +++ b/test/fixtures/products.yml @@ -0,0 +1,18 @@ +product_1: + name: "Product 1" + price: 10.01 + description: "This is a product that merchant_1 sells." + inventory: 5 + merchant: merchant_1 +product_2: + name: "Product 2" + price: 5.00 + description: "Merchant 2 sells this product." + inventory: 5 + merchant: merchant_2 +product_3: + name: "Product 3" + price: 8.99 + description: "This is also a product that merchant_1 sells." + inventory: 1 + merchant: merchant_1 \ No newline at end of file From 105ed3ffe61fc564a70d6304228915107fbeead2 Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 9 Jun 2020 22:06:45 -0700 Subject: [PATCH 012/234] tweaked routes --- config/routes.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index cd6a89352f..53522c9dc4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,9 +1,8 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html - resources :products do - resources :order_items, only [:create, :destroy] - end - + resources :products # do + # resources :order_items, only [:create, :destroy] + # end end From 181b751a3f53d316c66f9b7175a0300dde195087 Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 9 Jun 2020 23:26:33 -0700 Subject: [PATCH 013/234] added products v1 tests & placeholder CRUD --- app/controllers/products_controller.rb | 24 +++ test/controllers/products_controller_test.rb | 166 ++++++++++++++++++- 2 files changed, 187 insertions(+), 3 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index f1ad12ddea..7ea2773360 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,2 +1,26 @@ class ProductsController < ApplicationController + + def index + + end + + def new + + end + + def create + + end + + def show + + end + + def update + + end + + def destroy + + end end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 1c0716685f..00200be8a1 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,7 +1,167 @@ require "test_helper" describe ProductsController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + let (:merchant_1) { + merchants(:merchant_1) + } + + let (:product_1) { + products(:product_1) + } + + let (:product_hash) { + { + product: { + name: "Monstera", + price: 39.99, + description: "Big green plant!", + inventory: 3, + merchant_id: merchant_1.id + } + } + } + + describe "index" do + it "must get index" do + get products_path + must_respond_with :success + end + end + + describe "new" do + # TODO require login + it "gets the path" do + get new_product_path + must_respond_with :success + end + + # TODO add if user id not logged in, then it redirects to the homepage + # it "if not logged in, redirects to root path" do + # get new_product_path + + # must_respond_with :redirect + # must_redirect_to root_path + # end + end + + + describe "create" do + + # TODO - require login + it "creates a new product" do + expect { + post products_path, params: product_hash + }.must_differ 'Product.count', 1 + + must_respond_with :redirect + must_redirect_to product_path(Product.last.id) + expect(Product.last.name).must_equal product_hash[:product][:name] + expect(Product.last.price).must_equal product_hash[:product][:price] + expect(Product.last.description).must_equal product_hash[:product][:description] + expect(Product.last.inventory).must_equal product_hash[:product][:inventory] + # TODO add verify the merchant name + # expect(Product.last.author.name).must_equal sandi_metz.name + end + + # TODO add after validations + # it "doesn't create a product with invalid data" do + # product_hash[:product][:name] = nil + + # expect { + # post products_path, params: product_hash + # }.must_differ "Product.count", 0 + + # must_respond_with :bad_request + # end + + # TODO add not logged in redirect to root path + # it "if users is not logged in, redirects to homepage" do + # expect{ post products_path, params: product_hash }.must_differ 'Product.count', 0 + + # must_respond_with :redirect + # must_redirect_to root_path + # end + end + + describe "show" do + it "will get show for valid ids" do + # Arrange + valid_product_id = product_1.id + + # Act + get "/products/#{valid_product_id}" + + # Assert + must_respond_with :success + end + + it "will respond with not_found for invalid ids" do + # Arrange + invalid_product_id = 999 + + # Act + get "/products/#{invalid_product_id}" + + # Assert + must_respond_with :not_found + end + end + + describe "update" do + + # TODO require login + it "will update a product with a valid post request and redirect" do + id = Product.first.id + expect { + patch product_path(id), params: product_hash + }.wont_change "Product.count" + + must_respond_with :redirect + must_redirect_to product_path(id) + + product = Product.find_by(id: id) + expect(product.name).must_equal product_hash[:product][:name] + expect(product.description).must_equal product_hash[:product][:description] + end + + # TODO require login + it "will respond with not_found for invalid ids" do + id = -1 + + expect { + patch product_path(id), params: product_hash + }.wont_change "Product.count" + + must_respond_with :not_found + end + + # TODO after validations are added + # TODO require login + # it "will not update if the params are invalid" do + # product_hash[:product][:name] = nil + + # expect { + # patch product_path(product_1.id), params: product_hash + # }.wont_change "Product.count" + + # product_1.reload # refresh the product from the database + # must_respond_with :bad_request + # expect(product.name).wont_be_nil + # end + + # TODO Add not logged in version + # it "will not change a product if not logged in" do + # id = Product.first.id + # name = Product.first.name + # expect { + # patch product_path(id), params: product_hash + # }.wont_change "Product.count" + + # must_respond_with :redirect + # must_redirect_to root_path + + # product = Product.find_by(id: id) + # expect(product.name).must_equal name + # end + end end From b8b846eba213e0da8832f1d055e00e87019fae68 Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 9 Jun 2020 23:47:45 -0700 Subject: [PATCH 014/234] very rough homepage with index of products --- app/controllers/products_controller.rb | 2 +- app/views/layouts/application.html.erb | 7 ++++++- app/views/products/index.html.erb | 19 +++++++++++++++++++ config/routes.rb | 1 + 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 app/views/products/index.html.erb diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 7ea2773360..b9a14ed673 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,7 +1,7 @@ class ProductsController < ApplicationController def index - + @products = Product.all end def new diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 74961e61a4..f7cdd51732 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,7 +1,7 @@ - Betsy + Plantsy <%= csrf_meta_tags %> <%= csp_meta_tag %> @@ -10,6 +10,11 @@ +
+
+

Plantsy

+
+
<%= yield %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb new file mode 100644 index 0000000000..9a36a6c64b --- /dev/null +++ b/app/views/products/index.html.erb @@ -0,0 +1,19 @@ +
+

All The Plants

+
+ <% @products.each do |product| %> +
+ <%=link_to product.name, product_path( product.id ) %> +
+
+ Cost: $<%= sprintf('%.2f', product.price) %> +
+
+ Quantity: + <%= product.qty %> +
+ <% end %> +
+
+ + diff --git a/config/routes.rb b/config/routes.rb index 53522c9dc4..db73ea3327 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,7 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + root to: 'products#index' resources :products # do # resources :order_items, only [:create, :destroy] # end From 7fee24b1a936e743343a88d18a75214b158fd778 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 10 Jun 2020 09:46:23 -0700 Subject: [PATCH 015/234] create new item, create new order dependent on cart --- app/controllers/order_items_controller.rb | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 519adbda4a..120afba9ad 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -15,15 +15,18 @@ def create if session[:order] @open_order = Order.find_by(id: session[:order][:id]) - + @new_item = Order_Item.new( + product_id: params[:product_id], + order_id: @open_order.id + ) else - new_order = Order.new + @new_order = Order.new session[:order] = new_order - - - # maybe have an array of order_item ids within Order. - # or an array of order_item Objects + @new_item = Order_Item.new( + product_id: params[:product_id], + order_id: @new_order.id + ) end end From 9b4086d1f76f560f381470d856e388e0e6c242ca Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 10 Jun 2020 11:15:32 -0700 Subject: [PATCH 016/234] testing and writing for create function for orderItem (add to cart) --- app/controllers/order_items_controller.rb | 71 ++++++- app/models/order_item.rb | 2 + config/routes.rb | 3 +- .../order_items_controller_test.rb | 199 +++++++++++++++++- 4 files changed, 265 insertions(+), 10 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 120afba9ad..3b4ce2ebb2 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -5,30 +5,87 @@ class OrderItemsController < ApplicationController # end # def show + # @order_item = Order.find_by(id: params[:id]) + # flash[:success] = 'Item added to cart.' # if @order_item.nil? - # head :not_found + # flash.now[:error] = 'Item could not be added.' + # redirect_to product_order_items_path(params[:product_id]) + # #render :new, status: :bad_request + # #head :not_found # return # end # end + + + #ADD TO CART products/:product_id/order_items def create - if session[:order] @open_order = Order.find_by(id: session[:order][:id]) - @new_item = Order_Item.new( + @new_item = OrderItem.new( + name: params[:order_item][:name], + price: params[:order_item][:price], + quantity: params[:order_item][:quantity], product_id: params[:product_id], order_id: @open_order.id ) else - @new_order = Order.new - session[:order] = new_order + @new_order = Order.create + session[:order] = @new_order - @new_item = Order_Item.new( + @new_item = OrderItem.new( + name: params[:order_item][:name], + price: params[:order_item][:price], + quantity: params[:order_item][:quantity], product_id: params[:product_id], order_id: @new_order.id ) end - + + if @new_item.save + flash[:success] = 'Item added to cart.' + redirect_to orders_path + return + else + flash[:failure] = 'Item could not be added.' + redirect_to product_order_items_path(params[:product_id]) + # redirect_back fallback_location: root_path + return + end end + #PATCH: UPDATE CART /orders/:id (params) + # def update + # @order_item = Vote.find_by(id: params[:id]) + # if @order_item.nil? + # head :not_found + # return + # elsif @order_item.update(order_item_params) + + # redirect_to orders_path + # return + # else + # render :edit + # return + # end + # end + + #REMOVE FROM CART /orders/:id + # def destroy + # @order_item = Order.find_by(id: params[:id]) + # if @order_item.nil? + # head :not_found + # return + # end + + # @order_item.destroy + + # redirect_to orders_path + # return + # end + end + +def order_items_params + return params.require(:order_item).permit(:name, :price, :quantity, :product_id, :order_id) +end \ No newline at end of file diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 95b6a76cbb..7f0fe745b3 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -1,4 +1,6 @@ class OrderItem < ApplicationRecord has_one :product belongs_to :order + + validates :name, presence: true end diff --git a/config/routes.rb b/config/routes.rb index 4bd083a998..6ad2abb07a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,10 +1,11 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html + root to: 'orders#index' resources :products do resources :order_items end - + resources :order_items resources :orders end diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 17457ab944..288bc30daa 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -1,7 +1,202 @@ require "test_helper" describe OrderItemsController do - # it "does a thing" do - # value(1+1).must_equal 2 + before do + @merchant = Merchant.create( + username: 'Leroy Jenkins', + email: 'leroy@gmail.com' + ) + @product = Product.create( + name: 'Plant One', + price: 5.00, + description: 'This is a fake plant.', + inventory: 5, + merchant_id: @merchant.id + ) + end + + let (:new_item_hash) { + { + order_item: { + name: @product.name, + price: @product.price, + quantity: 1, + product_id: @product.id + } + } + } + + describe "create" do + it "can create a new OrderItem with valid information accurately, and redirect" do + expect { + post product_order_items_path(@product.id), params: new_item_hash + }.must_change 'OrderItem.count', 1 + + new_order_item = OrderItem.first + new_order = Order.first + + expect(new_order_item.name).must_equal @product.name + expect(new_order_item.price).must_equal @product.price + expect(new_order_item.quantity).must_equal 1 + expect(new_order_item.product_id).must_equal @product.id + expect(new_order_item.order_id).must_equal new_order.id + + must_redirect_to orders_path + end + + it "does not create a new OrderItem if the form data violates validations, and responds with a redirect" do + new_item_hash[:order_item][:name] = nil + + expect { + post product_order_items_path(@product.id), params: new_item_hash + }.wont_change 'OrderItem.count' + + must_redirect_to product_order_items_path(@product.id) + end + end + + # describe "edit" do + # before do + # @driver = Driver.create(name: 'Leroy Jenkins', vin: 'SU9PYDRK6214WL15M', available: true) + # @passenger = Passenger.create(name: "test person", phone_num: "1234567") + # end + + # it "responds with success when getting the edit page for an existing, valid trip" do + # trip = Trip.create( + # passenger_id: @passenger.id, + # driver_id: @driver.id, + # date: Date.today, + # rating: nil, + # cost: rand(1...3000) + # ) + + # get edit_trip_path(trip.id) + + # must_respond_with :success + # end + + # it "responds with redirect when getting the edit page for a non-existing trip" do + # get edit_trip_path(-1) + + # must_respond_with :not_found + # end + # end + + describe "edit" do + it "responds with success when getting the edit page for an existing, valid order" do + get edit_orders_path(trip) + must_respond_with :success + end + + it "responds with redirect when getting the edit page for a non-existing order item" do + get edit_orders_path(-1) + must_redirect_to orders_path + end + end + + # describe "update" do + # before do + # @driver = Driver.create(name: 'Leroy Jenkins', vin: 'SU9PYDRK6214WL15M', available: true) + # @passenger = Passenger.create(name: "test person", phone_num: "1234567") + # @trip = Trip.create( + # passenger_id: @passenger.id, + # driver_id: @driver.id, + # date: Date.today, + # rating: nil, + # cost: rand(1...3000) + # ) + # end + + # let (:update_hash) { + # { + # trip: { + # rating: 2 + # } + # } + # } + + # it "can update an existing trip with valid information accurately, and redirect" do + # expect { + # patch trip_path(@trip.id), params: update_hash + # }.wont_change 'Trip.count' + + # must_redirect_to trip_path(@trip.id) + + # find_trip = Trip.find_by(id: @trip.id) + # expect(find_trip.rating).must_equal update_hash[:trip][:rating] + # end + + # it "does not update any trip if given an invalid id, and responds with a 404" do + # expect { + # patch trip_path(-1), params: update_hash + # }.wont_change 'Trip.count' + + # must_respond_with :not_found + # end + + # it "does not update a Trip if the form data violates Driver validations, and responds with a redirect" do + # update_trip = { + # trip: { + # rating: 8 + # } + # } + + # expect { + # patch trip_path(@trip.id), params: update_trip + # }.wont_change 'Trip.count' + + # must_respond_with :redirect + # end # end + + # describe "destroy" do + # it "destroys the Trip instance in db when Trip exists, then redirects" do + # driver = Driver.create(name: 'Leroy Jenkins', vin: 'SU9PYDRK6214WL15M', available: true) + # passenger = Passenger.create(name: "test person", phone_num: "1234567") + # trip = Trip.create( + # passenger_id: passenger.id, + # driver_id: driver.id, + # date: Date.today, + # rating: nil, + # cost: rand(1...3000) + # ) + + # expect { + # delete trip_path(trip.id) + # }.must_differ 'Trip.count', -1 + + # must_respond_with :redirect + # must_redirect_to root_path + # end + + # it "does not change the db when the Trip does not exist, then responds with redirect" do + # expect { + # delete trip_path(-1) + # }.wont_change 'Driver.count' + + # must_respond_with :not_found + # end + # end + + + # describe "destroy" do + # it "destroys the order item instance in db when order item exists, then redirects" do + # new_order_item = Order.create(name: 'Tyron Banks', price: 2, quantity: 30, product_id: @product.id, merchant_id: @merchant.id) + + # expect { + # delete orders_path(id: new_trip.id) + # }.must_differ 'Trip.count', -1 + + # deleted = Trip.find_by(id: new_trip.id) + # expect(deleted).must_be_nil + + # must_redirect_to trips_path + # end + # it "does not change the db when the driver does not exist, then responds with " do + # expect { + # delete trip_path(id: -1) + # }.must_differ 'Trip.count', 0 + # end + # end + end From d71d44b8d3e51d2cc4bddf6bc5c14319d914349a Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 10 Jun 2020 11:37:08 -0700 Subject: [PATCH 017/234] custom route for cart --- app/controllers/order_items_controller.rb | 8 ++++---- app/controllers/orders_controller.rb | 8 ++++---- config/routes.rb | 3 +++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 3b4ce2ebb2..b753b7dc37 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,8 +1,8 @@ class OrderItemsController < ApplicationController - # def index - # @order_items = order_items.all - # end + def index + @order_items = order_items.all + end # def show # @order_item = Order.find_by(id: params[:id]) @@ -16,7 +16,7 @@ class OrderItemsController < ApplicationController # end # end - + #ADD TO CART products/:product_id/order_items def create diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 7f8605f10c..ee225bb7c1 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -12,9 +12,9 @@ def show end end - def create - @order = Order.new() - - end + def cart # show function for the open order at the moment + # session[:order][:id] + end + end diff --git a/config/routes.rb b/config/routes.rb index 6ad2abb07a..6ab8b7c99b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,4 +8,7 @@ resources :order_items resources :orders + + # shopping cart + get '/cart', to: 'orders#cart', as: 'cart' end From e25cbe1c4e99377186a1f52f4c708783f083776c Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 10 Jun 2020 23:26:52 -0700 Subject: [PATCH 018/234] added photo_url & status columns to Products --- db/migrate/20200611062352_add_status_to_products.rb | 5 +++++ db/migrate/20200611062541_add_photo_url_to_products.rb | 5 +++++ db/schema.rb | 4 +++- 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20200611062352_add_status_to_products.rb create mode 100644 db/migrate/20200611062541_add_photo_url_to_products.rb diff --git a/db/migrate/20200611062352_add_status_to_products.rb b/db/migrate/20200611062352_add_status_to_products.rb new file mode 100644 index 0000000000..e362f9d9a5 --- /dev/null +++ b/db/migrate/20200611062352_add_status_to_products.rb @@ -0,0 +1,5 @@ +class AddStatusToProducts < ActiveRecord::Migration[6.0] + def change + add_column :products, :status, :boolean + end +end diff --git a/db/migrate/20200611062541_add_photo_url_to_products.rb b/db/migrate/20200611062541_add_photo_url_to_products.rb new file mode 100644 index 0000000000..0b3ad91dd4 --- /dev/null +++ b/db/migrate/20200611062541_add_photo_url_to_products.rb @@ -0,0 +1,5 @@ +class AddPhotoUrlToProducts < ActiveRecord::Migration[6.0] + def change + add_column :products, :photo_url, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 88a7090ec1..66dbf687bf 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_09_214125) do +ActiveRecord::Schema.define(version: 2020_06_11_062541) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -56,6 +56,8 @@ t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.bigint "merchant_id" + t.boolean "status" + t.string "photo_url" t.index ["merchant_id"], name: "index_products_on_merchant_id" end From 21dc40acbf4722a30afddc26d1edb50e09af6d1c Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 10 Jun 2020 23:29:35 -0700 Subject: [PATCH 019/234] new product method --- app/controllers/products_controller.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index b9a14ed673..89e206326f 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,11 +1,14 @@ class ProductsController < ApplicationController + # TODO setup login required + # skip_before_action :require_login, only: [:index, :show] def index @products = Product.all + # TODO add status active end def new - + @product = Product.new end def create From dadb4892c1d82ac46c870197a6b4799b4d16a5fe Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 10 Jun 2020 23:41:41 -0700 Subject: [PATCH 020/234] added status and photo to fixture --- test/fixtures/products.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 315bdc1a1f..88bca26055 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -4,15 +4,21 @@ product_1: description: "This is a product that merchant_1 sells." inventory: 5 merchant: merchant_1 + status: true + photo_url: "https://www.goodfreephotos.com/albums/plants/phyllotaxis-plant-spiral.jpg" product_2: name: "Product 2" price: 5.00 description: "Merchant 2 sells this product." inventory: 5 merchant: merchant_2 + status: true + photo_url: "https://cdn.pixabay.com/photo/2019/04/16/02/40/plant-4130769_960_720.png" product_3: name: "Product 3" price: 8.99 description: "This is also a product that merchant_1 sells." inventory: 1 - merchant: merchant_1 \ No newline at end of file + merchant: merchant_1 + status: false + photo_url: "https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" \ No newline at end of file From 6eb9a4832ee3310339c0932b4d0c0f6aa272abc9 Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 10 Jun 2020 23:59:34 -0700 Subject: [PATCH 021/234] added inactive product to test --- test/controllers/products_controller_test.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 00200be8a1..57c8d60bd8 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -9,6 +9,10 @@ products(:product_1) } + let (:inactive_product) { + products(:product_3) + } + let (:product_hash) { { product: { @@ -26,6 +30,8 @@ get products_path must_respond_with :success end + + # TODO add doesn't display if status is set to false end describe "new" do @@ -105,6 +111,8 @@ # Assert must_respond_with :not_found end + + # TODO add cannot view product with status set to false end describe "update" do From c14f611c8cc2f2f25784c44ba269bb9f7de73b7f Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 10 Jun 2020 23:59:53 -0700 Subject: [PATCH 022/234] added create method to product controller --- app/controllers/products_controller.rb | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 89e206326f..17c1b90f7e 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -12,7 +12,19 @@ def new end def create - + @product = Product.new(product_params) # Instantiate a new work + # TODO add merchant + # @product.merchant_id = session[:merchant_id] + + if @product.save + flash[:success] = "Your product was added." + redirect_to product_path(@product.id) + return + else # if save fails + flash.now[:error] = "Oops. We couldn't add your product." + render :new, status: :bad_request # show the new media form again + return + end end def show @@ -26,4 +38,10 @@ def update def destroy end + + private + + def product_params + return params.require(:product).permit(:name, :price, :description, :inventory, :status, :photo_url) + end end From 30cab6e5c02ba8ebc984c8cde52f1ee68df88adf Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 11 Jun 2020 00:03:29 -0700 Subject: [PATCH 023/234] product controller show method --- app/controllers/products_controller.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 17c1b90f7e..7e01887985 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -28,7 +28,11 @@ def create end def show - + @product = Product.find_by(id: params[:id]) # TODO make controller fixture + if @product.nil? + head :not_found + return + end end def update From 1b5dbb9fe88271d500234fc1ff0d5e34a723a35c Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 11 Jun 2020 00:14:30 -0700 Subject: [PATCH 024/234] edit & update methods on product controller --- app/controllers/products_controller.rb | 30 +++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 7e01887985..a55fb40c2e 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -35,12 +35,40 @@ def show end end + def edit + @product = Product.find_by(id: params[:id]) + + if @product.nil? + head :not_found + return + end + # TODO add session id must match product merchant id + if @product.user_id != session[:user_id] + flash.now[:error] = "Oops. You can only edit your own products." + redirect_to product_path(@product.id) + return + end + end + def update + @product = Product.find_by(id: params[:id]) + if @product.nil? + head :not_found + return + elsif @product.update(product_params) + flash[:success] = "Product updated!" + redirect_to product_path(@product.id) + return + else # save failed + flash.now[:error] = "Oops! We couldn't update your product." + render :edit, status: :bad_request # show the new media form view again + return + end end def destroy - + # TODO do we need this? end private From d00999f60f4aa9f21452729559b96d7b5b34275d Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 11 Jun 2020 00:30:01 -0700 Subject: [PATCH 025/234] fixed wrong name used in Product index --- app/views/products/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 9a36a6c64b..15e721b5cd 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -10,7 +10,7 @@
Quantity: - <%= product.qty %> + <%= product.inventory %>
<% end %> From 12d13c28fdf7a60543307693cf86f21dca251db7 Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 11 Jun 2020 00:52:07 -0700 Subject: [PATCH 026/234] create draft views --- app/views/products/edit.html.erb | 4 ++++ app/views/products/index.html.erb | 30 +++++++++++++++--------------- app/views/products/new.html.erb | 4 ++++ app/views/products/show.html.erb | 23 +++++++++++++++++++++++ 4 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 app/views/products/edit.html.erb create mode 100644 app/views/products/new.html.erb create mode 100644 app/views/products/show.html.erb diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb new file mode 100644 index 0000000000..654d0f686e --- /dev/null +++ b/app/views/products/edit.html.erb @@ -0,0 +1,4 @@ +
+

Edit Product

+

+
\ No newline at end of file diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 15e721b5cd..4ffa8235f9 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,19 +1,19 @@
-

All The Plants

-
- <% @products.each do |product| %> -
- <%=link_to product.name, product_path( product.id ) %> -
-
- Cost: $<%= sprintf('%.2f', product.price) %> -
-
- Quantity: - <%= product.inventory %> -
- <% end %> -
+

All The Plants

+
+ <% @products.each do |product| %> +
+ <%=link_to product.name, product_path( product.id ) %> +
+
+ Cost: $<%= sprintf('%.2f', product.price) %> +
+
+ Quantity: + <%= product.inventory %> +
+ <% end %> +
diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb new file mode 100644 index 0000000000..4aef7ab4e2 --- /dev/null +++ b/app/views/products/new.html.erb @@ -0,0 +1,4 @@ +
+

Add a New Product

+

+
\ No newline at end of file diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb new file mode 100644 index 0000000000..4b7abb45d5 --- /dev/null +++ b/app/views/products/show.html.erb @@ -0,0 +1,23 @@ +
+
+

+ <%= @product.name %> +

+

+ <%= link_to "Edit", edit_product_path(@product.id) %> +

+
+ <% if @product.photo_url == nil %> + <%= image_tag("https://f1.pngfuel.com/png/584/952/34/black-and-white-flower-black-white-m-leaf-plant-stem-silhouette-computer-line-plants-png-clip-art.png", :alt => "generic plant silhouette", class: "product-image") %> + <% else %> + <%= image_tag(@product.photo_url, :alt => @product.name, class:"product-image") %> + <% end %> +
+ +
+

$<%= sprintf('%.2f', @product.price) %>

+

Stock: <%= @product.inventory %>

+

<%= @product.description %>

+
+
+
\ No newline at end of file From de6654b8df1a1625c6d4d4a30c020304fdbd9a51 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Thu, 11 Jun 2020 09:32:47 -0700 Subject: [PATCH 027/234] Added login and logout functions --- .env | 2 ++ .github/.gitignore | 1 + Gemfile | 4 +++ Gemfile.lock | 29 +++++++++++++++++++ app/controllers/merchants_controller.rb | 29 +++++++++++++++++++ app/models/merchant.rb | 10 +++++++ app/views/layouts/application.html.erb | 5 ++++ config/initializers/omniauth.rb | 3 ++ config/routes.rb | 3 ++ ...83459_add_uid_and_provider_to_merchants.rb | 6 ++++ db/schema.rb | 4 ++- 11 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 .env create mode 100644 .github/.gitignore create mode 100644 config/initializers/omniauth.rb create mode 100644 db/migrate/20200611083459_add_uid_and_provider_to_merchants.rb diff --git a/.env b/.env new file mode 100644 index 0000000000..dea0f11906 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +GITHUB_CLIENT_ID: 2ccaeae55c6e9cd0c89e +GITHUB_CLIENT_SECRET: 3c04b22cde6669dc880caf9bb85bf3287c9135b0 \ No newline at end of file diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 0000000000..2eea525d88 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/Gemfile b/Gemfile index bf513ff7ce..9da19dc714 100644 --- a/Gemfile +++ b/Gemfile @@ -70,9 +70,13 @@ end group :development do gem 'better_errors' gem 'binding_of_caller' + gem 'dotenv-rails' end 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..8b2bdf77e4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -92,8 +92,14 @@ GEM debase-ruby_core_source (>= 0.10.2) debase-ruby_core_source (0.10.9) debug_inspector (0.0.3) + 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) + multipart-post (>= 1.2, < 3) ffi (1.13.1) formatador (0.2.5) globalid (0.4.2) @@ -111,6 +117,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 +129,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 +155,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 +165,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) @@ -268,6 +294,7 @@ DEPENDENCIES byebug capybara (>= 2.15) debase (>= 0.2.4.1) + dotenv-rails guard guard-minitest jbuilder (~> 2.7) @@ -276,6 +303,8 @@ DEPENDENCIES listen (~> 3.2) minitest-rails minitest-reporters + omniauth + omniauth-github pg (>= 0.18, < 2.0) pry-rails puma (~> 4.1) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index ae95f7677b..1cb6a40552 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,2 +1,31 @@ class MerchantsController < ApplicationController + + def create + auth_hash = request.env["omniauth.auth"] + + merchant = Merchant.find_by(uid: auth_hash[:uid], provider: "github") + if merchant + flash[:success] = "Logged in as returning merchant #{merchant.username}" + else + merchant = Merchant.build_from_github(auth_hash) + + if merchant.save + flash[:success] = "Logged in as new merchant #{merchant.username}" + else + flash[:error] = "Could not create new merchant account: #{merchant.errors.messages}" + return redirect_to root_path + end + end + + session[:user_id] = merchant.id + return redirect_to root_path + end + + def destroy + session[:user_id] = nil + flash[:success] = "Successfully logged out!" + + redirect_to root_path + end + end diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 07aacc445d..efd46237e1 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,3 +1,13 @@ class Merchant < ApplicationRecord has_many :products + + 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"] + + return merchant + end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f7cdd51732..0504d04e87 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -13,6 +13,11 @@

Plantsy

+ <% if session[:user_id] %> + <%= link_to "Log out", logout_path, method: "delete" %> + <% else %> + <%= link_to "Login with Github", github_login_path %> + <% end %>
<%= yield %> 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 diff --git a/config/routes.rb b/config/routes.rb index db73ea3327..a707387dd1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,4 +6,7 @@ # resources :order_items, only [:create, :destroy] # end + get "/auth/github", as: "github_login" + get "/auth/:provider/callback", to: "merchants#create" + delete "/logout", to: "merchants#destroy", as: "logout" end diff --git a/db/migrate/20200611083459_add_uid_and_provider_to_merchants.rb b/db/migrate/20200611083459_add_uid_and_provider_to_merchants.rb new file mode 100644 index 0000000000..2c6fd90a4a --- /dev/null +++ b/db/migrate/20200611083459_add_uid_and_provider_to_merchants.rb @@ -0,0 +1,6 @@ +class AddUidAndProviderToMerchants < ActiveRecord::Migration[6.0] + def change + add_column :merchants, :uid, :integer + add_column :merchants, :provider, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 88a7090ec1..9ae107830a 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_09_214125) do +ActiveRecord::Schema.define(version: 2020_06_11_083459) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -20,6 +20,8 @@ t.string "email" 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 6cd1788ff7d55700af810998060f13b05db9edf3 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 11 Jun 2020 14:17:37 -0700 Subject: [PATCH 028/234] order items methods --- app/controllers/order_items_controller.rb | 82 ++++++++++------------- 1 file changed, 35 insertions(+), 47 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index b753b7dc37..f33734388c 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,24 +1,6 @@ class OrderItemsController < ApplicationController - - def index - @order_items = order_items.all - end - - # def show - # @order_item = Order.find_by(id: params[:id]) - # flash[:success] = 'Item added to cart.' - # if @order_item.nil? - # flash.now[:error] = 'Item could not be added.' - # redirect_to product_order_items_path(params[:product_id]) - # #render :new, status: :bad_request - # #head :not_found - # return - # end - # end - - - - #ADD TO CART products/:product_id/order_items + + #POST /order_items { :order_item => { :name => "hello", :price => 6, }} def create if session[:order] @open_order = Order.find_by(id: session[:order][:id]) @@ -54,35 +36,41 @@ def create end end - #PATCH: UPDATE CART /orders/:id (params) - # def update - # @order_item = Vote.find_by(id: params[:id]) - # if @order_item.nil? - # head :not_found - # return - # elsif @order_item.update(order_item_params) - - # redirect_to orders_path - # return - # else - # render :edit - # return - # end - # end + # PATCH: /order_items/:id (params) + def update + @order_item = Order_item.find_by(id: params[:id]) + if @order_item.nil? + head :not_found + return + elsif @order_item.update(order_item_params) + redirect_to orders_path # /orders + return + else + flash[:failure] = 'Order item could not be updated.' + redirect_to order_path(@order_item.order.id) #/orders/:id + return + end + end - #REMOVE FROM CART /orders/:id - # def destroy - # @order_item = Order.find_by(id: params[:id]) - # if @order_item.nil? - # head :not_found - # return - # end - - # @order_item.destroy + # DElETE /order_items/:id + def destroy + @order_item = Order_item.find_by(id: params[:id]) + if @order_item.nil? + head :not_found + return + end - # redirect_to orders_path - # return - # end + @order_item.destroy + count = @order_item.order.order_items.count + if count == 0 + @order_item.order.destroy + redirect_to orders_path # /orders + return + else + redirect_to order_path(@order_item.order.id) #/orders/:id + return + end + end end From 1beebcb5d8463d6ea52b6473ab704d8211f39806 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 11 Jun 2020 14:17:57 -0700 Subject: [PATCH 029/234] need to finish order method (just notes) --- app/controllers/orders_controller.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index ee225bb7c1..5a7e9a641b 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,10 +1,14 @@ class OrdersController < ApplicationController + #TODO: + + #all orders def index @order = orders.all end + #individual order def show if @order.nil? head :not_found @@ -12,6 +16,13 @@ def show end end + #mark order sent or closed + def delete + + end + + + def cart # show function for the open order at the moment # session[:order][:id] end From 1f01f7f5bd5d8d07b106e0224d5a676c67d25435 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 11 Jun 2020 14:18:23 -0700 Subject: [PATCH 030/234] notes for kate for product relation --- app/models/product.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/models/product.rb b/app/models/product.rb index 410f0db8d2..b1dac8636b 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,4 +1,12 @@ class Product < ApplicationRecord belongs_to :merchant has_one :order_item + #need to clarify this because if there's 10 plants and all get purchased, should see 10 order items + #product has many order items.... + #has_many: order_item + + #PER Jess: quantity is an attribute of the model end + + +#product.order_items..will give all order items with this product vs product.order_item ..this is just one \ No newline at end of file From 62a1f5aff1bbde69a95086d0d5d87f499c84b49a Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Thu, 11 Jun 2020 14:31:07 -0700 Subject: [PATCH 031/234] Fixed gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index f22dd34725..60d10a1fb8 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ /yarn-error.log yarn-debug.log* .yarn-integrity + +.env \ No newline at end of file From 00a7e5553445b07cd5a8cfccae896f6ab2d9e05a Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 11 Jun 2020 14:44:31 -0700 Subject: [PATCH 032/234] cleanup --- app/controllers/orders_controller.rb | 6 +++--- config/routes.rb | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 5a7e9a641b..4d30499244 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -3,9 +3,9 @@ class OrdersController < ApplicationController #TODO: #all orders - def index - @order = orders.all - end + # def index + # @order = Order.all + # end #individual order diff --git a/config/routes.rb b/config/routes.rb index 591a7cbecc..6de5ae8d9b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,6 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html - root to: 'orders#index' + root to: 'products#index' resources :products do resources :order_items From 21443e4374db9ca885c9fd67245257b7fd11afb4 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 11 Jun 2020 14:47:46 -0700 Subject: [PATCH 033/234] orders cart view --- app/views/orders/cart.html.erb | 10 ++++++++++ app/views/orders/index.html.erb | 0 2 files changed, 10 insertions(+) create mode 100644 app/views/orders/cart.html.erb create mode 100644 app/views/orders/index.html.erb diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb new file mode 100644 index 0000000000..0ae02df0d6 --- /dev/null +++ b/app/views/orders/cart.html.erb @@ -0,0 +1,10 @@ +

Shopping Cart

+<% if @open_order %> +

+ WAHH FIX +

+<% else %> +

+ Cart is empty. +

+<% end %> \ No newline at end of file diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 From 94becd7ce76f0fe690465dea3c1d535f1fb9a4ae Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 11 Jun 2020 15:00:23 -0700 Subject: [PATCH 034/234] merchant product seeds --- db/merchant-seed.csv | 4 +++ db/product-seed.csv | 6 +++++ db/seeds.rb | 63 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 db/merchant-seed.csv create mode 100644 db/product-seed.csv diff --git a/db/merchant-seed.csv b/db/merchant-seed.csv new file mode 100644 index 0000000000..bc9f14b1cb --- /dev/null +++ b/db/merchant-seed.csv @@ -0,0 +1,4 @@ +username,email +audrey2, littleshop@ofhorrors.com +bananaman, peel@monkey.net +greengiant, eat@yourveggies.com \ No newline at end of file diff --git a/db/product-seed.csv b/db/product-seed.csv new file mode 100644 index 0000000000..4421a359af --- /dev/null +++ b/db/product-seed.csv @@ -0,0 +1,6 @@ +name,price,description,inventory,status,photo_url +"Product 1",10.01,"This is a product that a merchant sells.",5,true,"https://www.goodfreephotos.com/albums/plants/phyllotaxis-plant-spiral.jpg" +"Product 2",5.00,"Another Merchant sells this product.",5,true,"https://cdn.pixabay.com/photo/2019/04/16/02/40/plant-4130769_960_720.png" +"Product 3",8.99,"Stuff.",1,false,"https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" +"Product 4",9.99,"Things.",1,true,"https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" +"Product 5",5.99,"Yez.",1,true,"https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" \ No newline at end of file diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2accd..25109c839b 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,3 +5,66 @@ # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) + +require 'csv' + +# MERCHANTS + +MERCHANTS_FILE = Rails.root.join('db', 'merchant-seeds.csv') +puts "Loading raw merchant data from #{MERCHANTS_FILE}" + +merchant_failures = [] +CSV.foreach(MERCHANTS_FILE, :headers => true) do |row| + merchant = Merchant.new + merchant.username = row['username'] + merchant.email = row['email'] + merchant.uid = rand(1..100) + merchant.provider = "github" + + successful = merchant.save + + if !successful + merchant_failures << merchant + puts "Failed to save merchant: #{merchant.inspect}" + else + puts "created merchant: #{merchant.inspect}" + end +end + +puts "Added #{Merchant.count} merchants" +puts "#{merchant_failures_failures.length} merchants failed to save" + +# PRODUCTS + +PRODUCTS_FILE = Rails.root.join('db', 'product-seeds.csv') +puts "Loading raw product data from #{PRODUCTS_FILE}" + +product_failures = [] +CSV.foreach(PRODUCTS_FILE, :headers => true) do |row| + product = Product.new + product.name = row['name'] + product.price = row['price'] + product.inventory = row['creator'] + product.description = row['description'] + product.status = row['status'] + product.photo_url = row['photo_url'] + product.user_id = Merchant.find(rand(1..6)).id + successful = product.save + + if !successful + product_failures << product + puts "Failed to save product: #{product.inspect}" + else + puts "created product: #{product.inspect}" + end +end + +puts "Added #{Product.count} products" +puts "#{product_failures.length} products failed to save" + +puts "Manually resetting each table's PK sequence" +ActiveRecord::Base.connection.tables.each do |t| + ActiveRecord::Base.connection.reset_pk_sequence!(t) +end + +puts "Done!" \ No newline at end of file From 14d221a08859737a8a0b1a6ad23ab51832b4d89b Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 11 Jun 2020 15:17:12 -0700 Subject: [PATCH 035/234] added merchant and product seeds --- db/migrate/20200609224346_set_default_status_of_order.rb | 5 ----- db/migrate/20200611220558_add_status_to_orders.rb | 5 +++++ db/schema.rb | 4 ++-- db/seeds.rb | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 db/migrate/20200609224346_set_default_status_of_order.rb create mode 100644 db/migrate/20200611220558_add_status_to_orders.rb diff --git a/db/migrate/20200609224346_set_default_status_of_order.rb b/db/migrate/20200609224346_set_default_status_of_order.rb deleted file mode 100644 index f31087ca19..0000000000 --- a/db/migrate/20200609224346_set_default_status_of_order.rb +++ /dev/null @@ -1,5 +0,0 @@ -class SetDefaultStatusOfOrder < ActiveRecord::Migration[6.0] - def change - change_column_default(:orders, :status, true) - end -end diff --git a/db/migrate/20200611220558_add_status_to_orders.rb b/db/migrate/20200611220558_add_status_to_orders.rb new file mode 100644 index 0000000000..76d857e5c1 --- /dev/null +++ b/db/migrate/20200611220558_add_status_to_orders.rb @@ -0,0 +1,5 @@ +class AddStatusToOrders < ActiveRecord::Migration[6.0] + def change + add_column :orders, :cart_status, :boolean, default: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 44a207eb1a..f457806008 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_11_083459) do +ActiveRecord::Schema.define(version: 2020_06_11_220558) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -48,7 +48,7 @@ t.string "phone_num" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false - t.boolean "status", default: true + t.boolean "cart_status", default: true end create_table "products", force: :cascade do |t| diff --git a/db/seeds.rb b/db/seeds.rb index 25109c839b..282b9c7ed8 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -10,7 +10,7 @@ # MERCHANTS -MERCHANTS_FILE = Rails.root.join('db', 'merchant-seeds.csv') +MERCHANTS_FILE = Rails.root.join('db', 'merchant-seed.csv') puts "Loading raw merchant data from #{MERCHANTS_FILE}" merchant_failures = [] @@ -32,11 +32,11 @@ end puts "Added #{Merchant.count} merchants" -puts "#{merchant_failures_failures.length} merchants failed to save" +puts "#{merchant_failures.length} merchants failed to save" # PRODUCTS -PRODUCTS_FILE = Rails.root.join('db', 'product-seeds.csv') +PRODUCTS_FILE = Rails.root.join('db', 'product-seed.csv') puts "Loading raw product data from #{PRODUCTS_FILE}" product_failures = [] @@ -48,7 +48,7 @@ product.description = row['description'] product.status = row['status'] product.photo_url = row['photo_url'] - product.user_id = Merchant.find(rand(1..6)).id + product.merchant_id = Merchant.find(rand(1..3)).id successful = product.save if !successful From 426c53db15ef149a0fd97ebea9527d1c6d580b13 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 11 Jun 2020 20:59:12 -0700 Subject: [PATCH 036/234] add product to cart as OrderItem --- app/controllers/order_items_controller.rb | 37 +++++++++------ app/views/products/show.html.erb | 16 +++++++ ...00612034231_add_photo_url_to_order_item.rb | 5 ++ db/schema.rb | 4 +- test/controllers/orders_controller_test.rb | 46 +++++++++++++++++-- 5 files changed, 88 insertions(+), 20 deletions(-) create mode 100644 db/migrate/20200612034231_add_photo_url_to_order_item.rb diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index f33734388c..290ca010a0 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -3,32 +3,40 @@ class OrderItemsController < ApplicationController #POST /order_items { :order_item => { :name => "hello", :price => 6, }} def create if session[:order] - @open_order = Order.find_by(id: session[:order][:id]) + @open_order = Order.find_by(id: session[:order]["id"]) @new_item = OrderItem.new( - name: params[:order_item][:name], - price: params[:order_item][:price], - quantity: params[:order_item][:quantity], - product_id: params[:product_id], + name: order_items_params[:name], + price: order_items_params[:price], + quantity: order_items_params[:quantity], + product_id: order_items_params[:product_id], + photo_url: order_items_params[:photo_url], order_id: @open_order.id ) + + p "SESSION IS HERE" else @new_order = Order.create session[:order] = @new_order - + @new_item = OrderItem.new( - name: params[:order_item][:name], - price: params[:order_item][:price], - quantity: params[:order_item][:quantity], - product_id: params[:product_id], + name: order_items_params[:name], + price: order_items_params[:price], + quantity: order_items_params[:quantity], + product_id: order_items_params[:product_id], + photo_url: order_items_params[:photo_url], order_id: @new_order.id ) + + p "CREATE A SESSION" end if @new_item.save + p "ITEM WAS ADD" flash[:success] = 'Item added to cart.' - redirect_to orders_path + redirect_to cart_path return else + p "ITEM WAS not ADDED" flash[:failure] = 'Item could not be added.' redirect_to product_order_items_path(params[:product_id]) # redirect_back fallback_location: root_path @@ -72,8 +80,7 @@ def destroy end end -end - -def order_items_params - return params.require(:order_item).permit(:name, :price, :quantity, :product_id, :order_id) + def order_items_params + return params.require(:order_item).permit(:name, :price, :quantity, :photo_url, :product_id, :order_id) + 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 4b7abb45d5..83d4d050bd 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -19,5 +19,21 @@

Stock: <%= @product.inventory %>

<%= @product.description %>

+ + <%= form_for :order_item, url: product_order_items_path(@product.id) do |f| %> +
+
+ <%= f.label :quantity %>
+ <%= f.text_field :quantity %> +
+ <%= f.hidden_field :name, :value => @product.name %> + <%= f.hidden_field :price, :value => @product.price %> + <%= f.hidden_field :photo_url, :value => @product.photo_url %> +
+ <%= f.submit 'Add to Cart' %> +
+
+ <% end %> + \ No newline at end of file diff --git a/db/migrate/20200612034231_add_photo_url_to_order_item.rb b/db/migrate/20200612034231_add_photo_url_to_order_item.rb new file mode 100644 index 0000000000..199469fe57 --- /dev/null +++ b/db/migrate/20200612034231_add_photo_url_to_order_item.rb @@ -0,0 +1,5 @@ +class AddPhotoUrlToOrderItem < ActiveRecord::Migration[6.0] + def change + add_column :order_items, :photo_url, :string, default: "https://f1.pngfuel.com/png/584/952/34/black-and-white-flower-black-white-m-leaf-plant-stem-silhouette-computer-line-plants-png-clip-art.png" + end +end diff --git a/db/schema.rb b/db/schema.rb index f457806008..4803b4824a 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_11_220558) do +ActiveRecord::Schema.define(version: 2020_06_12_034231) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -32,6 +32,7 @@ t.datetime "updated_at", precision: 6, null: false t.bigint "product_id" t.bigint "order_id" + t.string "photo_url", default: "https://f1.pngfuel.com/png/584/952/34/black-and-white-flower-black-white-m-leaf-plant-stem-silhouette-computer-line-plants-png-clip-art.png" t.index ["order_id"], name: "index_order_items_on_order_id" t.index ["product_id"], name: "index_order_items_on_product_id" end @@ -48,6 +49,7 @@ t.string "phone_num" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.boolean "status", default: true t.boolean "cart_status", default: true end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 4b01cc1988..d6cff7302e 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -1,7 +1,45 @@ require "test_helper" describe OrdersController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end -end + before do + @merchant = Merchant.create( + username: 'Leroy Jenkins', + email: 'leroy@gmail.com' + ) + @product = Product.create( + name: 'Plant One', + price: 5.00, + description: 'This is a fake plant.', + inventory: 5, + merchant_id: @merchant.id + ) + end + + let (:new_item_hash) { + { + order_item: { + name: @product.name, + price: @product.price, + quantity: 1, + product_id: @product.id + } + } + } + + describe "cart" do + it "finds a list of orders if session order is populated" do + expect { + post product_order_items_path(@product.id), params: new_item_hash + }.must_change 'OrderItem.count', 1 + + new_order_item = OrderItem.first + new_order = Order.first + cart_items = Order.find_by(id: session[:order][:id]).order_items + + expect(session[:order]).must_equal new_order + expect(cart_items.length).must_equal 1 + expect(cart_items[0]).must_equal new_order_item + end + end + +end \ No newline at end of file From b0a9c9e1e63b37a8fa5e5429177afd06ebe6cdb2 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 11 Jun 2020 21:01:13 -0700 Subject: [PATCH 037/234] minor change --- app/controllers/orders_controller.rb | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 4d30499244..42de278274 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,14 +1,9 @@ class OrdersController < ApplicationController - #TODO: - - #all orders - # def index - # @order = Order.all - # end + def index + @order = Order.all + end - - #individual order def show if @order.nil? head :not_found @@ -16,15 +11,10 @@ def show end end - #mark order sent or closed - def delete - - end - - - def cart # show function for the open order at the moment - # session[:order][:id] + if session[:order] + @cart_items = Order.find_by(id: session[:order][:id]).order_items + end end end From 011f28f88563c958ad49315c2283ae6ef0ee975b Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 11 Jun 2020 21:11:28 -0700 Subject: [PATCH 038/234] fixed logic to display cart items --- app/controllers/orders_controller.rb | 4 +++- app/views/orders/cart.html.erb | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 4d30499244..cb9d43bc22 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -24,7 +24,9 @@ def delete def cart # show function for the open order at the moment - # session[:order][:id] + if session[:order] + @cart_items = Order.find_by(id: session[:order]["id"]).order_items + end end end diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index 0ae02df0d6..5223489017 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -1,8 +1,8 @@

Shopping Cart

-<% if @open_order %> -

- WAHH FIX -

+<% if @cart_items %> + <% @cart_items.each do |item| %> + <%= item.name =%> + <% end %> <% else %>

Cart is empty. From 928b86eaece0296b90ac7d859989fb5173cfb42c Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 11 Jun 2020 21:19:36 -0700 Subject: [PATCH 039/234] fixed inventory error with seed data --- db/product-seed.csv | 2 +- db/seeds.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/db/product-seed.csv b/db/product-seed.csv index 4421a359af..18a8e0ceff 100644 --- a/db/product-seed.csv +++ b/db/product-seed.csv @@ -1,5 +1,5 @@ name,price,description,inventory,status,photo_url -"Product 1",10.01,"This is a product that a merchant sells.",5,true,"https://www.goodfreephotos.com/albums/plants/phyllotaxis-plant-spiral.jpg" +"Product 1",10.01,"This is a product that a merchant sells.",15,true,"https://www.goodfreephotos.com/albums/plants/phyllotaxis-plant-spiral.jpg" "Product 2",5.00,"Another Merchant sells this product.",5,true,"https://cdn.pixabay.com/photo/2019/04/16/02/40/plant-4130769_960_720.png" "Product 3",8.99,"Stuff.",1,false,"https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" "Product 4",9.99,"Things.",1,true,"https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" diff --git a/db/seeds.rb b/db/seeds.rb index 282b9c7ed8..ba46b3ed4e 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -44,7 +44,7 @@ product = Product.new product.name = row['name'] product.price = row['price'] - product.inventory = row['creator'] + product.inventory = row['inventory'] product.description = row['description'] product.status = row['status'] product.photo_url = row['photo_url'] From 1081a87f4a335de04207ceabd2329a61507da4c1 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 11 Jun 2020 22:16:36 -0700 Subject: [PATCH 040/234] add homepage controller for index page --- app/assets/stylesheets/application.scss | 7 +++++++ app/assets/stylesheets/homepages.scss | 3 +++ app/controllers/homepages_controller.rb | 4 ++++ app/helpers/homepages_helper.rb | 2 ++ app/views/homepages/index.html.erb | 0 config/routes.rb | 2 +- test/controllers/homepages_controller_test.rb | 7 +++++++ 7 files changed, 24 insertions(+), 1 deletion(-) 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 test/controllers/homepages_controller_test.rb diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 3d573122ff..852dacf4c8 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -14,3 +14,10 @@ /* Custom bootstrap variables must be set or imported *before* bootstrap. */ @import "bootstrap"; @import "**/*"; + +@import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,700;1,400&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Nunito:wght@400;700&display=swap'); + +body { + font-family: 'Roboto', sans-serif; +} diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss new file mode 100644 index 0000000000..f54dc27a9f --- /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..cdf733413a --- /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/views/homepages/index.html.erb b/app/views/homepages/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/routes.rb b/config/routes.rb index 6de5ae8d9b..90b7262dab 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,6 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html - root to: 'products#index' + root to: 'homepages#index' resources :products do resources :order_items 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 e578781f0eabde797d8b273e4a28c2d488d2f722 Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 11 Jun 2020 22:17:12 -0700 Subject: [PATCH 041/234] added product comments --- app/controllers/products_controller.rb | 1 + app/models/product.rb | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index a55fb40c2e..0d32bb1eb0 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -13,6 +13,7 @@ def new def create @product = Product.new(product_params) # Instantiate a new work + @product.merchant_id = rand(1..3) # TODO this is temporary # TODO add merchant # @product.merchant_id = session[:merchant_id] diff --git a/app/models/product.rb b/app/models/product.rb index b1dac8636b..cd563d0555 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -6,6 +6,10 @@ class Product < ApplicationRecord #has_many: order_item #PER Jess: quantity is an attribute of the model + + # ? Nora's thoughts: + # ? has_many :order_items + # ? has_many :orders, through :order_items end From d8f80e578965726edc035e549fd2d21a0583a1b9 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 11 Jun 2020 22:25:31 -0700 Subject: [PATCH 042/234] added Order index and show methods --- app/controllers/orders_controller.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 42de278274..6fe96d3cbe 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,13 +1,20 @@ class OrdersController < ApplicationController + #GET /orders def index - @order = Order.all + @orders = Order.all + # order = Order.all.as_json(only: [:id, :card_number,:card_expiration_date, :card_cvv, :address, :city,:zip_code, :guest_name, :email, :phone_num, :cart_status]) + # render json: order, status: :ok end + #GET /orders/:id def show + order_id = params[:id].to_i + @order = Order.find_by_id(order_id) + if @order.nil? head :not_found - return + return end end From 0b755400437b74422f4d0b777631a17de15c4136 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 11 Jun 2020 22:26:00 -0700 Subject: [PATCH 043/234] added temporary view for order index --- app/views/orders/index.html.erb | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index e69de29bb2..41e9d114ee 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -0,0 +1,37 @@ +

List of Orders

+ + + + + + + + + + + + + + + + + + <% @orders.each do |order| %> + + + + + + + + + + + + + + <% end %> + +
Order IDGuest NameCard NumberCard Exp. DateCard CVVAddressCityZip CodeEmailPhone NumberCart Status
<%= link_to order[:id], order_path(order.id), method: :get %><%= order[:guest_name] %><%= order[:card_number] %><%= order[:card_expiration_date] %><%= order[:card_cvv] %><%= order[:address] %><%= order[:city] %><%= order[:zip_code] %><%= order[:email] %><%= order[:phone_num] %><%= order[:cart_status] %>
+ +<%= link_to "Back to Plantsy", root_path, method: :get, class:"btn btn-primary" %> \ No newline at end of file From 9f0cd838b54153e4709e7af5a2edf92c41a9dad7 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 11 Jun 2020 22:26:29 -0700 Subject: [PATCH 044/234] added temp show order view --- app/views/orders/show.html.erb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 app/views/orders/show.html.erb diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb new file mode 100644 index 0000000000..874a73746b --- /dev/null +++ b/app/views/orders/show.html.erb @@ -0,0 +1,24 @@ +

Order History

+ + + + + + + + + + + + + + + + + + + + + + +
Guest NameEmailAddressCityZip CodeCard NumberCard Exp. Date
<%= @order[:guest_name] %><%= @order[:email] %><%= @order[:address] %><%= @order[:city] %><%= @order[:zip_code] %><%= @order[:card_number] %><%= @order[:card_expiration_date] %>
From af6391cdc9197cdbe14bfda535bc3b2cd82f7173 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 11 Jun 2020 22:28:01 -0700 Subject: [PATCH 045/234] added Order and Order Item routes --- config/routes.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 6de5ae8d9b..fd64086b73 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,8 +10,11 @@ get "/auth/:provider/callback", to: "merchants#create" delete "/logout", to: "merchants#destroy", as: "logout" - resources :order_items - resources :orders + #Order_Items + resources :order_items, only: [:index, :create, :update, :destroy, :show] + + #Orders + resources :orders, only: [:index, :show] # shopping cart get '/cart', to: 'orders#cart', as: 'cart' From 9a20a81ebd3ef12f09e99e6c11115e6db3b85885 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 11 Jun 2020 22:28:22 -0700 Subject: [PATCH 046/234] created orders seed data --- db/orders-seed.csv | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 db/orders-seed.csv diff --git a/db/orders-seed.csv b/db/orders-seed.csv new file mode 100644 index 0000000000..bc938b3cf1 --- /dev/null +++ b/db/orders-seed.csv @@ -0,0 +1,4 @@ +card_number,card_expiration_date,card_cvv,address,city,zip_code,guest_name,email,phone_num,cart_status +"123456","01/20","123","15 Main Street","Seattle","98010","Tyron Jenkins","tyrone@gmail.com","456-123-1234",true +"987654","10/22","456","120 Seneca Road","Los Angeles","90010","Captain America","capusa@gmail.com","206-253-7777",true +"732904","12/25","777","2020 Boeing Field Street","New York","10074","Seymour Gloots","sgloots@gmail.com","975-619-2100",true \ No newline at end of file From eca39990cf63ca948a188fed31e4cc2d268174bf Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 11 Jun 2020 22:28:41 -0700 Subject: [PATCH 047/234] created Orders script --- db/seeds.rb | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/db/seeds.rb b/db/seeds.rb index 282b9c7ed8..adce9a47ca 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -62,9 +62,50 @@ puts "Added #{Product.count} products" puts "#{product_failures.length} products failed to save" +# ORDERS + +ORDERS_FILE = Rails.root.join('db', 'orders-seed.csv') +puts "Loading raw orders data from #{ORDERS_FILE}" + +order_failures = [] +CSV.foreach(ORDERS_FILE, :headers => true) do |row| + order = Order.new + order.card_number = row['card_number'] + order.card_expiration_date = row['card_expiration_date'] + order.card_cvv = row['card_cvv'] + order.address = row['address'] + order.city = row['city'] + order.zip_code = row['zip_code'] + order.guest_name = row['guest_name'] + order.email = row['email'] + order.phone_num = row['phone_num'] + order.cart_status = row['cart_status'] + + successful = order.save + + if !successful + order_failures << order + puts "Failed to save order: #{order.inspect}" + else + puts "created order: #{order.inspect}" + end +end + +puts "Added #{Order.count} orders" +puts "#{order_failures.length} orders failed to save" + + + + + + + + + puts "Manually resetting each table's PK sequence" ActiveRecord::Base.connection.tables.each do |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) end -puts "Done!" \ No newline at end of file +puts "Done!" + From ddd2e732b302975e1548cdfd3c34f9fd29cf3446 Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 11 Jun 2020 22:42:09 -0700 Subject: [PATCH 048/234] added product validation & tests --- app/models/product.rb | 5 +++ test/models/product_test.rb | 78 +++++++++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index cd563d0555..b853e46eb9 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -10,6 +10,11 @@ class Product < ApplicationRecord # ? Nora's thoughts: # ? has_many :order_items # ? has_many :orders, through :order_items + + validates :name, presence: true, uniqueness: true + validates :price, presence: true, numericality: {only_float: true, greater_than: 0} + validates :inventory, presence: true, numericality: {only_integer: true} + end diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 6977718e14..4ad9347efb 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -1,7 +1,79 @@ require "test_helper" describe Product do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + + let (:product_1) { + products(:product_1) + } + + let (:product_hash) { + { + product: { + name: "Monstera", + price: 39.99, + description: "Big green plant!", + inventory: 3, + merchant_id: merchant_1.id + } + } + } + + describe "validations" do + + it "is valid when all fields are present" do + # Act + result = @product_1.valid? + + # Assert + expect(result).must_equal true + end + + it "is invalid without a name" do + # Arrange + @product_1.name = nil + + # Act + result = @product_1.valid? + + # Assert + expect(result).must_equal false + expect(@product_1.errors.messages).must_include :name + end + + it "is invalid without a price" do + # Arrange + @product_1.price = nil + + # Act + result = @product_1.valid? + + # Assert + expect(result).must_equal false + expect(@product_1.errors.messages).must_include :price + end + + it "is invalid without a price greater than 0" do + # Arrange + @product_1.price = 0 + + # Act + result = @product_1.valid? + + # Assert + expect(result).must_equal false + expect(@product_1.errors.messages).must_include :price + end + + it "is invalid without an inventory" do + # Arrange + @product_1.category = nil + + # Act + result = @product_1.valid? + + # Assert + expect(result).must_equal false + expect(@product_1.errors.messages).must_include :inventory + end + end end From ef4c66222d738949f7136438c238059213191f32 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 11 Jun 2020 23:19:47 -0700 Subject: [PATCH 049/234] basic styles for whole site --- app/assets/stylesheets/application.scss | 53 +++++++++++++++++++++++++ app/assets/stylesheets/homepages.scss | 3 ++ app/views/homepages/index.html.erb | 3 ++ app/views/layouts/application.html.erb | 39 ++++++++++++++---- app/views/products/index.html.erb | 30 +++++++------- 5 files changed, 105 insertions(+), 23 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 852dacf4c8..74cef6b876 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -19,5 +19,58 @@ @import url('https://fonts.googleapis.com/css2?family=Nunito:wght@400;700&display=swap'); body { + display: flex; + flex-direction: column; font-family: 'Roboto', sans-serif; } + +header, h1, h2, h3 { + font-family: 'Nunito', sans-serif; +} + +header { + padding: 1em 1.5em 0.75em; +} + +header h1 { + font-size: 3em; + margin: 1em; +} + +header, footer { + text-align: center; + background-color: #88BDBC; +} + +h1 { + color: #254E58; + font-weight: 800; + letter-spacing: 0.2em; + text-transform: uppercase; +} + +main { + flex: 5; + padding: 2em; +} + +nav { + display: flex; + justify-content: space-between; + width: 50vw; +} + +.navigation-bar { + display: flex; + font-size: 1.25em; + justify-content: space-between; +} + +.navigation-bar a { + color: #e6fffe; +} + +.navigation-bar a:hover { + color: #6E6658; + text-decoration: none; +} \ No newline at end of file diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss index f54dc27a9f..bb062cf2ab 100644 --- a/app/assets/stylesheets/homepages.scss +++ b/app/assets/stylesheets/homepages.scss @@ -1,3 +1,6 @@ // 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/ + +#homepage { +} \ No newline at end of file diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb index e69de29bb2..312a52db4c 100644 --- a/app/views/homepages/index.html.erb +++ b/app/views/homepages/index.html.erb @@ -0,0 +1,3 @@ +
+ LOREM IPSUM ????? +
\ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0504d04e87..57a2448283 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -11,15 +11,38 @@
-
-

Plantsy

- <% if session[:user_id] %> - <%= link_to "Log out", logout_path, method: "delete" %> - <% else %> - <%= link_to "Login with Github", github_login_path %> - <% end %> +

Plantsy

+ +
- <%= yield %> + +
+ <%= yield %> +
+ +
+ + Emily Cowan, Jessica Liang, Kate Mangubat, Nora Robertson + +
diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 4ffa8235f9..3ed701ce9c 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,19 +1,19 @@

All The Plants

-
- <% @products.each do |product| %> -
- <%=link_to product.name, product_path( product.id ) %> -
-
- Cost: $<%= sprintf('%.2f', product.price) %> -
-
- Quantity: - <%= product.inventory %> -
- <% end %> -
-
+
+ <% @products.each do |product| %> +
+ <%=link_to product.name, product_path( product.id ) %> +
+
+ Cost: $<%= sprintf('%.2f', product.price) %> +
+
+ Quantity: + <%= product.inventory %> +
+ <% end %> +
+ From 9738bae75ba082788f1ad8c012fc1f914b198d2e Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 11 Jun 2020 23:37:49 -0700 Subject: [PATCH 050/234] flash messages added to application --- app/views/layouts/application.html.erb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0504d04e87..d5ca3c8926 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -20,6 +20,15 @@ <% end %> + +
+ <% flash.each do |name, message| %> +
+ <%= message %> +
+ <% end %> +
+ <%= yield %> From 86214b56d7d1296e4e951499bf4277e39d6dc0f1 Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 11 Jun 2020 23:38:14 -0700 Subject: [PATCH 051/234] small tweaks to product validation --- app/controllers/products_controller.rb | 2 +- test/models/product_test.rb | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 0d32bb1eb0..0ebe740830 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -22,7 +22,7 @@ def create redirect_to product_path(@product.id) return else # if save fails - flash.now[:error] = "Oops. We couldn't add your product." + flash.now[:error] = "Oops. We couldn't add your product because #{@product.errors.full_messages}." render :new, status: :bad_request # show the new media form again return end diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 4ad9347efb..c5fdf77dee 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -22,7 +22,7 @@ it "is valid when all fields are present" do # Act - result = @product_1.valid? + result = product_1.valid? # Assert expect(result).must_equal true @@ -30,50 +30,50 @@ it "is invalid without a name" do # Arrange - @product_1.name = nil + product_1.name = nil # Act - result = @product_1.valid? + result = product_1.valid? # Assert expect(result).must_equal false - expect(@product_1.errors.messages).must_include :name + # expect(@product_1.errors.messages).must_include :name end it "is invalid without a price" do # Arrange - @product_1.price = nil + product_1.price = nil # Act - result = @product_1.valid? + result = product_1.valid? # Assert expect(result).must_equal false - expect(@product_1.errors.messages).must_include :price + expect(product_1.errors.messages).must_include :price end it "is invalid without a price greater than 0" do # Arrange - @product_1.price = 0 + product_1.price = 0 # Act - result = @product_1.valid? + result = product_1.valid? # Assert expect(result).must_equal false - expect(@product_1.errors.messages).must_include :price + expect(product_1.errors.messages).must_include :price end it "is invalid without an inventory" do # Arrange - @product_1.category = nil + product_1.inventory = nil # Act - result = @product_1.valid? + result = product_1.valid? # Assert expect(result).must_equal false - expect(@product_1.errors.messages).must_include :inventory + expect(product_1.errors.messages).must_include :inventory end end end From 0e65152a7671485b3ef0bba0775187a3c8397d98 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Fri, 12 Jun 2020 00:06:09 -0700 Subject: [PATCH 052/234] basic view for shopping cart --- app/assets/stylesheets/application.scss | 9 ++++++--- app/assets/stylesheets/homepages.scss | 5 +---- app/assets/stylesheets/orders.scss | 25 +++++++++++++++++++++++++ app/views/homepages/index.html.erb | 4 ++-- app/views/orders/cart.html.erb | 11 ++++++++++- 5 files changed, 44 insertions(+), 10 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 74cef6b876..32e33d2fc5 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -19,8 +19,6 @@ @import url('https://fonts.googleapis.com/css2?family=Nunito:wght@400;700&display=swap'); body { - display: flex; - flex-direction: column; font-family: 'Roboto', sans-serif; } @@ -29,9 +27,14 @@ header, h1, h2, h3 { } header { + min-height: 20vh; padding: 1em 1.5em 0.75em; } +footer { + height: 5vh; +} + header h1 { font-size: 3em; margin: 1em; @@ -50,7 +53,7 @@ h1 { } main { - flex: 5; + min-height: 75vh; padding: 2em; } diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss index bb062cf2ab..3f84285877 100644 --- a/app/assets/stylesheets/homepages.scss +++ b/app/assets/stylesheets/homepages.scss @@ -1,6 +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/ - -#homepage { -} \ No newline at end of file +// You can use Sass (SCSS) here: https://sass-lang.com/ \ No newline at end of file diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss index e8c23c2250..9e1c6f78fe 100644 --- a/app/assets/stylesheets/orders.scss +++ b/app/assets/stylesheets/orders.scss @@ -1,3 +1,28 @@ // 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/ + +.cart-item { + display: grid; + grid-template-columns: auto 3fr; + margin: 3em 1em; +} + +.cart-item img { + height: 8em; + width: 8em; + object-fit: cover; + border-radius: 2em; + grid-column: 1 / 2; + margin-right: 0.5em; +} + +.cart-item-info { + grid-column: 2 / 5; + padding: 0.5em; +} + +.cart-item-info ul { + list-style-type: none; + padding: 0; +} \ No newline at end of file diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb index 312a52db4c..9d9c231522 100644 --- a/app/views/homepages/index.html.erb +++ b/app/views/homepages/index.html.erb @@ -1,3 +1,3 @@ -
- LOREM IPSUM ????? +
+ LOREM IPSUM ????? vplease buy me plants
\ No newline at end of file diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index 5223489017..5bac107a03 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -1,7 +1,16 @@

Shopping Cart

<% if @cart_items %> <% @cart_items.each do |item| %> - <%= item.name =%> +
+ <%= image_tag(item.photo_url, alt: "photo of the cart item") %> +
+

<%= item.name %>

+
    +
  • Cost: <%= number_to_currency(item.price) %>
  • +
  • Quantity: <%= item.quantity %> | INSERT LINK TO DELETE
  • +
+
+
<% end %> <% else %>

From 7fef0e59d0a6377c0bcdd0c90477acd1e5e77abf Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Fri, 12 Jun 2020 00:12:57 -0700 Subject: [PATCH 053/234] format cart page --- app/assets/stylesheets/orders.scss | 12 +++++++++ app/views/orders/cart.html.erb | 43 +++++++++++++++++------------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss index 9e1c6f78fe..6e464a34ab 100644 --- a/app/assets/stylesheets/orders.scss +++ b/app/assets/stylesheets/orders.scss @@ -2,6 +2,18 @@ // They will automatically be included in application.css. // You can use Sass (SCSS) here: https://sass-lang.com/ +.cart-page { + display: flex; +} + +.cart-items-display { + flex: 4; +} + +.checkout-info { + flex: 2; +} + .cart-item { display: grid; grid-template-columns: auto 3fr; diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index 5bac107a03..1582fc42be 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -1,19 +1,26 @@

Shopping Cart

-<% if @cart_items %> - <% @cart_items.each do |item| %> -
- <%= image_tag(item.photo_url, alt: "photo of the cart item") %> -
-

<%= item.name %>

-
    -
  • Cost: <%= number_to_currency(item.price) %>
  • -
  • Quantity: <%= item.quantity %> | INSERT LINK TO DELETE
  • -
-
-
- <% end %> -<% else %> -

- Cart is empty. -

-<% end %> \ No newline at end of file +
+
+ <% if @cart_items %> + <% @cart_items.each do |item| %> +
+ <%= image_tag(item.photo_url, alt: "photo of the cart item") %> +
+

<%= item.name %>

+
    +
  • Cost: <%= number_to_currency(item.price) %>
  • +
  • Quantity: <%= item.quantity %> (Change?) | INSERT LINK TO DELETE
  • +
+
+
+ <% end %> + <% else %> +

+ Cart is empty. +

+ <% end %> +
+
+ <%= button_to "Checkout", root_path, :method => "get" %> +
+
\ No newline at end of file From a2dde454c41e057529bddee18a5ccdae1dff239b Mon Sep 17 00:00:00 2001 From: kate myer Date: Fri, 12 Jun 2020 01:11:13 -0700 Subject: [PATCH 054/234] completed order items crud --- app/controllers/order_items_controller.rb | 39 +++++++++++++++-------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index f33734388c..453d205bcb 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,4 +1,11 @@ class OrderItemsController < ApplicationController + skip_before_action :verify_authenticity_token + #database order_items -> use OrderItem + #GET /order_items + def index + order_items = OrderItem.all.as_json(only: [:id, :name, :price, :quantity]) + render json: order_items, status: :ok + end #POST /order_items { :order_item => { :name => "hello", :price => 6, }} def create @@ -38,12 +45,12 @@ def create # PATCH: /order_items/:id (params) def update - @order_item = Order_item.find_by(id: params[:id]) + @order_item = OrderItem.find_by(id: params[:id]) if @order_item.nil? head :not_found return - elsif @order_item.update(order_item_params) - redirect_to orders_path # /orders + elsif @order_item.update(order_items_params) + redirect_to order_path(@order_item.order.id) # /orders/:id return else flash[:failure] = 'Order item could not be updated.' @@ -54,26 +61,30 @@ def update # DElETE /order_items/:id def destroy - @order_item = Order_item.find_by(id: params[:id]) + @order_item = OrderItem.find_by(id: params[:id]) if @order_item.nil? head :not_found return end - @order_item.destroy - count = @order_item.order.order_items.count - if count == 0 - @order_item.order.destroy - redirect_to orders_path # /orders - return - else - redirect_to order_path(@order_item.order.id) #/orders/:id - return - end + redirect_to order_path(@order_item.order.id) + + #TODO for later: check if order items have a count of 0, then delete order + # count = @order_item.order.order_items.count + # if count == 0 + # @order_item.order.destroy + # redirect_to orders_path # /orders + # return + # else + # redirect_to order_path(@order_item.order.id) #/orders/:id + # return + # end end end +private + def order_items_params return params.require(:order_item).permit(:name, :price, :quantity, :product_id, :order_id) end \ No newline at end of file From defa0c518707b7165595f8622b928d14b949c03c Mon Sep 17 00:00:00 2001 From: kate myer Date: Fri, 12 Jun 2020 01:11:41 -0700 Subject: [PATCH 055/234] corrected orderitem relation to product --- app/models/order_item.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 7f0fe745b3..bcdd901b71 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -1,5 +1,6 @@ class OrderItem < ApplicationRecord - has_one :product + belongs_to :product + # has_one :product belongs_to :order validates :name, presence: true From 921900bced65dc51815d3d52a5c8e6a862c426b5 Mon Sep 17 00:00:00 2001 From: kate myer Date: Fri, 12 Jun 2020 01:12:02 -0700 Subject: [PATCH 056/234] show order with order items listed --- app/views/orders/show.html.erb | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 874a73746b..483846c7df 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -9,7 +9,6 @@ Zip Code Card Number Card Exp. Date - <%= @order[:guest_name] %> @@ -22,3 +21,27 @@ + + + + + + + + + + + + <% @order.order_items.each do |order_item| %> + + + + + + + + <% end %> + +
IDNamePriceQuantityProduct
<%= order_item.id %><%= order_item.name %><%= order_item.price %><%= order_item.quantity %><%= order_item.product.name %>
+ + From 3d78e3fa0227d4808196b0a1a3b83c0ad0d516e7 Mon Sep 17 00:00:00 2001 From: kate myer Date: Fri, 12 Jun 2020 01:12:17 -0700 Subject: [PATCH 057/234] created order item seed data --- db/order-items-seed.csv | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 db/order-items-seed.csv diff --git a/db/order-items-seed.csv b/db/order-items-seed.csv new file mode 100644 index 0000000000..30063b9121 --- /dev/null +++ b/db/order-items-seed.csv @@ -0,0 +1,7 @@ +name,price,quantity,product_id,order_id +"coffee plant1",5.00,10,1,1 +"fiddle fig tree1",15.99,3,1,2 +"fiddle fig tree2",25.99,4,2,2 +"echeveria1",21.00,1,1,3 +"echeveria2",22.00,2,2,3 +"echeveria3",23.00,3,3,3 From 189ace273b9e2cfd41b3810baca6acc152d4a9b0 Mon Sep 17 00:00:00 2001 From: kate myer Date: Fri, 12 Jun 2020 01:12:28 -0700 Subject: [PATCH 058/234] added order item script --- db/seeds.rb | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/db/seeds.rb b/db/seeds.rb index adce9a47ca..3410bc47c7 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -94,9 +94,32 @@ puts "Added #{Order.count} orders" puts "#{order_failures.length} orders failed to save" +#ORDER ITEMS + +ORDER_ITEMS_FILE = Rails.root.join('db', 'order-items-seed.csv') +puts "Loading raw order items data from #{ORDER_ITEMS_FILE}" + +order_item_failures = [] +CSV.foreach(ORDER_ITEMS_FILE, :headers => true) do |row| + order_item = OrderItem.new + order_item.name = row['name'] + order_item.price = row['price'] + order_item.quantity = row['quantity'] + order_item.product_id = row['product_id'] + order_item.order_id = row['order_id'] + + successful = order_item.save + if !successful + order_item_failures << order_item + puts "Failed to save order item: #{order_item.inspect}" + else + puts "created order item: #{order_item.inspect}" + end +end - +puts "Added #{OrderItem.count} order items" +puts "#{order_item_failures.length} order items failed to save" From e014cd2349fb54ab7ee63f51d8298addc86c6cc4 Mon Sep 17 00:00:00 2001 From: kate myer Date: Fri, 12 Jun 2020 01:14:05 -0700 Subject: [PATCH 059/234] renamed file contents are same --- ...mto_product.rb => 20200609213910_add_order_item_to_product.rb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename db/migrate/{20200609213910_add_order_itemto_product.rb => 20200609213910_add_order_item_to_product.rb} (100%) diff --git a/db/migrate/20200609213910_add_order_itemto_product.rb b/db/migrate/20200609213910_add_order_item_to_product.rb similarity index 100% rename from db/migrate/20200609213910_add_order_itemto_product.rb rename to db/migrate/20200609213910_add_order_item_to_product.rb From 7e109ff2bc2c9df8932d3264046c1b0d653efad3 Mon Sep 17 00:00:00 2001 From: kate myer Date: Fri, 12 Jun 2020 01:18:58 -0700 Subject: [PATCH 060/234] added destroy order method if order items == 0 --- app/controllers/order_items_controller.rb | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 453d205bcb..60512133c4 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -67,18 +67,18 @@ def destroy return end @order_item.destroy - redirect_to order_path(@order_item.order.id) - - #TODO for later: check if order items have a count of 0, then delete order - # count = @order_item.order.order_items.count - # if count == 0 - # @order_item.order.destroy - # redirect_to orders_path # /orders - # return - # else - # redirect_to order_path(@order_item.order.id) #/orders/:id - # return - # end + # redirect_to order_path(@order_item.order.id) + + #check if order items have a count of 0, then delete order + count = @order_item.order.order_items.count + if count == 0 + @order_item.order.destroy + redirect_to orders_path # /orders + return + else + redirect_to order_path(@order_item.order.id) #/orders/:id + return + end end end From 12f77191bbda0c431507ca88355490902a5cf44f Mon Sep 17 00:00:00 2001 From: thenora Date: Fri, 12 Jun 2020 01:21:08 -0700 Subject: [PATCH 061/234] installed simplecov --- .DS_Store | Bin 0 -> 8196 bytes .gitignore | 4 +++- Gemfile | 5 +++++ Gemfile.lock | 6 ++++++ db/schema.rb | 1 - test/test_helper.rb | 10 ++++++++++ 6 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4321f7d2e3699fc82d6e08c5c3176be66c4ae693 GIT binary patch literal 8196 zcmeHM&ube;6n-PQ^2$!A0|on5T>^G7!A4FTXdDz*CU#08L?sC%#nwuSta!B}^uuoI zs)!K!H?+R=ltb@5^xRYW7vx{)u~2$$zBecHi#K_h!EL&FmYEL_}h9 zP+uilAff;V+qqesQVQ4ektiASF%UIDMbd#M2DhXM|^C1Xe0s?>p#+5*5%;jt>XR$u;M3;Y1KWb8;=JV6oK z6;`_nv&9f*?;x~0>PrSc(pI~ZP(7m^)3Y!;6k)a=qM+a;O4|CfSHLTfRDk#HS*lWp zIy;fGfBzIUi~p#i+zcveu2yQY-O)|m9FG0lvRpR%|KO*;mJUAN{_U1sTR*3^vv0MU z8FAwuQV3olH7KGhR3k|-J)ssgarcyZ6KsEmhs!nuHg-{BJ{{%8H2*hHS@aBlJEr*i zPsTBs+Hp+DS|=tNp;5}&ak$)w_5Q)q+rhdFYfF=D**uFYpD+HhqqKM0Xv;C%voH>4 z@h5Z6+nk|&mj)BeS$ms#pgaySa$SsIlNv5wjl#M3@Tk`@GwJuR6SaE%m6g{blb!k? zHys2s!OX>(uPXcUsM4?Y2ffW|_YvRSt@igrbN!{1(dl(Hyx(dZ?aqDlnT-3@R@~?+ z=T^M|$m0jCxGs-2Y+`vWe@Lp zIA@5b)etAzI;?c#NXAX@;dnAsr_dclo~|OWrt2(T&IUd}V$f@JfT_}^`h*vzisLm+ zx8c)PFLsnRQ5^II7mXewqy_Xf(F=3?+Txan-vF$-V8TJYfy80W2GEyK=;7%0P&Q|Hf@eDn^zW_X%&l1 zPbP|wjh;f>(3bixZ^a`O=e&coaS`+Vv<>^+yYpiCZTh$B$0;?f-g(z_X2^nHJ8iMe zUbkY-5vR`>a|Lm`k#NKgHc!vg+>XzBA2@c$10izBYO}!m|E;rs|JNvg_6m3f-bn?- zRJl^#L}+inyG%yOd+h>_JseyZH_}$Q;H0+WuxdLFd-{hVt_y&&Ps!Mkws?Z_-~SNc S*Z;}QlVAT&H?;4~`u_%IC+3y_ literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore index 60d10a1fb8..7fea5a4d85 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,6 @@ yarn-debug.log* .yarn-integrity -.env \ No newline at end of file +.env + +coverage/* diff --git a/Gemfile b/Gemfile index 9da19dc714..b3a648e987 100644 --- a/Gemfile +++ b/Gemfile @@ -78,5 +78,10 @@ group :test do gem 'minitest-reporters' end + +group :test do + gem 'simplecov', require: true +end + gem "omniauth" gem "omniauth-github" \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 8b2bdf77e4..287a5b43f5 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) dotenv (2.7.5) dotenv-rails (2.7.5) dotenv (= 2.7.5) @@ -244,6 +245,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) @@ -312,6 +317,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/db/schema.rb b/db/schema.rb index 4803b4824a..9f0865e0c9 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -49,7 +49,6 @@ t.string "phone_num" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false - t.boolean "status", default: true t.boolean "cart_status", default: true end diff --git a/test/test_helper.rb b/test/test_helper.rb index b19af0d5bd..d8b4576eac 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,3 +1,11 @@ +require 'simplecov' +SimpleCov.start 'rails' do + add_filter '/bin/' + add_filter '/db/' + add_filter '/spec/' # for rspec + add_filter '/test/' # for minitest +end + ENV['RAILS_ENV'] ||= 'test' require_relative '../config/environment' require 'rails/test_help' @@ -10,6 +18,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 c92c75f76fd0da5f30387f185bfdd1eb20fe7fb8 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Fri, 12 Jun 2020 02:19:33 -0700 Subject: [PATCH 062/234] Added small changes --- config/routes.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index a707387dd1..12703ffd31 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,4 +9,6 @@ get "/auth/github", as: "github_login" get "/auth/:provider/callback", to: "merchants#create" delete "/logout", to: "merchants#destroy", as: "logout" + + resources :merchants, only: [:show] end From 7b5485818579cfec0e9f31753fe0b226cb15bdc8 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Fri, 12 Jun 2020 07:38:01 -0700 Subject: [PATCH 063/234] Added merchant dashboard and merchant model validations --- app/models/merchant.rb | 5 ++- app/models/order.rb | 1 + app/views/layouts/application.html.erb | 2 ++ app/views/merchants/show.html.erb | 7 ++-- ...0200612094255_relate_merchant_to_orders.rb | 5 +++ .../20200612094437_add_merchant_to_order.rb | 5 +++ db/schema.rb | 8 ++++- test/controllers/merchants_controller_test.rb | 33 +++++++++++++++++-- 8 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20200612094255_relate_merchant_to_orders.rb create mode 100644 db/migrate/20200612094437_add_merchant_to_order.rb diff --git a/app/models/merchant.rb b/app/models/merchant.rb index efd46237e1..d3ce42aa2e 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,5 +1,8 @@ class Merchant < ApplicationRecord + validates :username, :email, :uid, :provider, presence: :true + has_many :products + has_many :orders def self.build_from_github(auth_hash) merchant = Merchant.new @@ -10,4 +13,4 @@ def self.build_from_github(auth_hash) return merchant end -end +end \ No newline at end of file diff --git a/app/models/order.rb b/app/models/order.rb index b36051f45f..df52794e5a 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,4 +1,5 @@ class Order < ApplicationRecord has_many :order_items + has_many :merchants has_many :products, through: :order_items end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index b1643ea566..f3afdc955a 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -24,6 +24,8 @@
-

- <%= link_to "Edit this product listing", edit_product_path(@product.id) %> -

+ + <% if @product.merchant_id == session[:user_id] %> +

+ <%= link_to "Edit this product listing", edit_product_path(@product.id) %> +

+ <% end %> <% end %> From e7af1131b45e7855277d0ed0cdb92208c88f1a33 Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 00:04:40 -0700 Subject: [PATCH 074/234] tweaked product controller tests --- test/controllers/products_controller_test.rb | 44 ++++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 57c8d60bd8..375ea9dd03 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -17,10 +17,12 @@ { product: { name: "Monstera", - price: 39.99, - description: "Big green plant!", - inventory: 3, - merchant_id: merchant_1.id + price: 39.99, + description: "Big green plant!", + inventory: 3, + merchant_id: merchant_1.id, + status: true, + photo_url: "https://bloomscape.com/wp-content/uploads/2019/11/bloomscape_peopleplants_monstera-scaled.jpg" } } } @@ -55,18 +57,34 @@ # TODO - require login it "creates a new product" do + + # new_product = Product.new(product_hash) + new_product = { + product: { + name: "A Really Big Monstera", + price: 39.99, + description: "Big green plant!", + inventory: 3, + merchant_id: merchant_1.id, + status: true, + photo_url: "https://bloomscape.com/wp-content/uploads/2019/11/bloomscape_peopleplants_monstera-scaled.jpg" + } + } + + + expect { - post products_path, params: product_hash + #post products_path, params: product_hash + post products_path, params: new_product }.must_differ 'Product.count', 1 - must_respond_with :redirect - must_redirect_to product_path(Product.last.id) - expect(Product.last.name).must_equal product_hash[:product][:name] - expect(Product.last.price).must_equal product_hash[:product][:price] - expect(Product.last.description).must_equal product_hash[:product][:description] - expect(Product.last.inventory).must_equal product_hash[:product][:inventory] - # TODO add verify the merchant name - # expect(Product.last.author.name).must_equal sandi_metz.name + # must_respond_with :redirect + # must_redirect_to product_path(Product.last.id) + # expect(Product.last.name).must_equal product_hash[:product][:name] + # expect(Product.last.price).must_equal product_hash[:product][:price] + # expect(Product.last.description).must_equal product_hash[:product][:description] + # expect(Product.last.inventory).must_equal product_hash[:product][:inventory] + # expect(Product.merchant_id).must_equal product_hash[:product][:merchant_id] end # TODO add after validations From 5567f41ed15463980ab590db64d4f307827acec6 Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 01:29:52 -0700 Subject: [PATCH 075/234] created category relationship join tables --- app/controllers/products_controller.rb | 10 +++++++++- app/models/category.rb | 4 ++++ app/models/product.rb | 1 + db/migrate/20200613080901_create_categories.rb | 8 ++++++++ ...00613081857_create_products_categories_join.rb | 8 ++++++++ db/schema.rb | 15 ++++++++++++++- test/models/category_test.rb | 7 +++++++ 7 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 app/models/category.rb create mode 100644 db/migrate/20200613080901_create_categories.rb create mode 100644 db/migrate/20200613081857_create_products_categories_join.rb create mode 100644 test/models/category_test.rb diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index ed6559d238..eea7cfdfc4 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -74,6 +74,14 @@ def destroy private def product_params - return params.require(:product).permit(:name, :price, :description, :inventory, :status, :photo_url) + return params.require(:product).permit( + :name, + :price, + :description, + :inventory, + :status, + :photo_url, + category_ids: [] + ) end end diff --git a/app/models/category.rb b/app/models/category.rb new file mode 100644 index 0000000000..8a38538a7f --- /dev/null +++ b/app/models/category.rb @@ -0,0 +1,4 @@ +class Category < ApplicationRecord + has_and_belongs_to_many :products + +end diff --git a/app/models/product.rb b/app/models/product.rb index b853e46eb9..3d073d7137 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,6 +1,7 @@ class Product < ApplicationRecord belongs_to :merchant has_one :order_item + has_and_belongs_to_many :categories #need to clarify this because if there's 10 plants and all get purchased, should see 10 order items #product has many order items.... #has_many: order_item diff --git a/db/migrate/20200613080901_create_categories.rb b/db/migrate/20200613080901_create_categories.rb new file mode 100644 index 0000000000..d1fb8c510f --- /dev/null +++ b/db/migrate/20200613080901_create_categories.rb @@ -0,0 +1,8 @@ +class CreateCategories < ActiveRecord::Migration[6.0] + def change + create_table :categories do |t| + t.string :name + t.timestamps + end + end +end diff --git a/db/migrate/20200613081857_create_products_categories_join.rb b/db/migrate/20200613081857_create_products_categories_join.rb new file mode 100644 index 0000000000..94d245d0aa --- /dev/null +++ b/db/migrate/20200613081857_create_products_categories_join.rb @@ -0,0 +1,8 @@ +class CreateProductsCategoriesJoin < ActiveRecord::Migration[6.0] + def change + create_table :products_categories_joins do |t| + t.belongs_to :product, index: true + t.belongs_to :category, index: true + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 9f0865e0c9..25debce849 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_12_034231) do +ActiveRecord::Schema.define(version: 2020_06_13_081857) 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.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 "username" t.string "email" @@ -65,6 +71,13 @@ t.index ["merchant_id"], name: "index_products_on_merchant_id" end + create_table "products_categories_joins", force: :cascade do |t| + t.bigint "product_id" + t.bigint "category_id" + t.index ["category_id"], name: "index_products_categories_joins_on_category_id" + t.index ["product_id"], name: "index_products_categories_joins_on_product_id" + end + add_foreign_key "order_items", "orders" add_foreign_key "order_items", "products" add_foreign_key "products", "merchants" 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 3de1e02b8624d9aaacb6feca990bbf9385cdd553 Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 01:54:41 -0700 Subject: [PATCH 076/234] added category seed --- db/category-seed.csv | 6 ++++++ db/seeds.rb | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 db/category-seed.csv diff --git a/db/category-seed.csv b/db/category-seed.csv new file mode 100644 index 0000000000..69bd709277 --- /dev/null +++ b/db/category-seed.csv @@ -0,0 +1,6 @@ +name +"House Plants" +"Succulents" +"Pet Friendly" +"Hard to Kill" +"Needs Attention" \ No newline at end of file diff --git a/db/seeds.rb b/db/seeds.rb index 52c416cbe1..83b4471086 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -34,6 +34,29 @@ puts "Added #{Merchant.count} merchants" puts "#{merchant_failures.length} merchants failed to save" +# CATEGORIES + +CATEGORIES_FILE = Rails.root.join('db', 'category-seed.csv') +puts "Loading raw category data from #{CATEGORIES_FILE}" + +category_failures = [] +CSV.foreach(CATEGORIES_FILE, :headers => true) do |row| + category = Category.new + category.name = row['name'] + + successful = category.save + + if !successful + category_failures << category + puts "Failed to save category: #{category.inspect}" + else + puts "created category: #{category.inspect}" + end +end + +puts "Added #{Category.count} categories" +puts "#{category_failures.length} categories failed to save" + # PRODUCTS PRODUCTS_FILE = Rails.root.join('db', 'product-seed.csv') From daf6f05d7b42ed8b4e2772e2ba4d7a7308226ca0 Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 01:57:56 -0700 Subject: [PATCH 077/234] added category resources to routes --- config/routes.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index d8fffadec1..f8936b5c07 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,6 +8,11 @@ get "/auth/github", as: "github_login" get "/auth/:provider/callback", to: "merchants#create" + + #Category + resources :categories, except: :destroy + + #Merchant delete "/logout", to: "merchants#destroy", as: "logout" get "/dashboard", to: "merchants#dashboard", as: "dashboard" From 4db987f6182d87f6f07971fc1bb21cb7de6ff4b3 Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 02:02:32 -0700 Subject: [PATCH 078/234] created category controller --- app/assets/stylesheets/categories.scss | 3 ++ app/controllers/categories_controller.rb | 19 +++++++++++ app/helpers/categories_helper.rb | 2 ++ app/views/categories/create.html.erb | 2 ++ app/views/categories/edit.html.erb | 2 ++ app/views/categories/index.html.erb | 2 ++ app/views/categories/new.html.erb | 2 ++ app/views/categories/show.html.erb | 2 ++ app/views/categories/update.html.erb | 2 ++ config/routes.rb | 6 ++++ .../controllers/categories_controller_test.rb | 34 +++++++++++++++++++ 11 files changed, 76 insertions(+) create mode 100644 app/assets/stylesheets/categories.scss create mode 100644 app/controllers/categories_controller.rb create mode 100644 app/helpers/categories_helper.rb create mode 100644 app/views/categories/create.html.erb create mode 100644 app/views/categories/edit.html.erb create mode 100644 app/views/categories/index.html.erb create mode 100644 app/views/categories/new.html.erb create mode 100644 app/views/categories/show.html.erb create mode 100644 app/views/categories/update.html.erb create mode 100644 test/controllers/categories_controller_test.rb diff --git a/app/assets/stylesheets/categories.scss b/app/assets/stylesheets/categories.scss new file mode 100644 index 0000000000..068dd1a3b9 --- /dev/null +++ b/app/assets/stylesheets/categories.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Categories controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb new file mode 100644 index 0000000000..a3202e0854 --- /dev/null +++ b/app/controllers/categories_controller.rb @@ -0,0 +1,19 @@ +class CategoriesController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end +end diff --git a/app/helpers/categories_helper.rb b/app/helpers/categories_helper.rb new file mode 100644 index 0000000000..e06f31554c --- /dev/null +++ b/app/helpers/categories_helper.rb @@ -0,0 +1,2 @@ +module CategoriesHelper +end diff --git a/app/views/categories/create.html.erb b/app/views/categories/create.html.erb new file mode 100644 index 0000000000..63069b0005 --- /dev/null +++ b/app/views/categories/create.html.erb @@ -0,0 +1,2 @@ +

Categories#create

+

Find me in app/views/categories/create.html.erb

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

Categories#edit

+

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

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

Categories#index

+

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

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

Categories#new

+

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

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

Categories#show

+

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

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

Categories#update

+

Find me in app/views/categories/update.html.erb

diff --git a/config/routes.rb b/config/routes.rb index f8936b5c07..aa4ff17c52 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,10 @@ Rails.application.routes.draw do + get 'categories/index' + get 'categories/show' + get 'categories/new' + get 'categories/create' + get 'categories/edit' + get 'categories/update' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html root to: 'homepages#index' diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb new file mode 100644 index 0000000000..549d2626a4 --- /dev/null +++ b/test/controllers/categories_controller_test.rb @@ -0,0 +1,34 @@ +require "test_helper" + +describe CategoriesController do + it "must get index" do + get categories_index_url + must_respond_with :success + end + + it "must get show" do + get categories_show_url + must_respond_with :success + end + + it "must get new" do + get categories_new_url + must_respond_with :success + end + + it "must get create" do + get categories_create_url + must_respond_with :success + end + + it "must get edit" do + get categories_edit_url + must_respond_with :success + end + + it "must get update" do + get categories_update_url + must_respond_with :success + end + +end From b0a477492d99571c5c69f5fc4e3f8a5f248aa502 Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 02:25:56 -0700 Subject: [PATCH 079/234] added category controller methods --- app/controllers/categories_controller.rb | 42 ++++++++++++++++++++++++ app/controllers/products_controller.rb | 4 +-- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index a3202e0854..cdb0ca879a 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,19 +1,61 @@ class CategoriesController < ApplicationController + # skip_before_action :require_login, only: [:index, :show] + # TODO add require login for everything but index and show + def index + @categories = Category.all end def show + @category = Category.find_by(id: params[:id])# TODO make controller fixture + if @category.nil? + head :not_found + return + end end def new + @category = Category.new end def create + @category = Category.new( category_params ) + if @category.save + flash[:success] = "#{@category.name} added." + redirect_to categories_path + else + flash.now[:error] = "Oops. We couldn't add your category." + render :new, status: :bad_request + end end def edit + @category = Category.find_by(id: params[:id] ) + if @category.nil? + flash[:error] = "Oops. Couldn't find that category." + redirect_to categories_path + return + end end def update + @category = Category.find_by(id: params[:id] ) + if @category.nil? + flash[:error] = "Oops. Couldn't find that category." + redirect_to categories_path + return + elsif @category.update( category_params ) + flash[:success] = "#{@category.name} updated." + redirect_to category_path(@category.id) + else + flash.now[:error] = "#{@category.name} wasn't updated." + render :edit, status: :bad_request + end + end + + private + + def category_params + return params.require(:category).permit(:name) end end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index eea7cfdfc4..cef3e901c5 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -21,7 +21,7 @@ def create return else # if save fails flash.now[:error] = "Oops. We couldn't add your product because #{@product.errors.full_messages}." - render :new, status: :bad_request # show the new media form again + render :new, status: :bad_request # show the new product form again return end end @@ -62,7 +62,7 @@ def update return else # save failed flash.now[:error] = "Oops! We couldn't update your product." - render :edit, status: :bad_request # show the new media form view again + render :edit, status: :bad_request # show the new product form view again return end end From cccb1ce72e75e21098565a99bf601894fcc96375 Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 02:32:42 -0700 Subject: [PATCH 080/234] created category index --- app/views/categories/index.html.erb | 10 ++++++++-- app/views/layouts/application.html.erb | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index a5d0d54736..17b8980613 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -1,2 +1,8 @@ -

Categories#index

-

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

+

Shop by Category

+
+ <%@categories.each do |cat| %> +
  • + <%= link_to cat.name.upcase, category_path(cat.id)%> +
  • + <%end%> +
    \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 7817e62b0a..beecdad427 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -18,7 +18,7 @@ From 0574a66a05728c0e221e799788c592c8b429e10b Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 03:00:38 -0700 Subject: [PATCH 081/234] working on show category products --- app/views/categories/show.html.erb | 37 ++++++++++++++++++- ...095808_create_categories_products_join.rb} | 4 +- db/schema.rb | 16 +++++++- 3 files changed, 52 insertions(+), 5 deletions(-) rename db/migrate/{20200613081857_create_products_categories_join.rb => 20200613095808_create_categories_products_join.rb} (50%) diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index 60e06c3d7b..9f0b9ab6af 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -1,2 +1,35 @@ -

    Categories#show

    -

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

    +
    +

    Browse <%=@category.name.capitalize%>

    +
    + +
    + <% if @category.products.empty? %> +

    Oops! No plants in this category.

    + <% else %> +
    + <% @category.products.each do |product| %> +
    + <% if product.photo_url == nil || product.photo_url.length < 1 %> + <%= image_tag("https://f1.pngfuel.com/png/584/952/34/black-and-white-flower-black-white-m-leaf-plant-stem-silhouette-computer-line-plants-png-clip-art.png", :alt => "not found") %> + <% else %> + <%= image_tag(product.photo_url, :alt => product.name ) %> + <% end %> +
    +
    + <%= link_to product.name, product_path( product.id ) %> +
    +
    +
    +
    + Cost: $<%= sprintf('%.2f', product.price) %> +
    +
    + Inventory: + <%= product.inventory %> +
    +
    +
    + <% end %> +
    + <% end %> +
    \ No newline at end of file diff --git a/db/migrate/20200613081857_create_products_categories_join.rb b/db/migrate/20200613095808_create_categories_products_join.rb similarity index 50% rename from db/migrate/20200613081857_create_products_categories_join.rb rename to db/migrate/20200613095808_create_categories_products_join.rb index 94d245d0aa..0fe2357ea9 100644 --- a/db/migrate/20200613081857_create_products_categories_join.rb +++ b/db/migrate/20200613095808_create_categories_products_join.rb @@ -1,6 +1,6 @@ -class CreateProductsCategoriesJoin < ActiveRecord::Migration[6.0] +class CreateCategoriesProductsJoin < ActiveRecord::Migration[6.0] def change - create_table :products_categories_joins do |t| + create_table :categories_products do |t| t.belongs_to :product, index: true t.belongs_to :category, index: true end diff --git a/db/schema.rb b/db/schema.rb index 25debce849..6da1c04cf8 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_13_081857) do +ActiveRecord::Schema.define(version: 2020_06_13_095808) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -21,6 +21,20 @@ t.datetime "updated_at", precision: 6, null: false end + create_table "categories_products", force: :cascade do |t| + t.bigint "product_id" + t.bigint "category_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 "categories_products_joins", force: :cascade do |t| + t.bigint "book_id" + t.bigint "genre_id" + t.index ["book_id"], name: "index_categories_products_joins_on_book_id" + t.index ["genre_id"], name: "index_categories_products_joins_on_genre_id" + end + create_table "merchants", force: :cascade do |t| t.string "username" t.string "email" From 1a3d90b8eed861c4a7f94574e1a53c2ef7580264 Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 03:09:03 -0700 Subject: [PATCH 082/234] empty categories working --- .../20200613095808_create_categories_products_join.rb | 2 +- .../20200613100344_drop_categories_products_joins.rb | 5 +++++ db/schema.rb | 9 +-------- 3 files changed, 7 insertions(+), 9 deletions(-) create mode 100644 db/migrate/20200613100344_drop_categories_products_joins.rb diff --git a/db/migrate/20200613095808_create_categories_products_join.rb b/db/migrate/20200613095808_create_categories_products_join.rb index 0fe2357ea9..82dfdf6bad 100644 --- a/db/migrate/20200613095808_create_categories_products_join.rb +++ b/db/migrate/20200613095808_create_categories_products_join.rb @@ -1,8 +1,8 @@ class CreateCategoriesProductsJoin < ActiveRecord::Migration[6.0] def change create_table :categories_products do |t| - t.belongs_to :product, index: true t.belongs_to :category, index: true + t.belongs_to :product, index: true end end end diff --git a/db/migrate/20200613100344_drop_categories_products_joins.rb b/db/migrate/20200613100344_drop_categories_products_joins.rb new file mode 100644 index 0000000000..b5b031c842 --- /dev/null +++ b/db/migrate/20200613100344_drop_categories_products_joins.rb @@ -0,0 +1,5 @@ +class DropCategoriesProductsJoins < ActiveRecord::Migration[6.0] + def change + drop_table :categories_products_joins + end +end diff --git a/db/schema.rb b/db/schema.rb index 6da1c04cf8..44ca5dc663 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_13_095808) do +ActiveRecord::Schema.define(version: 2020_06_13_100344) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -28,13 +28,6 @@ t.index ["product_id"], name: "index_categories_products_on_product_id" end - create_table "categories_products_joins", force: :cascade do |t| - t.bigint "book_id" - t.bigint "genre_id" - t.index ["book_id"], name: "index_categories_products_joins_on_book_id" - t.index ["genre_id"], name: "index_categories_products_joins_on_genre_id" - end - create_table "merchants", force: :cascade do |t| t.string "username" t.string "email" From 058a78ce06fb0a6b2f37ec658d737eb86e221232 Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 11:42:02 -0700 Subject: [PATCH 083/234] added categories to create product --- app/views/products/_form.html.erb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index ab07dc827e..71a53dbb0c 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -27,6 +27,11 @@ <%= f.text_area :photo_url, class: 'form-control' %> +
    + <%= f.label :categories %> + <%= collection_check_boxes(:product, :category_ids, Category.all, :id, :name) %> +
    +
    <%= f.submit action_name, class: "btn btn-primary" %>
    From 927394a11ddc9b6b2356708ad3d6f80635afc195 Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 12:07:04 -0700 Subject: [PATCH 084/234] added default image to display --- app/views/categories/show.html.erb | 4 ++-- app/views/products/index.html.erb | 7 ++++++- app/views/products/show.html.erb | 4 ++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index 9f0b9ab6af..7291ab1068 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -1,10 +1,10 @@
    -

    Browse <%=@category.name.capitalize%>

    +

    Category: <%=@category.name.upcase%>

    <% if @category.products.empty? %> -

    Oops! No plants in this category.

    +

    Oops! Looks like we're sold out of these plants.

    <% else %>
    <% @category.products.each do |product| %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 7b134ecd6a..c6c25682a3 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -4,7 +4,12 @@ <% @products.each do |product| %>
    • - <%= link_to image_tag(product.photo_url, alt: "photo of #{product.name}"), product_path(product.id) %> + <% if product.photo_url == nil || product.photo_url.length < 1 %> + <%= link_to image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg"), product_path(product.id) %> + <% else %> + <%= link_to image_tag(product.photo_url, alt: "photo of #{product.name}"), product_path(product.id) %> + <% end %> +
    • <%=link_to product.name, product_path(product.id) %>

      diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 5b59dbf850..ff2f09c168 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,7 +1,7 @@
      - <% if @product.photo_url == nil %> - <%= image_tag("https://f1.pngfuel.com/png/584/952/34/black-and-white-flower-black-white-m-leaf-plant-stem-silhouette-computer-line-plants-png-clip-art.png", :alt => "generic plant silhouette", class: "product-image") %> + <% if @product.photo_url == nil || @product.photo_url.length < 1 %> + <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant silhouette", class: "product-image") %> <% else %> <%= image_tag(@product.photo_url, :alt => @product.name, class:"product-image") %> <% end %> From 929d7d3fa5de89bd9cfc9486d9878bfcaba09deb Mon Sep 17 00:00:00 2001 From: thenora Date: Sat, 13 Jun 2020 12:53:47 -0700 Subject: [PATCH 085/234] fixed default image for category show --- app/views/categories/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index 7291ab1068..0eceb7589a 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -10,7 +10,7 @@ <% @category.products.each do |product| %>
      <% if product.photo_url == nil || product.photo_url.length < 1 %> - <%= image_tag("https://f1.pngfuel.com/png/584/952/34/black-and-white-flower-black-white-m-leaf-plant-stem-silhouette-computer-line-plants-png-clip-art.png", :alt => "not found") %> + <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant black and white silhoutte") %> <% else %> <%= image_tag(product.photo_url, :alt => product.name ) %> <% end %> From 7ad7bfff5c9550f1a225f4c5090790607a8313f0 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Sat, 13 Jun 2020 15:37:22 -0700 Subject: [PATCH 086/234] add way to change quantity of order item --- app/assets/stylesheets/orders.scss | 4 ++++ app/views/orders/cart.html.erb | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss index 6e464a34ab..94f675bf15 100644 --- a/app/assets/stylesheets/orders.scss +++ b/app/assets/stylesheets/orders.scss @@ -37,4 +37,8 @@ .cart-item-info ul { list-style-type: none; padding: 0; +} + +.cart-item-change-quantity section{ + display: inline; } \ No newline at end of file diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index f32be03ba5..f1c7de9066 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -10,9 +10,20 @@
      • Cost: <%= number_to_currency(item.price) %>
      • - Quantity: <%= item.quantity %> (Change?) - | - <%= link_to 'Delete', order_item_path(item), method: :delete, data: {confirm: "Are you sure?"} %> + <%= form_for :order_item, url: order_item_path(item) do |f| %> +
        +
        + <%= f.label :quantity %>: + <%= f.text_field :quantity, value: item.quantity %> +
        +
        + <%= f.submit 'Change?' %> +
        +
        + <% end %> +
      • +
      • + <%= link_to 'Delete Item', order_item_path(item), method: :delete, data: {confirm: "Are you sure?"} %>
      From 3ec4eeb34523466759c2c96f13fce9e6e457a0a2 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Sat, 13 Jun 2020 15:41:07 -0700 Subject: [PATCH 087/234] add logic for changing quantity --- app/controllers/order_items_controller.rb | 5 +++-- app/views/orders/cart.html.erb | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index b57c802d7e..564c05e80b 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -57,11 +57,12 @@ def update head :not_found return elsif @order_item.update(order_items_params) - redirect_to order_path(@order_item.order.id) # /orders/:id + flash[:success] = 'Order item quantity updated.' + redirect_to cart_path return else flash[:failure] = 'Order item could not be updated.' - redirect_to order_path(@order_item.order.id) #/orders/:id + redirect_to cart_path return end end diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index f1c7de9066..a1ec34103e 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -10,7 +10,7 @@
      • Cost: <%= number_to_currency(item.price) %>
      • - <%= form_for :order_item, url: order_item_path(item) do |f| %> + <%= form_for :order_item, url: order_item_path(item), method: :patch do |f| %>
        <%= f.label :quantity %>: From 7c6c007ce33717342d7ffb6868dc5566cf1fd43d Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Sun, 14 Jun 2020 15:36:46 -0700 Subject: [PATCH 088/234] model validations for an order --- app/controllers/orders_controller.rb | 14 +++++++++++ app/models/order.rb | 36 ++++++++++++++++++++++++++++ app/views/orders/cart.html.erb | 2 +- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 9c16938eaf..1c14926fbf 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -28,5 +28,19 @@ def cart # show function for the open order at the moment end end + def checkout + + end + + def confirmation + + end + + private + + def orders_params + return params.require(:order).permit(:guest_name, :email, :phone_num, :address, :city, :state, :zip_code, :card_number, :card_expiration_date, :card_cvv) + end + end diff --git a/app/models/order.rb b/app/models/order.rb index b36051f45f..351bdad141 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,4 +1,40 @@ class Order < ApplicationRecord has_many :order_items has_many :products, through: :order_items + + validates :card_number, + presence: true, + length: { is: 16 }, + format: { with: /[0-9]{16}/ } + :on => :update + + validates :card_expiration_date, + presence: true + + validates :card_cvv, + presence: true, + length: { is: 3 }, + format: { with: /[0-9]{3}/ } + :on => :update + + validates :address, + presence: true + + validates :city, + presence: true + + validates :zip_code + presence: true, + format: { with: /[\d]{5}\-/[\d]*/ } + + validates :guest_name + presence: true + + validates :email + presence: true, + format: { with: /.+@.+\..+/ } + + validates :phone_num + presence: true, + format: { with: /^.*(\d{3}).*(\d{3}).*(\d{4})$/ } end diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index a1ec34103e..2504af921b 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -36,6 +36,6 @@ <% end %>
        - <%= button_to "Checkout", root_path, :method => "get" %> + <%= button_to "Checkout", root_path, :method => "get", class:"btn btn-primary" %>
      \ No newline at end of file From d68918836d750e98922f17f2a3222512ea701786 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Sun, 14 Jun 2020 15:59:05 -0700 Subject: [PATCH 089/234] add route for checkout, format form for checkout --- app/assets/stylesheets/orders.scss | 8 ++++ app/controllers/orders_controller.rb | 6 +++ app/models/order.rb | 33 ++++++++++------- app/views/orders/cart.html.erb | 2 +- app/views/orders/checkout.html.erb | 55 ++++++++++++++++++++++++++++ config/routes.rb | 2 + 6 files changed, 92 insertions(+), 14 deletions(-) create mode 100644 app/views/orders/checkout.html.erb diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss index 94f675bf15..7a177ab655 100644 --- a/app/assets/stylesheets/orders.scss +++ b/app/assets/stylesheets/orders.scss @@ -2,6 +2,8 @@ // They will automatically be included in application.css. // You can use Sass (SCSS) here: https://sass-lang.com/ +/* CART */ + .cart-page { display: flex; } @@ -41,4 +43,10 @@ .cart-item-change-quantity section{ display: inline; +} + +/* CHECKOUT */ + +.checkout-form { + width: 40vw; } \ No newline at end of file diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 1c14926fbf..a76392fbca 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -29,7 +29,13 @@ def cart # show function for the open order at the moment end def checkout + @cart = Order.find_by(cart_status: true) + if @cart.nil? || @cart.order_items.length == 0 + flash[:error] = "Unable to checkout." + # head :not_found + return + end end def confirmation diff --git a/app/models/order.rb b/app/models/order.rb index 351bdad141..87ff1d60fd 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -5,36 +5,43 @@ class Order < ApplicationRecord validates :card_number, presence: true, length: { is: 16 }, - format: { with: /[0-9]{16}/ } + format: { with: /[0-9]{16}/ }, :on => :update validates :card_expiration_date, - presence: true + presence: true, + :on => :update validates :card_cvv, presence: true, length: { is: 3 }, - format: { with: /[0-9]{3}/ } + format: { with: /[0-9]{3}/ }, :on => :update validates :address, - presence: true + presence: true, + :on => :update validates :city, - presence: true + presence: true, + :on => :update - validates :zip_code + validates :zip_code, presence: true, - format: { with: /[\d]{5}\-/[\d]*/ } + format: { with: /[\d]{5}\-[\d]*/ }, + :on => :update - validates :guest_name - presence: true + validates :guest_name, + presence: true, + :on => :update - validates :email + validates :email, presence: true, - format: { with: /.+@.+\..+/ } + format: { with: /.+@.+\..+/ }, + :on => :update - validates :phone_num + validates :phone_num, presence: true, - format: { with: /^.*(\d{3}).*(\d{3}).*(\d{4})$/ } + format: { with: /\A.*(\d{3}).*(\d{3}).*(\d{4})\z/ }, + :on => :update end diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index 2504af921b..02f3dd98b1 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -36,6 +36,6 @@ <% end %>
    - <%= button_to "Checkout", root_path, :method => "get", class:"btn btn-primary" %> + <%= button_to "Checkout", checkout_path, :method => "patch", class:"btn btn-primary" %>
    \ No newline at end of file diff --git a/app/views/orders/checkout.html.erb b/app/views/orders/checkout.html.erb new file mode 100644 index 0000000000..6e62b25419 --- /dev/null +++ b/app/views/orders/checkout.html.erb @@ -0,0 +1,55 @@ +

    Checkout

    +
    + <%= form_with model: @cart do |f| %> + +
    + <%= f.label :guest_name %> + <%= f.text_field :guest_name, class: 'form-control' %> +
    + +
    + <%= f.label :email %> + <%= f.text_field :email, class: 'form-control' %> +
    + +
    + <%= f.label :phone_num %> + <%= f.text_field :phone_num, class: 'form-control' %> +
    + +
    + <%= f.label :address %> + <%= f.text_field :address, class: 'form-control' %> +
    + +
    + <%= f.label :city %> + <%= f.text_field :city, class: 'form-control' %> +
    + +
    + <%= f.label :zip_code %> + <%= f.text_field :zip_code, class: 'form-control' %> +
    + +
    + <%= f.label :card_number %> + <%= f.text_field :card_number, class: 'form-control' %> +
    + +
    + <%= f.label :card_expiration_date %> + <%= f.text_field :card_expiration_date, class: 'form-control' %> +
    + +
    + <%= f.label :card_cvv %> + <%= f.text_field :card_cvv, class: 'form-control' %> +
    + +
    + <%= f.submit "Place Order", class: "btn btn-primary" %> +
    + + <% end %> +
    \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index aa4ff17c52..7fe38a3fab 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -30,4 +30,6 @@ # shopping cart get '/cart', to: 'orders#cart', as: 'cart' + patch '/checkout', to: 'orders#checkout', as: 'checkout' + end From c6d5c63aa408e55a86dda3df8c7205ecc2dda6eb Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Sun, 14 Jun 2020 16:10:39 -0700 Subject: [PATCH 090/234] confirmation route, also view your order items on checkout page --- app/assets/stylesheets/orders.scss | 6 ++ app/controllers/orders_controller.rb | 4 +- app/views/orders/checkout.html.erb | 154 +++++++++++++++++---------- config/routes.rb | 2 +- 4 files changed, 109 insertions(+), 57 deletions(-) diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss index 7a177ab655..d2004df95d 100644 --- a/app/assets/stylesheets/orders.scss +++ b/app/assets/stylesheets/orders.scss @@ -47,6 +47,12 @@ /* CHECKOUT */ +.checkout-page-container { + display: grid; + grid-template-columns: 1fr 1fr; +} + .checkout-form { + grid-column: 1 / 2; width: 40vw; } \ No newline at end of file diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index a76392fbca..d54c1d550e 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -35,7 +35,9 @@ def checkout flash[:error] = "Unable to checkout." # head :not_found return - end + end + + @cart_items = @cart.order_items end def confirmation diff --git a/app/views/orders/checkout.html.erb b/app/views/orders/checkout.html.erb index 6e62b25419..e9abd5f567 100644 --- a/app/views/orders/checkout.html.erb +++ b/app/views/orders/checkout.html.erb @@ -1,55 +1,99 @@ -

    Checkout

    -
    - <%= form_with model: @cart do |f| %> - -
    - <%= f.label :guest_name %> - <%= f.text_field :guest_name, class: 'form-control' %> -
    - -
    - <%= f.label :email %> - <%= f.text_field :email, class: 'form-control' %> -
    - -
    - <%= f.label :phone_num %> - <%= f.text_field :phone_num, class: 'form-control' %> -
    - -
    - <%= f.label :address %> - <%= f.text_field :address, class: 'form-control' %> -
    - -
    - <%= f.label :city %> - <%= f.text_field :city, class: 'form-control' %> -
    - -
    - <%= f.label :zip_code %> - <%= f.text_field :zip_code, class: 'form-control' %> -
    - -
    - <%= f.label :card_number %> - <%= f.text_field :card_number, class: 'form-control' %> -
    - -
    - <%= f.label :card_expiration_date %> - <%= f.text_field :card_expiration_date, class: 'form-control' %> -
    - -
    - <%= f.label :card_cvv %> - <%= f.text_field :card_cvv, class: 'form-control' %> -
    - -
    - <%= f.submit "Place Order", class: "btn btn-primary" %> -
    - - <% end %> -
    \ No newline at end of file +
    +
    +

    Checkout

    +
    + <%= form_with model: @cart, url: confirmation_path, method: :patch do |f| %> + +
    + <%= f.label :guest_name %> + <%= f.text_field :guest_name, class: 'form-control' %> +
    + +
    + <%= f.label :email %> + <%= f.text_field :email, class: 'form-control' %> +
    + +
    + <%= f.label :phone_num %> + <%= f.text_field :phone_num, class: 'form-control' %> +
    + +
    + <%= f.label :address %> + <%= f.text_field :address, class: 'form-control' %> +
    + +
    + <%= f.label :city %> + <%= f.text_field :city, class: 'form-control' %> +
    + +
    + <%= f.label :zip_code %> + <%= f.text_field :zip_code, class: 'form-control' %> +
    + +
    + <%= f.label :card_number %> + <%= f.text_field :card_number, class: 'form-control' %> +
    + +
    + <%= f.label :card_expiration_date %> + <%= f.text_field :card_expiration_date, class: 'form-control' %> +
    + +
    + <%= f.label :card_cvv %> + <%= f.text_field :card_cvv, class: 'form-control' %> +
    + +
    + <%= f.submit "Place Order", class: "btn btn-primary" %> +
    + + <% end %> +
    +
    + +
    +

    Your Cart

    +
    + <% @cart_items.each do |item| %> +
    + <%= image_tag(item.photo_url, alt: "photo of the cart item") %> +
    +

    <%= item.name %>

    +
      +
    • Cost: <%= number_to_currency(item.price) %>
    • +
    • + <%= form_for :order_item, url: order_item_path(item), method: :patch do |f| %> +
      +
      + <%= f.label :quantity %>: + <%= f.text_field :quantity, value: item.quantity %> +
      +
      + <%= f.submit 'Change?' %> +
      +
      + <% end %> +
    • +
    • + <%= link_to 'Delete Item', order_item_path(item), method: :delete, data: {confirm: "Are you sure?"} %> +
    • +
    +
    +
    + <% end %> +
    + + +

    + Total: +

    + PUT TOTAL HERE + +
    +
    \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 7fe38a3fab..a5dbfa0afc 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -31,5 +31,5 @@ # shopping cart get '/cart', to: 'orders#cart', as: 'cart' patch '/checkout', to: 'orders#checkout', as: 'checkout' - + get '/confirmation', to: 'orders#checkout', as: 'confirmation' end From f9329eeee08019af8b2ef73a9061e06f57e92f2f Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Sun, 14 Jun 2020 16:29:41 -0700 Subject: [PATCH 091/234] add model method for total price --- app/controllers/orders_controller.rb | 6 +++--- app/models/order.rb | 11 +++++++++++ app/views/orders/cart.html.erb | 1 + app/views/orders/checkout.html.erb | 18 +----------------- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index d54c1d550e..edf49c8fff 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -20,11 +20,11 @@ def show def cart # show function for the open order at the moment if !session[:order].nil? - open_order = Order.find_by(cart_status: true) + @open_order = Order.find_by(cart_status: true) end - if !open_order.nil? - @cart_items = open_order.order_items + if !@open_order.nil? + @cart_items = @open_order.order_items end end diff --git a/app/models/order.rb b/app/models/order.rb index 87ff1d60fd..7566ee8ec6 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -44,4 +44,15 @@ class Order < ApplicationRecord presence: true, format: { with: /\A.*(\d{3}).*(\d{3}).*(\d{4})\z/ }, :on => :update + + + def total_price + total = 0.0 + + self.order_items.each do |item| + total += item.price + end + + return total + end end diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index 02f3dd98b1..b56448b42c 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -36,6 +36,7 @@ <% end %>
    +

    Total: <%= number_to_currency(@open_order.total_price) %>

    <%= button_to "Checkout", checkout_path, :method => "patch", class:"btn btn-primary" %>
    \ No newline at end of file diff --git a/app/views/orders/checkout.html.erb b/app/views/orders/checkout.html.erb index e9abd5f567..31669795e9 100644 --- a/app/views/orders/checkout.html.erb +++ b/app/views/orders/checkout.html.erb @@ -62,27 +62,11 @@
    <% @cart_items.each do |item| %>
    - <%= image_tag(item.photo_url, alt: "photo of the cart item") %>

    <%= item.name %>

    • Cost: <%= number_to_currency(item.price) %>
    • -
    • - <%= form_for :order_item, url: order_item_path(item), method: :patch do |f| %> -
      -
      - <%= f.label :quantity %>: - <%= f.text_field :quantity, value: item.quantity %> -
      -
      - <%= f.submit 'Change?' %> -
      -
      - <% end %> -
    • -
    • - <%= link_to 'Delete Item', order_item_path(item), method: :delete, data: {confirm: "Are you sure?"} %> -
    • +
    • Quantity: <%= item.quantity %>
    From 624cba52570d9753d7c27f51924c598f0862e8be Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Sun, 14 Jun 2020 16:30:50 -0700 Subject: [PATCH 092/234] show total on checkout --- app/views/orders/checkout.html.erb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/views/orders/checkout.html.erb b/app/views/orders/checkout.html.erb index 31669795e9..52edcb053a 100644 --- a/app/views/orders/checkout.html.erb +++ b/app/views/orders/checkout.html.erb @@ -73,11 +73,8 @@ <% end %>
    - -

    - Total: -

    - PUT TOTAL HERE +
    +

    Total: <%= number_to_currency(@cart.total_price) %>

    \ No newline at end of file From 757ad64bf2b13eafcea97dc9d99007d52fe455b3 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Sun, 14 Jun 2020 20:15:45 -0700 Subject: [PATCH 093/234] confirmation of order page --- app/controllers/orders_controller.rb | 31 +++++++++- app/models/order.rb | 78 ++++++++++++++------------ app/views/orders/cart.html.erb | 2 +- app/views/orders/checkout.html.erb | 4 +- app/views/orders/confirmation.html.erb | 30 ++++++++++ config/routes.rb | 6 +- 6 files changed, 106 insertions(+), 45 deletions(-) create mode 100644 app/views/orders/confirmation.html.erb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index edf49c8fff..2242733203 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -18,6 +18,29 @@ def show end end + def update + p "WHERE AMI" + @open_order = Order.find_by(cart_status: true) + + if @open_order.nil? + p "NIL" + + head :not_found + return + elsif @open_order.update(orders_params) + p "UPDATED" + + redirect_to confirmation_path + return + else + p "why" + + flash[:error] = 'Order could not be placed.' + # redirect_to checkout_path + return + end + end + def cart # show function for the open order at the moment if !session[:order].nil? @open_order = Order.find_by(cart_status: true) @@ -29,11 +52,14 @@ def cart # show function for the open order at the moment end def checkout + p "what the fu" @cart = Order.find_by(cart_status: true) if @cart.nil? || @cart.order_items.length == 0 + p "*&******* HELLO???" + flash[:error] = "Unable to checkout." - # head :not_found + redirect_to cart_path return end @@ -41,7 +67,8 @@ def checkout end def confirmation - + @cart = Order.find_by(cart_status: true) + @cart_items = @cart.order_items end private diff --git a/app/models/order.rb b/app/models/order.rb index 7566ee8ec6..83a0d2ce3f 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,48 +2,48 @@ class Order < ApplicationRecord has_many :order_items has_many :products, through: :order_items - validates :card_number, - presence: true, - length: { is: 16 }, - format: { with: /[0-9]{16}/ }, - :on => :update - - validates :card_expiration_date, - presence: true, - :on => :update - - validates :card_cvv, - presence: true, - length: { is: 3 }, - format: { with: /[0-9]{3}/ }, - :on => :update - - validates :address, - presence: true, - :on => :update + # validates :card_number, + # presence: true, + # length: { is: 16 }, + # format: { with: /[0-9]{16}/ }, + # :on => :update + + # validates :card_expiration_date, + # presence: true, + # :on => :update + + # validates :card_cvv, + # presence: true, + # length: { is: 3 }, + # format: { with: /[0-9]{3}/ }, + # :on => :update + + # validates :address, + # presence: true, + # :on => :update - validates :city, - presence: true, - :on => :update + # validates :city, + # presence: true, + # :on => :update - validates :zip_code, - presence: true, - format: { with: /[\d]{5}\-[\d]*/ }, - :on => :update + # validates :zip_code, + # presence: true, + # format: { with: /[\d]{5}\-[\d]*/ }, + # :on => :update - validates :guest_name, - presence: true, - :on => :update + # validates :guest_name, + # presence: true, + # :on => :update - validates :email, - presence: true, - format: { with: /.+@.+\..+/ }, - :on => :update + # validates :email, + # presence: true, + # format: { with: /.+@.+\..+/ }, + # :on => :update - validates :phone_num, - presence: true, - format: { with: /\A.*(\d{3}).*(\d{3}).*(\d{4})\z/ }, - :on => :update + # validates :phone_num, + # presence: true, + # format: { with: /\A.*(\d{3}).*(\d{3}).*(\d{4})\z/ }, + # :on => :update def total_price @@ -55,4 +55,8 @@ def total_price return total end + + def find_product_id + + end end diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index b56448b42c..c8099a255d 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -37,6 +37,6 @@

    Total: <%= number_to_currency(@open_order.total_price) %>

    - <%= button_to "Checkout", checkout_path, :method => "patch", class:"btn btn-primary" %> + <%= button_to "Checkout", checkout_path, :method => "get", class:"btn btn-primary" %>
    \ No newline at end of file diff --git a/app/views/orders/checkout.html.erb b/app/views/orders/checkout.html.erb index 52edcb053a..86098c4330 100644 --- a/app/views/orders/checkout.html.erb +++ b/app/views/orders/checkout.html.erb @@ -2,7 +2,7 @@

    Checkout

    - <%= form_with model: @cart, url: confirmation_path, method: :patch do |f| %> + <%= form_with model: @cart, url: order_path(@cart), method: :patch do |f| %>
    <%= f.label :guest_name %> @@ -48,7 +48,7 @@ <%= f.label :card_cvv %> <%= f.text_field :card_cvv, class: 'form-control' %>
    - +
    <%= f.submit "Place Order", class: "btn btn-primary" %>
    diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb new file mode 100644 index 0000000000..bf7cf98927 --- /dev/null +++ b/app/views/orders/confirmation.html.erb @@ -0,0 +1,30 @@ +

    Confirmation: Order placed!

    +
      +
    • + Order Placed At: <%= @cart.updated_at.strftime('%a %b %d %H:%M:%S %Z %Y').in_time_zone("Pacific Time (US & Canada)") %> +
    • +
    • + Order Fullfillment Status: +
    • +
    + +
    +

    Your Items

    +
    + <% @cart_items.each do |item| %> +
    +
    +

    <%= link_to item.name, product_path(item.product_id) %>

    +
      +
    • Cost: <%= number_to_currency(item.price) %>
    • +
    • Quantity: <%= item.quantity %>
    • +
    +
    +
    + <% end %> +
    + +
    +

    Total: <%= number_to_currency(@cart.total_price) %>

    +
    +
    \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index a5dbfa0afc..c537bdc568 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -26,10 +26,10 @@ resources :order_items, only: [:index, :create, :update, :destroy, :show] #Orders - resources :orders, only: [:index, :show] + resources :orders, only: [:index, :show, :update] # shopping cart get '/cart', to: 'orders#cart', as: 'cart' - patch '/checkout', to: 'orders#checkout', as: 'checkout' - get '/confirmation', to: 'orders#checkout', as: 'confirmation' + get '/checkout', to: 'orders#checkout', as: 'checkout' + get '/confirmation', to: 'orders#confirmation', as: 'confirmation' end From b916d1a76a3e24120f44e84f0afe18031d5670d6 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Sun, 14 Jun 2020 23:56:41 -0700 Subject: [PATCH 094/234] add logic to change inventory and status after checking out --- app/controllers/orders_controller.rb | 18 +++++------------- app/models/order.rb | 11 ++++++++++- app/views/orders/cart.html.erb | 8 +++++++- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 2242733203..97fce67de3 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -19,24 +19,17 @@ def show end def update - p "WHERE AMI" @open_order = Order.find_by(cart_status: true) if @open_order.nil? - p "NIL" - head :not_found return elsif @open_order.update(orders_params) - p "UPDATED" - redirect_to confirmation_path return else - p "why" - flash[:error] = 'Order could not be placed.' - # redirect_to checkout_path + redirect_to checkout_path return end end @@ -52,13 +45,10 @@ def cart # show function for the open order at the moment end def checkout - p "what the fu" @cart = Order.find_by(cart_status: true) - if @cart.nil? || @cart.order_items.length == 0 - p "*&******* HELLO???" - - flash[:error] = "Unable to checkout." + if @cart.nil? || @cart.order_items.length == 0 + flash[:failure] = "Unable to checkout." redirect_to cart_path return end @@ -69,6 +59,8 @@ def checkout def confirmation @cart = Order.find_by(cart_status: true) @cart_items = @cart.order_items + + Order.purchase_changes(@cart, @cart_items) end private diff --git a/app/models/order.rb b/app/models/order.rb index 83a0d2ce3f..31e9bbbb4b 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -56,7 +56,16 @@ def total_price return total end - def find_product_id + def self.purchase_changes(cart, cart_items) + p "reaching?" + cart.cart_status = false + cart.save + cart_items.each do |item| + matching_product = Product.find_by(id: item.product_id) + + matching_product.inventory -= item.quantity + matching_product.save + end end end diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb index c8099a255d..cc5186d6d8 100644 --- a/app/views/orders/cart.html.erb +++ b/app/views/orders/cart.html.erb @@ -36,7 +36,13 @@ <% end %>
    -

    Total: <%= number_to_currency(@open_order.total_price) %>

    +

    Total: + <% if @open_order %> + <%= number_to_currency(@open_order.total_price) %> + <% else %> + $0.00 + <% end %> +

    <%= button_to "Checkout", checkout_path, :method => "get", class:"btn btn-primary" %>
    \ No newline at end of file From 27154ac08ece939dac75891df510e417d4171f85 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Mon, 15 Jun 2020 08:44:56 -0700 Subject: [PATCH 095/234] If user is not logged in, added feature to deny them access to the dashboard page --- app/controllers/merchants_controller.rb | 4 ++++ app/views/merchants/dashboard.html.erb | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index e6d10503b5..4edcf66dfb 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -23,6 +23,10 @@ def create def dashboard @merchant = Merchant.find_by(id: session[:user_id], provider: "github") + + if @merchant.nil? + flash[:error] = "You must be logged in to view this page!" + end end def destroy diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb index afa0452fa2..1e57c897c2 100644 --- a/app/views/merchants/dashboard.html.erb +++ b/app/views/merchants/dashboard.html.erb @@ -1,5 +1,13 @@

    Merchant Dashboard

    - <%= link_to "Add a product", new_product_path %> + <% if @merchant.nil?%> +

    Please Log In!

    + <% else %> + <%= link_to "Add a product", new_product_path %> + + <% @merchant.orders.each do |order| %> +
  • ID: <%= order.id %>
  • + + <% end %>
    \ No newline at end of file From bcfff99594bca9537c03b42cf3d3b85aa1d5180a Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Mon, 15 Jun 2020 13:47:03 -0700 Subject: [PATCH 096/234] Fixed route for merchant dashboard. view currently broken --- app/controllers/merchants_controller.rb | 2 +- app/views/merchants/dashboard.html.erb | 14 ++++-- config/routes.rb | 4 +- db/schema.rb | 3 +- test/controllers/merchants_controller_test.rb | 44 +++++++++++++++++++ 5 files changed, 58 insertions(+), 9 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 4edcf66dfb..79aeef6ebe 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -24,7 +24,7 @@ def create def dashboard @merchant = Merchant.find_by(id: session[:user_id], provider: "github") - if @merchant.nil? + if session[:user_id].nil? flash[:error] = "You must be logged in to view this page!" end end diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb index 1e57c897c2..b8c01ca221 100644 --- a/app/views/merchants/dashboard.html.erb +++ b/app/views/merchants/dashboard.html.erb @@ -1,13 +1,19 @@

    Merchant Dashboard

    - <% if @merchant.nil?%> -

    Please Log In!

    - <% else %> + <% unless session[:user_id].nil? %> +
    <%= link_to "Add a product", new_product_path %> +

    Orders:

    <% @merchant.orders.each do |order| %> -
  • ID: <%= order.id %>
  • +
  • <%= link_to: "ID: #{order.id}", order_path(order.id), method: :get %>
  • +

    Products:

    + + <% @merchant.products.each do |order| %> +
  • Name: <%= product.name %>
  • + +
    <% end %>
    \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index dad32cadd8..253d6e9d6f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -21,8 +21,8 @@ #Merchant delete "/logout", to: "merchants#destroy", as: "logout" - resources :merchants, only: [:show] - get "/dashboard", to: "merchants#dashboard", as: "dashboard" + # resources :merchants, only: [:show] + get "/merchants/:id", to: "merchants#dashboard", as: "dashboard" #Order_Items resources :order_items, only: [:index, :create, :update, :destroy, :show] diff --git a/db/schema.rb b/db/schema.rb index 0b287aec4c..96da88cfd4 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -82,8 +82,6 @@ t.index ["merchant_id"], name: "index_products_on_merchant_id" end - add_foreign_key "merchants", "orders" - create_table "products_categories_joins", force: :cascade do |t| t.bigint "product_id" t.bigint "category_id" @@ -91,6 +89,7 @@ t.index ["product_id"], name: "index_products_categories_joins_on_product_id" end + add_foreign_key "merchants", "orders" add_foreign_key "order_items", "orders" add_foreign_key "order_items", "products" add_foreign_key "orders", "merchants" diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index df3c54d641..143cead5af 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -64,3 +64,47 @@ def setup end end + +# require "test_helper" +# describe User do +# before do +# @korona = users(:korona) +# @charlie = users(:charlie) +# @gunit = users(:gunit) +# @captain = works(:captain) +# @it = works(:it) +# end +# describe "validations" do +# it "is valid when username is present" do +# valid_user = User.new(username: "steve") +# expect(valid_user.valid?).must_equal true +# end +# it "is invalid without a user" do +# @gunit.username = nil +# @gunit.save +# expect(@gunit.valid?).must_equal false +# expect(@gunit.errors.messages).must_include :username +# expect(@gunit.errors.messages[:username]).must_equal ["can't be blank"] +# end +# end +# describe "relations" do +# it "can have many votes" do +# @new_user = User.create(username: "timberlake") +# Vote.create!(work_id: @captain.id, user_id: @new_user.id) +# Vote.create!(work_id: @it.id, user_id: @new_user.id) +# expect(@new_user.votes.count).must_equal 2 +# @new_user.votes.each do |vote| +# expect(vote).must_be_instance_of Vote +# end +# end +# it "can have many works through votes" do +# @new_user = User.create(username: "timberlake") +# Vote.create!(work_id: @captain.id, user_id: @new_user.id) +# Vote.create!(work_id: @it.id, user_id: @new_user.id) +# @new_user.votes.each do |vote| +# voted_work = Work.find_by(id: vote.work_id) +# expect(voted_work).must_be_instance_of Work +# end +# end +# end +# end From 23a6a70d3569ae3df889689f3c4a3acf8773c1f0 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Mon, 15 Jun 2020 14:02:38 -0700 Subject: [PATCH 097/234] Route details/merchant dashboard details --- app/views/merchants/dashboard.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb index b8c01ca221..19a2b23db9 100644 --- a/app/views/merchants/dashboard.html.erb +++ b/app/views/merchants/dashboard.html.erb @@ -5,12 +5,12 @@
    <%= link_to "Add a product", new_product_path %>

    Orders:

    - +
      <% @merchant.orders.each do |order| %>
    • <%= link_to: "ID: #{order.id}", order_path(order.id), method: :get %>

    Products:

    - +
      <% @merchant.products.each do |order| %>
    • Name: <%= product.name %>
    From bcbfa3b7ec8528a79af7564e0a16ed4989e24cf5 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 14:38:01 -0700 Subject: [PATCH 098/234] correct total cost logic and clear session on order closing --- app/controllers/orders_controller.rb | 2 ++ app/models/order.rb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 97fce67de3..9801e38bd2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -61,6 +61,8 @@ def confirmation @cart_items = @cart.order_items Order.purchase_changes(@cart, @cart_items) + + session[:order] = nil end private diff --git a/app/models/order.rb b/app/models/order.rb index 31e9bbbb4b..4f9322792d 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -50,7 +50,7 @@ def total_price total = 0.0 self.order_items.each do |item| - total += item.price + total += (item.price * item.quantity) end return total From 6cced37e3a073f55cba459d9c8603aa88084177a Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 14:41:30 -0700 Subject: [PATCH 099/234] fix order status on confirmation --- app/views/orders/confirmation.html.erb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index bf7cf98927..56b755251a 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -4,7 +4,10 @@ Order Placed At: <%= @cart.updated_at.strftime('%a %b %d %H:%M:%S %Z %Y').in_time_zone("Pacific Time (US & Canada)") %>
  • - Order Fullfillment Status: + Order Status: + <% if @cart.cart_status == false %> + Paid + <% end %>
  • From b6c233a317dca66d32004258b8e63600c492b713 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 14:44:21 -0700 Subject: [PATCH 100/234] add state to order --- app/models/order.rb | 4 ++++ app/views/orders/checkout.html.erb | 5 +++++ db/migrate/20200615214220_add_state_to_order.rb | 5 +++++ db/schema.rb | 3 ++- 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20200615214220_add_state_to_order.rb diff --git a/app/models/order.rb b/app/models/order.rb index 4f9322792d..961db6ff52 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -26,6 +26,10 @@ class Order < ApplicationRecord # presence: true, # :on => :update + # validates :state, + # presence: true, + # :on => :update + # validates :zip_code, # presence: true, # format: { with: /[\d]{5}\-[\d]*/ }, diff --git a/app/views/orders/checkout.html.erb b/app/views/orders/checkout.html.erb index 86098c4330..3eb9a00d89 100644 --- a/app/views/orders/checkout.html.erb +++ b/app/views/orders/checkout.html.erb @@ -29,6 +29,11 @@ <%= f.text_field :city, class: 'form-control' %>
    +
    + <%= f.label :state %> + <%= f.text_field :state, class: 'form-control' %> +
    +
    <%= f.label :zip_code %> <%= f.text_field :zip_code, class: 'form-control' %> diff --git a/db/migrate/20200615214220_add_state_to_order.rb b/db/migrate/20200615214220_add_state_to_order.rb new file mode 100644 index 0000000000..1a7f4a7f7e --- /dev/null +++ b/db/migrate/20200615214220_add_state_to_order.rb @@ -0,0 +1,5 @@ +class AddStateToOrder < ActiveRecord::Migration[6.0] + def change + add_column :orders, :state, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 44ca5dc663..c23a724e32 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_13_100344) do +ActiveRecord::Schema.define(version: 2020_06_15_214220) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -63,6 +63,7 @@ t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.boolean "cart_status", default: true + t.string "state" end create_table "products", force: :cascade do |t| From b1f31318405c77a43146541e7c63381dae618d10 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 18:29:20 -0700 Subject: [PATCH 101/234] cannot add products to the cart that are out of stock --- app/controllers/order_items_controller.rb | 5 +++-- app/controllers/orders_controller.rb | 1 + app/models/order.rb | 8 -------- app/models/order_item.rb | 14 ++++++++++++++ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 564c05e80b..684bd0a3da 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -37,14 +37,15 @@ def create p "CREATE A SESSION" end - if @new_item.save + if @new_item.save && @new_item.check_product_inventory + @new_item.inventory_changes p "ITEM WAS ADD" flash[:success] = 'Item added to cart.' redirect_to cart_path return else p "ITEM WAS not ADDED" - flash[:failure] = 'Item could not be added.' + flash[:failure] = 'Not enough product inventory.' redirect_back fallback_location: root_path return end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 9801e38bd2..604eab3ece 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -37,6 +37,7 @@ def update def cart # show function for the open order at the moment if !session[:order].nil? @open_order = Order.find_by(cart_status: true) + p @open_order end if !@open_order.nil? diff --git a/app/models/order.rb b/app/models/order.rb index 961db6ff52..b6099dd5d3 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -61,15 +61,7 @@ def total_price end def self.purchase_changes(cart, cart_items) - p "reaching?" cart.cart_status = false cart.save - - cart_items.each do |item| - matching_product = Product.find_by(id: item.product_id) - - matching_product.inventory -= item.quantity - matching_product.save - end end end diff --git a/app/models/order_item.rb b/app/models/order_item.rb index bcdd901b71..1d2dc4b182 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -4,4 +4,18 @@ class OrderItem < ApplicationRecord belongs_to :order validates :name, presence: true + + def check_product_inventory + incoming_quantity = self.quantity + matching_product = Product.find_by(id: self.product_id) + + matching_product.inventory > incoming_quantity ? true : false + end + + def inventory_changes + matching_product = Product.find_by(id: self.product_id) + + matching_product.inventory -= self.quantity + matching_product.save + end end From 5bb3091847136a05d1a769963039cf080843cfab Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 19:00:58 -0700 Subject: [PATCH 102/234] cannot edit quantity of item in cart if there is not enough inventory + deleting item from cart restores stock --- app/controllers/order_items_controller.rb | 9 +++++---- app/models/order_item.rb | 9 ++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 684bd0a3da..53449b35cd 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -38,7 +38,7 @@ def create end if @new_item.save && @new_item.check_product_inventory - @new_item.inventory_changes + @new_item.reduce_inventory p "ITEM WAS ADD" flash[:success] = 'Item added to cart.' redirect_to cart_path @@ -57,12 +57,12 @@ def update if @order_item.nil? head :not_found return - elsif @order_item.update(order_items_params) + elsif @order_item.update(order_items_params) && @order_item.check_product_inventory flash[:success] = 'Order item quantity updated.' redirect_to cart_path return else - flash[:failure] = 'Order item could not be updated.' + flash[:failure] = 'Not enough inventory to update quantity.' redirect_to cart_path return end @@ -77,11 +77,12 @@ def destroy return end + @order_item.add_inventory @order_item.destroy - # redirect_to order_path(@order_item.order.id) #check if order items have a count of 0, then delete order count = @order_item.order.order_items.count + if count == 0 @order_item.order.destroy session[:order] = nil diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 1d2dc4b182..7a565b8842 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -12,10 +12,17 @@ def check_product_inventory matching_product.inventory > incoming_quantity ? true : false end - def inventory_changes + def reduce_inventory matching_product = Product.find_by(id: self.product_id) matching_product.inventory -= self.quantity matching_product.save end + + def add_inventory + matching_product = Product.find_by(id: self.product_id) + + matching_product.inventory += self.quantity + matching_product.save + end end From e546211d9efa66f710b53f234d7fa1e92cdccaa1 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 19:09:05 -0700 Subject: [PATCH 103/234] update logic to check inventory before checking --- app/controllers/order_items_controller.rb | 6 ++++-- app/models/order_item.rb | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 53449b35cd..88f64b2727 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -37,7 +37,8 @@ def create p "CREATE A SESSION" end - if @new_item.save && @new_item.check_product_inventory + if @new_item.check_product_inventory + @new_item.save @new_item.reduce_inventory p "ITEM WAS ADD" flash[:success] = 'Item added to cart.' @@ -57,7 +58,8 @@ def update if @order_item.nil? head :not_found return - elsif @order_item.update(order_items_params) && @order_item.check_product_inventory + elsif @order_item.check_product_inventory + @order_item.update(order_items_params) flash[:success] = 'Order item quantity updated.' redirect_to cart_path return diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 7a565b8842..7eede51b5a 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -9,7 +9,7 @@ def check_product_inventory incoming_quantity = self.quantity matching_product = Product.find_by(id: self.product_id) - matching_product.inventory > incoming_quantity ? true : false + matching_product.inventory >= incoming_quantity ? true : false end def reduce_inventory From f9d05a400ebeb5341840babe6f20390b8a5a5edb Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 20:55:10 -0700 Subject: [PATCH 104/234] orders#index testing --- test/controllers/orders_controller_test.rb | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index d6cff7302e..72a7601663 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -26,6 +26,30 @@ } } + describe "index" do + it "responds with success when there are many orders saved" do + new_order = Order.create + get orders_path + must_respond_with :success + end + + it "responds with success when there are no orders saved" do + expect(Order.count).must_equal 0 + get orders_path + must_respond_with :success + end + end + + describe "show" do + it "" do + end + end + + describe "update" do + it "" do + end + end + describe "cart" do it "finds a list of orders if session order is populated" do expect { @@ -42,4 +66,13 @@ end end + describe "checkout" do + it "" do + end + end + + describe "confirmation" do + it "" do + end + end end \ No newline at end of file From d273d53857db78c8c06ed5f3424ea58f6a395941 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 20:59:03 -0700 Subject: [PATCH 105/234] orders#show testing --- test/controllers/orders_controller_test.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 72a7601663..bac57b6892 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -41,7 +41,15 @@ end describe "show" do - it "" do + it "responds with success when showing an existing valid order" do + new_order = Order.create + get order_path(new_order.id) + must_respond_with :success + end + + it "responds with 404 with an invalid order id" do + get order_path(-1) + must_respond_with :not_found end end From eae76189555b2856fe68fbedb119d5bd39b30650 Mon Sep 17 00:00:00 2001 From: kate myer Date: Mon, 15 Jun 2020 21:10:35 -0700 Subject: [PATCH 106/234] model tests passing: order item --- test/models/order_item_test.rb | 39 +++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index b2630ff9e9..0ff94dbfa8 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -1,7 +1,40 @@ require "test_helper" describe OrderItem do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + before do + @order_item = OrderItem.new(name: "order_item1") + @new_product = products(:product_1) + @new_order = Order.create + @valid_order_item = OrderItem.create!(name: @new_product.name, price: @new_product.price, quantity: @new_product.inventory, product_id: @new_product.id, order_id: @new_order.id) + + end + + describe "validations" do + it "is valid when parameter are present" do + expect(@valid_order_item.valid?).must_equal true + end + + it "is invalid without a name" do + invalid_order_item = order_items(:order_item1) + invalid_order_item.name = nil + invalid_order_item.save + expect(invalid_order_item.valid?).must_equal false + expect(invalid_order_item.errors.messages).must_include :name + expect(invalid_order_item.errors.messages[:name]).must_equal ["can't be blank"] + end + + end + + describe "relations" do + it "belongs to one product" do + @valid_order_item.save + expect(@valid_order_item.product).must_be_instance_of Product + end + + it "belongs to one order" do + @valid_order_item.save + expect(@valid_order_item.order).must_be_instance_of Order + end + end end + From 81822d7571dfce18a6fbb98c203c7649ab69a481 Mon Sep 17 00:00:00 2001 From: kate myer Date: Mon, 15 Jun 2020 21:10:47 -0700 Subject: [PATCH 107/234] craeted fixtures: order items --- test/fixtures/order_items.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 test/fixtures/order_items.yml diff --git a/test/fixtures/order_items.yml b/test/fixtures/order_items.yml new file mode 100644 index 0000000000..a21709c175 --- /dev/null +++ b/test/fixtures/order_items.yml @@ -0,0 +1,30 @@ +order_item1: + name: coffee plant1 + price: 5.00 + quantity: 10 + product_id: 1 + order_id: 1 +order_item2: + name: fiddle fig tree1 + price: 15.99 + quantity: 3 + product_id: 1 + order_id: 2 +order_item3: + name: fiddle fig tree2 + price: 25.99 + quantity: 4 + product_id: 2 + order_id: 2 +order_item4: + name: echeveria1 + price: 21.00 + quantity: 1 + product_id: 1 + order_id: 3 +order_item5: + name: echeveria2 + price: 22.00 + quantity: 2 + product_id: 2 + order_id: 3 \ No newline at end of file From d552ca6192ba6b9c477b750a8f8794f01de264eb Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 21:23:14 -0700 Subject: [PATCH 108/234] orders#update testing --- test/controllers/orders_controller_test.rb | 64 +++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index bac57b6892..3adf63e2cd 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -1,6 +1,7 @@ require "test_helper" describe OrdersController do + before do @merchant = Merchant.create( username: 'Leroy Jenkins', @@ -54,8 +55,69 @@ end describe "update" do - it "" do + let (:update_hash) { + { + order: { + guest_name: 'Leroy Jenkins', + email: 'leroyj@gmail.com', + address: '444 Main St.', + city: 'Somewhere', + state: 'CA', + zip_code: '91007', + card_number: '4444333322221111', + card_expiration_date: '06/25', + card_cvv: '333', + } + } + } + + it "can update an existing order with valid information accurately, and redirect" do + new_order = Order.create + + expect { + patch order_path(new_order.id), params: update_hash + }.wont_change 'Order.count' + + must_respond_with :redirect + must_redirect_to confirmation_path + + find_order = Order.find_by(id: new_order.id) + + expect(find_order.guest_name).must_equal update_hash[:order][:guest_name] + expect(find_order.email).must_equal update_hash[:order][:email] + expect(find_order.address).must_equal update_hash[:order][:address] + expect(find_order.city).must_equal update_hash[:order][:city] + expect(find_order.state).must_equal update_hash[:order][:state] + expect(find_order.zip_code).must_equal update_hash[:order][:zip_code] + expect(find_order.card_number).must_equal update_hash[:order][:card_number] + expect(find_order.card_expiration_date).must_equal update_hash[:order][:card_expiration_date] + expect(find_order.card_cvv).must_equal update_hash[:order][:card_cvv] + end + + it "does not update any order if given an invalid id, and responds with a 404" do + expect { + patch order_path(-1), params: update_hash + }.wont_change 'Order.count' + + must_respond_with :not_found end + + #### CAN'T DO THIS ONE YET!!!!! ##### WAIT FOR FINAL VALIDATIONS + + # it "does not update a order if the form data violates passenger validations, and responds with a redirect" do + # new_order = Order.create + + # update = { + # passenger: { + # name: '', + # phone_num: '' + # } + # } + + # expect { + # patch passenger_path(passenger.id), params: update + # }.wont_change 'Passenger.count' + # end end describe "cart" do From f0489544ff8d647108a8b3234ee5776139c79a3c Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 21:43:12 -0700 Subject: [PATCH 109/234] orders#checkout testing --- app/controllers/orders_controller.rb | 3 +- test/controllers/orders_controller_test.rb | 33 ++++++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 604eab3ece..e05b993fb5 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -48,12 +48,13 @@ def cart # show function for the open order at the moment def checkout @cart = Order.find_by(cart_status: true) - if @cart.nil? || @cart.order_items.length == 0 + if @cart.nil? || @cart.order_items.length == 0 flash[:failure] = "Unable to checkout." redirect_to cart_path return end + head :ok @cart_items = @cart.order_items end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 3adf63e2cd..e301429e1d 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -103,7 +103,7 @@ end #### CAN'T DO THIS ONE YET!!!!! ##### WAIT FOR FINAL VALIDATIONS - + # it "does not update a order if the form data violates passenger validations, and responds with a redirect" do # new_order = Order.create @@ -137,7 +137,36 @@ end describe "checkout" do - it "" do + it "must respond with success if cart has items" do + valid_cart = Order.create + valid_item = OrderItem.create( + name: @product.name, + price: @product.price, + quantity: 1, + product_id: @product.id, + photo_url: 'order.jpg', + order_id: valid_cart.id + ) + + get checkout_path + + must_respond_with :ok + end + + it "redirects back to cart path if there are no items" do + empty_cart = Order.create + + get checkout_path + + must_redirect_to cart_path + end + + it "redirects back to cart path if no open cart has been made" do + bad_cart = Order.create(cart_status: false) + + get checkout_path + + must_redirect_to cart_path end end From efde3bd4ea1ccad7fa701177b604484c80178524 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 22:01:22 -0700 Subject: [PATCH 110/234] orders#confirmation testing --- app/controllers/orders_controller.rb | 9 ++++++ test/controllers/orders_controller_test.rb | 33 +++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index e05b993fb5..300a20dbf8 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -60,6 +60,15 @@ def checkout def confirmation @cart = Order.find_by(cart_status: true) + + if @cart.nil? || @cart.order_items.length == 0 + flash[:error] = "Unable to checkout." + render :update + return + end + + head :ok + @cart_items = @cart.order_items Order.purchase_changes(@cart, @cart_items) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index e301429e1d..b9a979aeef 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -171,7 +171,38 @@ end describe "confirmation" do - it "" do + it "responds with success if confirmation is loaded" do + valid_cart = Order.create + valid_item = OrderItem.create( + name: @product.name, + price: @product.price, + quantity: 1, + product_id: @product.id, + photo_url: 'order.jpg', + order_id: valid_cart.id + ) + + get confirmation_path + + must_respond_with :success + end + + it "responds with redirect if open cart is not found" do + bad_cart = Order.create(cart_status: false) + + get checkout_path + + must_redirect_to cart_path + end + + it "responds with redirect if no items are in the cart" do + empty_cart = Order.create + + get checkout_path + + must_redirect_to cart_path + + expect(session[:order]).must_be_nil end end end \ No newline at end of file From e6d384d582155469bb8360cc84107d63e3efb87e Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Mon, 15 Jun 2020 22:19:55 -0700 Subject: [PATCH 111/234] change some redirects to block access if cart is not ready --- app/controllers/orders_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 300a20dbf8..a7b90e1d35 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -63,7 +63,7 @@ def confirmation if @cart.nil? || @cart.order_items.length == 0 flash[:error] = "Unable to checkout." - render :update + redirect_to cart_path return end From 626ee602595060fc2142a77d5af77c9b79645e57 Mon Sep 17 00:00:00 2001 From: thenora Date: Mon, 15 Jun 2020 23:47:44 -0700 Subject: [PATCH 112/234] category product seeds working! --- .DS_Store | Bin 8196 -> 8196 bytes db/category-product-seed.csv | 21 ++++++++++++++ db/seeds.rb | 28 +++++++++++++++++-- test/controllers/products_controller_test.rb | 1 - 4 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 db/category-product-seed.csv diff --git a/.DS_Store b/.DS_Store index 4321f7d2e3699fc82d6e08c5c3176be66c4ae693..5842cc8c109ac066faa45560662f31087d3a1b68 100644 GIT binary patch delta 61 zcmV-D0K)%-K!iZBs}cdqldKYe3>kZSF*rCeEFd&8Fq1bE9RZq?RTCcpo0Gv46tjsF TeFU=y81@8{k`xuQ5f$ac delta 52 zcmV-40L%Y`K!iZBs}cdpldKYe3mAKQGcz?TATu;KlQ true) do |row| + category = Category.find_by(id: row["category_id"]) + product = Product.find_by(id: row["product_id"]) + product.categories << category + + successful = product.save + + if !successful + categoryproduct_failures << product + puts "Failed to add category #{category.inspect} to product #{product.inspect}" + else + puts "added category #{category.inspect} to product #{product.inspect}" + end +end + +# puts "Added #{Category_Product.count} category-product relationships" +puts "#{categoryproduct_failures.length} category-product relationships failed to save" + # ORDERS ORDERS_FILE = Rails.root.join('db', 'orders-seed.csv') @@ -145,9 +170,6 @@ puts "#{order_item_failures.length} order items failed to save" - - - puts "Manually resetting each table's PK sequence" ActiveRecord::Base.connection.tables.each do |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 375ea9dd03..3077d584b7 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -65,7 +65,6 @@ price: 39.99, description: "Big green plant!", inventory: 3, - merchant_id: merchant_1.id, status: true, photo_url: "https://bloomscape.com/wp-content/uploads/2019/11/bloomscape_peopleplants_monstera-scaled.jpg" } From a2c925f8e3ed76f1d1806abe27d93c4c9c94bcea Mon Sep 17 00:00:00 2001 From: thenora Date: Mon, 15 Jun 2020 23:57:43 -0700 Subject: [PATCH 113/234] made category show page match product index --- app/views/categories/show.html.erb | 50 ++++++++++++++-------------- app/views/products/index.html.erb | 52 +++++++++++++++--------------- 2 files changed, 52 insertions(+), 50 deletions(-) diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index 0eceb7589a..2a2db3b0c0 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -2,34 +2,36 @@

    Category: <%=@category.name.upcase%>

    -
    +
    <% if @category.products.empty? %>

    Oops! Looks like we're sold out of these plants.

    <% else %> -
    +
    <% @category.products.each do |product| %> -
    - <% if product.photo_url == nil || product.photo_url.length < 1 %> - <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant black and white silhoutte") %> - <% else %> - <%= image_tag(product.photo_url, :alt => product.name ) %> - <% end %> -
    -
    - <%= link_to product.name, product_path( product.id ) %> -
    -
    -
    -
    - Cost: $<%= sprintf('%.2f', product.price) %> -
    -
    - Inventory: - <%= product.inventory %> -
    -
    -
    +
      +
    • + <% if product.photo_url == nil || product.photo_url.length < 1 %> + <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant black and white silhoutte") %> + <% else %> + <%= image_tag(product.photo_url, :alt => product.name ) %> + <% end %> +
      +
      + <%= link_to product.name, product_path( product.id ) %> +
      +
      +
      +
      + Cost: $<%= sprintf('%.2f', product.price) %> +
      +
      + Inventory: + <%= product.inventory %> +
      +
      +
    • +
    <% end %>
    <% end %> -
    \ No newline at end of file + \ No newline at end of file diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index c6c25682a3..12c3625206 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,28 +1,28 @@ -
    -

    All The Plants

    -
    - <% @products.each do |product| %> -
      -
    • - <% if product.photo_url == nil || product.photo_url.length < 1 %> - <%= link_to image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg"), product_path(product.id) %> - <% else %> - <%= link_to image_tag(product.photo_url, alt: "photo of #{product.name}"), product_path(product.id) %> - <% end %> - -
    • -
    • -

      <%=link_to product.name, product_path(product.id) %>

      -
    • -
    • - Cost: <%= number_to_currency(product.price) %> -
    • -
    • - Quantity: <%= product.inventory %> -
    • -
    - <% end %> -
    -
    + +

    All The Plants

    +
    + <% @products.each do |product| %> +
      +
    • + <% if product.photo_url == nil || product.photo_url.length < 1 %> + <%= link_to image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg"), product_path(product.id) %> + <% else %> + <%= link_to image_tag(product.photo_url, alt: "photo of #{product.name}"), product_path(product.id) %> + <% end %> + +
    • +
    • +

      <%=link_to product.name, product_path(product.id) %>

      +
    • +
    • + Cost: <%= number_to_currency(product.price) %> +
    • +
    • + Quantity: <%= product.inventory %> +
    • +
    + <% end %> +
    + From 353db1dc476c389c9fafab98de65b217b5970769 Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 16 Jun 2020 00:57:36 -0700 Subject: [PATCH 114/234] heading tweaks --- app/views/categories/create.html.erb | 2 +- app/views/categories/edit.html.erb | 2 +- app/views/categories/index.html.erb | 6 +- app/views/categories/new.html.erb | 2 +- app/views/categories/update.html.erb | 2 +- app/views/orders/show.html.erb | 2 +- app/views/products/show.html.erb | 87 ++++++++++++++-------------- 7 files changed, 51 insertions(+), 52 deletions(-) diff --git a/app/views/categories/create.html.erb b/app/views/categories/create.html.erb index 63069b0005..b43f9d37ee 100644 --- a/app/views/categories/create.html.erb +++ b/app/views/categories/create.html.erb @@ -1,2 +1,2 @@ -

    Categories#create

    +

    Categories#create

    Find me in app/views/categories/create.html.erb

    diff --git a/app/views/categories/edit.html.erb b/app/views/categories/edit.html.erb index 3b8dca3af4..704744a974 100644 --- a/app/views/categories/edit.html.erb +++ b/app/views/categories/edit.html.erb @@ -1,2 +1,2 @@ -

    Categories#edit

    +

    Categories#edit

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

    diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index 17b8980613..70683b7753 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -1,8 +1,8 @@

    Shop by Category

    - <%@categories.each do |cat| %> -
  • - <%= link_to cat.name.upcase, category_path(cat.id)%> + <%@categories.each do |category| %> +
  • + <%= link_to category.name.upcase, category_path(category.id)%>
  • <%end%>
    \ No newline at end of file diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb index 7e5c27307e..018535b293 100644 --- a/app/views/categories/new.html.erb +++ b/app/views/categories/new.html.erb @@ -1,2 +1,2 @@ -

    Categories#new

    +

    Categories#new

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

    diff --git a/app/views/categories/update.html.erb b/app/views/categories/update.html.erb index 13b85657ff..64e4d6a069 100644 --- a/app/views/categories/update.html.erb +++ b/app/views/categories/update.html.erb @@ -1,2 +1,2 @@ -

    Categories#update

    +

    Categories#update

    Find me in app/views/categories/update.html.erb

    diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 483846c7df..37b90ba789 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -1,4 +1,4 @@ -

    Order History

    +

    Order History

    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index ff2f09c168..cbc297baa1 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,50 +1,49 @@ -
    -
    - <% if @product.photo_url == nil || @product.photo_url.length < 1 %> - <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant silhouette", class: "product-image") %> - <% else %> - <%= image_tag(@product.photo_url, :alt => @product.name, class:"product-image") %> - <% end %> -
    -

    - <%= @product.name %> -

    +
    + <% if @product.photo_url == nil || @product.photo_url.length < 1 %> + <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant silhouette", class: "product-image") %> + <% else %> + <%= image_tag(@product.photo_url, :alt => @product.name, class:"product-image") %> + <% end %> -
      -
    • -

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

      -
    • -
    • - Stock: <%= @product.inventory %> -
    • -
    • - <%= @product.description %> -
    • -
    +
    +

    + <%= @product.name %> +

    - <%= form_for :order_item, url: product_order_items_path(@product.id) do |f| %> -
    -
    - <%= f.label :quantity %>
    - <%= f.text_field :quantity %> -
    - <%= f.hidden_field :name, :value => @product.name %> - <%= f.hidden_field :price, :value => @product.price %> - <%= f.hidden_field :photo_url, :value => @product.photo_url %> -
    - <%= f.submit 'Add to Cart', class:"btn btn-info" %> -
    -
    +
      +
    • +

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

      +
    • +
    • + Stock: <%= @product.inventory %> +
    • +
    • + <%= @product.description %> +
    • +
    - - <% if @product.merchant_id == session[:user_id] %> -

    - <%= link_to "Edit this product listing", edit_product_path(@product.id) %> -

    - <% end %> -
    - <% end %> + <%= form_for :order_item, url: product_order_items_path(@product.id) do |f| %> +
    +
    + <%= f.label :quantity %>
    + <%= f.text_field :quantity %> +
    + <%= f.hidden_field :name, :value => @product.name %> + <%= f.hidden_field :price, :value => @product.price %> + <%= f.hidden_field :photo_url, :value => @product.photo_url %> +
    + <%= f.submit 'Add to Cart', class:"btn btn-info" %> +
    +
    + + <% if @product.merchant_id == session[:user_id] %> +

    + <%= link_to "Edit this product listing", edit_product_path(@product.id) %> +

    + <% end %>
    -
    \ No newline at end of file + <% end %> + + \ No newline at end of file From cf5698821247f2321274dd3ca7bb7175197f4f65 Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 16 Jun 2020 00:59:00 -0700 Subject: [PATCH 115/234] added merchant index routes and links --- app/controllers/merchants_controller.rb | 13 +++++++++++++ app/views/layouts/application.html.erb | 2 +- config/routes.rb | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index e1b6557605..c1b675aecc 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,5 +1,17 @@ class MerchantsController < ApplicationController + def index + @merchants = Merchant.all + end + + def show + @merchant = Merchant.find_by(id: params[:id]) + if @user.nil? + head :not_found + return + end + end + def create auth_hash = request.env["omniauth.auth"] @@ -20,6 +32,7 @@ def create session[:user_id] = merchant.id return redirect_to root_path end + def dashboard @merchant = Merchant.find_by(id: session[:user_id], provider: "github") diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index beecdad427..15a0619fdc 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -19,7 +19,7 @@ <%= link_to "Home", root_path %> <%= link_to "Shop Plants", products_path %> <%= link_to "Categories", categories_path %> - <%= link_to "Merchants", root_path %> + <%= link_to "Merchants", merchants_path %> -
    - <% if @category.products.empty? %> -

    Oops! Looks like we're sold out of these plants.

    - <% else %> -
    - <% @category.products.each do |product| %> -
      -
    • - <% if product.photo_url == nil || product.photo_url.length < 1 %> - <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant black and white silhoutte") %> - <% else %> - <%= image_tag(product.photo_url, :alt => product.name ) %> - <% end %> -
      -
      - <%= link_to product.name, product_path( product.id ) %> -
      -
      -
      -
      - Cost: $<%= sprintf('%.2f', product.price) %> -
      -
      - Inventory: - <%= product.inventory %> -
      -
      -
    • -
    - <% end %> -
    - <% end %> -
    \ No newline at end of file +
    + <% if @category.products.empty? %> +

    Oops! Looks like we're sold out of these plants.

    + <% else %> +
    + <% @category.products.each do |product| %> +
      +
    • + <% if product.photo_url == nil || product.photo_url.length < 1 %> + <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant black and white silhoutte") %> + <% else %> + <%= image_tag(product.photo_url, :alt => product.name ) %> + <% end %> +
      +
      + <%= link_to product.name, product_path( product.id ) %> +
      +
      +
      +
      + Cost: $<%= sprintf('%.2f', product.price) %> +
      +
      + Inventory: + <%= product.inventory %> +
      +
      +
    • +
    + <% end %> +
    + <% end %> +
    \ No newline at end of file diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb new file mode 100644 index 0000000000..e70ca3594f --- /dev/null +++ b/app/views/merchants/index.html.erb @@ -0,0 +1,8 @@ +

    Shop by Merchant

    +
    + <% @merchants.each do |merchant| %> +
  • + <%= link_to merchant.username, merchant_path(merchant.id)%> +
  • + <%end%> +
    \ No newline at end of file diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb new file mode 100644 index 0000000000..46682630eb --- /dev/null +++ b/app/views/merchants/show.html.erb @@ -0,0 +1,42 @@ + +

    this is text

    + + \ No newline at end of file diff --git a/db/product-seed.csv b/db/product-seed.csv index 07a516ae75..f591a93b2d 100644 --- a/db/product-seed.csv +++ b/db/product-seed.csv @@ -1,15 +1,10 @@ -name,price,description,inventory,status,photo_url -"Fiddlge Leagf Fig",185.00,"A Pinterest dream come true when watered perfectly.",5,true,"https://bloomscape.com/wp-content/uploads/2019/05/bloomscape_product-fiddle-leaf-fig-slate-2-e1558203121213.jpg?ver=28681" -"Monstera",65.00,"Make your home jungle Mowgly and Baloo would want to live in with the monstera's big leaves.",25,true,"https://bloomscape.com/wp-content/uploads/2019/04/bloomscape_product-monstera-slate.jpg?ver=22372" -"Sansevieria",29.99,"Even if you kill everything, you can not kill this plant, lovingly known as the Mother-in-law's tongue. ",15,false,"https://bloomscape.com/wp-content/uploads/2019/03/bloomscape_product-sansevieria-slate-1.jpg?ver=18849" -"All the Pothos",55.00,"Just get all three now, you will end up with all of them anyway.",1,true,"https://bloomscape.com/wp-content/uploads/2020/04/bloomscape_collections_pothos_basalt.jpg?ver=174797" -"Pet Friendly Trio",54.00,"Not all plants are friends, but these are for your fur babies who like to test their luck.",6,true,"https://bloomscape.com/wp-content/uploads/2019/09/bloomscape_collections_fur-friendly-3-basalt.jpg?ver=162142" -"Wandering Jew",15.00,"Can propagate easier than rabbits, makes a great and free gift for the rest of your life.",10,true,"https://bloomscape.com/wp-content/uploads/2019/04/bloomscape_product-wandering-jew-stone.jpg?ver=23771" -"Neon Prayer Plant",19.00,"We all need a prayer if you are living in 2020.",14,true,"https://bloomscape.com/wp-content/uploads/2019/09/bloomscape_product_neon-prayer-plant-3.jpg?ver=64407" -"Prickly Pear Cactus",48.00,"So you can seem extra hip even when you need Urban Dictionary for everything.",28,true,"https://bloomscape.com/wp-content/uploads/2020/03/bloomscape_product_prickly-pear-cactus-clay-scaled.jpg?ver=160856" -"Burgundy Rubber Tree",32.00,"The Rubber Tree that has no commitment issues, it will never die thus never leave you, ever.",10,true,"https://bloomscape.com/wp-content/uploads/2019/04/bloomscape_product-burgundy-rubber-tree-stone.jpg?ver=24177" -"Product 1",10.01,"This is a product that a merchant sells.",15,true,"https://www.goodfreephotos.com/albums/plants/phyllotaxis-plant-spiral.jpg" -"Product 2",5.00,"Another Merchant sells this product.",5,true,"https://cdn.pixabay.com/photo/2019/04/16/02/40/plant-4130769_960_720.png" -"Product 3",8.99,"Stuff.",1,false,"https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" -"Product 4",9.99,"Things.",1,true,"https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" -"Product 5",5.99,"Yez.",1,true,"https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" \ No newline at end of file +name,price,description,inventory,status,photo_url,merchant_id +"Fiddle Leaf Fig",185.00,"A Pinterest dream come true when watered perfectly.",5,true,"https://bloomscape.com/wp-content/uploads/2019/05/bloomscape_product-fiddle-leaf-fig-slate-2-e1558203121213.jpg?ver=28681",1 +"Monstera",65.00,"Make your home a jungle Mowgly and Baloo would want to live in with the monstera's big leaves.",25,true,"https://bloomscape.com/wp-content/uploads/2019/04/bloomscape_product-monstera-slate.jpg?ver=22372",1 +"Sansevieria",29.99,"Even if you kill everything, you can not kill this plant, lovingly known as the Mother-in-law's tongue. ",15,false,"https://bloomscape.com/wp-content/uploads/2019/03/bloomscape_product-sansevieria-slate-1.jpg?ver=18849",2 +"All the Pothos",55.00,"Just get all three now, you will end up with all of them anyway.",1,true,"https://bloomscape.com/wp-content/uploads/2020/04/bloomscape_collections_pothos_basalt.jpg?ver=174797",2 +"Pet Friendly Trio",54.00,"Not all plants are friends, but these are for your fur babies who like to test their luck.",6,true,"https://bloomscape.com/wp-content/uploads/2019/09/bloomscape_collections_fur-friendly-3-basalt.jpg?ver=162142",1 +"Wandering Jew",15.00,"Can propagate easier than rabbits, makes a great and free gift for the rest of your life.",10,true,"https://bloomscape.com/wp-content/uploads/2019/04/bloomscape_product-wandering-jew-stone.jpg?ver=23771",1 +"Neon Prayer Plant",19.00,"We all need a prayer if you are living in 2020.",14,true,"https://bloomscape.com/wp-content/uploads/2019/09/bloomscape_product_neon-prayer-plant-3.jpg?ver=64407",3 +"Prickly Pear Cactus",48.00,"So you can seem extra hip even when you need Urban Dictionary for everything.",28,true,"https://bloomscape.com/wp-content/uploads/2020/03/bloomscape_product_prickly-pear-cactus-clay-scaled.jpg?ver=160856",3 +"Burgundy Rubber Tree",32.00,"The Rubber Tree that has no commitment issues, it will never die thus never leave you, ever.",10,true,"https://bloomscape.com/wp-content/uploads/2019/04/bloomscape_product-burgundy-rubber-tree-stone.jpg?ver=24177",3 \ No newline at end of file From 2ded2524eb9c01cfd3adc139095e30f33182fc40 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 10:51:53 -0700 Subject: [PATCH 118/234] cannot add product if 0 or nil --- app/controllers/orders_controller.rb | 2 ++ app/models/order_item.rb | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index a7b90e1d35..8034f58d0e 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -49,6 +49,8 @@ def checkout @cart = Order.find_by(cart_status: true) if @cart.nil? || @cart.order_items.length == 0 + p "i broke it" + flash[:failure] = "Unable to checkout." redirect_to cart_path return diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 7eede51b5a..4c35f28514 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -4,8 +4,10 @@ class OrderItem < ApplicationRecord belongs_to :order validates :name, presence: true + validates :quantity, presence: true def check_product_inventory + return false if self.quantity == nil incoming_quantity = self.quantity matching_product = Product.find_by(id: self.product_id) From 71205faf17bc38202ee137e55c725219430e290a Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 10:52:15 -0700 Subject: [PATCH 119/234] fix issues using 'head' --- app/controllers/orders_controller.rb | 12 +++++------- app/models/order_item.rb | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 8034f58d0e..df994caa76 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -46,22 +46,22 @@ def cart # show function for the open order at the moment end def checkout - @cart = Order.find_by(cart_status: true) - + # @cart = Order.find_by(cart_status: true) + @cart = Order.find_by(id: session[:order]["id"]) if @cart.nil? || @cart.order_items.length == 0 p "i broke it" - + flash[:failure] = "Unable to checkout." redirect_to cart_path return end - head :ok + # head :ok @cart_items = @cart.order_items end def confirmation - @cart = Order.find_by(cart_status: true) + @cart = Order.find_by(id: session[:order]["id"]) if @cart.nil? || @cart.order_items.length == 0 flash[:error] = "Unable to checkout." @@ -69,8 +69,6 @@ def confirmation return end - head :ok - @cart_items = @cart.order_items Order.purchase_changes(@cart, @cart_items) diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 4c35f28514..cdd685d037 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -7,7 +7,7 @@ class OrderItem < ApplicationRecord validates :quantity, presence: true def check_product_inventory - return false if self.quantity == nil + return false if self.quantity == nil || self.quantity == 0 incoming_quantity = self.quantity matching_product = Product.find_by(id: self.product_id) From f3ce8bfb5b0890d9275bc5eb9aaaea32a59330f2 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 11:08:32 -0700 Subject: [PATCH 120/234] change the way session is stored --- app/controllers/order_items_controller.rb | 8 ++++---- app/controllers/orders_controller.rb | 12 +++++------- test/controllers/orders_controller_test.rb | 10 +++++----- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 88f64b2727..71ea5a1cd3 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -9,8 +9,8 @@ def index #POST /order_items { :order_item => { :name => "hello", :price => 6, }} def create - if session[:order] - @open_order = Order.find_by(cart_status: true) + if session[:order_id] + @open_order = Order.find_by(id: session[:order_id]) @new_item = OrderItem.new( name: order_items_params[:name], price: order_items_params[:price], @@ -23,7 +23,7 @@ def create p "SESSION IS HERE" else @new_order = Order.create - session[:order] = @new_order + session[:order_id] = @new_order.id @new_item = OrderItem.new( name: order_items_params[:name], @@ -87,7 +87,7 @@ def destroy if count == 0 @order_item.order.destroy - session[:order] = nil + session[:order_id] = nil end redirect_to cart_path diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index df994caa76..884a128627 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -35,8 +35,8 @@ def update end def cart # show function for the open order at the moment - if !session[:order].nil? - @open_order = Order.find_by(cart_status: true) + if !session[:order_id].nil? + @open_order = Order.find_by(id: session[:order_id]) p @open_order end @@ -47,21 +47,19 @@ def cart # show function for the open order at the moment def checkout # @cart = Order.find_by(cart_status: true) - @cart = Order.find_by(id: session[:order]["id"]) + @cart = Order.find_by(id: session[:order_id]) if @cart.nil? || @cart.order_items.length == 0 - p "i broke it" flash[:failure] = "Unable to checkout." redirect_to cart_path return end - # head :ok @cart_items = @cart.order_items end def confirmation - @cart = Order.find_by(id: session[:order]["id"]) + @cart = Order.find_by(id: session[:order_id]) if @cart.nil? || @cart.order_items.length == 0 flash[:error] = "Unable to checkout." @@ -73,7 +71,7 @@ def confirmation Order.purchase_changes(@cart, @cart_items) - session[:order] = nil + session[:order_id] = nil end private diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index b9a979aeef..85beb08ec5 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -128,9 +128,9 @@ new_order_item = OrderItem.first new_order = Order.first - cart_items = Order.find_by(id: session[:order][:id]).order_items + cart_items = Order.find_by(id: session[:order_id]).order_items - expect(session[:order]).must_equal new_order + expect(session[:order_id]).must_equal new_order.id expect(cart_items.length).must_equal 1 expect(cart_items[0]).must_equal new_order_item end @@ -150,7 +150,7 @@ get checkout_path - must_respond_with :ok + must_respond_with :found end it "redirects back to cart path if there are no items" do @@ -184,7 +184,7 @@ get confirmation_path - must_respond_with :success + must_respond_with :found end it "responds with redirect if open cart is not found" do @@ -202,7 +202,7 @@ must_redirect_to cart_path - expect(session[:order]).must_be_nil + expect(session[:order_id]).must_be_nil end end end \ No newline at end of file From 49a502c535208cd8bb8239efdac4f82aa8295b45 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 11:20:11 -0700 Subject: [PATCH 121/234] if this item already exists in cart, change quantity instead of adding new item --- app/controllers/order_items_controller.rb | 2 +- app/models/order_item.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 71ea5a1cd3..9805ce762c 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -38,7 +38,7 @@ def create end if @new_item.check_product_inventory - @new_item.save + @new_item.check_order_item_existence(session[:order_id]) @new_item.reduce_inventory p "ITEM WAS ADD" flash[:success] = 'Item added to cart.' diff --git a/app/models/order_item.rb b/app/models/order_item.rb index cdd685d037..0d533d04d6 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -14,6 +14,18 @@ def check_product_inventory matching_product.inventory >= incoming_quantity ? true : false end + def check_order_item_existence(order_id) + order = Order.find_by(id: order_id) + matching_item = order.order_items.find_by(product_id: self.product_id) + + if matching_item + matching_item.quantity += self.quantity + matching_item.save + else + self.save + end + end + def reduce_inventory matching_product = Product.find_by(id: self.product_id) From e04388ab275c24e172d1442410b6a3f5cab42f47 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 13:44:59 -0700 Subject: [PATCH 122/234] change model method format --- app/controllers/orders_controller.rb | 2 +- app/models/order.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 884a128627..41bcbf0e7c 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -69,7 +69,7 @@ def confirmation @cart_items = @cart.order_items - Order.purchase_changes(@cart, @cart_items) + @cart.purchase_changes session[:order_id] = nil end diff --git a/app/models/order.rb b/app/models/order.rb index b6099dd5d3..d10f22f41a 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -60,8 +60,8 @@ def total_price return total end - def self.purchase_changes(cart, cart_items) - cart.cart_status = false - cart.save + def purchase_changes + self.cart_status = false + self.save end end From 5e0eb60211428dc2b855e02a4344c7b86522c72a Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 13:54:59 -0700 Subject: [PATCH 123/234] Stopped tracking .env File --- .env | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index dea0f11906..0000000000 --- a/.env +++ /dev/null @@ -1,2 +0,0 @@ -GITHUB_CLIENT_ID: 2ccaeae55c6e9cd0c89e -GITHUB_CLIENT_SECRET: 3c04b22cde6669dc880caf9bb85bf3287c9135b0 \ No newline at end of file From 26194410875064ba6e133aa6371320314642cea3 Mon Sep 17 00:00:00 2001 From: kate myer Date: Tue, 16 Jun 2020 15:11:28 -0700 Subject: [PATCH 124/234] Model test validations: Order done + passing --- app/models/order.rb | 70 ++++++++++--------- test/fixtures/orders.yml | 12 ++-- test/models/order_test.rb | 142 +++++++++++++++++++++++++++++++++++++- 3 files changed, 181 insertions(+), 43 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index 31e9bbbb4b..f083d9e697 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,48 +2,50 @@ class Order < ApplicationRecord has_many :order_items has_many :products, through: :order_items - # validates :card_number, - # presence: true, - # length: { is: 16 }, - # format: { with: /[0-9]{16}/ }, - # :on => :update + + validates :card_number, + presence: true, + length: { is: 16 }, + format: { with: /[0-9]{16}/ }, + :on => :update - # validates :card_expiration_date, - # presence: true, - # :on => :update + validates :card_expiration_date, + presence: true, + :on => :update - # validates :card_cvv, - # presence: true, - # length: { is: 3 }, - # format: { with: /[0-9]{3}/ }, - # :on => :update + validates :card_cvv, + presence: true, + length: { is: 3 }, + format: { with: /[0-9]{3}/ }, + :on => :update - # validates :address, - # presence: true, - # :on => :update + validates :address, + presence: true, + :on => :update - # validates :city, - # presence: true, - # :on => :update + validates :city, + presence: true, + :on => :update - # validates :zip_code, - # presence: true, - # format: { with: /[\d]{5}\-[\d]*/ }, - # :on => :update + validates :zip_code, + presence: true, + format: { with: /[\d]{5}/ }, + :on => :update - # validates :guest_name, - # presence: true, - # :on => :update + + validates :guest_name, + presence: true, + :on => :update - # validates :email, - # presence: true, - # format: { with: /.+@.+\..+/ }, - # :on => :update + validates :email, + presence: true, + format: { with: URI::MailTo::EMAIL_REGEXP }, + :on => :update - # validates :phone_num, - # presence: true, - # format: { with: /\A.*(\d{3}).*(\d{3}).*(\d{4})\z/ }, - # :on => :update + validates :phone_num, + presence: true, + format: { with: /\([0-9]{3}\)[0-9]{3}-[0-9]{4}/ }, + :on => :update def total_price diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 7927b785f2..f9d9862a25 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -1,5 +1,5 @@ order1: - card_number: 123456 + card_number: 1234567890123456 card_expiration_date: 01/20 card_cvv: 123 address: 15 Main Street @@ -7,10 +7,10 @@ order1: zip_code: 98010 guest_name: Tyron Jenkins email: tyrone@gmail.com - phone_num: 456-123-1234 + phone_num: (456)123-1234 cart_status: false order2: - card_number: 987654 + card_number: 9876543211234567 card_expiration_date: 10/22 card_cvv: 456 address: 120 Seneca Road @@ -18,10 +18,10 @@ order2: zip_code: 90010 guest_name: Captain America email: capusa@gmail.com - phone_num: 206-253-7777 + phone_num: (206)253-7777 cart_status: false order3: - card_number: 732904 + card_number: 5434567812345906 card_expiration_date: 12/25 card_cvv: 777 address: 2020 Boeing Field Street @@ -29,5 +29,5 @@ order3: zip_code: 10074 guest_name: Seymour Gloots email: sgloots@gmail.com - phone_num: 975-619-2100 + phone_num: (975)619-2100 cart_status: false \ No newline at end of file diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 59ceb9a253..1fabd407c5 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,7 +1,143 @@ require "test_helper" describe Order do - # it "does a thing" do - # value(1+1).must_equal 2 + before do + + @new_order = Order.new(card_number: 1234567890123456, card_expiration_date: Date.today + 365, card_cvv: 123, + address: "15 Main Street", city: "Seattle", zip_code: 98010, guest_name: "Tyron Jenkins", email: "tyrone@gmail.com", phone_num: "(456)123-1234", cart_status: false) + + @product_1 = products(:product_1) + @new_product1 = Product.create(name: @product_1.name, price: @product_1.price, inventory: @product_1.inventory) + + @order1 = orders(:order1) + + @new_order_item = OrderItem.create(product: @new_product, order: @new_order) + end + + describe "relations" do + it "has many order items" do + expect(@new_order).must_respond_to :order_items + end + it "has many products" do + expect(@new_order).must_respond_to :products + end + end + + describe "validations" do + it "is valid when parameters are present" do + expect(@new_order.valid?).must_equal true + expect(@new_order.guest_name).must_equal @order1.guest_name + end + + it "is invalid without a card number" do + expect(@new_order.valid?).must_equal true #check order valid + expect(@new_order.card_number.length).must_equal 16 + @new_order.update(card_number: nil) #make sure number nil + expect(@new_order.valid?).must_equal false + end + + it "is invalid with an invalid card number" do + expect(@new_order.valid?).must_equal true + @new_order.update(card_number: 1234 ) + expect(@new_order.valid?).must_equal false + end + + it "is invalid without a card expiration date" do + expect(@new_order.valid?).must_equal true + @new_order.update(card_expiration_date: nil) + assert_nil(@new_order.card_expiration_date) + expect(@new_order.valid?).must_equal false + end + + it "is invalid without a card cvv" do + expect(@new_order.valid?).must_equal true + expect(@new_order.card_cvv.length).must_equal 3 + @new_order.update(card_cvv: nil) + assert_nil(@new_order.card_cvv) + expect(@new_order.valid?).must_equal false + end + + it "is invalid with an invalid cvv" do + expect(@new_order.valid?).must_equal true + @new_order.update(card_cvv: 1234 ) + expect(@new_order.valid?).must_equal false + end + + it "is invalid without an address" do + expect(@new_order.valid?).must_equal true + @new_order.update(address: nil) + assert_nil(@new_order.address) + expect(@new_order.valid?).must_equal false + end + + it "is invalid without a city" do + expect(@new_order.valid?).must_equal true + @new_order.update(city: nil) + assert_nil(@new_order.city) + expect(@new_order.valid?).must_equal false + end + + it "is invalid without a zip code" do + expect(@new_order.valid?).must_equal true + expect(@new_order.zip_code.length).must_equal 5 + @new_order.update(zip_code: nil) + assert_nil(@new_order.zip_code) + expect(@new_order.valid?).must_equal false + end + + it "is invalid with an invalid zip code" do + expect(@new_order.valid?).must_equal true + @new_order.update(zip_code: 1234 ) + expect(@new_order.valid?).must_equal false + end + + it "is invalid without a guest name" do + expect(@new_order.valid?).must_equal true + @new_order.update(guest_name: nil) + assert_nil(@new_order.guest_name) + expect(@new_order.valid?).must_equal false + end + + it "is invalid without an email" do + expect(@new_order.valid?).must_equal true + @new_order.update(email: nil) + assert_nil(@new_order.email) + expect(@new_order.valid?).must_equal false + end + + it "is invalid with an invalid email" do + expect(@new_order.valid?).must_equal true + @new_order.update(email: "1234 @ gmail com" ) + expect(@new_order.valid?).must_equal false + end + + it "is invalid without a phone number" do + expect(@new_order.valid?).must_equal true + @new_order.update(phone_num: nil) + assert_nil(@new_order.phone_num) + expect(@new_order.valid?).must_equal false + end + + it "is invalid with an invalid phone number" do + expect(@new_order.valid?).must_equal true + @new_order.update(phone_num: "123.234.1234" ) + expect(@new_order.valid?).must_equal false + end + + end + + describe "total price" do + it "calculates the order total correctly" do + @price_order = orders(:order1) + expect(orders(:order1).valid?).must_equal true + expect(@price_order.total_price).must_equal 0.0 + end + end + + # describe "purchase changes" do + # it "change cart status?" do + # TODO + # end # end -end + +end #Order From ba4bedb5de13bc948572d2a752039af5626c7bb6 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 15:15:57 -0700 Subject: [PATCH 125/234] add background img, change colors --- app/assets/stylesheets/application.scss | 15 +++++++++++---- app/assets/stylesheets/homepages.scss | 21 ++++++++++++++++++++- app/views/homepages/index.html.erb | 7 +++++-- app/views/layouts/application.html.erb | 2 +- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 8600dd0640..2648c282be 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -19,6 +19,7 @@ @import url('https://fonts.googleapis.com/css2?family=Nunito:wght@400;700&display=swap'); body { + color: #254118; font-family: 'Roboto', sans-serif; } @@ -36,7 +37,12 @@ header { } footer { + display: flex; + align-items: center; + justify-content: center; + font-style: italic; height: 5vh; + } header h1 { @@ -46,11 +52,12 @@ header h1 { header, footer { text-align: center; - background-color: #88BDBC; + background: rgb(195,217,154); + background: linear-gradient(90deg, rgba(195,217,154,1) 0%, rgba(134,169,91,1) 48%); } h1 { - color: #254E58; + color: #254118; font-weight: 800; letter-spacing: 0.2em; text-transform: uppercase; @@ -83,10 +90,10 @@ a:hover { } .navigation-bar a { - color: #e6fffe; + color: #EBF6F5; } .navigation-bar a:hover { - color: #6E6658; + color: #015249; text-decoration: none; } \ No newline at end of file diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss index 3f84285877..2ece44258f 100644 --- a/app/assets/stylesheets/homepages.scss +++ b/app/assets/stylesheets/homepages.scss @@ -1,3 +1,22 @@ // 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/ \ No newline at end of file +// You can use Sass (SCSS) here: https://sass-lang.com/ + +#homepage { + background-image: url('https://live.staticflickr.com/8589/28489093226_5cdcc9b809_o.jpg'); + background-size: cover; + color: #FFF; + margin: -2em; + min-height: 75vh; + display: flex; + justify-content: flex-start; + align-items: center; + padding: 3em; +} + +#homepage p { + font-family: 'Nunito', sans-serif; + font-weight: 700; + font-size: 3.5em; + line-height: 1em; +} \ No newline at end of file diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb index 9d9c231522..3379859f9d 100644 --- a/app/views/homepages/index.html.erb +++ b/app/views/homepages/index.html.erb @@ -1,3 +1,6 @@ -
    - LOREM IPSUM ????? vplease buy me plants +
    +

    + Buy plants
    + with us today! +

    \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index beecdad427..76952d9826 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -50,7 +50,7 @@
    - Emily Cowan, Jessica Liang, Kate Mangubat, Nora Robertson + 2020 - Emily Cowan, Jessica Liang, Kate Mangubat, Nora Robertson // Background from <%= link_to 'Csaba Ruman', "https://flic.kr/p/Kpu3Sw" %>
    From f880e37b4bd5c6e5a72750c4e02e9523b66c73c1 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 15:24:00 -0700 Subject: [PATCH 126/234] change more colors, shaddow to header --- app/assets/stylesheets/application.scss | 15 ++++++++------- app/assets/stylesheets/homepages.scss | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 2648c282be..3ed615c02f 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -48,16 +48,17 @@ footer { header h1 { font-size: 3em; margin: 1em; + text-shadow: -3px 3px 0px #254118; } header, footer { text-align: center; - background: rgb(195,217,154); - background: linear-gradient(90deg, rgba(195,217,154,1) 0%, rgba(134,169,91,1) 48%); + background: rgb(134,169,91); + background: linear-gradient(90deg, rgba(134,169,91,1) 0%, rgba(37,65,24,1) 100%); } h1 { - color: #254118; + color: #C3D99A; font-weight: 800; letter-spacing: 0.2em; text-transform: uppercase; @@ -75,11 +76,11 @@ nav { } a { - color: #88BDBC; + color: #86A95B; } a:hover { - color: #254E58; + color: #93C441; text-decoration: none; } @@ -90,10 +91,10 @@ a:hover { } .navigation-bar a { - color: #EBF6F5; + color: #ddedbe; } .navigation-bar a:hover { - color: #015249; + color: #eff7df; text-decoration: none; } \ No newline at end of file diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss index 2ece44258f..4fb50d1716 100644 --- a/app/assets/stylesheets/homepages.scss +++ b/app/assets/stylesheets/homepages.scss @@ -5,7 +5,7 @@ #homepage { background-image: url('https://live.staticflickr.com/8589/28489093226_5cdcc9b809_o.jpg'); background-size: cover; - color: #FFF; + color: #eff7df; margin: -2em; min-height: 75vh; display: flex; From 2ab8e0b12f8e9fcf19d65c5fcd4db1ab0f65192c Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 15:27:32 -0700 Subject: [PATCH 127/234] move around heights --- app/assets/stylesheets/application.scss | 6 +++--- app/assets/stylesheets/homepages.scss | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 3ed615c02f..d2d6b1cb91 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -32,7 +32,7 @@ h2 { } header { - min-height: 20vh; + min-height: 15vh; padding: 1em 1.5em 0.75em; } @@ -47,7 +47,7 @@ footer { header h1 { font-size: 3em; - margin: 1em; + margin: 0.7em; text-shadow: -3px 3px 0px #254118; } @@ -65,7 +65,7 @@ h1 { } main { - min-height: 75vh; + min-height: 80vh; padding: 2em; } diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss index 4fb50d1716..778bacd8f2 100644 --- a/app/assets/stylesheets/homepages.scss +++ b/app/assets/stylesheets/homepages.scss @@ -7,7 +7,7 @@ background-size: cover; color: #eff7df; margin: -2em; - min-height: 75vh; + min-height: 80vh; display: flex; justify-content: flex-start; align-items: center; From 647d927213c1f40217296c4f847935d3e8e5e33f Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 15:59:53 -0700 Subject: [PATCH 128/234] test state --- app/controllers/orders_controller.rb | 1 - app/models/order.rb | 6 ++-- test/controllers/orders_controller_test.rb | 38 ++++++++++------------ test/fixtures/orders.yml | 3 ++ test/models/order_test.rb | 13 ++++++-- 5 files changed, 34 insertions(+), 27 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 884a128627..d20cd8f306 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -46,7 +46,6 @@ def cart # show function for the open order at the moment end def checkout - # @cart = Order.find_by(cart_status: true) @cart = Order.find_by(id: session[:order_id]) if @cart.nil? || @cart.order_items.length == 0 diff --git a/app/models/order.rb b/app/models/order.rb index 1956aecbaa..26c20b8687 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -32,9 +32,9 @@ class Order < ApplicationRecord format: { with: /[\d]{5}/ }, :on => :update - # validates :state, - # presence: true, - # :on => :update + validates :state, + presence: true, + :on => :update validates :guest_name, presence: true, diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 85beb08ec5..ef035314bd 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -35,6 +35,8 @@ end it "responds with success when there are no orders saved" do + Order.destroy_all + expect(Order.count).must_equal 0 get orders_path must_respond_with :success @@ -60,11 +62,12 @@ order: { guest_name: 'Leroy Jenkins', email: 'leroyj@gmail.com', - address: '444 Main St.', + phone_num: "(456)123-1234", + address: '444 Main Street', city: 'Somewhere', state: 'CA', zip_code: '91007', - card_number: '4444333322221111', + card_number: '1234567890123456', card_expiration_date: '06/25', card_cvv: '333', } @@ -102,22 +105,19 @@ must_respond_with :not_found end - #### CAN'T DO THIS ONE YET!!!!! ##### WAIT FOR FINAL VALIDATIONS - - # it "does not update a order if the form data violates passenger validations, and responds with a redirect" do - # new_order = Order.create + it "does not update a order if the form data violates form validations, and responds with a redirect" do + new_order = Order.create - # update = { - # passenger: { - # name: '', - # phone_num: '' - # } - # } + update = { + order: { + name: '', + } + } - # expect { - # patch passenger_path(passenger.id), params: update - # }.wont_change 'Passenger.count' - # end + expect { + patch order_path(new_order.id), params: update + }.wont_change 'Order.count' + end end describe "cart" do @@ -126,13 +126,11 @@ post product_order_items_path(@product.id), params: new_item_hash }.must_change 'OrderItem.count', 1 - new_order_item = OrderItem.first - new_order = Order.first - cart_items = Order.find_by(id: session[:order_id]).order_items + new_order = Order.find_by(id: session[:order_id]) + cart_items = new_order.order_items expect(session[:order_id]).must_equal new_order.id expect(cart_items.length).must_equal 1 - expect(cart_items[0]).must_equal new_order_item end end diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index f9d9862a25..9a97d97671 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -4,6 +4,7 @@ order1: card_cvv: 123 address: 15 Main Street city: Seattle + state: WA zip_code: 98010 guest_name: Tyron Jenkins email: tyrone@gmail.com @@ -15,6 +16,7 @@ order2: card_cvv: 456 address: 120 Seneca Road city: Los Angeles + state: CA zip_code: 90010 guest_name: Captain America email: capusa@gmail.com @@ -26,6 +28,7 @@ order3: card_cvv: 777 address: 2020 Boeing Field Street city: New York + state: NY zip_code: 10074 guest_name: Seymour Gloots email: sgloots@gmail.com diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 1fabd407c5..4c2f3af711 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -3,8 +3,8 @@ describe Order do before do - @new_order = Order.new(card_number: 1234567890123456, card_expiration_date: Date.today + 365, card_cvv: 123, - address: "15 Main Street", city: "Seattle", zip_code: 98010, guest_name: "Tyron Jenkins", email: "tyrone@gmail.com", phone_num: "(456)123-1234", cart_status: false) + @new_order = Order.new(card_number: 1234567890123456, card_expiration_date: Date.today + 365, card_cvv: '123', + address: "15 Main Street", city: "Seattle", state: 'wa', zip_code: '98010', guest_name: "Tyron Jenkins", email: "tyrone@gmail.com", phone_num: "(456)123-1234", cart_status: false) @product_1 = products(:product_1) @new_product1 = Product.create(name: @product_1.name, price: @product_1.price, inventory: @product_1.inventory) @@ -77,6 +77,13 @@ expect(@new_order.valid?).must_equal false end + it "is invalid without a state" do + expect(@new_order.valid?).must_equal true + @new_order.update(city: nil) + assert_nil(@new_order.city) + expect(@new_order.valid?).must_equal false + end + it "is invalid without a zip code" do expect(@new_order.valid?).must_equal true expect(@new_order.zip_code.length).must_equal 5 @@ -129,7 +136,7 @@ describe "total price" do it "calculates the order total correctly" do @price_order = orders(:order1) - expect(orders(:order1).valid?).must_equal true + expect(@price_order.valid?).must_equal true expect(@price_order.total_price).must_equal 0.0 end end From 29582f505ad8a8c082fbe50e124ca8e94f231daa Mon Sep 17 00:00:00 2001 From: kate myer Date: Tue, 16 Jun 2020 16:03:18 -0700 Subject: [PATCH 129/234] controller test: homepage --- test/controllers/homepages_controller_test.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/controllers/homepages_controller_test.rb b/test/controllers/homepages_controller_test.rb index cef86edeae..9dd7648dbb 100644 --- a/test/controllers/homepages_controller_test.rb +++ b/test/controllers/homepages_controller_test.rb @@ -1,7 +1,9 @@ require "test_helper" describe HomepagesController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + it "can get the homepage" do + get root_path + + must_respond_with :success + end end From 29b4f300ff0685993486a9f2602e197e2aafa08e Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 16 Jun 2020 16:14:36 -0700 Subject: [PATCH 130/234] Wandering Dude --- db/product-seed.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/product-seed.csv b/db/product-seed.csv index f591a93b2d..cbc75fb7da 100644 --- a/db/product-seed.csv +++ b/db/product-seed.csv @@ -4,7 +4,7 @@ name,price,description,inventory,status,photo_url,merchant_id "Sansevieria",29.99,"Even if you kill everything, you can not kill this plant, lovingly known as the Mother-in-law's tongue. ",15,false,"https://bloomscape.com/wp-content/uploads/2019/03/bloomscape_product-sansevieria-slate-1.jpg?ver=18849",2 "All the Pothos",55.00,"Just get all three now, you will end up with all of them anyway.",1,true,"https://bloomscape.com/wp-content/uploads/2020/04/bloomscape_collections_pothos_basalt.jpg?ver=174797",2 "Pet Friendly Trio",54.00,"Not all plants are friends, but these are for your fur babies who like to test their luck.",6,true,"https://bloomscape.com/wp-content/uploads/2019/09/bloomscape_collections_fur-friendly-3-basalt.jpg?ver=162142",1 -"Wandering Jew",15.00,"Can propagate easier than rabbits, makes a great and free gift for the rest of your life.",10,true,"https://bloomscape.com/wp-content/uploads/2019/04/bloomscape_product-wandering-jew-stone.jpg?ver=23771",1 +"Wandering Dude",15.00,"Can propagate easier than rabbits, makes a great and free gift for the rest of your life.",10,true,"https://bloomscape.com/wp-content/uploads/2019/04/bloomscape_product-wandering-jew-stone.jpg?ver=23771",1 "Neon Prayer Plant",19.00,"We all need a prayer if you are living in 2020.",14,true,"https://bloomscape.com/wp-content/uploads/2019/09/bloomscape_product_neon-prayer-plant-3.jpg?ver=64407",3 "Prickly Pear Cactus",48.00,"So you can seem extra hip even when you need Urban Dictionary for everything.",28,true,"https://bloomscape.com/wp-content/uploads/2020/03/bloomscape_product_prickly-pear-cactus-clay-scaled.jpg?ver=160856",3 "Burgundy Rubber Tree",32.00,"The Rubber Tree that has no commitment issues, it will never die thus never leave you, ever.",10,true,"https://bloomscape.com/wp-content/uploads/2019/04/bloomscape_product-burgundy-rubber-tree-stone.jpg?ver=24177",3 \ No newline at end of file From e99423d9d0f2725791336877a53208c7e1467c74 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 16:18:31 -0700 Subject: [PATCH 131/234] test purchase changes --- test/controllers/orders_controller_test.rb | 1 + test/fixtures/order_items.yml | 4 ++-- test/models/order_test.rb | 25 ++++++++++++++-------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index ef035314bd..fa55e05a41 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -35,6 +35,7 @@ end it "responds with success when there are no orders saved" do + OrderItem.destroy_all Order.destroy_all expect(Order.count).must_equal 0 diff --git a/test/fixtures/order_items.yml b/test/fixtures/order_items.yml index a21709c175..1cae5cda70 100644 --- a/test/fixtures/order_items.yml +++ b/test/fixtures/order_items.yml @@ -21,10 +21,10 @@ order_item4: price: 21.00 quantity: 1 product_id: 1 - order_id: 3 + order: order3 order_item5: name: echeveria2 price: 22.00 quantity: 2 product_id: 2 - order_id: 3 \ No newline at end of file + order: order3 \ No newline at end of file diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 4c2f3af711..2895eae12b 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -133,18 +133,25 @@ end - describe "total price" do + describe "total price" do it "calculates the order total correctly" do - @price_order = orders(:order1) - expect(@price_order.valid?).must_equal true - expect(@price_order.total_price).must_equal 0.0 + expect(orders(:order3).total_price).must_equal 65.0 + end + + it "returns 0.0 if the order has no items" do + expect(orders(:order1).valid?).must_equal true + expect(orders(:order1).total_price).must_equal 0.0 end end - # describe "purchase changes" do - # it "change cart status?" do - # TODO - # end - # end + describe "purchase changes" do + it "flips cart status to inactive" do + new_order = Order.create + + new_order.purchase_changes + + expect(new_order.cart_status).must_equal false + end + end end #Order From ef85e5b150d7a634a213bb0267fdf342c1e56fec Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 16:22:19 -0700 Subject: [PATCH 132/234] one test fix --- test/controllers/order_items_controller_test.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 288bc30daa..a0b1412959 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -32,8 +32,7 @@ post product_order_items_path(@product.id), params: new_item_hash }.must_change 'OrderItem.count', 1 - new_order_item = OrderItem.first - new_order = Order.first + new_order_item = OrderItem.find_by(name: @product.name) expect(new_order_item.name).must_equal @product.name expect(new_order_item.price).must_equal @product.price From dae4dd92b3c78a3219b5c5700d8b68dd75d6ab14 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 16:59:28 -0700 Subject: [PATCH 133/234] add method to find cart item count --- app/models/order.rb | 8 ++++++++ app/views/layouts/application.html.erb | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/models/order.rb b/app/models/order.rb index 53b370f5ca..ed8df45dd9 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -65,4 +65,12 @@ def purchase_changes self.cart_status = false self.save end + + def self.cart_item_count(session) + if session[:order_id].nil? + return '0' + else + return Order.find_by(id: session[:order_id]).order_items.length + end + end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 76952d9826..53797cec94 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -31,7 +31,7 @@ <%= link_to "Login with Github", github_login_path %> <% end %> | - <%= link_to "Cart (CART NUM)", cart_path %> + <%= link_to "Cart (#{ Order.cart_item_count(session) })", cart_path %> From efd0fcb4cb16516a3ee428509ca2665632ead3db Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 17:08:44 -0700 Subject: [PATCH 134/234] test cart item count --- test/models/order_test.rb | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 2895eae12b..a68dce68db 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -154,4 +154,22 @@ end end -end #Order + describe "cart item count" do + before do + @session = {} # imitate session + @session[:order_id] = nil + end + + it "returns the number of items in cart" do + new_order = orders(:order3) + @session[:order_id] = new_order.id + + expect(Order.cart_item_count(@session)).must_equal 2 + end + + it "returns 0 if no cart has been made" do + expect(Order.cart_item_count(@session)).must_equal '0' + end + end + +end From f90a19973b3c85d5c70c296548ac848f7eb79681 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 17:13:50 -0700 Subject: [PATCH 135/234] test adjustments, update simplecov --- test/controllers/order_items_controller_test.rb | 1 - test/test_helper.rb | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index a0b1412959..e252c7d884 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -38,7 +38,6 @@ expect(new_order_item.price).must_equal @product.price expect(new_order_item.quantity).must_equal 1 expect(new_order_item.product_id).must_equal @product.id - expect(new_order_item.order_id).must_equal new_order.id must_redirect_to orders_path end diff --git a/test/test_helper.rb b/test/test_helper.rb index d8b4576eac..23ad6d79ec 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -2,6 +2,11 @@ SimpleCov.start 'rails' do add_filter '/bin/' add_filter '/db/' + add_filter '/jobs/' + add_filter '/mailers/' + add_filter '/helpers/' + add_filter '/channels/' + add_filter '/controllers/application_controller.rb' add_filter '/spec/' # for rspec add_filter '/test/' # for minitest end From 23dca51d98cda538796f55d35a99e2a008022ec0 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Wed, 17 Jun 2020 00:14:51 +0000 Subject: [PATCH 136/234] Restyled by rubocop --- app/models/order.rb | 78 ++++++++-------- .../order_items_controller_test.rb | 46 +++++----- test/models/order_test.rb | 91 +++++++++---------- test/test_helper.rb | 8 +- 4 files changed, 111 insertions(+), 112 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index ed8df45dd9..26444377ea 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,76 +1,76 @@ +# frozen_string_literal: true + class Order < ApplicationRecord has_many :order_items has_many :products, through: :order_items - validates :card_number, - presence: true, - length: { is: 16 }, - format: { with: /[0-9]{16}/ }, - :on => :update + presence: true, + length: { is: 16 }, + format: { with: /[0-9]{16}/ }, + on: :update validates :card_expiration_date, - presence: true, - :on => :update + presence: true, + on: :update validates :card_cvv, - presence: true, - length: { is: 3 }, - format: { with: /[0-9]{3}/ }, - :on => :update + presence: true, + length: { is: 3 }, + format: { with: /[0-9]{3}/ }, + on: :update validates :address, - presence: true, - :on => :update - + presence: true, + on: :update + validates :city, - presence: true, - :on => :update + presence: true, + on: :update validates :zip_code, - presence: true, - format: { with: /[\d]{5}/ }, - :on => :update - + presence: true, + format: { with: /[\d]{5}/ }, + on: :update + validates :state, - presence: true, - :on => :update - + presence: true, + on: :update + validates :guest_name, - presence: true, - :on => :update + presence: true, + on: :update validates :email, - presence: true, - format: { with: URI::MailTo::EMAIL_REGEXP }, - :on => :update + presence: true, + format: { with: URI::MailTo::EMAIL_REGEXP }, + on: :update validates :phone_num, - presence: true, - format: { with: /\([0-9]{3}\)[0-9]{3}-[0-9]{4}/ }, - :on => :update - + presence: true, + format: { with: /\([0-9]{3}\)[0-9]{3}-[0-9]{4}/ }, + on: :update def total_price total = 0.0 - self.order_items.each do |item| - total += (item.price * item.quantity) - end + order_items.each do |item| + total += (item.price * item.quantity) + end - return total + total end def purchase_changes self.cart_status = false - self.save + save end def self.cart_item_count(session) if session[:order_id].nil? - return '0' + '0' else - return Order.find_by(id: session[:order_id]).order_items.length + Order.find_by(id: session[:order_id]).order_items.length end end end diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index e252c7d884..9e44fed777 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -1,4 +1,6 @@ -require "test_helper" +# frozen_string_literal: true + +require 'test_helper' describe OrderItemsController do before do @@ -7,15 +9,15 @@ email: 'leroy@gmail.com' ) @product = Product.create( - name: 'Plant One', - price: 5.00, + name: 'Plant One', + price: 5.00, description: 'This is a fake plant.', inventory: 5, merchant_id: @merchant.id ) end - - let (:new_item_hash) { + + let (:new_item_hash) do { order_item: { name: @product.name, @@ -24,13 +26,13 @@ product_id: @product.id } } - } - - describe "create" do - it "can create a new OrderItem with valid information accurately, and redirect" do - expect { + end + + describe 'create' do + it 'can create a new OrderItem with valid information accurately, and redirect' do + expect do post product_order_items_path(@product.id), params: new_item_hash - }.must_change 'OrderItem.count', 1 + end.must_change 'OrderItem.count', 1 new_order_item = OrderItem.find_by(name: @product.name) @@ -42,12 +44,12 @@ must_redirect_to orders_path end - it "does not create a new OrderItem if the form data violates validations, and responds with a redirect" do + it 'does not create a new OrderItem if the form data violates validations, and responds with a redirect' do new_item_hash[:order_item][:name] = nil - - expect { + + expect do post product_order_items_path(@product.id), params: new_item_hash - }.wont_change 'OrderItem.count' + end.wont_change 'OrderItem.count' must_redirect_to product_order_items_path(@product.id) end @@ -80,13 +82,13 @@ # end # end - describe "edit" do - it "responds with success when getting the edit page for an existing, valid order" do + describe 'edit' do + it 'responds with success when getting the edit page for an existing, valid order' do get edit_orders_path(trip) must_respond_with :success end - - it "responds with redirect when getting the edit page for a non-existing order item" do + + it 'responds with redirect when getting the edit page for a non-existing order item' do get edit_orders_path(-1) must_redirect_to orders_path end @@ -176,7 +178,6 @@ # end # end - # describe "destroy" do # it "destroys the order item instance in db when order item exists, then redirects" do # new_order_item = Order.create(name: 'Tyron Banks', price: 2, quantity: 30, product_id: @product.id, merchant_id: @merchant.id) @@ -184,10 +185,10 @@ # expect { # delete orders_path(id: new_trip.id) # }.must_differ 'Trip.count', -1 - + # deleted = Trip.find_by(id: new_trip.id) # expect(deleted).must_be_nil - + # must_redirect_to trips_path # end # it "does not change the db when the driver does not exist, then responds with " do @@ -196,5 +197,4 @@ # }.must_differ 'Trip.count', 0 # end # end - end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index a68dce68db..1b3749673e 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,90 +1,91 @@ -require "test_helper" +# frozen_string_literal: true + +require 'test_helper' describe Order do before do + @new_order = Order.new(card_number: 1_234_567_890_123_456, card_expiration_date: Date.today + 365, card_cvv: '123', + address: '15 Main Street', city: 'Seattle', state: 'wa', zip_code: '98010', guest_name: 'Tyron Jenkins', email: 'tyrone@gmail.com', phone_num: '(456)123-1234', cart_status: false) - @new_order = Order.new(card_number: 1234567890123456, card_expiration_date: Date.today + 365, card_cvv: '123', - address: "15 Main Street", city: "Seattle", state: 'wa', zip_code: '98010', guest_name: "Tyron Jenkins", email: "tyrone@gmail.com", phone_num: "(456)123-1234", cart_status: false) - @product_1 = products(:product_1) @new_product1 = Product.create(name: @product_1.name, price: @product_1.price, inventory: @product_1.inventory) - + @order1 = orders(:order1) - @new_order_item = OrderItem.create(product: @new_product, order: @new_order) + @new_order_item = OrderItem.create(product: @new_product, order: @new_order) end - describe "relations" do - it "has many order items" do + describe 'relations' do + it 'has many order items' do expect(@new_order).must_respond_to :order_items end - it "has many products" do + it 'has many products' do expect(@new_order).must_respond_to :products end end - - describe "validations" do - it "is valid when parameters are present" do + + describe 'validations' do + it 'is valid when parameters are present' do expect(@new_order.valid?).must_equal true expect(@new_order.guest_name).must_equal @order1.guest_name end - it "is invalid without a card number" do - expect(@new_order.valid?).must_equal true #check order valid + it 'is invalid without a card number' do + expect(@new_order.valid?).must_equal true # check order valid expect(@new_order.card_number.length).must_equal 16 - @new_order.update(card_number: nil) #make sure number nil + @new_order.update(card_number: nil) # make sure number nil expect(@new_order.valid?).must_equal false end - it "is invalid with an invalid card number" do + it 'is invalid with an invalid card number' do expect(@new_order.valid?).must_equal true - @new_order.update(card_number: 1234 ) + @new_order.update(card_number: 1234) expect(@new_order.valid?).must_equal false end - it "is invalid without a card expiration date" do + it 'is invalid without a card expiration date' do expect(@new_order.valid?).must_equal true @new_order.update(card_expiration_date: nil) assert_nil(@new_order.card_expiration_date) expect(@new_order.valid?).must_equal false end - it "is invalid without a card cvv" do + it 'is invalid without a card cvv' do expect(@new_order.valid?).must_equal true expect(@new_order.card_cvv.length).must_equal 3 @new_order.update(card_cvv: nil) - assert_nil(@new_order.card_cvv) + assert_nil(@new_order.card_cvv) expect(@new_order.valid?).must_equal false end - it "is invalid with an invalid cvv" do + it 'is invalid with an invalid cvv' do expect(@new_order.valid?).must_equal true - @new_order.update(card_cvv: 1234 ) + @new_order.update(card_cvv: 1234) expect(@new_order.valid?).must_equal false end - it "is invalid without an address" do + it 'is invalid without an address' do expect(@new_order.valid?).must_equal true @new_order.update(address: nil) assert_nil(@new_order.address) expect(@new_order.valid?).must_equal false end - it "is invalid without a city" do + it 'is invalid without a city' do expect(@new_order.valid?).must_equal true @new_order.update(city: nil) assert_nil(@new_order.city) expect(@new_order.valid?).must_equal false end - it "is invalid without a state" do + it 'is invalid without a state' do expect(@new_order.valid?).must_equal true @new_order.update(city: nil) assert_nil(@new_order.city) expect(@new_order.valid?).must_equal false end - it "is invalid without a zip code" do + it 'is invalid without a zip code' do expect(@new_order.valid?).must_equal true expect(@new_order.zip_code.length).must_equal 5 @new_order.update(zip_code: nil) @@ -92,60 +93,59 @@ expect(@new_order.valid?).must_equal false end - it "is invalid with an invalid zip code" do + it 'is invalid with an invalid zip code' do expect(@new_order.valid?).must_equal true - @new_order.update(zip_code: 1234 ) + @new_order.update(zip_code: 1234) expect(@new_order.valid?).must_equal false end - it "is invalid without a guest name" do + it 'is invalid without a guest name' do expect(@new_order.valid?).must_equal true @new_order.update(guest_name: nil) assert_nil(@new_order.guest_name) expect(@new_order.valid?).must_equal false end - it "is invalid without an email" do + it 'is invalid without an email' do expect(@new_order.valid?).must_equal true @new_order.update(email: nil) assert_nil(@new_order.email) expect(@new_order.valid?).must_equal false end - it "is invalid with an invalid email" do + it 'is invalid with an invalid email' do expect(@new_order.valid?).must_equal true - @new_order.update(email: "1234 @ gmail com" ) + @new_order.update(email: '1234 @ gmail com') expect(@new_order.valid?).must_equal false end - it "is invalid without a phone number" do + it 'is invalid without a phone number' do expect(@new_order.valid?).must_equal true @new_order.update(phone_num: nil) assert_nil(@new_order.phone_num) expect(@new_order.valid?).must_equal false end - it "is invalid with an invalid phone number" do + it 'is invalid with an invalid phone number' do expect(@new_order.valid?).must_equal true - @new_order.update(phone_num: "123.234.1234" ) + @new_order.update(phone_num: '123.234.1234') expect(@new_order.valid?).must_equal false end - end - - describe "total price" do - it "calculates the order total correctly" do + + describe 'total price' do + it 'calculates the order total correctly' do expect(orders(:order3).total_price).must_equal 65.0 end - it "returns 0.0 if the order has no items" do + it 'returns 0.0 if the order has no items' do expect(orders(:order1).valid?).must_equal true expect(orders(:order1).total_price).must_equal 0.0 end end - describe "purchase changes" do - it "flips cart status to inactive" do + describe 'purchase changes' do + it 'flips cart status to inactive' do new_order = Order.create new_order.purchase_changes @@ -154,22 +154,21 @@ end end - describe "cart item count" do + describe 'cart item count' do before do @session = {} # imitate session @session[:order_id] = nil end - it "returns the number of items in cart" do + it 'returns the number of items in cart' do new_order = orders(:order3) @session[:order_id] = new_order.id expect(Order.cart_item_count(@session)).must_equal 2 end - it "returns 0 if no cart has been made" do + it 'returns 0 if no cart has been made' do expect(Order.cart_item_count(@session)).must_equal '0' end end - end diff --git a/test/test_helper.rb b/test/test_helper.rb index 23ad6d79ec..84550ae268 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'simplecov' SimpleCov.start 'rails' do add_filter '/bin/' @@ -14,8 +16,8 @@ ENV['RAILS_ENV'] ||= 'test' require_relative '../config/environment' require 'rails/test_help' -require "minitest/rails" -require "minitest/reporters" # for Colorized output +require 'minitest/rails' +require 'minitest/reporters' # for Colorized output # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, @@ -23,8 +25,6 @@ Minitest.backtrace_filter ) - - class ActiveSupport::TestCase # Run tests in parallel with specified workers # parallelize(workers: :number_of_processors) # causes out of order output. From 2d7f271fec7336d78d5e839b6c27b6d7b6eb5033 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Wed, 17 Jun 2020 00:14:52 +0000 Subject: [PATCH 137/234] Restyled by whitespace --- app/views/layouts/application.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 53797cec94..040f4e07b8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -14,7 +14,7 @@

    Plantsy

    <% if @merchant.products.length == 0 %> -

    Oops! Looks like we're sold out of these plants.

    +

    Oops! Looks like <%= @merchant.username %> sold out of plants for now.

    <% else %>
    <% products = Product.where(merchant_id: @merchant.id)%> From 6a5eb45b66857fdf5ae67121ad2e951961e73c21 Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 16 Jun 2020 18:50:13 -0700 Subject: [PATCH 140/234] deleted extra table --- .../20200617014820_drop_products_categories_joins.rb | 5 +++++ db/schema.rb | 9 +-------- 2 files changed, 6 insertions(+), 8 deletions(-) create mode 100644 db/migrate/20200617014820_drop_products_categories_joins.rb diff --git a/db/migrate/20200617014820_drop_products_categories_joins.rb b/db/migrate/20200617014820_drop_products_categories_joins.rb new file mode 100644 index 0000000000..202e049645 --- /dev/null +++ b/db/migrate/20200617014820_drop_products_categories_joins.rb @@ -0,0 +1,5 @@ +class DropProductsCategoriesJoins < ActiveRecord::Migration[6.0] + def change + drop_table :products_categories_joins + end +end diff --git a/db/schema.rb b/db/schema.rb index c23a724e32..3fcc38109d 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_15_214220) do +ActiveRecord::Schema.define(version: 2020_06_17_014820) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -79,13 +79,6 @@ t.index ["merchant_id"], name: "index_products_on_merchant_id" end - create_table "products_categories_joins", force: :cascade do |t| - t.bigint "product_id" - t.bigint "category_id" - t.index ["category_id"], name: "index_products_categories_joins_on_category_id" - t.index ["product_id"], name: "index_products_categories_joins_on_product_id" - end - add_foreign_key "order_items", "orders" add_foreign_key "order_items", "products" add_foreign_key "products", "merchants" From e99534a7bd637f77491e174a966e16ce7e27080b Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 16 Jun 2020 19:04:03 -0700 Subject: [PATCH 141/234] removed products from product cat relationships --- db/category-product-seed.csv | 40 ++++++++++++++++++------------------ db/merchant-seed.csv | 6 +++--- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/db/category-product-seed.csv b/db/category-product-seed.csv index 00f16f7304..ea865bcd60 100644 --- a/db/category-product-seed.csv +++ b/db/category-product-seed.csv @@ -1,21 +1,21 @@ category_id,product_id -1, 1 -1, 2 -1, 3 -1, 5 -1, 6 -1, 7 -2, 1 -2, 2 -2, 14 -2, 13 -2, 12 -2, 11 -2, 6 -2, 9 -2, 10 -3, 6 -3, 9 -4, 12 -5, 14 -5, 11 +1,1 +1,2 +1,3 +1,5 +1,6 +1,7 +2,1 +2,2 +2,5 +2,5 +2,1 +2,7 +2,6 +2,9 +2,8 +3,6 +3,9 +4,4 +5,1 +5,4 diff --git a/db/merchant-seed.csv b/db/merchant-seed.csv index bc9f14b1cb..f4f0b3ab73 100644 --- a/db/merchant-seed.csv +++ b/db/merchant-seed.csv @@ -1,4 +1,4 @@ username,email -audrey2, littleshop@ofhorrors.com -bananaman, peel@monkey.net -greengiant, eat@yourveggies.com \ No newline at end of file +audrey2,littleshop@ofhorrors.com +bananaman,peel@monkey.net +greengiant,eat@yourveggies.com \ No newline at end of file From e6b647e4faabe79b4e042d21ea75aea15fe5b90b Mon Sep 17 00:00:00 2001 From: kate myer Date: Tue, 16 Jun 2020 20:20:33 -0700 Subject: [PATCH 142/234] added nested route fx to order items index --- app/controllers/order_items_controller.rb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 9805ce762c..03566e95a2 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -3,8 +3,16 @@ class OrderItemsController < ApplicationController #database order_items -> use OrderItem #GET /order_items def index - order_items = OrderItem.all.as_json(only: [:id, :name, :price, :quantity]) - render json: order_items, status: :ok + if params[:product_id] + # This is the nested route, /products/:product_id/order_items + product = Product.find_by(id: params[:product_id]) + order_items = product.order_items.as_json(only: [:id, :name, :price, :quantity]) + render json: order_items, status: :ok + else + # This is the 'regular' route, /order_items + order_items = OrderItem.all.as_json(only: [:id, :name, :price, :quantity]) + render json: order_items, status: :ok + end end #POST /order_items { :order_item => { :name => "hello", :price => 6, }} From 8e04fb50ef74a19a7d12afad6f5141b310deec44 Mon Sep 17 00:00:00 2001 From: kate myer Date: Tue, 16 Jun 2020 20:21:20 -0700 Subject: [PATCH 143/234] changed relations to: product has many order items --- app/models/product.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/product.rb b/app/models/product.rb index 3d073d7137..4dfc5cbb63 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,6 +1,6 @@ class Product < ApplicationRecord belongs_to :merchant - has_one :order_item + has_many :order_items has_and_belongs_to_many :categories #need to clarify this because if there's 10 plants and all get purchased, should see 10 order items #product has many order items.... From 1eb1fe6aa89fb548e395312a87d6a02a6bc92832 Mon Sep 17 00:00:00 2001 From: kate myer Date: Tue, 16 Jun 2020 20:21:40 -0700 Subject: [PATCH 144/234] added nested route notes for myself --- config/routes.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/config/routes.rb b/config/routes.rb index c537bdc568..a742521a42 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,6 +8,7 @@ # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html root to: 'homepages#index' +# /product/1/order_items resources :products do resources :order_items end From 6defe10d8ae79a4dbdf67bc8b643f8c42e5b4b98 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Tue, 16 Jun 2020 21:08:23 -0700 Subject: [PATCH 145/234] fix logic for cart_item_count --- app/controllers/orders_controller.rb | 2 +- app/models/order.rb | 6 ++++-- app/views/layouts/application.html.erb | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 20db2bab8f..bd6192a08a 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -14,7 +14,7 @@ def show if @order.nil? head :not_found - return + return end end diff --git a/app/models/order.rb b/app/models/order.rb index 26444377ea..bd69ae7e7c 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -67,10 +67,12 @@ def purchase_changes end def self.cart_item_count(session) - if session[:order_id].nil? + if session[:order_id] == nil + '0' + elsif Order.find_by(id: session[:order_id]).nil? '0' else - Order.find_by(id: session[:order_id]).order_items.length + return Order.find_by(id: session[:order_id]).order_items.length end end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 80c5dc5775..66e6eb2f32 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -31,7 +31,7 @@ <%= link_to "Login with Github", github_login_path %> <% end %> | - <%= link_to "Cart (#{ Order.cart_item_count(session) })", cart_path %> + <%= link_to "Cart ( #{ Order.cart_item_count(session) })", cart_path %>
    From eb2d605457024510be746856530eb3953bc8a0f5 Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 16 Jun 2020 23:19:40 -0700 Subject: [PATCH 146/234] fixed seed --- db/category-product-seed.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/category-product-seed.csv b/db/category-product-seed.csv index ea865bcd60..7ff2ab82ee 100644 --- a/db/category-product-seed.csv +++ b/db/category-product-seed.csv @@ -8,7 +8,7 @@ category_id,product_id 2,1 2,2 2,5 -2,5 +2,6 2,1 2,7 2,6 From 5e2986ea68a91d1d2b7e914a7389f256d65bd13c Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 16 Jun 2020 23:21:49 -0700 Subject: [PATCH 147/234] seed tweak --- db/category-product-seed.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/category-product-seed.csv b/db/category-product-seed.csv index 7ff2ab82ee..1c66e09a4c 100644 --- a/db/category-product-seed.csv +++ b/db/category-product-seed.csv @@ -11,7 +11,7 @@ category_id,product_id 2,6 2,1 2,7 -2,6 +2,4 2,9 2,8 3,6 From 1d34601ce57d78fba11164d93e3d88aaafaccf6d Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 16 Jun 2020 23:25:20 -0700 Subject: [PATCH 148/234] and again a seed tweak --- db/category-product-seed.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/category-product-seed.csv b/db/category-product-seed.csv index 1c66e09a4c..35ad2d1b88 100644 --- a/db/category-product-seed.csv +++ b/db/category-product-seed.csv @@ -9,7 +9,7 @@ category_id,product_id 2,2 2,5 2,6 -2,1 +2,3 2,7 2,4 2,9 From 71deaa4804c3cfedf49e2840ee0c0457b137242b Mon Sep 17 00:00:00 2001 From: kate myer Date: Tue, 16 Jun 2020 23:43:14 -0700 Subject: [PATCH 149/234] controller tests: order items - index and create. --- .../order_items_controller_test.rb | 130 ++++++++++-------- test/fixtures/merchants.yml | 12 +- test/fixtures/order_items.yml | 60 ++++---- test/fixtures/orders.yml | 66 ++++----- test/fixtures/products.yml | 48 +++---- 5 files changed, 163 insertions(+), 153 deletions(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 288bc30daa..c5b82ffd87 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -3,96 +3,106 @@ describe OrderItemsController do before do @merchant = Merchant.create( - username: 'Leroy Jenkins', - email: 'leroy@gmail.com' + username: 'test_user', + email: 'test_user@gmail.com' ) - @product = Product.create( - name: 'Plant One', + @test_product1 = Product.create( + name: 'test product1', price: 5.00, description: 'This is a fake plant.', inventory: 5, merchant_id: @merchant.id ) + @new_order = Order.create( + card_number: 1234567890123456, + card_expiration_date: Date.today + 365, + card_cvv: 123, + address: "15 Main Street", + city: "Seattle", + zip_code: 98010, + guest_name: "Tyron Jenkins", + email: "tyrone@gmail.com", + phone_num: "(456)123-1234" + ) + @new_order1 = Order.create( + card_number: 1234567890123457, + card_expiration_date: Date.today + 365, + card_cvv: 121, + address: "151 Main Street", + city: "Seattle", + zip_code: 98011, + guest_name: "test_user1", + email: "test_user1@gmail.com", + phone_num: "(456)123-1235" + ) + @new_order_item = OrderItem.create( + name: @test_product1.name, + price: @test_product1.price, + quantity: 1, + product_id: @test_product1.id, + order_id: @new_order.id + ) + + end - + let (:new_item_hash) { { order_item: { - name: @product.name, - price: @product.price, + name: @test_product1.name, + price: @test_product1.price, quantity: 1, - product_id: @product.id + product_id: @test_product1.id } } } + describe "index" do + it "can get the index path" do + get order_items_path + must_respond_with :success + end + + it "lists order items based on product id via nested routes" do + get product_order_items_path(@test_product1.id) + must_respond_with :success + body = JSON.parse(response.body) + expect(body.length).must_equal 1 + expect(body[0]["name"]).must_equal @test_product1.name + end + end + describe "create" do it "can create a new OrderItem with valid information accurately, and redirect" do expect { - post product_order_items_path(@product.id), params: new_item_hash - }.must_change 'OrderItem.count', 1 + post product_order_items_path(@test_product1.id), + params: new_item_hash + }.must_change "Product.find(#{@test_product1.id}).order_items.count", 2 + - new_order_item = OrderItem.first - new_order = Order.first + found_order_item = OrderItem.find_by(order_id: session[:order_id]) + #new_order = Order.first - expect(new_order_item.name).must_equal @product.name - expect(new_order_item.price).must_equal @product.price - expect(new_order_item.quantity).must_equal 1 - expect(new_order_item.product_id).must_equal @product.id - expect(new_order_item.order_id).must_equal new_order.id + expect(found_order_item.name).must_equal new_item_hash[:order_item][:name] + expect(found_order_item.price).must_equal new_item_hash[:order_item][:price] + expect(found_order_item.quantity).must_equal new_item_hash[:order_item][:quantity] + expect(found_order_item.product_id).must_equal new_item_hash[:order_item][:product_id] + expect(found_order_item.order_id).must_equal session[:order_id] - must_redirect_to orders_path + must_redirect_to cart_path end - it "does not create a new OrderItem if the form data violates validations, and responds with a redirect" do - new_item_hash[:order_item][:name] = nil + it "does not create a new OrderItem if the form data violates inventory, and responds with a redirect" do + new_item_hash[:order_item][:quantity] = 1000 expect { - post product_order_items_path(@product.id), params: new_item_hash + post product_order_items_path(@test_product1.id), params: new_item_hash }.wont_change 'OrderItem.count' - must_redirect_to product_order_items_path(@product.id) + must_redirect_to root_path end end - # describe "edit" do - # before do - # @driver = Driver.create(name: 'Leroy Jenkins', vin: 'SU9PYDRK6214WL15M', available: true) - # @passenger = Passenger.create(name: "test person", phone_num: "1234567") - # end - - # it "responds with success when getting the edit page for an existing, valid trip" do - # trip = Trip.create( - # passenger_id: @passenger.id, - # driver_id: @driver.id, - # date: Date.today, - # rating: nil, - # cost: rand(1...3000) - # ) - - # get edit_trip_path(trip.id) - - # must_respond_with :success - # end - - # it "responds with redirect when getting the edit page for a non-existing trip" do - # get edit_trip_path(-1) - - # must_respond_with :not_found - # end - # end - - describe "edit" do - it "responds with success when getting the edit page for an existing, valid order" do - get edit_orders_path(trip) - must_respond_with :success - end - - it "responds with redirect when getting the edit page for a non-existing order item" do - get edit_orders_path(-1) - must_redirect_to orders_path - end - end # describe "update" do # before do diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index 350f35b38b..943e68a92d 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -1,6 +1,6 @@ -merchant_1: - username: merchant_1 - email: email@email.com -merchant_2: - username: merchant_2 - email: email@webmail.net +# merchant_1: +# username: merchant_1 +# email: email@email.com +# merchant_2: +# username: merchant_2 +# email: email@webmail.net diff --git a/test/fixtures/order_items.yml b/test/fixtures/order_items.yml index a21709c175..962693d014 100644 --- a/test/fixtures/order_items.yml +++ b/test/fixtures/order_items.yml @@ -1,30 +1,30 @@ -order_item1: - name: coffee plant1 - price: 5.00 - quantity: 10 - product_id: 1 - order_id: 1 -order_item2: - name: fiddle fig tree1 - price: 15.99 - quantity: 3 - product_id: 1 - order_id: 2 -order_item3: - name: fiddle fig tree2 - price: 25.99 - quantity: 4 - product_id: 2 - order_id: 2 -order_item4: - name: echeveria1 - price: 21.00 - quantity: 1 - product_id: 1 - order_id: 3 -order_item5: - name: echeveria2 - price: 22.00 - quantity: 2 - product_id: 2 - order_id: 3 \ No newline at end of file +# order_item1: +# name: coffee plant1 +# price: 5.00 +# quantity: 10 +# product_id: 1 +# order_id: 1 +# order_item2: +# name: fiddle fig tree1 +# price: 15.99 +# quantity: 3 +# product_id: 1 +# order_id: 2 +# order_item3: +# name: fiddle fig tree2 +# price: 25.99 +# quantity: 4 +# product_id: 2 +# order_id: 2 +# order_item4: +# name: echeveria1 +# price: 21.00 +# quantity: 1 +# product_id: 1 +# order_id: 3 +# order_item5: +# name: echeveria2 +# price: 22.00 +# quantity: 2 +# product_id: 2 +# order_id: 3 \ No newline at end of file diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index f9d9862a25..c2fb319133 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -1,33 +1,33 @@ -order1: - card_number: 1234567890123456 - card_expiration_date: 01/20 - card_cvv: 123 - address: 15 Main Street - city: Seattle - zip_code: 98010 - guest_name: Tyron Jenkins - email: tyrone@gmail.com - phone_num: (456)123-1234 - cart_status: false -order2: - card_number: 9876543211234567 - card_expiration_date: 10/22 - card_cvv: 456 - address: 120 Seneca Road - city: Los Angeles - zip_code: 90010 - guest_name: Captain America - email: capusa@gmail.com - phone_num: (206)253-7777 - cart_status: false -order3: - card_number: 5434567812345906 - card_expiration_date: 12/25 - card_cvv: 777 - address: 2020 Boeing Field Street - city: New York - zip_code: 10074 - guest_name: Seymour Gloots - email: sgloots@gmail.com - phone_num: (975)619-2100 - cart_status: false \ No newline at end of file +# order1: +# card_number: 1234567890123456 +# card_expiration_date: 01/20 +# card_cvv: 123 +# address: 15 Main Street +# city: Seattle +# zip_code: 98010 +# guest_name: Tyron Jenkins +# email: tyrone@gmail.com +# phone_num: (456)123-1234 +# cart_status: false +# order2: +# card_number: 9876543211234567 +# card_expiration_date: 10/22 +# card_cvv: 456 +# address: 120 Seneca Road +# city: Los Angeles +# zip_code: 90010 +# guest_name: Captain America +# email: capusa@gmail.com +# phone_num: (206)253-7777 +# cart_status: false +# order3: +# card_number: 5434567812345906 +# card_expiration_date: 12/25 +# card_cvv: 777 +# address: 2020 Boeing Field Street +# city: New York +# zip_code: 10074 +# guest_name: Seymour Gloots +# email: sgloots@gmail.com +# phone_num: (975)619-2100 +# cart_status: false \ No newline at end of file diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 88bca26055..b2769ed975 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -1,24 +1,24 @@ -product_1: - name: "Product 1" - price: 10.01 - description: "This is a product that merchant_1 sells." - inventory: 5 - merchant: merchant_1 - status: true - photo_url: "https://www.goodfreephotos.com/albums/plants/phyllotaxis-plant-spiral.jpg" -product_2: - name: "Product 2" - price: 5.00 - description: "Merchant 2 sells this product." - inventory: 5 - merchant: merchant_2 - status: true - photo_url: "https://cdn.pixabay.com/photo/2019/04/16/02/40/plant-4130769_960_720.png" -product_3: - name: "Product 3" - price: 8.99 - description: "This is also a product that merchant_1 sells." - inventory: 1 - merchant: merchant_1 - status: false - photo_url: "https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" \ No newline at end of file +# product_1: +# name: "Product 1" +# price: 10.01 +# description: "This is a product that merchant_1 sells." +# inventory: 5 +# merchant: merchant_1 +# status: true +# photo_url: "https://www.goodfreephotos.com/albums/plants/phyllotaxis-plant-spiral.jpg" +# product_2: +# name: "Product 2" +# price: 5.00 +# description: "Merchant 2 sells this product." +# inventory: 5 +# merchant: merchant_2 +# status: true +# photo_url: "https://cdn.pixabay.com/photo/2019/04/16/02/40/plant-4130769_960_720.png" +# product_3: +# name: "Product 3" +# price: 8.99 +# description: "This is also a product that merchant_1 sells." +# inventory: 1 +# merchant: merchant_1 +# status: false +# photo_url: "https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" \ No newline at end of file From fe2c9d6400e4897ee3c8ec7b8c19d9579918554e Mon Sep 17 00:00:00 2001 From: kate myer Date: Tue, 16 Jun 2020 23:45:55 -0700 Subject: [PATCH 150/234] added some notes for self --- .../order_items_controller_test.rb | 105 +----------------- 1 file changed, 1 insertion(+), 104 deletions(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index c5b82ffd87..c6a01629bc 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -104,109 +104,6 @@ end - # describe "update" do - # before do - # @driver = Driver.create(name: 'Leroy Jenkins', vin: 'SU9PYDRK6214WL15M', available: true) - # @passenger = Passenger.create(name: "test person", phone_num: "1234567") - # @trip = Trip.create( - # passenger_id: @passenger.id, - # driver_id: @driver.id, - # date: Date.today, - # rating: nil, - # cost: rand(1...3000) - # ) - # end - - # let (:update_hash) { - # { - # trip: { - # rating: 2 - # } - # } - # } - - # it "can update an existing trip with valid information accurately, and redirect" do - # expect { - # patch trip_path(@trip.id), params: update_hash - # }.wont_change 'Trip.count' - - # must_redirect_to trip_path(@trip.id) - - # find_trip = Trip.find_by(id: @trip.id) - # expect(find_trip.rating).must_equal update_hash[:trip][:rating] - # end - - # it "does not update any trip if given an invalid id, and responds with a 404" do - # expect { - # patch trip_path(-1), params: update_hash - # }.wont_change 'Trip.count' - - # must_respond_with :not_found - # end - - # it "does not update a Trip if the form data violates Driver validations, and responds with a redirect" do - # update_trip = { - # trip: { - # rating: 8 - # } - # } - - # expect { - # patch trip_path(@trip.id), params: update_trip - # }.wont_change 'Trip.count' - - # must_respond_with :redirect - # end - # end - - # describe "destroy" do - # it "destroys the Trip instance in db when Trip exists, then redirects" do - # driver = Driver.create(name: 'Leroy Jenkins', vin: 'SU9PYDRK6214WL15M', available: true) - # passenger = Passenger.create(name: "test person", phone_num: "1234567") - # trip = Trip.create( - # passenger_id: passenger.id, - # driver_id: driver.id, - # date: Date.today, - # rating: nil, - # cost: rand(1...3000) - # ) - - # expect { - # delete trip_path(trip.id) - # }.must_differ 'Trip.count', -1 - - # must_respond_with :redirect - # must_redirect_to root_path - # end - - # it "does not change the db when the Trip does not exist, then responds with redirect" do - # expect { - # delete trip_path(-1) - # }.wont_change 'Driver.count' - - # must_respond_with :not_found - # end - # end - - - # describe "destroy" do - # it "destroys the order item instance in db when order item exists, then redirects" do - # new_order_item = Order.create(name: 'Tyron Banks', price: 2, quantity: 30, product_id: @product.id, merchant_id: @merchant.id) - - # expect { - # delete orders_path(id: new_trip.id) - # }.must_differ 'Trip.count', -1 - - # deleted = Trip.find_by(id: new_trip.id) - # expect(deleted).must_be_nil - - # must_redirect_to trips_path - # end - # it "does not change the db when the driver does not exist, then responds with " do - # expect { - # delete trip_path(id: -1) - # }.must_differ 'Trip.count', 0 - # end - # end + #KATE WILL FINISH UPDATE AND DESTOY TESTS WEDNESDAY!!!!!!!# end From 3f4f9d3dfeeab9400810ed77aaf15688ba22aba7 Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 00:07:02 -0700 Subject: [PATCH 151/234] add new category form and dashboard link --- app/views/categories/new.html.erb | 17 +++++++++++++++-- app/views/merchants/dashboard.html.erb | 2 ++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb index 018535b293..9ae5d7ab8f 100644 --- a/app/views/categories/new.html.erb +++ b/app/views/categories/new.html.erb @@ -1,2 +1,15 @@ -

    Categories#new

    -

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

    +

    Add New Category

    +
    + <%= form_with model: @category do |f| %> +

    What category would you like to create?

    + +
    + <%= f.label :name %> + <%= f.text_field :name, class: 'form-control' %> +
    + +
    + <%= f.submit 'Add', class: 'catbtn btn-primaryegory-button' %> + <% end %> +
    +
    diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb index 051b6890d1..d2413630a4 100644 --- a/app/views/merchants/dashboard.html.erb +++ b/app/views/merchants/dashboard.html.erb @@ -2,9 +2,11 @@
    <% unless @merchant.nil? %> + # TODO add require login as a controller filter -i think?
    <%= link_to "Add a product", new_product_path %> + <%= link_to "Add a category", new_category_path %>

    Your Orders:

    <% if @merchant.orders.length > 0 %> From b28b867b0c2e1c1ecfdcd98c6ca648bee40366bf Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 00:46:23 -0700 Subject: [PATCH 152/234] added some fixture relationships --- test/fixtures/categories.yml | 10 ++++++++++ test/fixtures/categories_products.yml | 15 +++++++++++++++ test/fixtures/products.yml | 4 +++- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/categories.yml create mode 100644 test/fixtures/categories_products.yml diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml new file mode 100644 index 0000000000..6a690a504f --- /dev/null +++ b/test/fixtures/categories.yml @@ -0,0 +1,10 @@ +category1: + name: "category1" +category2: + name: "category2" +category3: + name: "category3" +category4: + name: "category4" +category5: + name: "category5" diff --git a/test/fixtures/categories_products.yml b/test/fixtures/categories_products.yml new file mode 100644 index 0000000000..a226117446 --- /dev/null +++ b/test/fixtures/categories_products.yml @@ -0,0 +1,15 @@ +one: + category_id: 1 + product_id: 1 +two: + category_id: 2 + product_id: 1 +three: + category_id: 2 + product_id: 3 +four: + category_id: 3 + product_id: 2 +five: + category_id: 4 + product_id: 2 diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 88bca26055..a32dc8a1e2 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -5,7 +5,8 @@ product_1: inventory: 5 merchant: merchant_1 status: true - photo_url: "https://www.goodfreephotos.com/albums/plants/phyllotaxis-plant-spiral.jpg" + photo_url: "https://www.goodfreephotos.com/albums/plants/phyllotaxis-plant-spiral.jpg", + categories: category1, category2 product_2: name: "Product 2" price: 5.00 @@ -14,6 +15,7 @@ product_2: merchant: merchant_2 status: true photo_url: "https://cdn.pixabay.com/photo/2019/04/16/02/40/plant-4130769_960_720.png" + categories: category2, category3, category4 product_3: name: "Product 3" price: 8.99 From c4362c08c6ca1ec82c2253d5952d9116036b3326 Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 01:04:45 -0700 Subject: [PATCH 153/234] require_login method & skip_before on controllers --- app/controllers/application_controller.rb | 14 ++++++++++++++ app/controllers/categories_controller.rb | 3 +-- app/controllers/homepages_controller.rb | 2 ++ app/controllers/merchants_controller.rb | 1 + app/controllers/order_items_controller.rb | 2 ++ app/controllers/orders_controller.rb | 1 + app/controllers/products_controller.rb | 3 +-- 7 files changed, 22 insertions(+), 4 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 09705d12ab..28e2d2c1bf 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,2 +1,16 @@ class ApplicationController < ActionController::Base + before_action :require_login + + def current_user + return User.find_by(id: session[:user_id]) if session[:user_id] + end + + def require_login + if current_user.nil? + flash[:error] = "Oops. Looks like you don't have permission to view this page. If you're a merchant, please login." + redirect_to root_path + end + end + + end diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 49f8eabc7e..47acfe1f27 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,6 +1,5 @@ class CategoriesController < ApplicationController - # skip_before_action :require_login, only: [:index, :show] - # TODO add require login for everything but index and show + skip_before_action :require_login, only: [:index, :show] def index @categories = Category.all diff --git a/app/controllers/homepages_controller.rb b/app/controllers/homepages_controller.rb index cdf733413a..d97eaa4fc6 100644 --- a/app/controllers/homepages_controller.rb +++ b/app/controllers/homepages_controller.rb @@ -1,4 +1,6 @@ class HomepagesController < ApplicationController + skip_before_action :require_login + def index end end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index ad0ef501b7..39c069eebe 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,4 +1,5 @@ class MerchantsController < ApplicationController + skip_before_action :require_login, except: [:dashboard] def index @merchants = Merchant.all diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 9805ce762c..350ddc7e5f 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -1,5 +1,7 @@ class OrderItemsController < ApplicationController skip_before_action :verify_authenticity_token + skip_before_action :require_login + #database order_items -> use OrderItem #GET /order_items def index diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index bd6192a08a..d0f37b00e2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,4 +1,5 @@ class OrdersController < ApplicationController + skip_before_action :require_login, except: [:show, :index] #GET /orders def index diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index cef3e901c5..65aca5e55b 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,6 +1,5 @@ class ProductsController < ApplicationController - # TODO setup login required - # skip_before_action :require_login, only: [:index, :show] + skip_before_action :require_login, only: [:index, :show] def index @products = Product.all From 22de6455db7e316a792beb5463a8355d8ce41f70 Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 09:58:06 -0700 Subject: [PATCH 154/234] merchant tweaks to name vs nickname --- app/controllers/merchants_controller.rb | 3 ++- app/models/merchant.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index ad0ef501b7..ec3658a2d4 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -16,12 +16,13 @@ def create auth_hash = request.env["omniauth.auth"] merchant = Merchant.find_by(uid: auth_hash[:uid], provider: "github") + if merchant flash[:success] = "Logged in as returning merchant #{merchant.username}" else merchant = Merchant.build_from_github(auth_hash) - if merchant.save + if merchant.save! flash[:success] = "Logged in as new merchant #{merchant.username}" else flash[:error] = "Could not create new merchant account: #{merchant.errors.messages}" diff --git a/app/models/merchant.rb b/app/models/merchant.rb index d3ce42aa2e..fca700ac3a 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -8,7 +8,7 @@ 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.username = auth_hash["info"]["nickname"] merchant.email = auth_hash["info"]["email"] return merchant From 7bbcb5dec734698e2f781c8550a428f86d0a01c5 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 17 Jun 2020 10:34:51 -0700 Subject: [PATCH 155/234] test changes for order items controller --- test/controllers/order_items_controller_test.rb | 15 ++------------- test/fixtures/order_items.yml | 16 ++++++++-------- test/fixtures/products.yml | 2 +- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 4851afa801..a1753a4203 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -4,18 +4,8 @@ describe OrderItemsController do before do - @merchant = Merchant.create( - username: 'test_user', - email: 'test_user@gmail.com' - ) - - @test_product1 = Product.create( - name: 'test product1', - price: 5.00, - description: 'This is a fake plant.', - inventory: 5, - merchant_id: @merchant.id - ) + @merchant = merchants(:merchant_1) + @test_product1 = products(:product_1) @new_order = Order.create( card_number: 1234567890123456, card_expiration_date: Date.today + 365, @@ -46,7 +36,6 @@ order_id: @new_order.id ) - end let (:new_item_hash) { diff --git a/test/fixtures/order_items.yml b/test/fixtures/order_items.yml index 863542e835..59bfbe9c6f 100644 --- a/test/fixtures/order_items.yml +++ b/test/fixtures/order_items.yml @@ -3,29 +3,29 @@ order_item1: name: coffee plant1 price: 5.00 quantity: 10 - product_id: 1 - order_id: 1 + product: product_1 + order: order1 order_item2: name: fiddle fig tree1 price: 15.99 quantity: 3 - product_id: 1 - order_id: 2 + product: product_1 + order: order2 order_item3: name: fiddle fig tree2 price: 25.99 quantity: 4 - product_id: 2 - order_id: 2 + product: product_2 + order: order2 order_item4: name: echeveria1 price: 21.00 quantity: 1 - product_id: 1 + product: product_3 order: order3 order_item5: name: echeveria2 price: 22.00 quantity: 2 - product_id: 2 + product: product_2 order: order3 diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index a32dc8a1e2..5f3208d0dc 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -5,7 +5,7 @@ product_1: inventory: 5 merchant: merchant_1 status: true - photo_url: "https://www.goodfreephotos.com/albums/plants/phyllotaxis-plant-spiral.jpg", + photo_url: "https://www.goodfreephotos.com/albums/plants/phyllotaxis-plant-spiral.jpg" categories: category1, category2 product_2: name: "Product 2" From 52d61af7d660862fe4bcac17f3183e2e752b648b Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 10:36:48 -0700 Subject: [PATCH 156/234] fixed user to merchant --- 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 28e2d2c1bf..d8bb52997c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,7 +2,7 @@ class ApplicationController < ActionController::Base before_action :require_login def current_user - return User.find_by(id: session[:user_id]) if session[:user_id] + return Merchant.find_by(id: session[:user_id]) if session[:user_id] end def require_login From 04a2c0714f91baa311ef9773bc956174d2b2b811 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 17 Jun 2020 11:05:20 -0700 Subject: [PATCH 157/234] merchant relations with orderitems fixed --- app/models/merchant.rb | 2 +- app/models/order.rb | 4 ++-- app/models/product.rb | 6 +----- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index fca700ac3a..cb59f5b0c3 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -2,7 +2,7 @@ class Merchant < ApplicationRecord validates :username, :email, :uid, :provider, presence: :true has_many :products - has_many :orders + has_many :order_items, through: :products def self.build_from_github(auth_hash) merchant = Merchant.new diff --git a/app/models/order.rb b/app/models/order.rb index af41133e7f..6e9007c9a8 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,8 +2,8 @@ class Order < ApplicationRecord has_many :order_items - has_many :merchants - has_many :products, through: :order_items + has_many :merchants, through: products + has_many :products, through: order_items validates :card_number, presence: true, diff --git a/app/models/product.rb b/app/models/product.rb index 4dfc5cbb63..144a3d332d 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -2,11 +2,7 @@ class Product < ApplicationRecord belongs_to :merchant has_many :order_items has_and_belongs_to_many :categories - #need to clarify this because if there's 10 plants and all get purchased, should see 10 order items - #product has many order items.... - #has_many: order_item - - #PER Jess: quantity is an attribute of the model + # has_many :reviews # ? Nora's thoughts: # ? has_many :order_items From 80617f117469b0659669d67e240dd72f30ce83e2 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 17 Jun 2020 11:12:30 -0700 Subject: [PATCH 158/234] fixed relations --- app/models/order.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index 6e9007c9a8..8052fa4af4 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,8 +2,8 @@ class Order < ApplicationRecord has_many :order_items - has_many :merchants, through: products - has_many :products, through: order_items + has_many :merchants, through: :products + has_many :products, through: :order_items validates :card_number, presence: true, From ab2055614dd95afceef1701091293bb6abfbfb81 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 17 Jun 2020 11:28:59 -0700 Subject: [PATCH 159/234] fixed order items yml and initial cont test --- .../order_items_controller_test.rb | 36 +++---------------- test/fixtures/order_items.yml | 22 ++++++------ 2 files changed, 16 insertions(+), 42 deletions(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index a1753a4203..85dc081634 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -6,36 +6,9 @@ before do @merchant = merchants(:merchant_1) @test_product1 = products(:product_1) - @new_order = Order.create( - card_number: 1234567890123456, - card_expiration_date: Date.today + 365, - card_cvv: 123, - address: "15 Main Street", - city: "Seattle", - zip_code: 98010, - guest_name: "Tyron Jenkins", - email: "tyrone@gmail.com", - phone_num: "(456)123-1234" - ) - @new_order1 = Order.create( - card_number: 1234567890123457, - card_expiration_date: Date.today + 365, - card_cvv: 121, - address: "151 Main Street", - city: "Seattle", - zip_code: 98011, - guest_name: "test_user1", - email: "test_user1@gmail.com", - phone_num: "(456)123-1235" - ) - @new_order_item = OrderItem.create( - name: @test_product1.name, - price: @test_product1.price, - quantity: 1, - product_id: @test_product1.id, - order_id: @new_order.id - ) - + @new_order = orders(:order1) + @new_order1 = orders(:order2) + @new_order_item = order_items(:order_item1) end let (:new_item_hash) { @@ -59,7 +32,8 @@ get product_order_items_path(@test_product1.id) must_respond_with :success body = JSON.parse(response.body) - expect(body.length).must_equal 1 + puts body + expect(body.length).must_equal 2 expect(body[0]["name"]).must_equal @test_product1.name end end diff --git a/test/fixtures/order_items.yml b/test/fixtures/order_items.yml index 59bfbe9c6f..4cbfacc9c2 100644 --- a/test/fixtures/order_items.yml +++ b/test/fixtures/order_items.yml @@ -1,31 +1,31 @@ order_item1: - name: coffee plant1 - price: 5.00 - quantity: 10 + name: Product 1 + price: 10.01 + quantity: 5 product: product_1 order: order1 order_item2: - name: fiddle fig tree1 - price: 15.99 + name: Product 1 + price: 10.01 quantity: 3 product: product_1 order: order2 order_item3: - name: fiddle fig tree2 - price: 25.99 + name: Product 2 + price: 5.00 quantity: 4 product: product_2 order: order2 order_item4: - name: echeveria1 - price: 21.00 + name: Product 3 + price: 8.99 quantity: 1 product: product_3 order: order3 order_item5: - name: echeveria2 - price: 22.00 + name: Product 2 + price: 5.00 quantity: 2 product: product_2 order: order3 From 06de97c16189e1a9b14b16dea104c17f50c0ce9b Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 11:43:17 -0700 Subject: [PATCH 160/234] add review relationship + view update --- app/models/product.rb | 2 +- app/models/review.rb | 4 ++++ app/views/layouts/application.html.erb | 3 +-- db/migrate/20200617183343_create_reviews.rb | 11 +++++++++++ db/schema.rb | 10 +++++++++- test/models/review_test.rb | 7 +++++++ 6 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 app/models/review.rb create mode 100644 db/migrate/20200617183343_create_reviews.rb create mode 100644 test/models/review_test.rb diff --git a/app/models/product.rb b/app/models/product.rb index 144a3d332d..bf78736c57 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -2,7 +2,7 @@ class Product < ApplicationRecord belongs_to :merchant has_many :order_items has_and_belongs_to_many :categories - # has_many :reviews + has_many :reviews # ? Nora's thoughts: # ? has_many :order_items diff --git a/app/models/review.rb b/app/models/review.rb new file mode 100644 index 0000000000..f020dbcf60 --- /dev/null +++ b/app/models/review.rb @@ -0,0 +1,4 @@ +class Review < ApplicationRecord + belongs_to :product + +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 9dbc5ba696..2b264066f5 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -27,12 +27,11 @@ <%= link_to "Dashboard", dashboard_path(session[:user_id]) %> | <%= link_to "Log out", logout_path, method: "delete" %> - | <% else %> <%= link_to "Login with Github", github_login_path %> <% end %> | - <%= link_to "Cart ( #{ Order.cart_item_count(session) })", cart_path %> + <%= link_to "Cart (#{ Order.cart_item_count(session) })", cart_path %>
    diff --git a/db/migrate/20200617183343_create_reviews.rb b/db/migrate/20200617183343_create_reviews.rb new file mode 100644 index 0000000000..b061ed3514 --- /dev/null +++ b/db/migrate/20200617183343_create_reviews.rb @@ -0,0 +1,11 @@ +class CreateReviews < ActiveRecord::Migration[6.0] + def change + create_table :reviews do |t| + t.string :title + t.integer :rating + t.string :description + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index bd50d4abac..d55596c1b8 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_17_014820) do +ActiveRecord::Schema.define(version: 2020_06_17_183343) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -83,6 +83,14 @@ t.index ["merchant_id"], name: "index_products_on_merchant_id" end + create_table "reviews", force: :cascade do |t| + t.string "title" + t.integer "rating" + t.string "description" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + end + add_foreign_key "order_items", "orders" add_foreign_key "order_items", "products" add_foreign_key "orders", "merchants" 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 014308ee80f8284b0be40984d9992da610679d22 Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 12:21:18 -0700 Subject: [PATCH 161/234] added todo comments --- app/models/merchant.rb | 2 +- app/models/order.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index fca700ac3a..4b2180a296 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -2,7 +2,7 @@ class Merchant < ApplicationRecord validates :username, :email, :uid, :provider, presence: :true has_many :products - has_many :orders + has_many :orders # TODO REMOVE THIS def self.build_from_github(auth_hash) merchant = Merchant.new diff --git a/app/models/order.rb b/app/models/order.rb index af41133e7f..19292306b0 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,7 +2,7 @@ class Order < ApplicationRecord has_many :order_items - has_many :merchants + has_many :merchants # TODO REMOVE THIS has_many :products, through: :order_items validates :card_number, From 977c999c29a05553565a97ad66fa1112c7e91faf Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 13:10:49 -0700 Subject: [PATCH 162/234] only display active products in full products list --- app/controllers/products_controller.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 65aca5e55b..7a6856923e 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -2,8 +2,7 @@ class ProductsController < ApplicationController skip_before_action :require_login, only: [:index, :show] def index - @products = Product.all - # TODO add status active + @products = Product.where(status: "true") end def new From cca5a8531588c210e24ce925d2a4d23b5d6648c0 Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 13:11:20 -0700 Subject: [PATCH 163/234] add active checkbox to prooduct form --- app/views/products/_form.html.erb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb index 71a53dbb0c..7e031cc957 100644 --- a/app/views/products/_form.html.erb +++ b/app/views/products/_form.html.erb @@ -32,6 +32,11 @@ <%= collection_check_boxes(:product, :category_ids, Category.all, :id, :name) %>
    +
    + <%= f.label "Display this product:" %> + <%= f.check_box :status %> +
    +
    <%= f.submit action_name, class: "btn btn-primary" %>
    From b86b2085dc4f13213cb19bddfc4c24035d605350 Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 13:38:33 -0700 Subject: [PATCH 164/234] hide inactive product page if not creator --- app/controllers/products_controller.rb | 7 +++++++ app/views/products/show.html.erb | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 7a6856923e..7448e6a762 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -30,6 +30,13 @@ def show head :not_found return end + + if @product.status == false && @product.merchant_id != session[:user_id] + flash[:error] = "Oops. That plant isn't available. Let's find you another beautiful plant." + redirect_to products_path + return + + end end def edit diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index cbc297baa1..f3864fa377 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,6 +1,6 @@
    - <% if @product.photo_url == nil || @product.photo_url.length < 1 %> + <% if @product.photo_url == nil || @product.photo_url.length < 1 %> <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant silhouette", class: "product-image") %> <% else %> <%= image_tag(@product.photo_url, :alt => @product.name, class:"product-image") %> From 88370cd02f5aa818386fff725eec25aab512436e Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 14:31:48 -0700 Subject: [PATCH 165/234] add review section to product page --- app/assets/stylesheets/products.scss | 15 +++++++++++---- app/views/products/show.html.erb | 20 ++++++++++++-------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index fea0a19f7d..76e3669d9d 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -32,16 +32,18 @@ .product-show { display: grid; grid-template-columns: auto 1fr; + grid-template-rows: 1fr auto; + grid-template-areas: "image info" "reviews reviews"; } -.product-show img { - grid-column: 1 / 2; - margin-right: 3em; +.product-image { + grid-area: image; + margin: 0 7em 0 2em; width: 35em; } .product-show-info { - grid-column: 2 / 3; + grid-area: info; } .product-show-info ul { @@ -49,6 +51,11 @@ padding: 0; } +.product-reviews { + grid-area: reviews; + margin-top: 3em; +} + .product-submit-quantity { margin: 2em 0; } diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index cbc297baa1..0f14f8cab5 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,10 +1,11 @@ -
    - <% if @product.photo_url == nil || @product.photo_url.length < 1 %> - <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant silhouette", class: "product-image") %> - <% else %> - <%= image_tag(@product.photo_url, :alt => @product.name, class:"product-image") %> - <% end %> +
    + <% if @product.photo_url == nil || @product.photo_url.length < 1 %> + <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant silhouette", class: "product-image") %> + <% else %> + <%= image_tag(@product.photo_url, :alt => @product.name, class:"product-image") %> + <% end %> +

    @@ -36,7 +37,7 @@ <%= f.submit 'Add to Cart', class:"btn btn-info" %>

    - + <% end %> <% if @product.merchant_id == session[:user_id] %>

    @@ -44,6 +45,9 @@

    <% end %>
    - <% end %> + +
    +

    Reviews

    +
    \ No newline at end of file From 3ee2a791a1c5cffbfdee42ae80c38e506adadbbe Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 14:38:59 -0700 Subject: [PATCH 166/234] generate reviews controller --- app/assets/stylesheets/reviews.scss | 3 +++ app/controllers/reviews_controller.rb | 2 ++ app/helpers/reviews_helper.rb | 2 ++ test/controllers/reviews_controller_test.rb | 7 +++++++ 4 files changed, 14 insertions(+) create mode 100644 app/assets/stylesheets/reviews.scss create mode 100644 app/controllers/reviews_controller.rb create mode 100644 app/helpers/reviews_helper.rb create mode 100644 test/controllers/reviews_controller_test.rb diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss new file mode 100644 index 0000000000..6457abefb6 --- /dev/null +++ b/app/assets/stylesheets/reviews.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Reviews controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb new file mode 100644 index 0000000000..b3d77cc1c3 --- /dev/null +++ b/app/controllers/reviews_controller.rb @@ -0,0 +1,2 @@ +class ReviewsController < ApplicationController +end diff --git a/app/helpers/reviews_helper.rb b/app/helpers/reviews_helper.rb new file mode 100644 index 0000000000..682b7b1abc --- /dev/null +++ b/app/helpers/reviews_helper.rb @@ -0,0 +1,2 @@ +module ReviewsHelper +end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb new file mode 100644 index 0000000000..444c98848f --- /dev/null +++ b/test/controllers/reviews_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe ReviewsController do + # it "does a thing" do + # value(1+1).must_equal 2 + # end +end From ee565044f4f78118f2df7fa31da0cbf1c46b8a32 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 15:01:01 -0700 Subject: [PATCH 167/234] relate reviews to product --- app/controllers/reviews_controller.rb | 5 +++++ app/views/products/show.html.erb | 6 ++++++ db/migrate/20200617220004_add_product_to_reviews.rb | 5 +++++ db/schema.rb | 8 +++++++- 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20200617220004_add_product_to_reviews.rb diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index b3d77cc1c3..9e95acef5c 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,2 +1,7 @@ class ReviewsController < ApplicationController + + def index + product = Product.find_by(id: params[:product_id]) + + end end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 0f14f8cab5..d48ef8ab55 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -48,6 +48,12 @@

    Reviews

    + + <% if @product.reviews.length > 0 %> + i have reviews + <% else %> + No reviews yet! + <% end %>
    \ No newline at end of file diff --git a/db/migrate/20200617220004_add_product_to_reviews.rb b/db/migrate/20200617220004_add_product_to_reviews.rb new file mode 100644 index 0000000000..0603f6076a --- /dev/null +++ b/db/migrate/20200617220004_add_product_to_reviews.rb @@ -0,0 +1,5 @@ +class AddProductToReviews < 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 d55596c1b8..17bb04efd4 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_17_183343) do +ActiveRecord::Schema.define(version: 2020_06_17_220004) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -80,7 +80,9 @@ t.bigint "merchant_id" t.boolean "status" t.string "photo_url" + t.bigint "review_id" t.index ["merchant_id"], name: "index_products_on_merchant_id" + t.index ["review_id"], name: "index_products_on_review_id" end create_table "reviews", force: :cascade do |t| @@ -89,10 +91,14 @@ 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 "order_items", "orders" add_foreign_key "order_items", "products" add_foreign_key "orders", "merchants" add_foreign_key "products", "merchants" + add_foreign_key "products", "reviews" + add_foreign_key "reviews", "products" end From 6dad8a09a69f5fb27bc88236396394db37c7a3a3 Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 15:10:17 -0700 Subject: [PATCH 168/234] only show active plants on cat/merch lists --- app/views/categories/show.html.erb | 48 ++++++++++++++++-------------- app/views/merchants/show.html.erb | 48 ++++++++++++++++-------------- 2 files changed, 50 insertions(+), 46 deletions(-) diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index 63e59b989d..6354e34e2d 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -8,29 +8,31 @@ <% else %>
    <% @category.products.each do |product| %> -
      -
    • - <% if product.photo_url == nil || product.photo_url.length < 1 %> - <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant black and white silhoutte") %> - <% else %> - <%= image_tag(product.photo_url, :alt => product.name ) %> - <% end %> -
      -
      - <%= link_to product.name, product_path( product.id ) %> -
      -
      -
      -
      - Cost: $<%= sprintf('%.2f', product.price) %> -
      -
      - Inventory: - <%= product.inventory %> -
      -
      -
    • -
    + <% if product.status == true %> +
      +
    • + <% if product.photo_url == nil || product.photo_url.length < 1 %> + <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant black and white silhoutte") %> + <% else %> + <%= image_tag(product.photo_url, :alt => product.name ) %> + <% end %> +
      +
      + <%= link_to product.name, product_path( product.id ) %> +
      +
      +
      +
      + Cost: $<%= sprintf('%.2f', product.price) %> +
      +
      + Inventory: + <%= product.inventory %> +
      +
      +
    • +
    + <% end %> <% end %>
    <% end %> diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 1f8edbf600..87908b6162 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -8,29 +8,31 @@
    <% products = Product.where(merchant_id: @merchant.id)%> <% products.each do |product| %> -
      -
    • - <% if product.photo_url == nil || product.photo_url.length < 1 %> - <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant black and white silhoutte") %> - <% else %> - <%= image_tag(product.photo_url, :alt => product.name ) %> - <% end %> -
      -
      - <%= link_to product.name, product_path( product.id ) %> -
      -
      -
      -
      - Cost: $<%= sprintf('%.2f', product.price) %> -
      -
      - Inventory: - <%= product.inventory %> -
      -
      -
    • -
    + <% if product.status == true %> +
      +
    • + <% if product.photo_url == nil || product.photo_url.length < 1 %> + <%= image_tag("https://www.creativefabrica.com/wp-content/uploads/2019/10/01/Plant-Flower-Leaf-Agriculture-Icon-by-Hoeda80-11-580x386.jpg", :alt => "generic plant black and white silhoutte") %> + <% else %> + <%= image_tag(product.photo_url, :alt => product.name ) %> + <% end %> +
      +
      + <%= link_to product.name, product_path( product.id ) %> +
      +
      +
      +
      + Cost: $<%= sprintf('%.2f', product.price) %> +
      +
      + Inventory: + <%= product.inventory %> +
      +
      +
    • +
    + <% end %> <% end %>
    <% end %> From 3cf07b57c42f2622df27676bb94265d9f51d55d5 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 15:41:10 -0700 Subject: [PATCH 169/234] styling --- app/assets/stylesheets/application.scss | 2 +- app/assets/stylesheets/products.scss | 20 ++++++++++++++- app/assets/stylesheets/reviews.scss | 4 +++ app/controllers/reviews_controller.rb | 27 ++++++++++++++++++-- app/views/products/show.html.erb | 33 +++++++++++++++++++++++-- config/routes.rb | 1 + 6 files changed, 81 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index d2d6b1cb91..44e03e211d 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -23,7 +23,7 @@ body { font-family: 'Roboto', sans-serif; } -header, h1, h2, h3 { +header, h1, h2, h3, h4, h5 { font-family: 'Nunito', sans-serif; } diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index 76e3669d9d..3dccf90b7e 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -46,7 +46,7 @@ grid-area: info; } -.product-show-info ul { +.product-show-info ul, .product-reviews ul { list-style-type: none; padding: 0; } @@ -54,6 +54,24 @@ .product-reviews { grid-area: reviews; margin-top: 3em; + text-align: center; +} + +.product-reviews h3, .product-reviews h4 { + margin: 1.5em 0 1em; +} + +.product-reviews h5 { + color: darkolivegreen; +} + +.product-reviews ul { + border-bottom: 1px solid darkolivegreen; + padding-bottom: 1em; +} + +.product-reviews input, .product-reviews textarea { + width: 50vw; } .product-submit-quantity { diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss index 6457abefb6..3451cc44bf 100644 --- a/app/assets/stylesheets/reviews.scss +++ b/app/assets/stylesheets/reviews.scss @@ -1,3 +1,7 @@ // 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/ + +.product-reviews input, .product-reviews textarea { + width: 50vw; +} \ No newline at end of file diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 9e95acef5c..1e51c8c38c 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,7 +1,30 @@ class ReviewsController < ApplicationController - def index - product = Product.find_by(id: params[:product_id]) + skip_before_action :verify_authenticity_token + skip_before_action :require_login + + def create + @review = Review.new( + title: review_params[:title], + rating: review_params[:rating], + description: review_params[:description], + product_id: params[:product_id] + ) + if @review.save! + flash[:success] = "Your review was added." + redirect_back fallback_location: root_path + return + else + flash.now[:failure] = "Error: Review could not be added." + redirect_back fallback_location: root_path + return + end + end + + private + + def review_params + return params.require(:review).permit(:title, :rating, :description, :product_id) end end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index d48ef8ab55..9b1139043d 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -24,7 +24,7 @@ - <%= form_for :order_item, url: product_order_items_path(@product.id) do |f| %> + <%= form_for :order_item, url: product_order_items_path(@product.id) do |f| %>
    <%= f.label :quantity %>
    @@ -50,10 +50,39 @@

    Reviews

    <% if @product.reviews.length > 0 %> - i have reviews + <% @product.reviews.each do |review| %> +
      +
    • +
      <%= review.title %>
      +
    • +
    • + <%= review.rating %> +
    • +
    • + <%= review.description %> +
    • +
    + <% end %> <% else %> No reviews yet! <% end %> + +

    Leave a Review

    + <%= form_for :review, url: product_reviews_path(@product.id) do |f| %> +
    + <%= f.label :title %>
    + <%= f.text_field :title %> +
    +
    + <%= f.label :rating %>
    + <%= f.text_field :rating %> +
    +
    + <%= f.label :description %>
    + <%= f.text_area :description %> +
    + <%= f.submit 'Submit', class:"btn btn-info" %> + <% end %>
    \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 9332c67d49..7a0ef88d23 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,6 +6,7 @@ # /product/1/order_items resources :products do resources :order_items + resources :reviews, only: [:new, :create] end get "/auth/github", as: "github_login" From 36e00b74507d6c4bfdaf7c7be7bdc01e1c1f7d66 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 15:42:48 -0700 Subject: [PATCH 170/234] add validations --- app/models/review.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/models/review.rb b/app/models/review.rb index f020dbcf60..2229fb402e 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,4 +1,7 @@ class Review < ApplicationRecord belongs_to :product + validates :title, presence: true + validates :rating, presence: true + validates :description, presence: true end From 91f8a009aa092a1719296ccbd050562676fb16cc Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 16:14:53 -0700 Subject: [PATCH 171/234] fixtures + cannot leave review if you are the product's merchant --- app/controllers/reviews_controller.rb | 13 +++++++------ app/views/products/show.html.erb | 5 ++++- test/fixtures/reviews.yml | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 test/fixtures/reviews.yml diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 1e51c8c38c..2c825a17b0 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -11,20 +11,21 @@ def create product_id: params[:product_id] ) - if @review.save! + if @review.save && (session[:user_id] != params[:merchant_id]) flash[:success] = "Your review was added." - redirect_back fallback_location: root_path - return + elsif (session[:user_id] == params[:merchant_id]) + flash.now[:failure] = "You cannot review your own product." else flash.now[:failure] = "Error: Review could not be added." - redirect_back fallback_location: root_path - return end + + redirect_back fallback_location: root_path + return end private def review_params - return params.require(:review).permit(:title, :rating, :description, :product_id) + return params.require(:review).permit(:title, :rating, :description, :product_id, :merchant_id) end end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 9b1139043d..bcbfe22a29 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -81,7 +81,10 @@ <%= f.label :description %>
    <%= f.text_area :description %> - <%= f.submit 'Submit', class:"btn btn-info" %> + <%= f.hidden_field :merchant_id, :value => @product.merchant_id %> +
    + <%= f.submit 'Submit', class:"btn btn-info" %> +
    <% end %> diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml new file mode 100644 index 0000000000..1fb5011edf --- /dev/null +++ b/test/fixtures/reviews.yml @@ -0,0 +1,15 @@ +review_1: + title: Best Plant Ever + rating: 5 + description: I have never had a better plant. + product: product_1 +review_2: + title: Wilted + rating: 3 + description: It's not doing too good. + product: product_1 +review_3: + title: This plant sucks + rating: 1 + description: Boooooooo + product: product_2 \ No newline at end of file From bacf3935712af135ff80d824756eeb1596951deb Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 17 Jun 2020 16:40:49 -0700 Subject: [PATCH 172/234] destroy test created, passing --- .../order_items_controller_test.rb | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 85dc081634..3c03e1a089 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -32,7 +32,6 @@ get product_order_items_path(@test_product1.id) must_respond_with :success body = JSON.parse(response.body) - puts body expect(body.length).must_equal 2 expect(body[0]["name"]).must_equal @test_product1.name end @@ -70,8 +69,27 @@ end end + describe "update" do + + end + + describe "destroy" do + it "destroys an existing order item, creates a flash, then redirects" do + expect{ + delete order_item_path(@new_order_item.id) + }.must_change "OrderItem.count", -1 + + must_respond_with :redirect + must_redirect_to cart_path + end - #KATE WILL FINISH UPDATE AND DESTOY TESTS WEDNESDAY!!!!!!!# + it "renders 404 not_found, does not update the DB for invalid order item" do + expect { + delete order_item_path(-1) + }.wont_change "OrderItem.count" + must_respond_with :not_found + end + end end From 54a4f68b4941c055556b0158d45716420951fe0a Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 17 Jun 2020 17:15:44 -0700 Subject: [PATCH 173/234] test for update method complete and passing --- .../order_items_controller_test.rb | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 3c03e1a089..a93a92abc1 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -44,7 +44,6 @@ params: new_item_hash }.must_change "Product.find(#{@test_product1.id}).order_items.count", 2 - found_order_item = OrderItem.find_by(order_id: session[:order_id]) #new_order = Order.first @@ -65,12 +64,27 @@ }.wont_change 'OrderItem.count' must_redirect_to root_path - end end describe "update" do - + it "can update an existing order item, creates a flash, then redirects" do + expect{ + patch order_item_path(@new_order_item.id), params: new_item_hash + }.wont_change "OrderItem.count" + + must_respond_with :redirect + must_redirect_to cart_path + end + + it "renders 404 not_found, does not update in the DB for invalid order item" do + expect { + patch order_item_path(@new_order_item.id), params: new_item_hash + }.wont_change "OrderItem.count" + + must_respond_with :redirect + must_redirect_to cart_path + end end describe "destroy" do @@ -83,7 +97,7 @@ must_redirect_to cart_path end - it "renders 404 not_found, does not update the DB for invalid order item" do + it "renders 404 not_found, does not destroy in the DB for invalid order item" do expect { delete order_item_path(-1) }.wont_change "OrderItem.count" From 678c3978b753664f4420e22f1bd98871a09f6818 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 20:47:23 -0700 Subject: [PATCH 174/234] controller tests for reviews --- app/controllers/merchants_controller.rb | 2 +- app/controllers/reviews_controller.rb | 21 ++++++-- test/controllers/reviews_controller_test.rb | 59 +++++++++++++++++++-- test/fixtures/reviews.yml | 15 ------ test/test_helper.rb | 14 +++++ 5 files changed, 88 insertions(+), 23 deletions(-) delete mode 100644 test/fixtures/reviews.yml diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index b08562d2b2..9cfac5b9de 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -23,7 +23,7 @@ def create else merchant = Merchant.build_from_github(auth_hash) - if merchant.save! + if merchant.save flash[:success] = "Logged in as new merchant #{merchant.username}" else flash[:error] = "Could not create new merchant account: #{merchant.errors.messages}" diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 2c825a17b0..0969d9b450 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -10,12 +10,25 @@ def create description: review_params[:description], product_id: params[:product_id] ) - - if @review.save && (session[:user_id] != params[:merchant_id]) - flash[:success] = "Your review was added." - elsif (session[:user_id] == params[:merchant_id]) + + merchant_id = Product.find_by(id: params[:product_id]).merchant_id + + # p @review.valid? + # p params + # p "SESSION: #{session[:user_id]} AND #{session[:user_id].class}" + # p "MERCHANT PARAM: #{merchant_id} AND #{merchant_id.class}" + + if (session[:user_id] == merchant_id) + p "session matches merchant" + flash.now[:failure] = "You cannot review your own product." + elsif @review.save && (session[:user_id] != merchant_id) + p "success" + + flash[:success] = "Your review was added." else + p "idk" + flash.now[:failure] = "Error: Review could not be added." end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 444c98848f..5d2bb6c4e9 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -1,7 +1,60 @@ require "test_helper" describe ReviewsController do - # it "does a thing" do - # value(1+1).must_equal 2 - # end + before do + @merchant = merchants(:merchant_1) + @product = products(:product_1) + end + + let (:create_review) { + { + review: { + title: 'So Good', + rating: 5, + description: 'How did I get such a perfect plant', + merchant_id: merchants(:merchant_1).id + }, + } + } + describe "create" do + + it "leaves a review when not logging in" do + expect { + post product_reviews_path(product_id: @product.id), params: create_review + }.must_change 'Review.count', 1 + + new_review = Review.find_by(product_id: @product.id) + + expect(new_review.title).must_equal 'So Good' + expect(new_review.rating).must_equal 5 + expect(new_review.description).must_equal 'How did I get such a perfect plant' + end + + it "leaves a review if you are logged in and NOT the product's merchant" do + perform_login(merchants(:merchant_2)) + + expect { + post product_reviews_path(product_id: @product.id), params: create_review + }.must_change 'Review.count', 1 + end + + it "does not leave a review if you are logged in as the product's merchant" do + perform_login(merchants(:merchant_1)) + + expect(session[:user_id]).must_equal merchants(:merchant_1).id + + expect { + post product_reviews_path(product_id: @product.id), params: create_review + }.wont_change 'Review.count' + end + + it "review is invalid if validations fail" do + create_review[:review][:title] = nil + + expect { + post product_reviews_path(product_id: @product.id), params: create_review + }.wont_change 'Review.count' + end + end + end diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml deleted file mode 100644 index 1fb5011edf..0000000000 --- a/test/fixtures/reviews.yml +++ /dev/null @@ -1,15 +0,0 @@ -review_1: - title: Best Plant Ever - rating: 5 - description: I have never had a better plant. - product: product_1 -review_2: - title: Wilted - rating: 3 - description: It's not doing too good. - product: product_1 -review_3: - title: This plant sucks - rating: 1 - description: Boooooooo - product: product_2 \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 45e4435a3b..3aa2c4deb9 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -34,6 +34,10 @@ class ActiveSupport::TestCase # Add more helper methods to be used by all tests here... + def setup + OmniAuth.config.test_mode = true + end + def mock_auth_hash(merchant) return { provider: merchant.provider, @@ -44,4 +48,14 @@ def mock_auth_hash(merchant) } } end + + def perform_login(user = nil) + user ||= User.first + + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) + + get "/auth/github/callback" + + return user + end end From 27b00fd872da15b8ef05f5184d0fa962075bdcdf Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Wed, 17 Jun 2020 20:48:43 -0700 Subject: [PATCH 175/234] Started implementing merchant's total revenue method. Also prevents non-logged-in user from creating a new product --- app/controllers/merchants_controller.rb | 1 + app/controllers/orders_controller.rb | 3 ++- app/controllers/products_controller.rb | 6 +++++- app/models/merchant.rb | 21 +++++++++++++++++++++ app/views/layouts/application.html.erb | 2 +- app/views/merchants/dashboard.html.erb | 8 ++++++-- app/views/products/new.html.erb | 6 +++++- config/routes.rb | 1 + 8 files changed, 42 insertions(+), 6 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index ad0ef501b7..3a9ea221ee 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -42,6 +42,7 @@ def dashboard # flash[:error] = "You are not authorized to view this page" else @merchant = Merchant.find_by(id: session[:user_id], provider: "github") + # @total_revenue = Merchant.total_revenue end end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index bd6192a08a..22f8af3d0a 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -10,7 +10,8 @@ def index #GET /orders/:id def show order_id = params[:id].to_i - @order = Order.find_by_id(order_id) + merchant_id = session[:user_id].to_i + @order = Order.find_by_id(merchant_id, order_id) if @order.nil? head :not_found diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index cef3e901c5..52f67ce3a0 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -8,7 +8,11 @@ def index end def new - @product = Product.new + if session[:user_id] + @product = Product.new + else + flash[:error] = "Please log in to create a new product!" + end end def create diff --git a/app/models/merchant.rb b/app/models/merchant.rb index d3ce42aa2e..828ccd20cc 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -13,4 +13,25 @@ def self.build_from_github(auth_hash) return merchant end + + # def self.total_revenue + # merchant = Merchant.find_by(id: session[:user_id], provider: "github") + # total = 0 + + # if merchant.orders.length == 0 + # return total + # else + # merchant.orders.each do |order| + # order.order_items.each do |order_item| + # total += (order_item.price * order_item.quantity) + # end + # end + # end + + # return total + # end + + # self.order_items.each do |oi| + # order_merchant = oi.product.merchant + # 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 9dbc5ba696..3fcd635102 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -24,7 +24,7 @@
    diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 87908b6162..3206106a38 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -27,7 +27,11 @@
    Inventory: - <%= product.inventory %> + <% if product.inventory == 0 %> + SOLD OUT + <% else %> + <%= product.inventory %> + <% end %>
    diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 12c3625206..031d482c49 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -18,7 +18,12 @@ Cost: <%= number_to_currency(product.price) %>
  • - Quantity: <%= product.inventory %> + Quantity: + <% if product.inventory == 0 %> + SOLD OUT + <% else %> + <%= product.inventory %> + <% end %>
  • <% end %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index bcbfe22a29..7d5eea06a7 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -17,28 +17,38 @@

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

  • - Stock: <%= @product.inventory %> + Stock: + <% if @product.inventory == 0 %> + SOLD OUT + <% else %> + <%= @product.inventory %> + <% end %>
  • <%= @product.description %>
  • - - <%= form_for :order_item, url: product_order_items_path(@product.id) do |f| %> -
    -
    - <%= f.label :quantity %>
    - <%= f.text_field :quantity %> -
    - <%= f.hidden_field :name, :value => @product.name %> - <%= f.hidden_field :price, :value => @product.price %> - <%= f.hidden_field :photo_url, :value => @product.photo_url %> -
    - <%= f.submit 'Add to Cart', class:"btn btn-info" %> -
    -
    + <% if @product.inventory > 0 %> + <%= form_for :order_item, url: product_order_items_path(@product.id) do |f| %> +
    +
    + <%= f.label :quantity %>
    + <%= f.text_field :quantity %> +
    + <%= f.hidden_field :name, :value => @product.name %> + <%= f.hidden_field :price, :value => @product.price %> + <%= f.hidden_field :photo_url, :value => @product.photo_url %> +
    + <%= f.submit 'Add to Cart', class:"btn btn-info" %> +
    +
    + <% end %> + <% else %> +

    +
    + Please check back, or see what else <%= link_to @product.merchant.username, merchant_path(@product.merchant.id) %> has available. +

    <% end %> - <% if @product.merchant_id == session[:user_id] %>

    <%= link_to "Edit this product listing", edit_product_path(@product.id) %> diff --git a/db/schema.rb b/db/schema.rb index 17bb04efd4..f487317adc 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -80,9 +80,7 @@ t.bigint "merchant_id" t.boolean "status" t.string "photo_url" - t.bigint "review_id" t.index ["merchant_id"], name: "index_products_on_merchant_id" - t.index ["review_id"], name: "index_products_on_review_id" end create_table "reviews", force: :cascade do |t| @@ -99,6 +97,5 @@ add_foreign_key "order_items", "products" add_foreign_key "orders", "merchants" add_foreign_key "products", "merchants" - add_foreign_key "products", "reviews" add_foreign_key "reviews", "products" end From c022ff6945583d0772ead8f7f4a44d08e13f8865 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 22:05:21 -0700 Subject: [PATCH 179/234] cart bug fixes + test fixes --- app/controllers/order_items_controller.rb | 6 +++- app/models/order.rb | 6 +--- app/models/order_item.rb | 8 ++++- .../order_items_controller_test.rb | 34 ++++++++++++++----- test/models/order_item_test.rb | 10 ++++++ 5 files changed, 48 insertions(+), 16 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index fc253a564b..72c3f736ec 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -65,15 +65,19 @@ def create # PATCH: /order_items/:id (params) def update @order_item = OrderItem.find_by(id: params[:id]) + + p params if @order_item.nil? head :not_found return - elsif @order_item.check_product_inventory + elsif @order_item.update_product_inventory(order_items_params[:quantity]) + p "herereee?" @order_item.update(order_items_params) flash[:success] = 'Order item quantity updated.' redirect_to cart_path return else + p "here?" flash[:failure] = 'Not enough inventory to update quantity.' redirect_to cart_path return diff --git a/app/models/order.rb b/app/models/order.rb index 8052fa4af4..306f542ef9 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,5 +1,3 @@ -# frozen_string_literal: true - class Order < ApplicationRecord has_many :order_items has_many :merchants, through: :products @@ -68,9 +66,7 @@ def purchase_changes end def self.cart_item_count(session) - if session[:order_id] == nil - '0' - elsif Order.find_by(id: session[:order_id]).nil? + if session[:order_id] == nil || Order.find_by(id: session[:order_id]).nil? '0' else return Order.find_by(id: session[:order_id]).order_items.length diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 0d533d04d6..c7706ed6c1 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -1,6 +1,5 @@ class OrderItem < ApplicationRecord belongs_to :product - # has_one :product belongs_to :order validates :name, presence: true @@ -8,12 +7,19 @@ class OrderItem < ApplicationRecord def check_product_inventory return false if self.quantity == nil || self.quantity == 0 + incoming_quantity = self.quantity matching_product = Product.find_by(id: self.product_id) matching_product.inventory >= incoming_quantity ? true : false end + def update_product_inventory(incoming_quantity) + matching_product = Product.find_by(id: self.product_id) + + matching_product.inventory >= incoming_quantity.to_i ? true : false + end + def check_order_item_existence(order_id) order = Order.find_by(id: order_id) matching_item = order.order_items.find_by(product_id: self.product_id) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index a93a92abc1..283bcd7456 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -1,5 +1,3 @@ -# frozen_string_literal: true - require 'test_helper' describe OrderItemsController do @@ -40,12 +38,10 @@ describe "create" do it "can create a new OrderItem with valid information accurately, and redirect" do expect { - post product_order_items_path(@test_product1.id), - params: new_item_hash + post product_order_items_path(@test_product1.id), params: new_item_hash }.must_change "Product.find(#{@test_product1.id}).order_items.count", 2 found_order_item = OrderItem.find_by(order_id: session[:order_id]) - #new_order = Order.first expect(found_order_item.name).must_equal new_item_hash[:order_item][:name] expect(found_order_item.price).must_equal new_item_hash[:order_item][:price] @@ -68,23 +64,43 @@ end describe "update" do + + let (:update_hash) { + { + order_item: { + quantity: 3, + } + } + } + it "can update an existing order item, creates a flash, then redirects" do - expect{ - patch order_item_path(@new_order_item.id), params: new_item_hash + expect { + patch order_item_path(@new_order_item.id), params: update_hash }.wont_change "OrderItem.count" must_respond_with :redirect must_redirect_to cart_path end - it "renders 404 not_found, does not update in the DB for invalid order item" do + it "does not update if there is not enough inventory" do + update_hash[:order_item][:quantity] = 1000000 + expect { - patch order_item_path(@new_order_item.id), params: new_item_hash + patch order_item_path(@new_order_item.id), params: update_hash }.wont_change "OrderItem.count" + expect(flash[:failure]).must_equal 'Not enough inventory to update quantity.' must_respond_with :redirect must_redirect_to cart_path end + + it "renders 404 not_found, does not update in the DB for nil input" do + expect { + patch order_item_path(-1), params: update_hash + }.wont_change "OrderItem.count" + + must_respond_with :not_found + end end describe "destroy" do diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index 0ff94dbfa8..32755f7657 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -36,5 +36,15 @@ expect(@valid_order_item.order).must_be_instance_of Order end end + + describe "update_product_inventory" do + it "returns true if product inventory is adequate for updating cart" do + expect(order_items(:order_item4).update_product_inventory(1)).must_equal true + end + + it "returns false if product inventory is inadequate for updating cart" do + expect(order_items(:order_item4).update_product_inventory(10)).must_equal false + end + end end From f83d01aadb4e853aa57cda4b52e2f5ce56d4bead Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 22:20:07 -0700 Subject: [PATCH 180/234] test coverage --- app/controllers/orders_controller.rb | 3 +-- test/controllers/orders_controller_test.rb | 18 ++++++------------ test/models/order_test.rb | 6 +++--- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index d0f37b00e2..959a4d794b 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -10,8 +10,7 @@ def index #GET /orders/:id def show - order_id = params[:id].to_i - @order = Order.find_by_id(order_id) + @order = Order.find_by(id: params[:id]) if @order.nil? head :not_found diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index fa55e05a41..d817795f32 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -31,7 +31,7 @@ it "responds with success when there are many orders saved" do new_order = Order.create get orders_path - must_respond_with :success + must_respond_with :found end it "responds with success when there are no orders saved" do @@ -40,18 +40,20 @@ expect(Order.count).must_equal 0 get orders_path - must_respond_with :success + must_respond_with :found end end describe "show" do it "responds with success when showing an existing valid order" do + perform_login(merchants(:merchant_1)) new_order = Order.create get order_path(new_order.id) must_respond_with :success end it "responds with 404 with an invalid order id" do + perform_login(merchants(:merchant_1)) get order_path(-1) must_respond_with :not_found end @@ -123,15 +125,8 @@ describe "cart" do it "finds a list of orders if session order is populated" do - expect { - post product_order_items_path(@product.id), params: new_item_hash - }.must_change 'OrderItem.count', 1 - - new_order = Order.find_by(id: session[:order_id]) - cart_items = new_order.order_items - - expect(session[:order_id]).must_equal new_order.id - expect(cart_items.length).must_equal 1 + get cart_path + must_respond_with :success end end @@ -148,7 +143,6 @@ ) get checkout_path - must_respond_with :found end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 1b3749673e..de30bb6911 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -135,12 +135,12 @@ describe 'total price' do it 'calculates the order total correctly' do - expect(orders(:order3).total_price).must_equal 65.0 + expect(orders(:order3).total_price).must_be_close_to 18.99 end it 'returns 0.0 if the order has no items' do - expect(orders(:order1).valid?).must_equal true - expect(orders(:order1).total_price).must_equal 0.0 + empty_order = Order.new + expect(empty_order.total_price).must_equal 0.0 end end From a320263fcaa44bf616e67e0587aa5e9db9172459 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 17 Jun 2020 22:20:34 -0700 Subject: [PATCH 181/234] check product inventory custom method test --- test/models/order_item_test.rb | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index 0ff94dbfa8..929c31a0bd 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -2,11 +2,10 @@ describe OrderItem do before do - @order_item = OrderItem.new(name: "order_item1") + @order_item = OrderItem.create(name: "order_item1") @new_product = products(:product_1) @new_order = Order.create @valid_order_item = OrderItem.create!(name: @new_product.name, price: @new_product.price, quantity: @new_product.inventory, product_id: @new_product.id, order_id: @new_order.id) - end describe "validations" do @@ -36,5 +35,34 @@ expect(@valid_order_item.order).must_be_instance_of Order end end + + describe "check product inventory" do + it "returns true if inventory is available" do + expect(@valid_order_item.check_product_inventory).must_equal true + end + + it "returns false if inventory not available" do + @valid_order_item.product.inventory = 0 + @valid_order_item.product.save + expect(@valid_order_item.check_product_inventory).must_equal false + end + end + + describe "check order item existence" do + + end + + describe "reduce inventory" do + + end + + describe "add inventory" do + + + end + + + + end From b6029bbd980ffe47030c46029916036682bcc4fb Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 22:27:29 -0700 Subject: [PATCH 182/234] only add review of rating 1 to 5 --- app/models/review.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/models/review.rb b/app/models/review.rb index 2229fb402e..1d9c1a806c 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -2,6 +2,8 @@ class Review < ApplicationRecord belongs_to :product validates :title, presence: true - validates :rating, presence: true + validates :rating, + presence: true, + :inclusion => 1..5 validates :description, presence: true end From 1d3aad271ee7ad54bcd67791c77a59559740af63 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Wed, 17 Jun 2020 22:28:42 -0700 Subject: [PATCH 183/234] Added logic to show orders for the logged in merchant on the order page as well as finished revenue logic --- app/controllers/merchants_controller.rb | 16 ++++++------ app/controllers/orders_controller.rb | 12 +++++++-- app/models/merchant.rb | 34 ++++++++++++++----------- app/views/merchants/dashboard.html.erb | 7 ++--- app/views/orders/show.html.erb | 12 ++++----- 5 files changed, 47 insertions(+), 34 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 7bc8653c96..931a5e042d 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -5,13 +5,13 @@ def index @merchants = Merchant.all end - def show - @merchant = Merchant.find_by(id: params[:id]) - if @merchant.nil? - head :not_found - return - end - end + # def show + # @merchant = Merchant.find_by(id: params[:id]) + # if @merchant.nil? + # head :not_found + # return + # end + # end def create auth_hash = request.env["omniauth.auth"] @@ -44,7 +44,7 @@ def dashboard # flash[:error] = "You are not authorized to view this page" else @merchant = Merchant.find_by(id: session[:user_id], provider: "github") - # @total_revenue = Merchant.total_revenue + @total_revenue = @merchant.total_revenue end end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index fcf34d6373..eb7e583fe2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -11,8 +11,16 @@ def index #GET /orders/:id def show order_id = params[:id].to_i - merchant_id = session[:user_id].to_i - @order = Order.find_by_id(merchant_id, order_id) + # merchant_id = session[:user_id].to_i + @order = Order.find_by_id(order_id) + # merchant = Merchant.find_by(id: session[:user_id]) + @merchant_items = [] + + @order.order_items.each do |order_item| + if order_item.product.merchant_id == session[:user_id] + @merchant_items << order_item + end + end if @order.nil? head :not_found diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 0ce306e69a..983a533c74 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -14,23 +14,27 @@ def self.build_from_github(auth_hash) return merchant end - # def self.total_revenue - # merchant = Merchant.find_by(id: session[:user_id], provider: "github") - # total = 0 - - # if merchant.orders.length == 0 - # return total - # else - # merchant.orders.each do |order| - # order.order_items.each do |order_item| - # total += (order_item.price * order_item.quantity) - # end - # end - # end - - # return total + # def self.find_order_items + # merchant = Merchant.find_by(id: session[:user_id]) + + # merchant.order_items # end + def total_revenue + + total = 0 + + if self.order_items.length == 0 + return total + else + self.order_items.each do |order_item| + total += (order_item.price * order_item.quantity) + end + end + + return total + end + # self.order_items.each do |oi| # order_merchant = oi.product.merchant # end diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb index 06b0309218..c20179dd33 100644 --- a/app/views/merchants/dashboard.html.erb +++ b/app/views/merchants/dashboard.html.erb @@ -11,12 +11,13 @@

    <%= link_to "Add a product", new_product_path %> <%= link_to "Add a category", new_category_path %> + Total Earnings: $ <%= @merchant.total_revenue %>

    Your Orders:

    - <% if @merchant.orders.length > 0 %> + <% if @merchant.order_items.length > 0 %>
      - <% @merchant.orders.each do |order| %> -
    • Order ID: <%= link_to order[:id], order_path(order.id), method: :get %>
    • + <% @merchant.order_items.each do |order_item| %> +
    • Order: <%= link_to order_item[:id], order_path(order_item.order.id), method: :get %>
    • <% end %>
    <% end %> diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 37b90ba789..7878cc0b52 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -32,13 +32,13 @@
    - <% @order.order_items.each do |order_item| %> + <% @merchant_items.each do |merchant_item| %> - - - - - + + + + + <% end %> From 8c828cded405009a2d0ed2e2b20af8413fd393c3 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 22:31:00 -0700 Subject: [PATCH 184/234] show number of stars depending on rating --- 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 74c9e4a06a..49ac221512 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -56,7 +56,9 @@
    <%= review.title %>
  • - <%= review.rating %> + <% review.rating.times do %> + ★ + <% end %>
  • <%= review.description %> From 27c58b77f1901595e19a6aa0355df7903de36296 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Wed, 17 Jun 2020 22:38:14 -0700 Subject: [PATCH 185/234] Removed unnecessary comments in merchant controller --- app/controllers/merchants_controller.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 931a5e042d..a74b0b1159 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -5,14 +5,6 @@ def index @merchants = Merchant.all end - # def show - # @merchant = Merchant.find_by(id: params[:id]) - # if @merchant.nil? - # head :not_found - # return - # end - # end - def create auth_hash = request.env["omniauth.auth"] From 7b90bb51b4e4e65f50af6f9f10bbd12cd0bf46a6 Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 22:48:43 -0700 Subject: [PATCH 186/234] undid merge --- app/controllers/merchants_controller.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 9201bca1e2..cc101ecda5 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -5,13 +5,13 @@ def index @merchants = Merchant.all end - # def show - # @merchant = Merchant.find_by(id: params[:id]) - # if @merchant.nil? - # head :not_found - # return - # end - # end + def show + @merchant = Merchant.find_by(id: params[:id]) + if @merchant.nil? + head :not_found + return + end + end def create auth_hash = request.env["omniauth.auth"] From 4066f26bf13be16271483933cd81d3d40c04bbf0 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 22:50:52 -0700 Subject: [PATCH 187/234] drop down select rating --- app/views/products/show.html.erb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 49ac221512..6ca474c7aa 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -77,7 +77,15 @@
    <%= f.label :rating %>
    - <%= f.text_field :rating %> + <%= select(:review, :rating, + [ + ['Select', 0], + ['1', 1], + ['2', 2], + ['3', 3], + ['4', 4], + ['5', 5] + ]) %>
    <%= f.label :description %>
    From 1fc4b32b12d129a7e1b8244e16f862e58dcbb637 Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 17 Jun 2020 23:33:19 -0700 Subject: [PATCH 188/234] changed user to merchant --- test/controllers/merchants_controller_test.rb | 2 +- test/test_helper.rb | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 143cead5af..4424d9b1c6 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -59,7 +59,7 @@ def setup session[:user_id].must_equal merchant.id - User.count.must_equal start_count + Merchant.count.must_equal start_count end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 3aa2c4deb9..55ab90191b 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -49,13 +49,13 @@ def mock_auth_hash(merchant) } end - def perform_login(user = nil) - user ||= User.first + def perform_login(merchant = nil) + merchant ||= Merchant.first - OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) get "/auth/github/callback" - return user + return merchant end end From 0873cabb973f8dad2a629dd7b6af3c19926b7ebe Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 23:42:42 -0700 Subject: [PATCH 189/234] dry up create, modify valids --- app/controllers/order_items_controller.rb | 43 ++++++++++++++--------- app/controllers/orders_controller.rb | 1 + app/models/order.rb | 1 - 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 72c3f736ec..709cf3ed4d 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -19,30 +19,41 @@ def index #POST /order_items { :order_item => { :name => "hello", :price => 6, }} def create + @new_item = OrderItem.new( + name: order_items_params[:name], + price: order_items_params[:price], + quantity: order_items_params[:quantity], + product_id: params[:product_id], + photo_url: order_items_params[:photo_url], + # order_id: @new_order.id + ) + if session[:order_id] @open_order = Order.find_by(id: session[:order_id]) - @new_item = OrderItem.new( - name: order_items_params[:name], - price: order_items_params[:price], - quantity: order_items_params[:quantity], - product_id: params[:product_id], - photo_url: order_items_params[:photo_url], - order_id: @open_order.id - ) + # @new_item = OrderItem.new( + # name: order_items_params[:name], + # price: order_items_params[:price], + # quantity: order_items_params[:quantity], + # product_id: params[:product_id], + # photo_url: order_items_params[:photo_url], + # order_id: @open_order.id + # ) + @new_item.order_id = @open_order.id p "SESSION IS HERE" else @new_order = Order.create session[:order_id] = @new_order.id - @new_item = OrderItem.new( - name: order_items_params[:name], - price: order_items_params[:price], - quantity: order_items_params[:quantity], - product_id: params[:product_id], - photo_url: order_items_params[:photo_url], - order_id: @new_order.id - ) + # @new_item = OrderItem.new( + # name: order_items_params[:name], + # price: order_items_params[:price], + # quantity: order_items_params[:quantity], + # product_id: params[:product_id], + # photo_url: order_items_params[:photo_url], + # order_id: @new_order.id + # ) + @new_item.order_id = @new_order.id p "CREATE A SESSION" end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 849dec245b..b6c43ad686 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -37,6 +37,7 @@ def update redirect_to confirmation_path return else + p @open_order.errors flash[:error] = 'Order could not be placed.' redirect_to checkout_path return diff --git a/app/models/order.rb b/app/models/order.rb index 306f542ef9..3248b8d3c9 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -47,7 +47,6 @@ class Order < ApplicationRecord validates :phone_num, presence: true, - format: { with: /\([0-9]{3}\)[0-9]{3}-[0-9]{4}/ }, on: :update def total_price From 5ed7dde0854a80f6448280f0d65bf048bc6c7000 Mon Sep 17 00:00:00 2001 From: kate myer Date: Wed, 17 Jun 2020 23:49:07 -0700 Subject: [PATCH 190/234] add and reduce inventory custom method tests --- test/models/order_item_test.rb | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index 929c31a0bd..99f4fe839a 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -53,16 +53,20 @@ end describe "reduce inventory" do - + it "reduces correctly" do + expect{@valid_order_item.reduce_inventory}.must_change "Product.find(#{@valid_order_item.product.id}).inventory", 0 - @valid_order_item.quantity + end end describe "add inventory" do - - + it "adds correctly" do + expected_inventory = @valid_order_item.quantity + @valid_order_item.product.inventory #5 +5 + # @valid_order_item.add_inventory + # @valid_order_item.reload #resync w/ DB + # new_inventory = @valid_order_item.product.inventory + # expect(@valid_order_item.product.inventory).must_equal expected_inventory + expect{@valid_order_item.add_inventory}.must_change "Product.find(#{@valid_order_item.product.id}).inventory", @valid_order_item.quantity + end end - - - - end From 14d67db987006c665e963616a6fbf2f91dbab2e3 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Wed, 17 Jun 2020 23:55:06 -0700 Subject: [PATCH 191/234] spacing and cleanup --- app/controllers/order_items_controller.rb | 26 +++-------------------- app/controllers/orders_controller.rb | 5 +---- 2 files changed, 4 insertions(+), 27 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 709cf3ed4d..5a0558dac6 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -5,13 +5,11 @@ class OrderItemsController < ApplicationController #database order_items -> use OrderItem #GET /order_items def index - if params[:product_id] - # This is the nested route, /products/:product_id/order_items + if params[:product_id] # This is the nested route, /products/:product_id/order_items product = Product.find_by(id: params[:product_id]) order_items = product.order_items.as_json(only: [:id, :name, :price, :quantity]) render json: order_items, status: :ok - else - # This is the 'regular' route, /order_items + else # This is the 'regular' route, /order_items order_items = OrderItem.all.as_json(only: [:id, :name, :price, :quantity]) render json: order_items, status: :ok end @@ -24,35 +22,17 @@ def create price: order_items_params[:price], quantity: order_items_params[:quantity], product_id: params[:product_id], - photo_url: order_items_params[:photo_url], - # order_id: @new_order.id + photo_url: order_items_params[:photo_url] ) if session[:order_id] @open_order = Order.find_by(id: session[:order_id]) - # @new_item = OrderItem.new( - # name: order_items_params[:name], - # price: order_items_params[:price], - # quantity: order_items_params[:quantity], - # product_id: params[:product_id], - # photo_url: order_items_params[:photo_url], - # order_id: @open_order.id - # ) @new_item.order_id = @open_order.id p "SESSION IS HERE" else @new_order = Order.create session[:order_id] = @new_order.id - - # @new_item = OrderItem.new( - # name: order_items_params[:name], - # price: order_items_params[:price], - # quantity: order_items_params[:quantity], - # product_id: params[:product_id], - # photo_url: order_items_params[:photo_url], - # order_id: @new_order.id - # ) @new_item.order_id = @new_order.id p "CREATE A SESSION" diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index b6c43ad686..14f1656c65 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -47,7 +47,6 @@ def update def cart # show function for the open order at the moment if !session[:order_id].nil? @open_order = Order.find_by(id: session[:order_id]) - p @open_order end if !@open_order.nil? @@ -57,8 +56,8 @@ def cart # show function for the open order at the moment def checkout @cart = Order.find_by(id: session[:order_id]) - if @cart.nil? || @cart.order_items.length == 0 + if @cart.nil? || @cart.order_items.length == 0 flash[:failure] = "Unable to checkout." redirect_to cart_path return @@ -77,9 +76,7 @@ def confirmation end @cart_items = @cart.order_items - @cart.purchase_changes - session[:order_id] = nil end From c11b94c73d4902229a263e63eb2a0ca772407eec Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 18 Jun 2020 00:02:20 -0700 Subject: [PATCH 192/234] added login and updated lots of things --- test/controllers/products_controller_test.rb | 184 +++++++++---------- 1 file changed, 91 insertions(+), 93 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 3077d584b7..c8fe29bcfa 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -20,7 +20,7 @@ price: 39.99, description: "Big green plant!", inventory: 3, - merchant_id: merchant_1.id, + # merchant_id: merchant_1.id, status: true, photo_url: "https://bloomscape.com/wp-content/uploads/2019/11/bloomscape_peopleplants_monstera-scaled.jpg" } @@ -39,71 +39,68 @@ describe "new" do # TODO require login it "gets the path" do + perform_login() get new_product_path must_respond_with :success end # TODO add if user id not logged in, then it redirects to the homepage - # it "if not logged in, redirects to root path" do - # get new_product_path + it "if not logged in, redirects to root path" do + get new_product_path - # must_respond_with :redirect - # must_redirect_to root_path - # end + must_respond_with :redirect + must_redirect_to root_path + end end describe "create" do - - # TODO - require login - it "creates a new product" do - - # new_product = Product.new(product_hash) - new_product = { - product: { - name: "A Really Big Monstera", - price: 39.99, - description: "Big green plant!", - inventory: 3, - status: true, - photo_url: "https://bloomscape.com/wp-content/uploads/2019/11/bloomscape_peopleplants_monstera-scaled.jpg" + describe "logged in" do + before do + perform_login() + end + + it "creates a new product" do + new_product = { + product: { + name: "A Really Big Monstera", + price: 39.99, + description: "Big green plant!", + inventory: 3, + status: true, + photo_url: "https://bloomscape.com/wp-content/uploads/2019/11/bloomscape_peopleplants_monstera-scaled.jpg" + } } - } - + expect { + post products_path, params: new_product + }.must_differ 'Product.count', 1 - expect { - #post products_path, params: product_hash - post products_path, params: new_product - }.must_differ 'Product.count', 1 - - # must_respond_with :redirect - # must_redirect_to product_path(Product.last.id) - # expect(Product.last.name).must_equal product_hash[:product][:name] - # expect(Product.last.price).must_equal product_hash[:product][:price] - # expect(Product.last.description).must_equal product_hash[:product][:description] - # expect(Product.last.inventory).must_equal product_hash[:product][:inventory] - # expect(Product.merchant_id).must_equal product_hash[:product][:merchant_id] - end + must_respond_with :redirect + must_redirect_to product_path(Product.last.id) + expect(Product.last.name).must_equal new_product[:product][:name] + expect(Product.last.price).must_equal new_product[:product][:price] + expect(Product.last.description).must_equal new_product[:product][:description] + expect(Product.last.inventory).must_equal new_product[:product][:inventory] + end - # TODO add after validations - # it "doesn't create a product with invalid data" do - # product_hash[:product][:name] = nil + it "doesn't create a product with invalid data" do + product_hash[:product][:name] = nil - # expect { - # post products_path, params: product_hash - # }.must_differ "Product.count", 0 + expect { + post products_path, params: product_hash + }.must_differ "Product.count", 0 - # must_respond_with :bad_request - # end + must_respond_with :bad_request + end + end - # TODO add not logged in redirect to root path - # it "if users is not logged in, redirects to homepage" do - # expect{ post products_path, params: product_hash }.must_differ 'Product.count', 0 + it "if user is not logged in, redirects to homepage" do + expect{ post products_path, params: product_hash }.must_differ 'Product.count', 0 - # must_respond_with :redirect - # must_redirect_to root_path - # end + must_respond_with :redirect + must_redirect_to root_path + end end describe "show" do @@ -134,59 +131,60 @@ describe "update" do - # TODO require login - it "will update a product with a valid post request and redirect" do + describe "logged in" do + before do + perform_login() + end + + it "will update a product with a valid post request and redirect" do + id = Product.first.id + expect { + patch product_path(id), params: product_hash + }.wont_change "Product.count" + + must_respond_with :redirect + must_redirect_to product_path(id) + + product = Product.find_by(id: id) + expect(product.name).must_equal product_hash[:product][:name] + expect(product.description).must_equal product_hash[:product][:description] + end + + it "will respond with not_found for invalid ids" do + id = -1 + + expect { + patch product_path(id), params: product_hash + }.wont_change "Product.count" + + must_respond_with :not_found + end + + it "will not update if the params are invalid" do + product_hash[:product][:name] = nil + + expect { + patch product_path(product_1.id), params: product_hash + }.wont_change "Product.count" + + product_1.reload # refresh the product from the database + must_respond_with :bad_request + expect(product_1.name).wont_be_nil + end + end + + it "will not change a product if not logged in" do id = Product.first.id + name = Product.first.name expect { patch product_path(id), params: product_hash }.wont_change "Product.count" must_respond_with :redirect - must_redirect_to product_path(id) + must_redirect_to root_path product = Product.find_by(id: id) - expect(product.name).must_equal product_hash[:product][:name] - expect(product.description).must_equal product_hash[:product][:description] + expect(product.name).must_equal name end - - # TODO require login - it "will respond with not_found for invalid ids" do - id = -1 - - expect { - patch product_path(id), params: product_hash - }.wont_change "Product.count" - - must_respond_with :not_found - end - - # TODO after validations are added - # TODO require login - # it "will not update if the params are invalid" do - # product_hash[:product][:name] = nil - - # expect { - # patch product_path(product_1.id), params: product_hash - # }.wont_change "Product.count" - - # product_1.reload # refresh the product from the database - # must_respond_with :bad_request - # expect(product.name).wont_be_nil - # end - - # TODO Add not logged in version - # it "will not change a product if not logged in" do - # id = Product.first.id - # name = Product.first.name - # expect { - # patch product_path(id), params: product_hash - # }.wont_change "Product.count" - - # must_respond_with :redirect - # must_redirect_to root_path - - # product = Product.find_by(id: id) - # expect(product.name).must_equal name - # end end end From c86181d95720e71f1822cb260eb624d9aa89284e Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 18 Jun 2020 00:46:00 -0700 Subject: [PATCH 193/234] so many tests --- app/controllers/products_controller.rb | 2 +- test/controllers/products_controller_test.rb | 62 +++++++++++++++++++- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 4f8d82c10e..f47f0c8028 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -50,7 +50,7 @@ def edit head :not_found return end - # TODO add session id must match product merchant id + if @product.merchant_id != session[:user_id] flash[:error] = "Oops. You can only edit your own products." redirect_to product_path(@product.id) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index c8fe29bcfa..6c23ee81d1 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -9,6 +9,10 @@ products(:product_1) } + let (:product_2) { + products(:product_2) + } + let (:inactive_product) { products(:product_3) } @@ -34,17 +38,16 @@ end # TODO add doesn't display if status is set to false + end describe "new" do - # TODO require login it "gets the path" do perform_login() get new_product_path must_respond_with :success end - # TODO add if user id not logged in, then it redirects to the homepage it "if not logged in, redirects to root path" do get new_product_path @@ -126,7 +129,60 @@ must_respond_with :not_found end - # TODO add cannot view product with status set to false + it "cannot view product with status set to false if not logged in" do + get product_path(246273452735) + + # Assert + must_respond_with :not_found + end + end + + describe "edit" do + + describe "logged in" do + before do + perform_login() + end + + it "can access the edit product page if logged in creator" do + get edit_product_path(product_1) + + must_respond_with :success + expect(flash[:success]).wont_be_nil + end + + it "will respond with not_found for invalid ids" do + id = -1 + + expect { + get edit_product_path(id), params: product_hash + }.wont_change "Product.count" + + must_respond_with :not_found + end + + it "can't edit another merchant's product" do + id = product_2.id + + get edit_product_path(id) + + must_respond_with :redirect + must_redirect_to product_path(id) + + expect(flash[:error]).wont_be_nil + end + end + + it "can't edit a product if not logged in" do + id = product_2.id + + get edit_product_path(id) + + must_respond_with :redirect + must_redirect_to root_path + + expect(flash[:error]).wont_be_nil + end end describe "update" do From fa64308253688dc185499c20e782613082cb6c32 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 18 Jun 2020 00:47:59 -0700 Subject: [PATCH 194/234] todo: check order item existence test --- test/models/order_item_test.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index 99f4fe839a..ed9b9af828 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -48,9 +48,9 @@ end end - describe "check order item existence" do - - end + # describe "check order item existence" do + #Need Jessica to do this one, unclear of method and how to test + # end describe "reduce inventory" do it "reduces correctly" do From b033df4f916508c88b3d68a331ad36ad5b3d1afe Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 18 Jun 2020 01:12:24 -0700 Subject: [PATCH 195/234] fixed some order tests --- app/controllers/orders_controller.rb | 9 ++++----- test/models/order_test.rb | 10 +++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 14f1656c65..b60658289e 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -12,6 +12,10 @@ def index def show @order = Order.find_by(id: params[:id]) + if @order.nil? + head :not_found + return + end # merchant = Merchant.find_by(id: session[:user_id]) @merchant_items = [] @@ -20,11 +24,6 @@ def show @merchant_items << order_item end end - - if @order.nil? - head :not_found - return - end end def update diff --git a/test/models/order_test.rb b/test/models/order_test.rb index de30bb6911..9fca7aea02 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -126,11 +126,11 @@ expect(@new_order.valid?).must_equal false end - it 'is invalid with an invalid phone number' do - expect(@new_order.valid?).must_equal true - @new_order.update(phone_num: '123.234.1234') - expect(@new_order.valid?).must_equal false - end + # it 'is invalid with an invalid phone number' do + # expect(@new_order.valid?).must_equal true + # @new_order.update(phone_num: '123.234.1234') + # expect(@new_order.valid?).must_equal false + # end end describe 'total price' do From 7b10800247bb0cd8ef722dd0111c3e95172bafd1 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 18 Jun 2020 09:44:15 -0700 Subject: [PATCH 196/234] change view for order --- app/views/orders/show.html.erb | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 7878cc0b52..4ea7dc2bd4 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -1,26 +1,15 @@

    Order History

    -
  • <%= order_item.id %><%= order_item.name %><%= order_item.price %><%= order_item.quantity %><%= order_item.product.name %><%= merchant_item.id %><%= merchant_item.name %><%= merchant_item.price %><%= merchant_item.quantity %><%= merchant_item.product.name %>
    - - - - - - - - - - - - - - - - - +
      +
    • Guest Name: <%= @order[:guest_name] %>
    • +
    • Email: <%= @order[:email] %>
    • +
    • Address: <%= @order[:address] %>
    • +
    • City: <%= @order[:city] %>
    • +
    • Zip Code: <%= @order[:zip_code] %>
    • +
    • Card Number: <%= @order[:card_number] %>
    • +
    • Card Exp. Date: <%= @order[:card_expiration_date] %>
    • +
    - -
    Guest NameEmailAddressCityZip CodeCard NumberCard Exp. Date
    <%= @order[:guest_name] %><%= @order[:email] %><%= @order[:address] %><%= @order[:city] %><%= @order[:zip_code] %><%= @order[:card_number] %><%= @order[:card_expiration_date] %>
    From 491ed44511492c61d04fc8925e0688f18bc68d79 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 18 Jun 2020 10:23:52 -0700 Subject: [PATCH 197/234] order controller filter --- app/controllers/orders_controller.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index b60658289e..8395ce0e0c 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -54,8 +54,6 @@ def cart # show function for the open order at the moment end def checkout - @cart = Order.find_by(id: session[:order_id]) - if @cart.nil? || @cart.order_items.length == 0 flash[:failure] = "Unable to checkout." redirect_to cart_path @@ -66,8 +64,6 @@ def checkout end def confirmation - @cart = Order.find_by(id: session[:order_id]) - if @cart.nil? || @cart.order_items.length == 0 flash[:error] = "Unable to checkout." redirect_to cart_path @@ -85,5 +81,10 @@ def orders_params return params.require(:order).permit(:guest_name, :email, :phone_num, :address, :city, :state, :zip_code, :card_number, :card_expiration_date, :card_cvv) end + #controller filter + def find_cart_order + @cart = Order.find_by(id: session[:order_id]) + end + end From ceb3aa037e315dd862ac7be9fd47ea94f2be3e87 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 18 Jun 2020 11:28:25 -0700 Subject: [PATCH 198/234] order items filters with some little other fixes --- app/controllers/order_items_controller.rb | 36 +++++++++++------------ app/controllers/orders_controller.rb | 5 +--- db/schema.rb | 3 +- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 5a0558dac6..807fa9dc06 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -2,6 +2,7 @@ class OrderItemsController < ApplicationController skip_before_action :verify_authenticity_token skip_before_action :require_login + before_action :find_order_item, only: [:update, :destroy] #database order_items -> use OrderItem #GET /order_items def index @@ -24,29 +25,22 @@ def create product_id: params[:product_id], photo_url: order_items_params[:photo_url] ) - if session[:order_id] @open_order = Order.find_by(id: session[:order_id]) @new_item.order_id = @open_order.id - - p "SESSION IS HERE" else @new_order = Order.create session[:order_id] = @new_order.id @new_item.order_id = @new_order.id - - p "CREATE A SESSION" end if @new_item.check_product_inventory @new_item.check_order_item_existence(session[:order_id]) @new_item.reduce_inventory - p "ITEM WAS ADD" flash[:success] = 'Item added to cart.' redirect_to cart_path return else - p "ITEM WAS not ADDED" flash[:failure] = 'Not enough product inventory.' redirect_back fallback_location: root_path return @@ -55,29 +49,25 @@ def create # PATCH: /order_items/:id (params) def update - @order_item = OrderItem.find_by(id: params[:id]) - - p params + # @order_item = OrderItem.find_by(id: params[:id]) if @order_item.nil? head :not_found return elsif @order_item.update_product_inventory(order_items_params[:quantity]) - p "herereee?" @order_item.update(order_items_params) flash[:success] = 'Order item quantity updated.' redirect_to cart_path return else - p "here?" flash[:failure] = 'Not enough inventory to update quantity.' redirect_to cart_path return end end - # DElETE /order_items/:id + # DELETE /order_items/:id def destroy - @order_item = OrderItem.find_by(id: params[:id]) + # @order_item = OrderItem.find_by(id: params[:id]) if @order_item.nil? head :not_found @@ -98,11 +88,19 @@ def destroy redirect_to cart_path return end +end #class + + +private + +def order_items_params + return params.require(:order_item).permit(:name, :price, :quantity, :photo_url, :product_id, :order_id) +end + +#controller filter +def find_order_item + @order_item = OrderItem.find_by(id: params[:id]) +end - private - def order_items_params - return params.require(:order_item).permit(:name, :price, :quantity, :photo_url, :product_id, :order_id) - end -end \ No newline at end of file diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 8395ce0e0c..cae4222c6e 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,11 +1,9 @@ class OrdersController < ApplicationController skip_before_action :require_login, except: [:show, :index] - + before_action :find_cart_order, only: [:cart, :confirmation] #GET /orders def index @orders = Order.all - # order = Order.all.as_json(only: [:id, :card_number,:card_expiration_date, :card_cvv, :address, :city,:zip_code, :guest_name, :email, :phone_num, :cart_status]) - # render json: order, status: :ok end #GET /orders/:id @@ -16,7 +14,6 @@ def show head :not_found return end - # merchant = Merchant.find_by(id: session[:user_id]) @merchant_items = [] @order.order_items.each do |order_item| diff --git a/db/schema.rb b/db/schema.rb index f487317adc..a41d652509 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -65,8 +65,8 @@ t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.boolean "cart_status", default: true - t.bigint "merchant_id" t.string "state" + t.bigint "merchant_id" t.index ["merchant_id"], name: "index_orders_on_merchant_id" end @@ -93,6 +93,7 @@ t.index ["product_id"], name: "index_reviews_on_product_id" end + add_foreign_key "merchants", "orders" add_foreign_key "order_items", "orders" add_foreign_key "order_items", "products" add_foreign_key "orders", "merchants" From bdf7a650a712ba3301510036f442de1a216c0619 Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 18 Jun 2020 11:32:31 -0700 Subject: [PATCH 199/234] do not add product if retired --- app/controllers/orders_controller.rb | 6 +++--- app/models/order_item.rb | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index b60658289e..85220cd54d 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -10,8 +10,8 @@ def index #GET /orders/:id def show - - @order = Order.find_by(id: params[:id]) + @order = Order.find_by(id: params[:id]) + if @order.nil? head :not_found return @@ -27,7 +27,7 @@ def show end def update - @open_order = Order.find_by(cart_status: true) + @open_order = Order.find_by(id: session[:order_id]) if @open_order.nil? head :not_found diff --git a/app/models/order_item.rb b/app/models/order_item.rb index c7706ed6c1..e986cbfe7f 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -6,17 +6,18 @@ class OrderItem < ApplicationRecord validates :quantity, presence: true def check_product_inventory - return false if self.quantity == nil || self.quantity == 0 - incoming_quantity = self.quantity matching_product = Product.find_by(id: self.product_id) + return false if matching_product.status == false + return false if incoming_quantity == nil || incoming_quantity == 0 + matching_product.inventory >= incoming_quantity ? true : false end def update_product_inventory(incoming_quantity) matching_product = Product.find_by(id: self.product_id) - + matching_product.inventory >= incoming_quantity.to_i ? true : false end From b2e5de96a9af65b0fb6362ef86cdeac7eebce78a Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 18 Jun 2020 11:37:04 -0700 Subject: [PATCH 200/234] cover edge cases for checking product inventory --- test/models/order_item_test.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index f8e578e695..61b5f5612c 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -46,6 +46,24 @@ @valid_order_item.product.save expect(@valid_order_item.check_product_inventory).must_equal false end + + it "returns false if incoming quantity is nil" do + @valid_order_item.quantity = nil + @valid_order_item.save + expect(@valid_order_item.check_product_inventory).must_equal false + end + + it "returns false if incoming quantity is 0" do + @valid_order_item.quantity = 0 + @valid_order_item.save + expect(@valid_order_item.check_product_inventory).must_equal false + end + + it "returns false if product is retired" do + @valid_order_item.product.status = false + @valid_order_item.product.save + expect(@valid_order_item.check_product_inventory).must_equal false + end end # describe "check order item existence" do From 4cedf9b9692aaa47167260445db6319ccea3265d Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 18 Jun 2020 11:42:06 -0700 Subject: [PATCH 201/234] adjust add inventory test --- test/models/order_item_test.rb | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index 61b5f5612c..2ea956956d 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -66,6 +66,16 @@ end end + describe "update_product_inventory" do + it "returns true if product inventory is adequate for updating cart" do + expect(order_items(:order_item4).update_product_inventory(1)).must_equal true + end + + it "returns false if product inventory is inadequate for updating cart" do + expect(order_items(:order_item4).update_product_inventory(10)).must_equal false + end + end + # describe "check order item existence" do # TODO Need Jessica to do this one, unclear of method and how to test # end @@ -76,23 +86,16 @@ end end -# describe "add inventory" do -# it "adds correctly" do -# expected_inventory = @valid_order_item.quantity + @valid_order_item.product.inventory #5 +5 -# # @valid_order_item.add_inventory -# # @valid_order_item.reload #resync w/ DB -# # new_inventory = @valid_order_item.product.inventory -# # expect(@valid_order_item.product.inventory).must_equal expected_inventory -# expect{@valid_order_item.add_inventory}.must_change "Product.find(#{@valid_order_item.product.id}).inventory", @valid_order_item.quantity + describe "add inventory" do + it "adds correctly" do + expected_inventory = @valid_order_item.quantity + @valid_order_item.product.inventory #5 +5 - describe "update_product_inventory" do - it "returns true if product inventory is adequate for updating cart" do - expect(order_items(:order_item4).update_product_inventory(1)).must_equal true - end + @valid_order_item.add_inventory + @valid_order_item.reload - it "returns false if product inventory is inadequate for updating cart" do - expect(order_items(:order_item4).update_product_inventory(10)).must_equal false + expect(@valid_order_item.product.inventory).must_equal expected_inventory end end + end From e9756735dead5cf7c75f08a20abfba1e12abaecb Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 18 Jun 2020 12:27:07 -0700 Subject: [PATCH 202/234] test check existence of item in cart already func --- test/models/order_item_test.rb | 40 ++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/test/models/order_item_test.rb b/test/models/order_item_test.rb index 2ea956956d..aa94b7be3c 100644 --- a/test/models/order_item_test.rb +++ b/test/models/order_item_test.rb @@ -5,7 +5,7 @@ @order_item = OrderItem.create(name: "order_item1") @new_product = products(:product_1) @new_order = Order.create - @valid_order_item = OrderItem.create!(name: @new_product.name, price: @new_product.price, quantity: @new_product.inventory, product_id: @new_product.id, order_id: @new_order.id) + @valid_order_item = OrderItem.create(name: @new_product.name, price: @new_product.price, quantity: @new_product.inventory, product_id: @new_product.id, order_id: @new_order.id) end describe "validations" do @@ -76,9 +76,41 @@ end end - # describe "check order item existence" do - # TODO Need Jessica to do this one, unclear of method and how to test - # end + describe "check order item existence" do + it "adds to cart if item does not already exist in cart" do + product = products(:product_1) + order_item = order_items(:order_item1) + open_cart = orders(:order1) + + another_item = OrderItem.create( + name: product.name, + price: product.price, + quantity: 2, + photo_url: product.photo_url, + product_id: product.id, + order_id: open_cart.id + ) + + another_item.check_order_item_existence(open_cart.id) + another_item.reload + + expect(order_item.quantity).must_equal 5 + expect(another_item.quantity).must_equal 2 + expect(open_cart.order_items.count).must_equal 2 + end + + it "updates item quantity in cart if it already exists" do + order_item = order_items(:order_item1) + another_item = order_items(:order_item1) + open_cart = orders(:order1) + + another_item.check_order_item_existence(open_cart.id) + another_item.reload + + expect(order_item.quantity).must_equal 10 + expect(open_cart.order_items.count).must_equal 1 + end + end describe "reduce inventory" do it "reduces correctly" do From 59405df97b3df040813cdd8731974996381ef209 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 18 Jun 2020 12:40:14 -0700 Subject: [PATCH 203/234] simple cov order items controller test up to 100% --- test/controllers/order_items_controller_test.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 283bcd7456..47b98893c2 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -4,6 +4,7 @@ before do @merchant = merchants(:merchant_1) @test_product1 = products(:product_1) + @test_product2 = products(:product_2) @new_order = orders(:order1) @new_order1 = orders(:order2) @new_order_item = order_items(:order_item1) @@ -50,6 +51,11 @@ expect(found_order_item.order_id).must_equal session[:order_id] must_redirect_to cart_path + + expect { + post product_order_items_path(@test_product2.id), params: new_item_hash + }.must_change "Product.find(#{@test_product2.id}).order_items.count", 3 + expect(found_order_item.order.id).must_equal session[:order_id] end it "does not create a new OrderItem if the form data violates inventory, and responds with a redirect" do From b73cef23abe56ee73add05fc08975aaffede1ff3 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 18 Jun 2020 12:41:49 -0700 Subject: [PATCH 204/234] added a clarifying comment, do not remove --- test/controllers/order_items_controller_test.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/controllers/order_items_controller_test.rb b/test/controllers/order_items_controller_test.rb index 47b98893c2..2a43e54d61 100644 --- a/test/controllers/order_items_controller_test.rb +++ b/test/controllers/order_items_controller_test.rb @@ -51,11 +51,13 @@ expect(found_order_item.order_id).must_equal session[:order_id] must_redirect_to cart_path - + #creates order item from previous order id(does not create a new order) expect { post product_order_items_path(@test_product2.id), params: new_item_hash }.must_change "Product.find(#{@test_product2.id}).order_items.count", 3 expect(found_order_item.order.id).must_equal session[:order_id] + + must_redirect_to cart_path end it "does not create a new OrderItem if the form data violates inventory, and responds with a redirect" do From 33fa77b2985a96c367364df95dd912fc1256285f Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Thu, 18 Jun 2020 12:55:46 -0700 Subject: [PATCH 205/234] A merchant can no longer view an order page for an order that they do not have items in --- app/views/orders/show.html.erb | 66 ++++++++++++++++++---------------- db/schema.rb | 3 +- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 4ea7dc2bd4..3e2ab8eb8e 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -1,36 +1,42 @@

    Order History

    -
      -
    • Guest Name: <%= @order[:guest_name] %>
    • -
    • Email: <%= @order[:email] %>
    • -
    • Address: <%= @order[:address] %>
    • -
    • City: <%= @order[:city] %>
    • -
    • Zip Code: <%= @order[:zip_code] %>
    • -
    • Card Number: <%= @order[:card_number] %>
    • -
    • Card Exp. Date: <%= @order[:card_expiration_date] %>
    • -
    +<% if @merchant_items.length == 0%> -
    - - - - - - - - - - - <% @merchant_items.each do |merchant_item| %> + You do not have permission to view this order. + +<% else %> + +
      +
    • Guest Name: <%= @order[:guest_name] %>
    • +
    • Email: <%= @order[:email] %>
    • +
    • Address: <%= @order[:address] %>
    • +
    • City: <%= @order[:city] %>
    • +
    • Zip Code: <%= @order[:zip_code] %>
    • +
    • Card Number: <%= @order[:card_number] %>
    • +
    • Card Exp. Date: <%= @order[:card_expiration_date] %>
    • +
    + +
    IDNamePriceQuantityProduct
    + - - - - - + + + + + - <% end %> - -
    <%= merchant_item.id %><%= merchant_item.name %><%= merchant_item.price %><%= merchant_item.quantity %><%= merchant_item.product.name %>IDNamePriceQuantityProduct
    - + + + <% @merchant_items.each do |merchant_item| %> + + <%= merchant_item.id %> + <%= merchant_item.name %> + <%= merchant_item.price %> + <%= merchant_item.quantity %> + <%= merchant_item.product.name %> + + <% end %> + + +<% end %> \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index a41d652509..f487317adc 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -65,8 +65,8 @@ t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.boolean "cart_status", default: true - t.string "state" t.bigint "merchant_id" + t.string "state" t.index ["merchant_id"], name: "index_orders_on_merchant_id" end @@ -93,7 +93,6 @@ t.index ["product_id"], name: "index_reviews_on_product_id" end - add_foreign_key "merchants", "orders" add_foreign_key "order_items", "orders" add_foreign_key "order_items", "products" add_foreign_key "orders", "merchants" From 0b908ee6483bf3fa379e94a69c85e1face2cb14d Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Thu, 18 Jun 2020 12:55:46 -0700 Subject: [PATCH 206/234] filter bug --- app/controllers/orders_controller.rb | 2 +- test/controllers/orders_controller_test.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 22af580fd5..29117f6b0c 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,6 +1,6 @@ class OrdersController < ApplicationController skip_before_action :require_login, except: [:show, :index] - before_action :find_cart_order, only: [:cart, :confirmation] + before_action :find_cart_order, only: [:cart, :checkout, :confirmation] #GET /orders def index @orders = Order.all diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index d817795f32..c701f7a71a 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -84,6 +84,7 @@ patch order_path(new_order.id), params: update_hash }.wont_change 'Order.count' + p new_order must_respond_with :redirect must_redirect_to confirmation_path From 789fe293b0855ea8769a7083e089621c3663e9cb Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Thu, 18 Jun 2020 13:00:14 -0700 Subject: [PATCH 207/234] Hid all but last 4 digits of customer card number on order 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 3e2ab8eb8e..fb38ed8b35 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -12,7 +12,7 @@
  • Address: <%= @order[:address] %>
  • City: <%= @order[:city] %>
  • Zip Code: <%= @order[:zip_code] %>
  • -
  • Card Number: <%= @order[:card_number] %>
  • +
  • Card Number: **** **** **** <%= @order[:card_number][11..14] %>
  • Card Exp. Date: <%= @order[:card_expiration_date] %>
  • From 17f218acf8079d9fd45cb61dc907baed5ad18bf9 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Thu, 18 Jun 2020 13:06:21 -0700 Subject: [PATCH 208/234] Added status to order items schema --- app/views/orders/show.html.erb | 2 ++ db/migrate/20200618200329_add_statusto_order_item.rb | 5 +++++ db/schema.rb | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20200618200329_add_statusto_order_item.rb diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index fb38ed8b35..d0196fb904 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -24,6 +24,7 @@ Price Quantity Product + Status @@ -34,6 +35,7 @@ <%= merchant_item.price %> <%= merchant_item.quantity %> <%= merchant_item.product.name %> + <%= merchant_item.status %> <% end %> diff --git a/db/migrate/20200618200329_add_statusto_order_item.rb b/db/migrate/20200618200329_add_statusto_order_item.rb new file mode 100644 index 0000000000..3294512bb9 --- /dev/null +++ b/db/migrate/20200618200329_add_statusto_order_item.rb @@ -0,0 +1,5 @@ +class AddStatustoOrderItem < ActiveRecord::Migration[6.0] + def change + add_column :order_items, :fulfillment_status, :string, default: "pending" + end +end \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index f487317adc..cbb2deb97d 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_17_220004) do +ActiveRecord::Schema.define(version: 2020_06_18_200329) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -48,6 +48,7 @@ t.bigint "product_id" t.bigint "order_id" t.string "photo_url", default: "https://f1.pngfuel.com/png/584/952/34/black-and-white-flower-black-white-m-leaf-plant-stem-silhouette-computer-line-plants-png-clip-art.png" + t.string "fulfillment_status", default: "pending" t.index ["order_id"], name: "index_order_items_on_order_id" t.index ["product_id"], name: "index_order_items_on_product_id" end From df412463b9ab4f107381c117973a98e818c8f12d Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Thu, 18 Jun 2020 13:08:28 -0700 Subject: [PATCH 209/234] Edited seed data to include fulfillment status --- db/order-items-seed.csv | 14 +++++++------- db/seeds.rb | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/db/order-items-seed.csv b/db/order-items-seed.csv index 30063b9121..4c5fc71ac7 100644 --- a/db/order-items-seed.csv +++ b/db/order-items-seed.csv @@ -1,7 +1,7 @@ -name,price,quantity,product_id,order_id -"coffee plant1",5.00,10,1,1 -"fiddle fig tree1",15.99,3,1,2 -"fiddle fig tree2",25.99,4,2,2 -"echeveria1",21.00,1,1,3 -"echeveria2",22.00,2,2,3 -"echeveria3",23.00,3,3,3 +name,price,quantity,product_id,order_id,fulfillment_status +"coffee plant1",5.00,10,1,1,paid +"fiddle fig tree1",15.99,3,1,2,complete +"fiddle fig tree2",25.99,4,2,2,pending +"echeveria1",21.00,1,1,3,cancelled +"echeveria2",22.00,2,2,3,complete +"echeveria3",23.00,3,3,3,paid diff --git a/db/seeds.rb b/db/seeds.rb index 25cc6e3870..bc4ccaf0e3 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -155,6 +155,7 @@ order_item.quantity = row['quantity'] order_item.product_id = row['product_id'] order_item.order_id = row['order_id'] + order_item.fulfillment_status = row['fulfillment_status'] successful = order_item.save From d0b0b07f67f21689b69fe2468960845d86b647ed Mon Sep 17 00:00:00 2001 From: thenora Date: Thu, 18 Jun 2020 13:25:43 -0700 Subject: [PATCH 210/234] tests --- app/controllers/categories_controller.rb | 26 +---- .../controllers/categories_controller_test.rb | 107 ++++++++++++++---- test/controllers/products_controller_test.rb | 4 +- test/fixtures/categories_products.yml | 20 ++-- test/fixtures/products.yml | 5 +- 5 files changed, 104 insertions(+), 58 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 47acfe1f27..6b6789e652 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -6,7 +6,7 @@ def index end def show - @category = Category.find_by(id: params[:id]) # TODO make controller fixture + @category = Category.find_by(id: params[:id]) if @category.nil? head :not_found return @@ -28,29 +28,7 @@ def create end end - def edit - @category = Category.find_by(id: params[:id] ) - if @category.nil? - flash[:error] = "Oops. Couldn't find that category." - redirect_to categories_path - return - end - end - - def update - @category = Category.find_by(id: params[:id] ) - if @category.nil? - flash[:error] = "Oops. Couldn't find that category." - redirect_to categories_path - return - elsif @category.update( category_params ) - flash[:success] = "#{@category.name} updated." - redirect_to category_path(@category.id) - else - flash.now[:error] = "#{@category.name} wasn't updated." - render :edit, status: :bad_request - end - end + # TODO change route resources to not include edit / update private diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index 549d2626a4..c00b957d8c 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -1,34 +1,101 @@ require "test_helper" describe CategoriesController do - it "must get index" do - get categories_index_url - must_respond_with :success - end - it "must get show" do - get categories_show_url - must_respond_with :success - end + let (:product_1) { + products(:product_1) + } + + let (:product_2) { + products(:product_2) + } + + let (:category_1) { + categories(:category1) + } - it "must get new" do - get categories_new_url - must_respond_with :success + let (:category_2) { + categories(:category2) + } + + let (:category_hash) { + { + category: { + name: "Flowers", + } + } + } + + describe "index" do + it "must get index" do + get categories_path + must_respond_with :success + end end - it "must get create" do - get categories_create_url - must_respond_with :success + describe "show" do + it "must get a page for a specific category" do + get category_path(category_1.id) + must_respond_with :success + end + + it "will respond with not_found for invalid ids" do + # Arrange + invalid_category_id = 999 + + # Act + get category_path(invalid_category_id) + + # Assert + must_respond_with :not_found + end end - it "must get edit" do - get categories_edit_url - must_respond_with :success + describe "new" do + it "a not logged in user is redirected" do + get new_category_path + + must_respond_with :redirect + must_redirect_to root_path + end + + describe "logged in" do + before do + perform_login() + end + + it "must get form to create a new category" do + get new_category_path + must_respond_with :success + end + end end - it "must get update" do - get categories_update_url - must_respond_with :success + describe "create" do + + it "redirects and can't create a new category when not logged in" do + expect{ post categories_path, params: category_hash }.must_differ 'Category.count', 0 + + must_respond_with :redirect + must_redirect_to root_path + end + + describe "logged in" do + before do + perform_login() + end + + it "a logged in merchant can create a new category" do + expect { + post categories_path, params: category_hash + }.must_differ 'Category.count', 1 + + must_respond_with :redirect + must_redirect_to categories_path + + expect(Category.last.name).must_equal category_hash[:category][:name] + end + end end end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 6c23ee81d1..e5a39216be 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -112,7 +112,7 @@ valid_product_id = product_1.id # Act - get "/products/#{valid_product_id}" + get product_path(valid_product_id) # Assert must_respond_with :success @@ -123,7 +123,7 @@ invalid_product_id = 999 # Act - get "/products/#{invalid_product_id}" + get product_path(invalid_product_id) # Assert must_respond_with :not_found diff --git a/test/fixtures/categories_products.yml b/test/fixtures/categories_products.yml index a226117446..c3eef8f7e7 100644 --- a/test/fixtures/categories_products.yml +++ b/test/fixtures/categories_products.yml @@ -1,15 +1,15 @@ one: - category_id: 1 - product_id: 1 + category_id: category1 + product_id: product_1 two: - category_id: 2 - product_id: 1 + category_id: category2 + product_id: product_1 three: - category_id: 2 - product_id: 3 + category_id: category2 + product_id: product_3 four: - category_id: 3 - product_id: 2 + category_id: category2 + product_id: product_2 five: - category_id: 4 - product_id: 2 + category_id: category4 + product_id: product_2 diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 5f3208d0dc..eeb5e0e894 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -15,7 +15,7 @@ product_2: merchant: merchant_2 status: true photo_url: "https://cdn.pixabay.com/photo/2019/04/16/02/40/plant-4130769_960_720.png" - categories: category2, category3, category4 + categories: category4, category5 product_3: name: "Product 3" price: 8.99 @@ -23,4 +23,5 @@ product_3: inventory: 1 merchant: merchant_1 status: false - photo_url: "https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" \ No newline at end of file + photo_url: "https://p1.piqsels.com/preview/5/143/671/fittonia-variegated-leaves-indoor-plant-mottled-home-flower-house-plant.jpg" + categories: category3 \ No newline at end of file From 7f497c0572df715d30538074e7ffc5395a740847 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Thu, 18 Jun 2020 14:16:24 -0700 Subject: [PATCH 211/234] Started forum for changing status of an order on merchant dashboard --- app/assets/stylesheets/application.scss | 10 ++++- .../merchants/_fulfillment_form.html.erb | 13 ++++++ app/views/merchants/dashboard.html.erb | 40 ++++++++++++++----- app/views/orders/show.html.erb | 2 +- 4 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 app/views/merchants/_fulfillment_form.html.erb diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 44e03e211d..64b05f4a7c 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -97,4 +97,12 @@ a:hover { .navigation-bar a:hover { color: #eff7df; text-decoration: none; -} \ No newline at end of file +} + +.btn { + background: #6E6658; +} + +// .btn a:hover { +// background: rgb(176, 155, 120); +// } \ No newline at end of file diff --git a/app/views/merchants/_fulfillment_form.html.erb b/app/views/merchants/_fulfillment_form.html.erb new file mode 100644 index 0000000000..eae6913345 --- /dev/null +++ b/app/views/merchants/_fulfillment_form.html.erb @@ -0,0 +1,13 @@ +

    <%= title %>

    +
    + <%= form_with model: @product, url: order_item_path(item), method: :patch do |f| %> + + <%= select_tag "fulfillment_status", options_for_select([["Paid", "paid"], ["Complete", "complete"], ["Cancelled", "cancelled"]]), onchange: "this.form.submit();" %> + <%# %> + <% end %> +
    \ No newline at end of file diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb index c20179dd33..3443fb0611 100644 --- a/app/views/merchants/dashboard.html.erb +++ b/app/views/merchants/dashboard.html.erb @@ -1,4 +1,4 @@ -

    <%= @merchant.username %>'s Dashboard

    +

    <%= @merchant.username %>'s Dashboard

    <% unless @merchant.nil? %> @@ -9,18 +9,40 @@ <%#
    %>
    - <%= link_to "Add a product", new_product_path %> - <%= link_to "Add a category", new_category_path %> + + Total Earnings: $ <%= @merchant.total_revenue %> +
    + +

    Your Orders:

    - <% if @merchant.order_items.length > 0 %> -
      - <% @merchant.order_items.each do |order_item| %> -
    • Order: <%= link_to order_item[:id], order_path(order_item.order.id), method: :get %>
    • + + + + + + + + + + + + + <% @merchant.order_items.each do |item| %> + + + + + + + + <% end %> - - <% end %> + +
      IDNamePriceQuantityProductStatus
      <%= link_to item[:id], order_path(item.order.id), method: :get %><%= item.name %><%= item.price %><%= item.quantity %><%= item.product.name %> + <%= render partial: "fulfillment_form", locals: { item: item, title: 'Edit Status'} %> +

      Your Products:

      diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index d0196fb904..8a121a1996 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -35,7 +35,7 @@ <%= merchant_item.price %> <%= merchant_item.quantity %> <%= merchant_item.product.name %> - <%= merchant_item.status %> + <%= merchant_item.fulfillment_status.capitalize %> <% end %> From 5ce8410f5f7195e133b89deef12b25382fb8b8d3 Mon Sep 17 00:00:00 2001 From: kate myer Date: Thu, 18 Jun 2020 15:19:59 -0700 Subject: [PATCH 212/234] order controllers update test PASSING --- app/controllers/orders_controller.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 29117f6b0c..15dfa9d78d 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -24,8 +24,13 @@ def show end def update - @open_order = Order.find_by(id: session[:order_id]) - + @open_order = nil + if !session[:order_id].nil? + @open_order = Order.find_by(id: session[:order_id]) + else + @open_order = Order.find_by(id: params[:id]) + end + if @open_order.nil? head :not_found return From 5c24433025ee4b13e8c73d85b784f57207e7f783 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Thu, 18 Jun 2020 16:09:03 -0700 Subject: [PATCH 213/234] continuing to add on to status change form --- app/controllers/order_items_controller.rb | 18 ++++++++++++++++++ app/views/merchants/_fulfillment_form.html.erb | 4 +++- config/routes.rb | 2 ++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb index 807fa9dc06..c240ded4dc 100644 --- a/app/controllers/order_items_controller.rb +++ b/app/controllers/order_items_controller.rb @@ -49,6 +49,7 @@ def create # PATCH: /order_items/:id (params) def update + # @order_item = OrderItem.find_by(id: params[:id]) if @order_item.nil? head :not_found @@ -65,6 +66,23 @@ def update end end + # PATCH: /order_items/update_status(.:format) + def update_status + @order_item = OrderItem.find_by(id: params[:id]) + # raise "THIS IS ERROR" + + if @order_item.nil? + # head :not_found + redirect_to dashboard_path + return + else + @order_item.update(fulfillment_status: params[:fulfillment_status]) + flash[:success] = 'Order item fulfillment status updated.' + redirect_to dashboard_path + return + end + end + # DELETE /order_items/:id def destroy # @order_item = OrderItem.find_by(id: params[:id]) diff --git a/app/views/merchants/_fulfillment_form.html.erb b/app/views/merchants/_fulfillment_form.html.erb index eae6913345..66c898078e 100644 --- a/app/views/merchants/_fulfillment_form.html.erb +++ b/app/views/merchants/_fulfillment_form.html.erb @@ -1,8 +1,10 @@

      <%= title %>

      - <%= form_with model: @product, url: order_item_path(item), method: :patch do |f| %> + <%= form_for(item, url: order_items_update_status_path, method: :patch) do |f| %> + <%= select_tag "fulfillment_status", options_for_select([["Paid", "paid"], ["Complete", "complete"], ["Cancelled", "cancelled"]]), onchange: "this.form.submit();" %> + <%# - - - - %> + <%= form_for(item, url: order_items_update_status_path(id: item.id), method: :patch) do |f| %> + <%= select_tag "fulfillment_status", options_for_select([["Pending", "pending"], ["Paid", "paid"], ["Complete", "complete"], ["Cancelled", "cancelled"]]), :selected => item.fulfillment_status, onchange: "this.form.submit();" %> <% end %>
      \ No newline at end of file diff --git a/app/views/merchants/dashboard.html.erb b/app/views/merchants/dashboard.html.erb index 3443fb0611..0c8343d8c2 100644 --- a/app/views/merchants/dashboard.html.erb +++ b/app/views/merchants/dashboard.html.erb @@ -2,19 +2,15 @@
      <% unless @merchant.nil? %> - # TODO add require login as a controller filter -i think? - - <%#
      -

      Total Earnings: <%= @total_revenue %> - <%#

      %>
      - Total Earnings: $ <%= @merchant.total_revenue %>
      - +
      +
      Total Earnings: $ <%= @merchant.total_revenue %>
      +

      Your Orders:

      @@ -26,6 +22,7 @@ + @@ -36,8 +33,9 @@ + <% end %> @@ -53,6 +51,7 @@ <% end %> <% end %> + diff --git a/plantsy-app b/plantsy-app new file mode 160000 index 0000000000..bc5144ac03 --- /dev/null +++ b/plantsy-app @@ -0,0 +1 @@ +Subproject commit bc5144ac034c1855af2560eaddda6114ae3f3ac1 From 0c0f662fb4ec096039ae8163ef9beaa5eea81b8a Mon Sep 17 00:00:00 2001 From: Jessica Liang Date: Fri, 19 Jun 2020 09:20:53 -0700 Subject: [PATCH 233/234] fix button color --- app/assets/stylesheets/application.scss | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 5a5e36cfe4..2c6b99a78f 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -96,13 +96,4 @@ a:hover { .navigation-bar a:hover { color: #eff7df; text-decoration: none; -} - -.btn { - background: #6E6658; - color: white; -} - -// .btn a:hover { -// background: rgb(176, 155, 120); -// } \ No newline at end of file +} \ No newline at end of file From 9d6b7803abe9809fb93955abeefc4ab356b3d10e Mon Sep 17 00:00:00 2001 From: kate myer Date: Fri, 19 Jun 2020 10:41:51 -0700 Subject: [PATCH 234/234] final PR --- .github/PULL_REQUEST_TEMPLATE | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE index 732a72a289..a942aa2b9e 100644 --- a/.github/PULL_REQUEST_TEMPLATE +++ b/.github/PULL_REQUEST_TEMPLATE @@ -7,12 +7,20 @@ Congratulations! You're submitting your assignment. Please reflect on the assign Prompt | Response --- | --- Each team member: what is one thing you were primarily responsible for that you're proud of? | +Kate: I was in charge of completing all the model validations, custom mode methods testing. I helped Jessica with order and order_item controller testing as well as doing parts of the crud for these controllers. Most proud of writing tests to pass getting simplecov to 90-100% for these controllers and models. +Nora: I made all the product display pages, including for category and merchant. I also did all the related controller testing. The thing I’m most proud of though is finally realizing how simple controller filters can be and actually using one. +Jessica:I worked primarily on the cart and checkout process. I am most proud that I was able to make it function! I also did the styling and my team thinks it looks very Pinterest worthy!! +Emily: I am proud of how the merchant dashboard turned out because I added several features that were outside of my knowledge. I learned a lot of new tools that will be helpful for future projects. | Each team member: what is one thing you were primarily responsible for that you would like targeted feedback on? | -How did your team break up the work to be done? | -How did your team utilize git to collaborate? | -What did your group do to try to keep your code DRY while many people collaborated on it? | -What was a technical challenge that you faced as a group? | -What was a team/personal challenge that you faced as a group? | -What was your application's ERD? (upload this to Google Drive, change the share settings to viewable by everyone with a link, and include a link) | -What is your Trello URL? | -What is the Heroku URL of your deployed application? | +Kate: Since I mostly worked on tests, I would like feedback on how to do tests for sessions as that was one that was a difficult to wrap my head around. I understood what was happening in the methods that were written in the controllers but wasn't able to get that last 10% coverage in the order controller. +Jessica: The check out process. +Emily: Styling for the merchant dashboard. +Nora: Product controller testing. | +How did your team break up the work to be done? | We made an ERD first, then we went through the user stories to develop our Trello board. We pretty much just started grabbing parts that we thought were interesting to us and ran with tasks related to those parts. We were committed to daily standups to share our progress, what we were going to work on next, and any help we needed. | +How did your team utilize git to collaborate? | We were really amazing honestly at being diligent about creating branches when we worked on a feature. We had great communication when we submitted a PR and another team member quickly came in to check and merge. We then were great at pulling from the master and using branches for each new feature. In the grand scheme of git hygeine, we did well but sometimes we got caught up and did not commit as frequently. There was an incident where there was a merge conflict but Jessica and Nora were able to quickly mend the issue. | +What did your group do to try to keep your code DRY while many people collaborated on it? | Because we were able to work on our parts "seperately" and were great about continually meeting and merging, we managed to keep the code DRY throughout. However, we did our DRY-ing and cleaning up at the end. The code production was deliberately careful and thought out as much as possible. With our testing, we were able to consistently use the fixtures we created. | +What was a technical challenge that you faced as a group? | Deploying to Heroku was much more involved than we initially thought! DEPLOY EARLY, DEPLOY OFTEN! | +What was a team/personal challenge that you faced as a group? | This project was enormous and at different parts of the project, it felt like one or two people were getting doing the brunt of the work. Then towards the middle, things picked up for all of us, and at the end, we all came together to wrap things up really nicely. Our team was available for help, someone was there to jump in to help at all times even super late into the night. Couldn't have asked for a better team, we really did it! | +What was your application's ERD? (upload this to Google Drive, change the share settings to viewable by everyone with a link, and include a link) | https://drive.google.com/file/d/1RNkK9Z238OJaRnywiimgJSBKwnno-Mz1/view?usp=sharing | +What is your Trello URL? | https://trello.com/b/moXn53QI/plantsy| +What is the Heroku URL of your deployed application? | https://plantsy-2020.herokuapp.com/|
      Quantity Product StatusChange Status
      <%= item.price %> <%= item.quantity %> <%= item.product.name %><%= item.fulfillment_status.capitalize %> - <%= render partial: "fulfillment_form", locals: { item: item, title: 'Edit Status'} %> + <%= render partial: "fulfillment_form", locals: { item: item, title: ''} %>