From 280340b4c79eae73ae0f9bd701ceb861e2c24926 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Wed, 10 Aug 2022 09:49:10 +0100 Subject: [PATCH 01/21] setup associations --- app/controllers/application_controller.rb | 1 + app/models/category.rb | 2 ++ app/models/payment.rb | 2 ++ app/models/user.rb | 2 ++ 4 files changed, 7 insertions(+) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 09705d1..6b4dcfa 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,2 +1,3 @@ class ApplicationController < ActionController::Base + before_action :authenticate_user! end diff --git a/app/models/category.rb b/app/models/category.rb index 4f5791c..57437a2 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,3 +1,5 @@ class Category < ApplicationRecord has_one_attached :icon + has_many :payments, dependent: :destroy + belongs_to :user end diff --git a/app/models/payment.rb b/app/models/payment.rb index eab5c26..b7149c0 100644 --- a/app/models/payment.rb +++ b/app/models/payment.rb @@ -1,2 +1,4 @@ class Payment < ApplicationRecord + belongs_to :user + belongs_to :category end diff --git a/app/models/user.rb b/app/models/user.rb index 4756799..f8f341e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,4 +1,6 @@ class User < ApplicationRecord + has_many :categories, dependent: :destroy + has_many :payments, dependent: :destroy # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, From cf502026d3992f42262b2f5a84b677bcf398eff7 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Wed, 10 Aug 2022 14:34:25 +0100 Subject: [PATCH 02/21] fix signup authentication --- app/controllers/application_controller.rb | 7 +++++++ app/controllers/users_controller.rb | 4 +--- app/controllers/welcome_controller.rb | 1 + app/models/user.rb | 3 +-- app/views/devise/registrations/new.html.erb | 4 ---- app/views/devise/sessions/new.html.erb | 6 +++++- app/views/layouts/application.html.erb | 5 ++--- app/views/welcome/index.html.erb | 4 ++-- config/initializers/devise.rb | 3 +-- config/routes.rb | 9 ++------- 10 files changed, 22 insertions(+), 24 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6b4dcfa..2ec15d4 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,10 @@ class ApplicationController < ActionController::Base + protect_from_forgery with: :exception + before_action :configure_permitted_parameters, if: :devise_controller? before_action :authenticate_user! + + protected + def configure_permitted_parameters + devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit(:name, :email, :password, :password_confirmation) } + end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 779f395..3a8f625 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -23,11 +23,9 @@ def create respond_to do |format| if @user.save - format.html { redirect_to user_url(@user), notice: 'User was successfully created.' } - format.json { render :show, status: :created, location: @user } + format.html { redirect_to categories_path, notice: 'Account successfully created.' } else format.html { render :new, status: :unprocessable_entity } - format.json { render json: @user.errors, status: :unprocessable_entity } end end end diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index e387d9c..d7546dd 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -1,3 +1,4 @@ class WelcomeController < ApplicationController + skip_before_action :authenticate_user! def index; end end diff --git a/app/models/user.rb b/app/models/user.rb index f8f341e..00bb6b5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -3,6 +3,5 @@ class User < ApplicationRecord has_many :payments, dependent: :destroy # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable - devise :database_authenticatable, :registerable, - :recoverable, :rememberable, :validatable + devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end diff --git a/app/views/devise/registrations/new.html.erb b/app/views/devise/registrations/new.html.erb index de52a17..66061e8 100644 --- a/app/views/devise/registrations/new.html.erb +++ b/app/views/devise/registrations/new.html.erb @@ -23,9 +23,5 @@ <%= f.label :password_confirmation, class: "sr-only" %> <%= f.password_field :password_confirmation, placeholder: "Confirm password", class: "w-full border border-[#E9EDF4] py-3 px-5 text-base placeholder-[#ACB6BE] outline-none focus-visible:shadow-none focus:border-primary" %> - -
- <%= f.submit "Sign up" %> -
<% end %> \ No newline at end of file diff --git a/app/views/devise/sessions/new.html.erb b/app/views/devise/sessions/new.html.erb index 2006318..9857870 100644 --- a/app/views/devise/sessions/new.html.erb +++ b/app/views/devise/sessions/new.html.erb @@ -14,6 +14,10 @@ <% end %> -
<%= link_to "Forgot your password?", new_password_path(resource_name) %> +
+<%= link_to "Forgot your password?", new_password_path(resource_name) %> + +

Not a member yet? <%= link_to "Sign up", new_registration_path(resource_name) %> +

\ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index bbfb9b8..4fe126f 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,9 +10,8 @@ <%= javascript_importmap_tags %> - -

<%= notice %>

-

<%= alert %>

+ + <% if alert %>

<%= alert %>

<% end %>
<%= yield %>
diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb index 6284810..ec835f6 100644 --- a/app/views/welcome/index.html.erb +++ b/app/views/welcome/index.html.erb @@ -2,12 +2,12 @@ <%= image_tag 'logo.png', class: 'mx-auto' %>
- <%= link_to login_path do %> + <%= link_to new_user_session_path do %>
LOG IN
<% end %> - <%= link_to sign_up_path do %> + <%= link_to new_user_registration_path do %>
SIGN UP
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 4308c3a..89a364a 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -263,8 +263,7 @@ # should add them to the navigational formats lists. # # The "*/*" below is required to match Internet Explorer requests. - # config.navigational_formats = ['*/*', :html] - + config.navigational_formats = ['*/*', :html, :turbo_stream] # The default HTTP method used to sign out a resource. Default is :delete. config.sign_out_via = :delete diff --git a/config/routes.rb b/config/routes.rb index 3d93ed1..c69d970 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,13 +1,8 @@ Rails.application.routes.draw do + devise_for :users resources :payments resources :categories - devise_for :users - - devise_scope :user do - get 'login', to: 'devise/sessions#new' - get 'sign_up', to: 'devise/registrations#new' - end - + authenticated :user do root 'categories#index', as: :authenticated_root end From 599f1c6e063da02b44002075125a1a14945b8038 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Wed, 10 Aug 2022 17:22:02 +0100 Subject: [PATCH 03/21] add form helpers for category and payments --- app/controllers/payments_controller.rb | 1 + app/views/categories/_form.html.erb | 14 +++++++------- app/views/categories/new.html.erb | 9 +++------ app/views/payments/_form.html.erb | 19 ++++++++++++------- app/views/payments/new.html.erb | 10 +++++----- app/views/shared/_session_header.html.erb | 7 +++++++ 6 files changed, 35 insertions(+), 25 deletions(-) create mode 100644 app/views/shared/_session_header.html.erb diff --git a/app/controllers/payments_controller.rb b/app/controllers/payments_controller.rb index a6696cb..917cb31 100644 --- a/app/controllers/payments_controller.rb +++ b/app/controllers/payments_controller.rb @@ -12,6 +12,7 @@ def show; end # GET /payments/new def new @payment = Payment.new + @categories = Category.includes(:user).where(user: current_user) end # GET /payments/1/edit diff --git a/app/views/categories/_form.html.erb b/app/views/categories/_form.html.erb index 1a6470b..4cde3f4 100644 --- a/app/views/categories/_form.html.erb +++ b/app/views/categories/_form.html.erb @@ -11,17 +11,17 @@
<% end %> -
- <%= form.label :name, style: "display: block" %> - <%= form.text_field :name %> +
+ <%= form.label :name, class: "block mb-3 text-base font-medium" %> + <%= form.text_field :name, class: "w-full border-[1.5px] border-form-stroke rounded-lg py-3 px-5 font-medium text-body-color placeholder-body-color outline-none focus:border-primary active:border-primary transition" %>
-
- <%= form.label :icon, style: "display: block" %> - <%= form.file_field :icon %> +
+ <%= form.label :icon, class: "block mb-3 text-base font-medium" %> + <%= form.file_field :icon, class: "w-full border-[1.5px] border-form-stroke rounded-lg font-medium outline-none focus:border-primary active:border-primary transition cursor-pointer bg-white file:bg-white file:border-0 file:border-r file:border-solid file:border-collapse file:border-form-stroke file:py-3 file:px-5 file:mr-5 file:text-body-color file:cursor-pointer file:hover:bg-primary file:hover:bg-opacity-10" %>
-
+
<%= form.submit %>
<% end %> diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb index 8df9c54..06fca9f 100644 --- a/app/views/categories/new.html.erb +++ b/app/views/categories/new.html.erb @@ -1,9 +1,6 @@ -

New category

+<%= render "shared/session_header", title: "New Category" %> +
<%= render "form", category: @category %> - -
- -
- <%= link_to "Back to categories", categories_path %>
+ diff --git a/app/views/payments/_form.html.erb b/app/views/payments/_form.html.erb index 7fe6ba8..b09853b 100644 --- a/app/views/payments/_form.html.erb +++ b/app/views/payments/_form.html.erb @@ -11,17 +11,22 @@
<% end %> -
- <%= form.label :name, style: "display: block" %> - <%= form.text_field :name %> +
+ <%= form.label :name, class: "block mb-3 text-base font-medium" %> + <%= form.text_field :name, class: "w-full border-[1.5px] border-form-stroke rounded-lg py-3 px-5 font-medium text-body-color placeholder-body-color outline-none focus:border-primary active:border-primary transition" %>
-
- <%= form.label :amount, style: "display: block" %> - <%= form.text_field :amount %> +
+ <%= form.label :amount, class: "block mb-3 text-base font-medium" %> + <%= form.number_field :amount, class: "w-full border-[1.5px] border-form-stroke rounded-lg py-3 px-5 font-medium text-body-color placeholder-body-color outline-none focus:border-primary active:border-primary transition" %>
-
+
+ <%= form.label :category, class: "block mb-3 text-base font-medium" %> + <%= form.collection_select :category_id, categories, :id, :name, {}, {class: "w-full border-[1.5px] border-form-stroke rounded-lg py-3 px-5 font-medium text-body-color placeholder-body-color outline-none focus:border-primary active:border-primary transition"} %> +
+ +
<%= form.submit %>
<% end %> diff --git a/app/views/payments/new.html.erb b/app/views/payments/new.html.erb index 96cd2e0..434bb32 100644 --- a/app/views/payments/new.html.erb +++ b/app/views/payments/new.html.erb @@ -1,9 +1,9 @@ -

New payment

+<%= render "shared/session_header", title: "New Payment" %> -<%= render "form", payment: @payment %> - -
+
+<%= render "form", payment: @payment, categories: @categories %> +
- <%= link_to "Back to payments", payments_path %> + <%= link_to "Go back", payments_path %>
diff --git a/app/views/shared/_session_header.html.erb b/app/views/shared/_session_header.html.erb new file mode 100644 index 0000000..ba9fbff --- /dev/null +++ b/app/views/shared/_session_header.html.erb @@ -0,0 +1,7 @@ +
+ <%= link_to root_path do %> + <%= image_tag "left-arrow.png" %> + <% end %> +

<%= title %>

+ <%= link_to "Sign out", destroy_user_session_path, data: { turbo_method: :delete } %> +
\ No newline at end of file From f98731762e6517aebdedb32385625ff9037fb111 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Thu, 11 Aug 2022 00:25:19 +0100 Subject: [PATCH 04/21] finish categories creation setup --- app/controllers/categories_controller.rb | 27 ++++++----------------- app/models/category.rb | 10 +++++++++ app/views/categories/_category.html.erb | 28 +++++++++++++----------- app/views/categories/_form.html.erb | 4 ++-- app/views/categories/index.html.erb | 22 +++++++++---------- app/views/layouts/application.html.erb | 4 ++-- 6 files changed, 47 insertions(+), 48 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index b50907b..860bc98 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -3,52 +3,39 @@ class CategoriesController < ApplicationController # GET /categories or /categories.json def index - @categories = Category.all + @categories = Category.includes(:user).where(user: current_user) end # GET /categories/1 or /categories/1.json - def show; end + def show + @payments = @category.sorted_payments(current_user) + end # GET /categories/new def new @category = Category.new end - # GET /categories/1/edit - def edit; end - # POST /categories or /categories.json def create @category = Category.new(category_params) + @category.user = current_user respond_to do |format| if @category.save - format.html { redirect_to category_url(@category), notice: 'Category was successfully created.' } + format.html { redirect_to categories_path, notice: 'Category was successfully created.' } else format.html { render :new, status: :unprocessable_entity } end end end - # PATCH/PUT /categories/1 or /categories/1.json - def update - respond_to do |format| - if @category.update(category_params) - format.html { redirect_to category_url(@category), notice: 'Category was successfully updated.' } - format.json { render :show, status: :ok, location: @category } - else - format.html { render :edit, status: :unprocessable_entity } - format.json { render json: @category.errors, status: :unprocessable_entity } - end - end - end - # DELETE /categories/1 or /categories/1.json def destroy @category.destroy respond_to do |format| - format.html { redirect_to categories_url, notice: 'Category was successfully deleted.' } + format.html { redirect_to categories_path, notice: 'Category was successfully deleted.' } end end diff --git a/app/models/category.rb b/app/models/category.rb index 57437a2..d55b94e 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -2,4 +2,14 @@ class Category < ApplicationRecord has_one_attached :icon has_many :payments, dependent: :destroy belongs_to :user + validates :name, presence: true + validates :icon, presence: true + + def total_amount(user) + payments.includes(:user).where(user: user).sum(:amount) + end + + def sorted_payments(user) + payments.includes(:user).where(user: user).order(created_at: :desc) + end end diff --git a/app/views/categories/_category.html.erb b/app/views/categories/_category.html.erb index 0f24311..04df224 100644 --- a/app/views/categories/_category.html.erb +++ b/app/views/categories/_category.html.erb @@ -1,13 +1,15 @@ -
-

- Name: - <%= category.name %> -

- -

- Icon: - <%= link_to category.icon.filename, category.icon if category.icon.attached? %> - <%= image_tag category.icon if category.icon.attached? %> -

- -
+
+ <% if category.icon.attached? %> + <%= image_tag category.icon, class: "w-32 h-32 object-cover rounded-lg" %> + <% else %> + image + <% end %> +
+

<%= category.name %>

+

Total Transactions: <%= category.total_amount(current_user) %>

+
+
diff --git a/app/views/categories/_form.html.erb b/app/views/categories/_form.html.erb index 4cde3f4..65e8134 100644 --- a/app/views/categories/_form.html.erb +++ b/app/views/categories/_form.html.erb @@ -21,7 +21,7 @@ <%= form.file_field :icon, class: "w-full border-[1.5px] border-form-stroke rounded-lg font-medium outline-none focus:border-primary active:border-primary transition cursor-pointer bg-white file:bg-white file:border-0 file:border-r file:border-solid file:border-collapse file:border-form-stroke file:py-3 file:px-5 file:mr-5 file:text-body-color file:cursor-pointer file:hover:bg-primary file:hover:bg-opacity-10" %>
-
- <%= form.submit %> +
+ <%= form.submit class: "px-10 py-4 text-base font-normal text-center text-white rounded-md cursor-pointer lg:px-8 xl:px-10 bg-primary hover:bg-opacity-90" %>
<% end %> diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index 58d8158..453ab40 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -1,14 +1,14 @@ -

<%= notice %>

+<%= render "shared/session_header", title: "Categories" %> -

Categories

- -
+
<% @categories.each do |category| %> - <%= render category %> -

- <%= link_to "Show this category", category %> -

+ <%= link_to category_path(category) do %> + <%= render category %> + <% end %> <% end %> -
- -<%= link_to "New category", new_category_path %> + <%= link_to new_category_path do %> +
+ New Category +
+ <% end %> + diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 4fe126f..c109162 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,9 +10,9 @@ <%= javascript_importmap_tags %> - + <% if alert %>

<%= alert %>

<% end %> -
+
<%= yield %>
From e808bc6c8335c23b2faf6d2f402602a0450609f5 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Thu, 11 Aug 2022 07:55:23 +0100 Subject: [PATCH 05/21] finish payment controller and views setup --- app/controllers/payments_controller.rb | 18 +++------------- app/models/payment.rb | 4 ++++ app/views/categories/_category.html.erb | 2 +- app/views/categories/index.html.erb | 2 +- app/views/categories/new.html.erb | 2 +- app/views/categories/show.html.erb | 26 ++++++++++++++++------- app/views/layouts/application.html.erb | 2 +- app/views/payments/_form.html.erb | 4 ++-- app/views/payments/_payment.html.erb | 19 ++++++----------- app/views/payments/new.html.erb | 5 +---- app/views/shared/_session_header.html.erb | 2 +- 11 files changed, 40 insertions(+), 46 deletions(-) diff --git a/app/controllers/payments_controller.rb b/app/controllers/payments_controller.rb index 917cb31..6f56437 100644 --- a/app/controllers/payments_controller.rb +++ b/app/controllers/payments_controller.rb @@ -21,25 +21,13 @@ def edit; end # POST /payments or /payments.json def create @payment = Payment.new(payment_params) + @payment.user = current_user respond_to do |format| if @payment.save - format.html { redirect_to payment_url(@payment), notice: 'Payment was successfully created.' } - format.json { render :show, status: :created, location: @payment } + format.html { redirect_to category_path(@payment.category), notice: 'Payment was successfully created.' } else format.html { render :new, status: :unprocessable_entity } - format.json { render json: @payment.errors, status: :unprocessable_entity } - end - end - end - - # PATCH/PUT /payments/1 or /payments/1.json - def update - respond_to do |format| - if @payment.update(payment_params) - format.html { redirect_to payment_url(@payment), notice: 'Payment was successfully updated.' } - else - format.html { render :edit, status: :unprocessable_entity } end end end @@ -63,6 +51,6 @@ def set_payment # Only allow a list of trusted parameters through. def payment_params - params.require(:payment).permit(:name, :amount) + params.require(:payment).permit(:name, :amount, :category_id) end end diff --git a/app/models/payment.rb b/app/models/payment.rb index b7149c0..5c56ab6 100644 --- a/app/models/payment.rb +++ b/app/models/payment.rb @@ -1,4 +1,8 @@ class Payment < ApplicationRecord belongs_to :user belongs_to :category + + def payment_date + self.created_at.strftime("%d %b %Y") + end end diff --git a/app/views/categories/_category.html.erb b/app/views/categories/_category.html.erb index 04df224..3eda93c 100644 --- a/app/views/categories/_category.html.erb +++ b/app/views/categories/_category.html.erb @@ -10,6 +10,6 @@ <% end %>

<%= category.name %>

-

Total Transactions: <%= category.total_amount(current_user) %>

+

Total payments: <%= category.total_amount(current_user) %>

diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index 453ab40..ac48f34 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -1,4 +1,4 @@ -<%= render "shared/session_header", title: "Categories" %> +<%= render "shared/session_header", title: "Categories", pathway: root_path %>
<% @categories.each do |category| %> diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb index 06fca9f..89dbfc7 100644 --- a/app/views/categories/new.html.erb +++ b/app/views/categories/new.html.erb @@ -1,4 +1,4 @@ -<%= render "shared/session_header", title: "New Category" %> +<%= render "shared/session_header", title: "New Category", pathway: root_path %>
<%= render "form", category: @category %> diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index dd28ade..873a894 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -1,10 +1,20 @@ -

<%= notice %>

+<%= render "shared/session_header", title: @category.name, pathway: root_path %> -<%= render @category %> +
+ <%= render @category %> +
+

Payments

+ <% @payments.each do |payment| %> + <%= render payment %> + <% end %> +
+
+ <%= link_to new_payment_path do %> +
+ Add new payment +
+ <% end %> -
- <%= link_to "Edit this category", edit_category_path(@category) %> | - <%= link_to "Back to categories", categories_path %> - - <%= button_to "Destroy this category", @category, method: :delete %> -
+ <%= button_to "Delete category", @category, method: :delete, class: "p-4 text-base font-normal text-center text-white rounded-md cursor-pointer bg-primary hover:bg-opacity-90" %> +
+
\ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index c109162..c5616c4 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,7 +10,7 @@ <%= javascript_importmap_tags %> - + <% if alert %>

<%= alert %>

<% end %>
<%= yield %> diff --git a/app/views/payments/_form.html.erb b/app/views/payments/_form.html.erb index b09853b..6047ad6 100644 --- a/app/views/payments/_form.html.erb +++ b/app/views/payments/_form.html.erb @@ -26,7 +26,7 @@ <%= form.collection_select :category_id, categories, :id, :name, {}, {class: "w-full border-[1.5px] border-form-stroke rounded-lg py-3 px-5 font-medium text-body-color placeholder-body-color outline-none focus:border-primary active:border-primary transition"} %>
-
- <%= form.submit %> +
+ <%= form.submit class: "px-10 py-4 text-base font-normal text-center text-white rounded-md cursor-pointer lg:px-8 xl:px-10 bg-primary hover:bg-opacity-90" %>
<% end %> diff --git a/app/views/payments/_payment.html.erb b/app/views/payments/_payment.html.erb index 409c206..00916d6 100644 --- a/app/views/payments/_payment.html.erb +++ b/app/views/payments/_payment.html.erb @@ -1,12 +1,7 @@ -
-

- Name: - <%= payment.name %> -

- -

- Amount: - <%= payment.amount %> -

- -
+
+
+

<%= payment.name %>

+

Amount: <%= payment.amount %>

+
+

<%= payment.payment_date %>

+
diff --git a/app/views/payments/new.html.erb b/app/views/payments/new.html.erb index 434bb32..04e878e 100644 --- a/app/views/payments/new.html.erb +++ b/app/views/payments/new.html.erb @@ -1,9 +1,6 @@ -<%= render "shared/session_header", title: "New Payment" %> +<%= render "shared/session_header", title: "New Payment", pathway: :back %>
<%= render "form", payment: @payment, categories: @categories %>
-
- <%= link_to "Go back", payments_path %> -
diff --git a/app/views/shared/_session_header.html.erb b/app/views/shared/_session_header.html.erb index ba9fbff..16fe733 100644 --- a/app/views/shared/_session_header.html.erb +++ b/app/views/shared/_session_header.html.erb @@ -1,5 +1,5 @@
- <%= link_to root_path do %> + <%= link_to(pathway) do %> <%= image_tag "left-arrow.png" %> <% end %>

<%= title %>

From 7d8bb818d949a0def7a54900f2773ef73ad63c5b Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Thu, 11 Aug 2022 13:43:05 +0100 Subject: [PATCH 06/21] setup cloud storage for files --- Gemfile | 1 + Gemfile.lock | 18 +++++++++++ app/assets/javascript/activestorage.js | 2 ++ app/assets/javascript/direct_uploads.js | 40 +++++++++++++++++++++++++ app/assets/stylesheets/application.css | 39 ++++++++++++++++++++++++ app/views/categories/_form.html.erb | 2 +- config/environments/development.rb | 2 +- config/environments/production.rb | 2 +- config/storage.yml | 13 ++++---- 9 files changed, 110 insertions(+), 9 deletions(-) create mode 100644 app/assets/javascript/activestorage.js create mode 100644 app/assets/javascript/direct_uploads.js diff --git a/Gemfile b/Gemfile index 92e3e8f..6d73c45 100644 --- a/Gemfile +++ b/Gemfile @@ -54,6 +54,7 @@ gem 'cssbundling-rails', '~> 1.1' # Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images] # gem "image_processing", "~> 1.2" +gem "aws-sdk-s3", require: false group :development, :test do # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem diff --git a/Gemfile.lock b/Gemfile.lock index 3064550..91a807f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -69,6 +69,22 @@ GEM addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) ast (2.4.2) + aws-eventstream (1.2.0) + aws-partitions (1.616.0) + aws-sdk-core (3.132.0) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.525.0) + aws-sigv4 (~> 1.1) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.58.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.114.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.4) + aws-sigv4 (1.5.1) + aws-eventstream (~> 1, >= 1.0.2) bcrypt (3.1.18) bindex (0.8.1) bootsnap (1.13.0) @@ -123,6 +139,7 @@ GEM jbuilder (2.11.5) actionview (>= 5.0.0) activesupport (>= 5.0.0) + jmespath (1.6.1) json (2.6.2) loofah (2.18.0) crass (~> 1.0.2) @@ -283,6 +300,7 @@ PLATFORMS x64-mingw-ucrt DEPENDENCIES + aws-sdk-s3 bootsnap capybara cssbundling-rails (~> 1.1) diff --git a/app/assets/javascript/activestorage.js b/app/assets/javascript/activestorage.js new file mode 100644 index 0000000..91c172d --- /dev/null +++ b/app/assets/javascript/activestorage.js @@ -0,0 +1,2 @@ +//= require activestorage + diff --git a/app/assets/javascript/direct_uploads.js b/app/assets/javascript/direct_uploads.js new file mode 100644 index 0000000..15a96e3 --- /dev/null +++ b/app/assets/javascript/direct_uploads.js @@ -0,0 +1,40 @@ + +// direct_uploads.js + +addEventListener("direct-upload:initialize", event => { + const { target, detail } = event + const { id, file } = detail + target.insertAdjacentHTML("beforebegin", ` +
+
+ +
+ `) + target.previousElementSibling.querySelector(`.direct-upload__filename`).textContent = file.name +}) + +addEventListener("direct-upload:start", event => { + const { id } = event.detail + const element = document.getElementById(`direct-upload-${id}`) + element.classList.remove("direct-upload--pending") +}) + +addEventListener("direct-upload:progress", event => { + const { id, progress } = event.detail + const progressElement = document.getElementById(`direct-upload-progress-${id}`) + progressElement.style.width = `${progress}%` +}) + +addEventListener("direct-upload:error", event => { + event.preventDefault() + const { id, error } = event.detail + const element = document.getElementById(`direct-upload-${id}`) + element.classList.add("direct-upload--error") + element.setAttribute("title", error) +}) + +addEventListener("direct-upload:end", event => { + const { id } = event.detail + const element = document.getElementById(`direct-upload-${id}`) + element.classList.add("direct-upload--complete") +}) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 288b9ab..549a72b 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -13,3 +13,42 @@ *= require_tree . *= require_self */ +/* direct_uploads.css */ + +.direct-upload { + display: inline-block; + position: relative; + padding: 2px 4px; + margin: 0 3px 3px 0; + border: 1px solid rgba(0, 0, 0, 0.3); + border-radius: 3px; + font-size: 11px; + line-height: 13px; +} + +.direct-upload--pending { + opacity: 0.6; +} + +.direct-upload__progress { + position: absolute; + top: 0; + left: 0; + bottom: 0; + opacity: 0.2; + background: #0076ff; + transition: width 120ms ease-out, opacity 60ms 60ms ease-in; + transform: translate3d(0, 0, 0); +} + +.direct-upload--complete .direct-upload__progress { + opacity: 0.4; +} + +.direct-upload--error { + border-color: red; +} + +input[type=file][data-direct-upload-url][disabled] { + display: none; +} \ No newline at end of file diff --git a/app/views/categories/_form.html.erb b/app/views/categories/_form.html.erb index 65e8134..059d511 100644 --- a/app/views/categories/_form.html.erb +++ b/app/views/categories/_form.html.erb @@ -18,7 +18,7 @@
<%= form.label :icon, class: "block mb-3 text-base font-medium" %> - <%= form.file_field :icon, class: "w-full border-[1.5px] border-form-stroke rounded-lg font-medium outline-none focus:border-primary active:border-primary transition cursor-pointer bg-white file:bg-white file:border-0 file:border-r file:border-solid file:border-collapse file:border-form-stroke file:py-3 file:px-5 file:mr-5 file:text-body-color file:cursor-pointer file:hover:bg-primary file:hover:bg-opacity-10" %> + <%= form.file_field :icon, direct_upload: true, class: "w-full border-[1.5px] border-form-stroke rounded-lg font-medium outline-none focus:border-primary active:border-primary transition cursor-pointer bg-white file:bg-white file:border-0 file:border-r file:border-solid file:border-collapse file:border-form-stroke file:py-3 file:px-5 file:mr-5 file:text-body-color file:cursor-pointer file:hover:bg-primary file:hover:bg-opacity-10" %>
diff --git a/config/environments/development.rb b/config/environments/development.rb index ded35d7..c87b1b3 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -34,7 +34,7 @@ end # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :local + config.active_storage.service = :spaces # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false diff --git a/config/environments/production.rb b/config/environments/production.rb index 8ef8d9d..b21b234 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -38,7 +38,7 @@ # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :local + config.active_storage.service = :spaces # Mount Action Cable outside main process or domain. # config.action_cable.mount_path = nil diff --git a/config/storage.yml b/config/storage.yml index 4942ab6..62dfbdf 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -7,12 +7,13 @@ local: root: <%= Rails.root.join("storage") %> # Use bin/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-<%= Rails.env %> +spaces: + service: S3 + access_key_id: DO002NTJAWM29VNLZBBB + secret_access_key: 1eDGe0YlGwH807XA4MfRbYMzFhCocqeApHkROwSNi64 + region: nyc3 + bucket: budgit-app + endpoint: https://nyc3.digitaloceanspaces.com/ # Remember not to checkin your GCS keyfile to a repository # google: From 2ef5e8836d2ca68bd5a706e5d01415e481ff737f Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Thu, 11 Aug 2022 14:20:27 +0100 Subject: [PATCH 07/21] remove access keys --- config/storage.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/storage.yml b/config/storage.yml index 62dfbdf..73b6e0a 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -9,8 +9,8 @@ local: # Use bin/rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) spaces: service: S3 - access_key_id: DO002NTJAWM29VNLZBBB - secret_access_key: 1eDGe0YlGwH807XA4MfRbYMzFhCocqeApHkROwSNi64 + access_key_id: + secret_access_key: region: nyc3 bucket: budgit-app endpoint: https://nyc3.digitaloceanspaces.com/ From 1210743bfa4ea3d9fc10892a7a8eeed930c2745f Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Thu, 11 Aug 2022 14:23:52 +0100 Subject: [PATCH 08/21] add validations to payment --- app/models/payment.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/models/payment.rb b/app/models/payment.rb index 5c56ab6..5b8ef65 100644 --- a/app/models/payment.rb +++ b/app/models/payment.rb @@ -1,6 +1,10 @@ class Payment < ApplicationRecord belongs_to :user belongs_to :category + validates :amount, presence: true + validates :amount, numericality: { greater_than: 0 } + validates :category_id, presence: true + validates :name, presence: true def payment_date self.created_at.strftime("%d %b %Y") From e625009432e58dfc9967d934fe8b330c2e92fe80 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Thu, 11 Aug 2022 16:20:52 +0100 Subject: [PATCH 09/21] setup test suite --- .../{requests => features}/categories_spec.rb | 0 spec/{requests => features}/payments_spec.rb | 0 spec/{requests => features}/users_spec.rb | 0 spec/{requests => features}/welcome_spec.rb | 0 spec/helpers/payments_helper_spec.rb | 15 -------- spec/helpers/users_helper_spec.rb | 15 -------- spec/helpers/welcome_helper_spec.rb | 15 -------- spec/routing/categories_routing_spec.rb | 37 ------------------- spec/routing/payments_routing_spec.rb | 37 ------------------- spec/routing/users_routing_spec.rb | 37 ------------------- 10 files changed, 156 deletions(-) rename spec/{requests => features}/categories_spec.rb (100%) rename spec/{requests => features}/payments_spec.rb (100%) rename spec/{requests => features}/users_spec.rb (100%) rename spec/{requests => features}/welcome_spec.rb (100%) delete mode 100644 spec/helpers/payments_helper_spec.rb delete mode 100644 spec/helpers/users_helper_spec.rb delete mode 100644 spec/helpers/welcome_helper_spec.rb delete mode 100644 spec/routing/categories_routing_spec.rb delete mode 100644 spec/routing/payments_routing_spec.rb delete mode 100644 spec/routing/users_routing_spec.rb diff --git a/spec/requests/categories_spec.rb b/spec/features/categories_spec.rb similarity index 100% rename from spec/requests/categories_spec.rb rename to spec/features/categories_spec.rb diff --git a/spec/requests/payments_spec.rb b/spec/features/payments_spec.rb similarity index 100% rename from spec/requests/payments_spec.rb rename to spec/features/payments_spec.rb diff --git a/spec/requests/users_spec.rb b/spec/features/users_spec.rb similarity index 100% rename from spec/requests/users_spec.rb rename to spec/features/users_spec.rb diff --git a/spec/requests/welcome_spec.rb b/spec/features/welcome_spec.rb similarity index 100% rename from spec/requests/welcome_spec.rb rename to spec/features/welcome_spec.rb diff --git a/spec/helpers/payments_helper_spec.rb b/spec/helpers/payments_helper_spec.rb deleted file mode 100644 index a6fcc46..0000000 --- a/spec/helpers/payments_helper_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'rails_helper' - -# Specs in this file have access to a helper object that includes -# the PaymentsHelper. For example: -# -# describe PaymentsHelper do -# describe "string concat" do -# it "concats two strings with spaces" do -# expect(helper.concat_strings("this","that")).to eq("this that") -# end -# end -# end -RSpec.describe PaymentsHelper, type: :helper do - pending "add some examples to (or delete) #{__FILE__}" -end diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb deleted file mode 100644 index b2e3444..0000000 --- a/spec/helpers/users_helper_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'rails_helper' - -# Specs in this file have access to a helper object that includes -# the UsersHelper. For example: -# -# describe UsersHelper do -# describe "string concat" do -# it "concats two strings with spaces" do -# expect(helper.concat_strings("this","that")).to eq("this that") -# end -# end -# end -RSpec.describe UsersHelper, type: :helper do - pending "add some examples to (or delete) #{__FILE__}" -end diff --git a/spec/helpers/welcome_helper_spec.rb b/spec/helpers/welcome_helper_spec.rb deleted file mode 100644 index a899852..0000000 --- a/spec/helpers/welcome_helper_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'rails_helper' - -# Specs in this file have access to a helper object that includes -# the WelcomeHelper. For example: -# -# describe WelcomeHelper do -# describe "string concat" do -# it "concats two strings with spaces" do -# expect(helper.concat_strings("this","that")).to eq("this that") -# end -# end -# end -RSpec.describe WelcomeHelper, type: :helper do - pending "add some examples to (or delete) #{__FILE__}" -end diff --git a/spec/routing/categories_routing_spec.rb b/spec/routing/categories_routing_spec.rb deleted file mode 100644 index 1a18eba..0000000 --- a/spec/routing/categories_routing_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'rails_helper' - -RSpec.describe CategoriesController, type: :routing do - describe 'routing' do - it 'routes to #index' do - expect(get: '/categories').to route_to('categories#index') - end - - it 'routes to #new' do - expect(get: '/categories/new').to route_to('categories#new') - end - - it 'routes to #show' do - expect(get: '/categories/1').to route_to('categories#show', id: '1') - end - - it 'routes to #edit' do - expect(get: '/categories/1/edit').to route_to('categories#edit', id: '1') - end - - it 'routes to #create' do - expect(post: '/categories').to route_to('categories#create') - end - - it 'routes to #update via PUT' do - expect(put: '/categories/1').to route_to('categories#update', id: '1') - end - - it 'routes to #update via PATCH' do - expect(patch: '/categories/1').to route_to('categories#update', id: '1') - end - - it 'routes to #destroy' do - expect(delete: '/categories/1').to route_to('categories#destroy', id: '1') - end - end -end diff --git a/spec/routing/payments_routing_spec.rb b/spec/routing/payments_routing_spec.rb deleted file mode 100644 index 1fcc537..0000000 --- a/spec/routing/payments_routing_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'rails_helper' - -RSpec.describe PaymentsController, type: :routing do - describe 'routing' do - it 'routes to #index' do - expect(get: '/payments').to route_to('payments#index') - end - - it 'routes to #new' do - expect(get: '/payments/new').to route_to('payments#new') - end - - it 'routes to #show' do - expect(get: '/payments/1').to route_to('payments#show', id: '1') - end - - it 'routes to #edit' do - expect(get: '/payments/1/edit').to route_to('payments#edit', id: '1') - end - - it 'routes to #create' do - expect(post: '/payments').to route_to('payments#create') - end - - it 'routes to #update via PUT' do - expect(put: '/payments/1').to route_to('payments#update', id: '1') - end - - it 'routes to #update via PATCH' do - expect(patch: '/payments/1').to route_to('payments#update', id: '1') - end - - it 'routes to #destroy' do - expect(delete: '/payments/1').to route_to('payments#destroy', id: '1') - end - end -end diff --git a/spec/routing/users_routing_spec.rb b/spec/routing/users_routing_spec.rb deleted file mode 100644 index 7933520..0000000 --- a/spec/routing/users_routing_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'rails_helper' - -RSpec.describe UsersController, type: :routing do - describe 'routing' do - it 'routes to #index' do - expect(get: '/users').to route_to('users#index') - end - - it 'routes to #new' do - expect(get: '/users/new').to route_to('users#new') - end - - it 'routes to #show' do - expect(get: '/users/1').to route_to('users#show', id: '1') - end - - it 'routes to #edit' do - expect(get: '/users/1/edit').to route_to('users#edit', id: '1') - end - - it 'routes to #create' do - expect(post: '/users').to route_to('users#create') - end - - it 'routes to #update via PUT' do - expect(put: '/users/1').to route_to('users#update', id: '1') - end - - it 'routes to #update via PATCH' do - expect(patch: '/users/1').to route_to('users#update', id: '1') - end - - it 'routes to #destroy' do - expect(delete: '/users/1').to route_to('users#destroy', id: '1') - end - end -end From 183f1109184fa8866eaa66c596d888b003663ebe Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Fri, 12 Aug 2022 09:41:33 +0100 Subject: [PATCH 10/21] write model spec for all models --- app/models/category.rb | 1 + app/models/user.rb | 4 ++-- spec/factories/food_factory.rb | 18 ------------------ spec/factories/user_factory.rb | 1 - spec/fixtures/files/logo.png | Bin 0 -> 4466 bytes spec/models/category_spec.rb | 18 +++++++++++++++++- spec/models/payment_spec.rb | 10 +++++++++- spec/models/user_spec.rb | 13 ++++++++++++- 8 files changed, 41 insertions(+), 24 deletions(-) delete mode 100644 spec/factories/food_factory.rb create mode 100644 spec/fixtures/files/logo.png diff --git a/app/models/category.rb b/app/models/category.rb index d55b94e..46c6e20 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -4,6 +4,7 @@ class Category < ApplicationRecord belongs_to :user validates :name, presence: true validates :icon, presence: true + validates :user_id, presence: true def total_amount(user) payments.includes(:user).where(user: user).sum(:amount) diff --git a/app/models/user.rb b/app/models/user.rb index 00bb6b5..23fac01 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,7 +1,7 @@ class User < ApplicationRecord has_many :categories, dependent: :destroy has_many :payments, dependent: :destroy - # Include default devise modules. Others available are: - # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable + validates :name, presence: true, length: { minimum: 3, maximum: 25 } + devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end diff --git a/spec/factories/food_factory.rb b/spec/factories/food_factory.rb deleted file mode 100644 index e0f0061..0000000 --- a/spec/factories/food_factory.rb +++ /dev/null @@ -1,18 +0,0 @@ -FactoryBot.define do - factory :food do - name { 'Pizza' } - measurement_unit { 'grams' } - price { 10 } - quantity { 100 } - end -end - -FactoryBot.define do - factory :recipe do - name { 'Pizza' } - preparation_time { 10 } - cooking_time { 10 } - description { 'Pizza recipe' } - public { true } - end -end diff --git a/spec/factories/user_factory.rb b/spec/factories/user_factory.rb index 25d40a8..6329320 100644 --- a/spec/factories/user_factory.rb +++ b/spec/factories/user_factory.rb @@ -4,6 +4,5 @@ email { 'testing@gmail.com' } password { 'password' } password_confirmation { 'password' } - confirmed_at { Date.today } end end diff --git a/spec/fixtures/files/logo.png b/spec/fixtures/files/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..be877b45b8e9e253866ee66560d02cfd4c734853 GIT binary patch literal 4466 zcmb_fdpwi<`=^tV&JprFlu9Kwa)=yq$eF~FG|OfiW45*3m^r6C9tn>mNlTKL)4r0{ z%t%67nnTjasU@UYPA#W=NBw%9=lgp8_`QC=?_T%4d)M{3uJ`A2UDx}%UiT7QU2HeV zD$7bqNo}yVvv!j_XP54^D<$7Gx`mr0k5zsa&K6QqWhv|D;j1OGG|A1@QmXW&%7~QI zibhu_$nnL+#mULZq@)ZEr_S2iBQ7pwZf?%f5|T)zE-Wm#xWG6pRz^k+jg~($GV1E; zlbV|4=7xYcI209?!(iC-^lT=Rlai8IQ&TSzjeB^YS*)7G#Ps&oRwRrPfti_^ z#>VEH96Fs|24JxQ!JvbK7Xm@Z%`Hk#r=_LQXtX>mmLe95OG+y8^BG7ebYMW>4IjU~q8A#oAgV5_NR&b8}0e zQ0&mq2$h=ZVq??X+%6CZGBa~LTwDMk&c?DklMH$6RVZ4H4!1E|!LZa%-6%S}y8tmSaZ84NDB)x!fR5DejP6bA<=0K_7^ycmp% z#zwB4nc3*b2$?`&(CPK{-05j?c2-tJS=pdK5E2p>8=KhK*!jKFqt)6E{{Nns$sJS1_rTMG7gQ-&Caf`Z_3FjD$374qOF~snK>>J zMTCSLGcX|d`)8)5L7be3#8@_y8A2eG(CGmPL|Rf(T}=(2-#s}#UQxk`C6kE(0fc~n z&W;XlVhevu!N?hHvvN(QlXOCOR6F#rHlFAQ(lIhJ0)cfwy1H5t3oTL@4uF%ja3pmJf~?vyhBb=hOT-WW3?8Sp zgb7FBg8@?w4Oz7x&=vqd#2|j6<4D@@Wlivsi?$?a5FAMY>1czOj-{q%^4;Fp0!dmD zzi;A>I=?J@m#~=Sod|Fu2?YrwpiDK~P$YaX(HFIhu;lau#EOW511O}KE?5!)_=pzR z$OQBsOG|tF>2RD3*dxsjgVBciXkWONj)5LZOYg7&TnhmOOQun!y|o2|EG@h_hu_{Q-^ggDGzu!Co*I0W_vNnIIg@$BL`7g6vupJV z#T6UZPRg#@Y#{r)I9J+B|9M>h9*4Y!V8O!#J6gfr5w>&O?Vwql+kukz4-e1}R=Bl& z+tSm+=hGUE`~uX&M4smsAHNMBGc6yQWU*6onEK2N3gzr9PzZee=1Q-l(Y8&OFCU8V=ijdg z~)2BVN&9eRY$hOY6)pfruTohsk_Hl}#!l zI>AZSwjI0sB-BEqQkM($rMp=5H4ru*E&Swsil_h52;F$Y^hMQgw+h1VeBr#_xMr{X zm)k|Z(6^k(ox1qt!Ptru(9fI6?7Fd;=g?6aT&&*d#Dg}o&F^daJ%j-jB+bL^V3=&@ zS#P8Dhz${3CIFgHs>m_!5?=niXFN5}44B@Weg1q!bY*p_+piZbRCi$Y$6jT;I?Xpw zicAGr(Df}H9Dnb9e{G#g*)G{gCkM=KC`NfJjCKAAu@F0Z(cr+vE60UN3QPraV;0`TUYhs9a?q1#8|@>X~^adw>GNnGnIu4(%Dc9Fs_8ZJZx+4 zaaCRGHXM>_f6jOxIw{q@Yc(igvs|UuUNkDu)?PtxkELRH)1Hn)=)sQGGdGTBByMhS zu6zqON;KJdTYR;4*j@<%^6rv03cT>L?NFDd71rmu*7o*GnTI$}+Wb-#dlC1#6t?ud zd2tsbufTJW^IhkTeLQ+G>ICvjI-T&aDk9g(n?3ko+UbVJfYelYCc+UpMO_k%bgg!} zWAksmu9tY;+C95liDRW{bMN}@%$$q%M>X_OlrCx*?o3Rj?~|g%9@(W$IZ_HKh*G*>k*!fm*>A?At4*P2n|4Q=bD_2OLep9P zoT`s{lm};@7hXnh^wUjIiK&izn=$WJWBFlt2UM*j8~$mZroxH&O;iDUN8XB-6xZPo zX;&B|$fe}6UlX2yC+IioN4F1r{jfJ#KBm_;$FWgdat89-wX%@$U%K|IU;1@B?&i@D z)zsUV0`I6NhFegM8DrwDlffIBhEQu_zZLvzcnTA9@6+Ci!W}bQ7}w7gv}ti8kl>{3 z{pjG1LjBW)N$2Xm{w~`0=z^v8t|yV2Mcjkoqu2LPdPY^kP`@V&uU!l`+O9dqQabp& z*V$ytr9ih*swz#6q8X~|u6$|q4{bu;3hjc^NAovDC4GTV+5wmKj^R4azP6orjXbXD zy*WAb@Ti~n{@V1e{->Xr;ab4tdEKeWAJ53Vo!ej`LMz7v&;a%8brr9Qt&33rHT?bM4%8oZ1>yH(wg9}T#t^>=zR}qb7zXu!bjajiwoD1NDH4I)B4B) z>idjg!?Az8%gzoLXOU`rdF#3j#ElM-e?a{WDOk1HG^W^xqY9hu?7>(MVwmrM;Mc)F-%cEG| zs>PQ#3aW<3ZW+!mNe%sW_tlP<+2)JFV(aJ+w~H1O`a!)(L5ygh;CC|8(@pr2m+`zC z;|=kB%*w-SdgkA!D6~H2-G_{xtHA^#hJ*2{-;z2`sxD62ym+oT&Ww4}Cugz98;PFR zvq$#M_H0_b8Nu~n_03Idiu1LP-dLHxSg~08-b7}0{Vua7XSx21f%iOxc9c2MQ<7Pa z?fM_t1#}6nRmIqwR|11l%LTc~4EkWC^W5<1_wND+FFX~&i%m~F3xC!>EX*<2N=!`g z@Z0PXHC#>{*C!f~;uA>OPZzFDnB@meeQC)9d8f@UwEw2dm!UjmS$+%2t*Svp|7O^B zK(s3^mr2FRhRSx!!kX1?&bMRWYxOR7A$WZ*O8le~_h$vN1cemj^pY)sn)K6FRZ@aXX z{A9;{x~)mUEu8gGn$r4%{aq@FQ9OlBMeLoK^~UXJA37U}2c;Z%_4Wg8h}rIky_169rPHaJ&@_GFRknR3$M0EXkJ-QMy>>_T;PD#I>hgd>PJF@4sc*iHNQ7DHZQuRFBRECS9JjQ~ z%IH$##O#`d_UX%46J?54_3PjVSF6i?y_HIA=JDJ2pQ$~qET?|umMXrd{nfG5P{zj^ zWrZ>S+JyVwJz-(g`uZ$`Qyybo)uMMfZEeZP4GlMLbalDsS60ICVU+HNogUsUxr{^P zM^XO%Gflnv9eh6N!*+Rn{q#XYF?7U4@yg1x%B!{ho9{IL{Du^piSCbHonLiIPPoN> Q>0hG#aTn`SOP>q>23uVa=l}o! literal 0 HcmV?d00001 diff --git a/spec/models/category_spec.rb b/spec/models/category_spec.rb index 0c9fefa..890be58 100644 --- a/spec/models/category_spec.rb +++ b/spec/models/category_spec.rb @@ -1,5 +1,21 @@ require 'rails_helper' RSpec.describe Category, type: :model do - pending "add some examples to (or delete) #{__FILE__}" + before :all do + @user = FactoryBot.create(:user) + @category = Category.create(name: 'Test Category', icon: fixture_file_upload("logo.png"), user_id: @user.id) + end + + it 'is valid with valid attributes' do + expect(@category).to be_valid + end + + it 'is not valid without a name' do + @category.name = nil + expect(@category).to_not be_valid + end + + it 'icon should be present' do + expect(@category.icon).to be_attached + end end diff --git a/spec/models/payment_spec.rb b/spec/models/payment_spec.rb index c185224..a716e67 100644 --- a/spec/models/payment_spec.rb +++ b/spec/models/payment_spec.rb @@ -1,5 +1,13 @@ require 'rails_helper' RSpec.describe Payment, type: :model do - pending "add some examples to (or delete) #{__FILE__}" + before :all do + @user = FactoryBot.create(:user) + @category = Category.create(name: 'Test Category', icon: fixture_file_upload("logo.png"), user_id: @user.id) + @payment = Payment.create(name: 'Test Payment', amount: 100, user_id: @user.id, category_id: @category.id) + end + + it 'is valid with valid attributes' do + expect(@payment).to be_valid + end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 47a31bb..36ce9dc 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1,5 +1,16 @@ require 'rails_helper' RSpec.describe User, type: :model do - pending "add some examples to (or delete) #{__FILE__}" + before :all do + @user = FactoryBot.create(:user) + end + + it 'is valid with valid attributes' do + expect(@user).to be_valid + end + + it 'is not valid without a name' do + @user.name = nil + expect(@user).to_not be_valid + end end From 524c399022b1de07e313242a75d66d8cfc028d59 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Fri, 12 Aug 2022 11:45:01 +0100 Subject: [PATCH 11/21] update secret keys --- .gitignore | 3 +++ Gemfile | 5 +++++ Gemfile.lock | 10 ++++++++++ config/storage.yml | 4 ++-- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 1dd0a39..a3539c6 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,6 @@ !/app/assets/builds/.keep /node_modules + +# Ignore application configuration +/config/application.yml diff --git a/Gemfile b/Gemfile index 6d73c45..cb22b47 100644 --- a/Gemfile +++ b/Gemfile @@ -56,6 +56,9 @@ gem 'cssbundling-rails', '~> 1.1' # gem "image_processing", "~> 1.2" gem "aws-sdk-s3", require: false +# Store encrypted credentials +gem "figaro" + group :development, :test do # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem gem 'debug', platforms: %i[mri mingw x64_mingw] @@ -83,3 +86,5 @@ group :test do gem 'selenium-webdriver' gem 'webdrivers' end + +gem 'pry-rails', :group => :development \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 91a807f..0b9581d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -100,6 +100,7 @@ GEM regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) childprocess (4.1.0) + coderay (1.1.3) concurrent-ruby (1.1.10) crass (1.0.6) cssbundling-rails (1.1.1) @@ -126,6 +127,8 @@ GEM factory_bot (~> 6.2.0) railties (>= 5.0.0) ffi (1.15.5-x64-mingw-ucrt) + figaro (1.2.0) + thor (>= 0.14.0, < 2) globalid (1.0.0) activesupport (>= 5.0) i18n (1.12.0) @@ -174,6 +177,11 @@ GEM parser (3.1.2.0) ast (~> 2.4.1) pg (1.4.2-x64-mingw-ucrt) + pry (0.14.1) + coderay (~> 1.1) + method_source (~> 1.0) + pry-rails (0.3.9) + pry (>= 0.10.4) public_suffix (4.0.7) puma (5.6.4) nio4r (~> 2.0) @@ -309,9 +317,11 @@ DEPENDENCIES devise factory_bot_rails ffi (~> 1.15, >= 1.15.5) + figaro importmap-rails jbuilder pg (~> 1.1) + pry-rails puma (~> 5.0) rails (~> 7.0.3, >= 7.0.3.1) rails-controller-testing diff --git a/config/storage.yml b/config/storage.yml index 62dfbdf..c3e95d4 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -9,8 +9,8 @@ local: # Use bin/rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) spaces: service: S3 - access_key_id: DO002NTJAWM29VNLZBBB - secret_access_key: 1eDGe0YlGwH807XA4MfRbYMzFhCocqeApHkROwSNi64 + access_key_id: <%= Figaro.env.spaces_access_key_id %> + secret_access_key: <%= Figaro.env.spaces_secret_access_key %> region: nyc3 bucket: budgit-app endpoint: https://nyc3.digitaloceanspaces.com/ From f1cd73c7727a2a5f0f22dbbb9715f4bf7181f188 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Fri, 12 Aug 2022 21:48:26 +0100 Subject: [PATCH 12/21] write integration tests --- app/views/welcome/index.html.erb | 2 +- config/environments/development.rb | 2 +- spec/features/categories_spec.rb | 132 ++++++--------------------- spec/features/payments_spec.rb | 138 +++-------------------------- spec/features/users_spec.rb | 130 --------------------------- spec/features/welcome_spec.rb | 25 +++++- 6 files changed, 62 insertions(+), 367 deletions(-) delete mode 100644 spec/features/users_spec.rb diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb index ec835f6..d8533d7 100644 --- a/app/views/welcome/index.html.erb +++ b/app/views/welcome/index.html.erb @@ -1,5 +1,5 @@
-<%= image_tag 'logo.png', class: 'mx-auto' %> +<%= image_tag 'logo.png', alt: 'logo', class: 'mx-auto' %>
<%= link_to new_user_session_path do %> diff --git a/config/environments/development.rb b/config/environments/development.rb index c87b1b3..ded35d7 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -34,7 +34,7 @@ end # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :spaces + config.active_storage.service = :local # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false diff --git a/spec/features/categories_spec.rb b/spec/features/categories_spec.rb index 637df67..18c3091 100644 --- a/spec/features/categories_spec.rb +++ b/spec/features/categories_spec.rb @@ -1,130 +1,48 @@ require 'rails_helper' -# This spec was generated by rspec-rails when you ran the scaffold generator. -# It demonstrates how one might use RSpec to test the controller code that -# was generated by Rails when you ran the scaffold generator. -# -# It assumes that the implementation code is generated by the rails scaffold -# generator. If you are using any extension libraries to generate different -# controller code, this generated spec may or may not pass. -# -# It only uses APIs available in rails and/or rspec-rails. There are a number -# of tools you can use to make these specs even more expressive, but we're -# sticking to rails and rspec-rails APIs to keep things simple and stable. - -RSpec.describe '/categories', type: :request do - # This should return the minimal set of attributes required to create a valid - # Category. As you add validations to Category, be sure to - # adjust the attributes here as well. - let(:valid_attributes) do - skip('Add a hash of attributes valid for your model') - end - - let(:invalid_attributes) do - skip('Add a hash of attributes invalid for your model') +RSpec.describe '/categories', type: :feature do + before :each do + @user = FactoryBot.create(:user) + sign_in @user end describe 'GET /index' do - it 'renders a successful response' do - Category.create! valid_attributes - get categories_url - expect(response).to be_successful + it 'renders the index template' do + visit authenticated_root_path + expect(page).to have_text('Categories') end - end - describe 'GET /show' do - it 'renders a successful response' do - category = Category.create! valid_attributes - get category_url(category) - expect(response).to be_successful + it 'redirect to new category page' do + visit authenticated_root_path + click_on 'New Category' + expect(page).to have_content('New Category') end end - describe 'GET /new' do - it 'renders a successful response' do - get new_category_url - expect(response).to be_successful + describe 'GET /show' do + it 'renders a successful response and page' do + category = Category.create(name: 'Test Category', icon: fixture_file_upload("logo.png"), user_id: @user.id) + visit category_path(category) + expect(page).to have_content('Test Category') end end - describe 'GET /edit' do - it 'renders a successful response' do - category = Category.create! valid_attributes - get edit_category_url(category) - expect(response).to be_successful + describe 'GET /new' do + it 'renders a form' do + visit new_category_path + expect(page).to have_content('New Category') end end describe 'POST /create' do context 'with valid parameters' do it 'creates a new Category' do - expect do - post categories_url, params: { category: valid_attributes } - end.to change(Category, :count).by(1) - end - - it 'redirects to the created category' do - post categories_url, params: { category: valid_attributes } - expect(response).to redirect_to(category_url(Category.last)) - end - end - - context 'with invalid parameters' do - it 'does not create a new Category' do - expect do - post categories_url, params: { category: invalid_attributes } - end.to change(Category, :count).by(0) - end - - it "renders a successful response (i.e. to display the 'new' template)" do - post categories_url, params: { category: invalid_attributes } - expect(response).to be_successful - end - end - end - - describe 'PATCH /update' do - context 'with valid parameters' do - let(:new_attributes) do - skip('Add a hash of attributes valid for your model') - end - - it 'updates the requested category' do - category = Category.create! valid_attributes - patch category_url(category), params: { category: new_attributes } - category.reload - skip('Add assertions for updated state') - end - - it 'redirects to the category' do - category = Category.create! valid_attributes - patch category_url(category), params: { category: new_attributes } - category.reload - expect(response).to redirect_to(category_url(category)) + visit new_category_path + fill_in 'Name', with: 'Test Category' + attach_file('Icon', Rails.root + 'spec/fixtures/files/logo.png') + click_on 'Create Category' + expect(page).to have_content('Test Category') end end - - context 'with invalid parameters' do - it "renders a successful response (i.e. to display the 'edit' template)" do - category = Category.create! valid_attributes - patch category_url(category), params: { category: invalid_attributes } - expect(response).to be_successful - end - end - end - - describe 'DELETE /destroy' do - it 'destroys the requested category' do - category = Category.create! valid_attributes - expect do - delete category_url(category) - end.to change(Category, :count).by(-1) - end - - it 'redirects to the categories list' do - category = Category.create! valid_attributes - delete category_url(category) - expect(response).to redirect_to(categories_url) - end end end diff --git a/spec/features/payments_spec.rb b/spec/features/payments_spec.rb index 3bc9dfc..bb7deaa 100644 --- a/spec/features/payments_spec.rb +++ b/spec/features/payments_spec.rb @@ -1,130 +1,16 @@ require 'rails_helper' -# This spec was generated by rspec-rails when you ran the scaffold generator. -# It demonstrates how one might use RSpec to test the controller code that -# was generated by Rails when you ran the scaffold generator. -# -# It assumes that the implementation code is generated by the rails scaffold -# generator. If you are using any extension libraries to generate different -# controller code, this generated spec may or may not pass. -# -# It only uses APIs available in rails and/or rspec-rails. There are a number -# of tools you can use to make these specs even more expressive, but we're -# sticking to rails and rspec-rails APIs to keep things simple and stable. - -RSpec.describe '/payments', type: :request do - # This should return the minimal set of attributes required to create a valid - # Payment. As you add validations to Payment, be sure to - # adjust the attributes here as well. - let(:valid_attributes) do - skip('Add a hash of attributes valid for your model') - end - - let(:invalid_attributes) do - skip('Add a hash of attributes invalid for your model') - end - - describe 'GET /index' do - it 'renders a successful response' do - Payment.create! valid_attributes - get payments_url - expect(response).to be_successful - end - end - - describe 'GET /show' do - it 'renders a successful response' do - payment = Payment.create! valid_attributes - get payment_url(payment) - expect(response).to be_successful - end - end - - describe 'GET /new' do - it 'renders a successful response' do - get new_payment_url - expect(response).to be_successful - end - end - - describe 'GET /edit' do - it 'renders a successful response' do - payment = Payment.create! valid_attributes - get edit_payment_url(payment) - expect(response).to be_successful - end - end - - describe 'POST /create' do - context 'with valid parameters' do - it 'creates a new Payment' do - expect do - post payments_url, params: { payment: valid_attributes } - end.to change(Payment, :count).by(1) - end - - it 'redirects to the created payment' do - post payments_url, params: { payment: valid_attributes } - expect(response).to redirect_to(payment_url(Payment.last)) - end - end - - context 'with invalid parameters' do - it 'does not create a new Payment' do - expect do - post payments_url, params: { payment: invalid_attributes } - end.to change(Payment, :count).by(0) - end - - it "renders a successful response (i.e. to display the 'new' template)" do - post payments_url, params: { payment: invalid_attributes } - expect(response).to be_successful - end - end - end - - describe 'PATCH /update' do - context 'with valid parameters' do - let(:new_attributes) do - skip('Add a hash of attributes valid for your model') - end - - it 'updates the requested payment' do - payment = Payment.create! valid_attributes - patch payment_url(payment), params: { payment: new_attributes } - payment.reload - skip('Add assertions for updated state') - end - - it 'redirects to the payment' do - payment = Payment.create! valid_attributes - patch payment_url(payment), params: { payment: new_attributes } - payment.reload - expect(response).to redirect_to(payment_url(payment)) - end - end - - context 'with invalid parameters' do - it "renders a successful response (i.e. to display the 'edit' template)" do - payment = Payment.create! valid_attributes - patch payment_url(payment), params: { payment: invalid_attributes } - expect(response).to be_successful - end - end - end - - describe 'DELETE /destroy' do - it 'destroys the requested payment' do - payment = Payment.create! valid_attributes - expect do - delete payment_url(payment) - end.to change(Payment, :count).by(-1) - end - - it 'redirects to the payments list' do - payment = Payment.create! valid_attributes - delete payment_url(payment) - expect(response).to redirect_to(payments_url) - end +RSpec.describe '/payments', type: :feature do + + it 'creates a new Payment' do + @user = FactoryBot.create(:user) + sign_in @user + @category = Category.create(name: 'Test Category', icon: fixture_file_upload("logo.png"), user_id: @user.id) + visit new_payment_path + fill_in 'Name', with: 'Test Payment' + fill_in 'Amount', with: 100 + select 'Test Category' + click_on 'Create Payment' + expect(page).to have_content('Test Payment') end end diff --git a/spec/features/users_spec.rb b/spec/features/users_spec.rb deleted file mode 100644 index f1afa12..0000000 --- a/spec/features/users_spec.rb +++ /dev/null @@ -1,130 +0,0 @@ -require 'rails_helper' - -# This spec was generated by rspec-rails when you ran the scaffold generator. -# It demonstrates how one might use RSpec to test the controller code that -# was generated by Rails when you ran the scaffold generator. -# -# It assumes that the implementation code is generated by the rails scaffold -# generator. If you are using any extension libraries to generate different -# controller code, this generated spec may or may not pass. -# -# It only uses APIs available in rails and/or rspec-rails. There are a number -# of tools you can use to make these specs even more expressive, but we're -# sticking to rails and rspec-rails APIs to keep things simple and stable. - -RSpec.describe '/users', type: :request do - # This should return the minimal set of attributes required to create a valid - # User. As you add validations to User, be sure to - # adjust the attributes here as well. - let(:valid_attributes) do - skip('Add a hash of attributes valid for your model') - end - - let(:invalid_attributes) do - skip('Add a hash of attributes invalid for your model') - end - - describe 'GET /index' do - it 'renders a successful response' do - User.create! valid_attributes - get users_url - expect(response).to be_successful - end - end - - describe 'GET /show' do - it 'renders a successful response' do - user = User.create! valid_attributes - get user_url(user) - expect(response).to be_successful - end - end - - describe 'GET /new' do - it 'renders a successful response' do - get new_user_url - expect(response).to be_successful - end - end - - describe 'GET /edit' do - it 'renders a successful response' do - user = User.create! valid_attributes - get edit_user_url(user) - expect(response).to be_successful - end - end - - describe 'POST /create' do - context 'with valid parameters' do - it 'creates a new User' do - expect do - post users_url, params: { user: valid_attributes } - end.to change(User, :count).by(1) - end - - it 'redirects to the created user' do - post users_url, params: { user: valid_attributes } - expect(response).to redirect_to(user_url(User.last)) - end - end - - context 'with invalid parameters' do - it 'does not create a new User' do - expect do - post users_url, params: { user: invalid_attributes } - end.to change(User, :count).by(0) - end - - it "renders a successful response (i.e. to display the 'new' template)" do - post users_url, params: { user: invalid_attributes } - expect(response).to be_successful - end - end - end - - describe 'PATCH /update' do - context 'with valid parameters' do - let(:new_attributes) do - skip('Add a hash of attributes valid for your model') - end - - it 'updates the requested user' do - user = User.create! valid_attributes - patch user_url(user), params: { user: new_attributes } - user.reload - skip('Add assertions for updated state') - end - - it 'redirects to the user' do - user = User.create! valid_attributes - patch user_url(user), params: { user: new_attributes } - user.reload - expect(response).to redirect_to(user_url(user)) - end - end - - context 'with invalid parameters' do - it "renders a successful response (i.e. to display the 'edit' template)" do - user = User.create! valid_attributes - patch user_url(user), params: { user: invalid_attributes } - expect(response).to be_successful - end - end - end - - describe 'DELETE /destroy' do - it 'destroys the requested user' do - user = User.create! valid_attributes - expect do - delete user_url(user) - end.to change(User, :count).by(-1) - end - - it 'redirects to the users list' do - user = User.create! valid_attributes - delete user_url(user) - expect(response).to redirect_to(users_url) - end - end -end diff --git a/spec/features/welcome_spec.rb b/spec/features/welcome_spec.rb index 37b662f..71a39d9 100644 --- a/spec/features/welcome_spec.rb +++ b/spec/features/welcome_spec.rb @@ -1,7 +1,28 @@ require 'rails_helper' -RSpec.describe 'Welcomes', type: :request do +RSpec.describe 'Welcome Page', type: :feature do describe 'GET /index' do - pending "add some examples (or delete) #{__FILE__}" + it 'renders the index template' do + visit root_path + expect(page).to have_css("img[alt='logo']") + end + + it 'contains a link to sign up and log in' do + visit root_path + expect(page).to have_link('SIGN UP') + expect(page).to have_link('LOG IN') + end + + it 'sign up link redirects to sign up page' do + visit root_path + click_link('SIGN UP') + expect(page).to have_content('REGISTER') + end + + it 'log in link redirects to log in page' do + visit root_path + click_link('LOG IN') + expect(page).to have_content('LOGIN') + end end end From 78965d1490446e7b9b82d28d3833e284dc86d199 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Fri, 12 Aug 2022 22:03:22 +0100 Subject: [PATCH 13/21] fix linters --- Gemfile | 6 +++--- app/controllers/application_controller.rb | 1 + app/models/category.rb | 4 ++-- app/models/payment.rb | 2 +- app/models/user.rb | 2 +- spec/features/categories_spec.rb | 4 ++-- spec/features/payments_spec.rb | 3 +-- spec/models/category_spec.rb | 2 +- spec/models/payment_spec.rb | 2 +- spec/support/database_cleaner.rb | 4 ++-- spec/views/categories/edit.html.erb_spec.rb | 20 ------------------ spec/views/categories/index.html.erb_spec.rb | 22 -------------------- spec/views/categories/new.html.erb_spec.rb | 20 ------------------ spec/views/categories/show.html.erb_spec.rb | 16 -------------- spec/views/payments/edit.html.erb_spec.rb | 20 ------------------ spec/views/payments/index.html.erb_spec.rb | 22 -------------------- spec/views/payments/new.html.erb_spec.rb | 20 ------------------ spec/views/payments/show.html.erb_spec.rb | 16 -------------- spec/views/users/edit.html.erb_spec.rb | 17 --------------- spec/views/users/index.html.erb_spec.rb | 19 ----------------- spec/views/users/new.html.erb_spec.rb | 17 --------------- spec/views/users/show.html.erb_spec.rb | 14 ------------- 22 files changed, 15 insertions(+), 238 deletions(-) delete mode 100644 spec/views/categories/edit.html.erb_spec.rb delete mode 100644 spec/views/categories/index.html.erb_spec.rb delete mode 100644 spec/views/categories/new.html.erb_spec.rb delete mode 100644 spec/views/categories/show.html.erb_spec.rb delete mode 100644 spec/views/payments/edit.html.erb_spec.rb delete mode 100644 spec/views/payments/index.html.erb_spec.rb delete mode 100644 spec/views/payments/new.html.erb_spec.rb delete mode 100644 spec/views/payments/show.html.erb_spec.rb delete mode 100644 spec/views/users/edit.html.erb_spec.rb delete mode 100644 spec/views/users/index.html.erb_spec.rb delete mode 100644 spec/views/users/new.html.erb_spec.rb delete mode 100644 spec/views/users/show.html.erb_spec.rb diff --git a/Gemfile b/Gemfile index cb22b47..42844d7 100644 --- a/Gemfile +++ b/Gemfile @@ -54,10 +54,10 @@ gem 'cssbundling-rails', '~> 1.1' # Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images] # gem "image_processing", "~> 1.2" -gem "aws-sdk-s3", require: false +gem 'aws-sdk-s3', require: false # Store encrypted credentials -gem "figaro" +gem 'figaro' group :development, :test do # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem @@ -87,4 +87,4 @@ group :test do gem 'webdrivers' end -gem 'pry-rails', :group => :development \ No newline at end of file +gem 'pry-rails', group: :development diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 2ec15d4..6cdb00f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -4,6 +4,7 @@ class ApplicationController < ActionController::Base before_action :authenticate_user! protected + def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit(:name, :email, :password, :password_confirmation) } end diff --git a/app/models/category.rb b/app/models/category.rb index 46c6e20..48aad4a 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -7,10 +7,10 @@ class Category < ApplicationRecord validates :user_id, presence: true def total_amount(user) - payments.includes(:user).where(user: user).sum(:amount) + payments.includes(:user).where(user:).sum(:amount) end def sorted_payments(user) - payments.includes(:user).where(user: user).order(created_at: :desc) + payments.includes(:user).where(user:).order(created_at: :desc) end end diff --git a/app/models/payment.rb b/app/models/payment.rb index 5b8ef65..d4c0fb3 100644 --- a/app/models/payment.rb +++ b/app/models/payment.rb @@ -7,6 +7,6 @@ class Payment < ApplicationRecord validates :name, presence: true def payment_date - self.created_at.strftime("%d %b %Y") + created_at.strftime('%d %b %Y') end end diff --git a/app/models/user.rb b/app/models/user.rb index 23fac01..4a9c05b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2,6 +2,6 @@ class User < ApplicationRecord has_many :categories, dependent: :destroy has_many :payments, dependent: :destroy validates :name, presence: true, length: { minimum: 3, maximum: 25 } - + devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end diff --git a/spec/features/categories_spec.rb b/spec/features/categories_spec.rb index 18c3091..c3b9766 100644 --- a/spec/features/categories_spec.rb +++ b/spec/features/categories_spec.rb @@ -21,7 +21,7 @@ describe 'GET /show' do it 'renders a successful response and page' do - category = Category.create(name: 'Test Category', icon: fixture_file_upload("logo.png"), user_id: @user.id) + category = Category.create(name: 'Test Category', icon: fixture_file_upload('logo.png'), user_id: @user.id) visit category_path(category) expect(page).to have_content('Test Category') end @@ -39,7 +39,7 @@ it 'creates a new Category' do visit new_category_path fill_in 'Name', with: 'Test Category' - attach_file('Icon', Rails.root + 'spec/fixtures/files/logo.png') + attach_file('Icon', "#{Rails.root}spec/fixtures/files/logo.png") click_on 'Create Category' expect(page).to have_content('Test Category') end diff --git a/spec/features/payments_spec.rb b/spec/features/payments_spec.rb index bb7deaa..c5918eb 100644 --- a/spec/features/payments_spec.rb +++ b/spec/features/payments_spec.rb @@ -1,11 +1,10 @@ require 'rails_helper' RSpec.describe '/payments', type: :feature do - it 'creates a new Payment' do @user = FactoryBot.create(:user) sign_in @user - @category = Category.create(name: 'Test Category', icon: fixture_file_upload("logo.png"), user_id: @user.id) + @category = Category.create(name: 'Test Category', icon: fixture_file_upload('logo.png'), user_id: @user.id) visit new_payment_path fill_in 'Name', with: 'Test Payment' fill_in 'Amount', with: 100 diff --git a/spec/models/category_spec.rb b/spec/models/category_spec.rb index 890be58..55f7e4f 100644 --- a/spec/models/category_spec.rb +++ b/spec/models/category_spec.rb @@ -3,7 +3,7 @@ RSpec.describe Category, type: :model do before :all do @user = FactoryBot.create(:user) - @category = Category.create(name: 'Test Category', icon: fixture_file_upload("logo.png"), user_id: @user.id) + @category = Category.create(name: 'Test Category', icon: fixture_file_upload('logo.png'), user_id: @user.id) end it 'is valid with valid attributes' do diff --git a/spec/models/payment_spec.rb b/spec/models/payment_spec.rb index a716e67..0a4910e 100644 --- a/spec/models/payment_spec.rb +++ b/spec/models/payment_spec.rb @@ -3,7 +3,7 @@ RSpec.describe Payment, type: :model do before :all do @user = FactoryBot.create(:user) - @category = Category.create(name: 'Test Category', icon: fixture_file_upload("logo.png"), user_id: @user.id) + @category = Category.create(name: 'Test Category', icon: fixture_file_upload('logo.png'), user_id: @user.id) @payment = Payment.create(name: 'Test Payment', amount: 100, user_id: @user.id, category_id: @category.id) end diff --git a/spec/support/database_cleaner.rb b/spec/support/database_cleaner.rb index 6a3dc86..7c62135 100644 --- a/spec/support/database_cleaner.rb +++ b/spec/support/database_cleaner.rb @@ -18,11 +18,11 @@ MSG end - DatabaseCleaner.clean_with(:truncation) + DatabaseCleaner.clean_with(:deletion) end config.before(:each) do - DatabaseCleaner.strategy = :transaction + DatabaseCleaner.strategy = :deletion end config.before(:each, type: :feature) do diff --git a/spec/views/categories/edit.html.erb_spec.rb b/spec/views/categories/edit.html.erb_spec.rb deleted file mode 100644 index 45be10a..0000000 --- a/spec/views/categories/edit.html.erb_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'categories/edit', type: :view do - before(:each) do - @category = assign(:category, Category.create!( - name: 'MyString', - icon: nil - )) - end - - it 'renders the edit category form' do - render - - assert_select 'form[action=?][method=?]', category_path(@category), 'post' do - assert_select 'input[name=?]', 'category[name]' - - assert_select 'input[name=?]', 'category[icon]' - end - end -end diff --git a/spec/views/categories/index.html.erb_spec.rb b/spec/views/categories/index.html.erb_spec.rb deleted file mode 100644 index fa0ecb3..0000000 --- a/spec/views/categories/index.html.erb_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'categories/index', type: :view do - before(:each) do - assign(:categories, [ - Category.create!( - name: 'Name', - icon: nil - ), - Category.create!( - name: 'Name', - icon: nil - ) - ]) - end - - it 'renders a list of categories' do - render - assert_select 'tr>td', text: 'Name'.to_s, count: 2 - assert_select 'tr>td', text: nil.to_s, count: 2 - end -end diff --git a/spec/views/categories/new.html.erb_spec.rb b/spec/views/categories/new.html.erb_spec.rb deleted file mode 100644 index 915c84e..0000000 --- a/spec/views/categories/new.html.erb_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'categories/new', type: :view do - before(:each) do - assign(:category, Category.new( - name: 'MyString', - icon: nil - )) - end - - it 'renders new category form' do - render - - assert_select 'form[action=?][method=?]', categories_path, 'post' do - assert_select 'input[name=?]', 'category[name]' - - assert_select 'input[name=?]', 'category[icon]' - end - end -end diff --git a/spec/views/categories/show.html.erb_spec.rb b/spec/views/categories/show.html.erb_spec.rb deleted file mode 100644 index 8db1e7e..0000000 --- a/spec/views/categories/show.html.erb_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'categories/show', type: :view do - before(:each) do - @category = assign(:category, Category.create!( - name: 'Name', - icon: nil - )) - end - - it 'renders attributes in

' do - render - expect(rendered).to match(/Name/) - expect(rendered).to match(//) - end -end diff --git a/spec/views/payments/edit.html.erb_spec.rb b/spec/views/payments/edit.html.erb_spec.rb deleted file mode 100644 index 3de4d0a..0000000 --- a/spec/views/payments/edit.html.erb_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'payments/edit', type: :view do - before(:each) do - @payment = assign(:payment, Payment.create!( - name: 'MyString', - amount: '9.99' - )) - end - - it 'renders the edit payment form' do - render - - assert_select 'form[action=?][method=?]', payment_path(@payment), 'post' do - assert_select 'input[name=?]', 'payment[name]' - - assert_select 'input[name=?]', 'payment[amount]' - end - end -end diff --git a/spec/views/payments/index.html.erb_spec.rb b/spec/views/payments/index.html.erb_spec.rb deleted file mode 100644 index a630341..0000000 --- a/spec/views/payments/index.html.erb_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'payments/index', type: :view do - before(:each) do - assign(:payments, [ - Payment.create!( - name: 'Name', - amount: '9.99' - ), - Payment.create!( - name: 'Name', - amount: '9.99' - ) - ]) - end - - it 'renders a list of payments' do - render - assert_select 'tr>td', text: 'Name'.to_s, count: 2 - assert_select 'tr>td', text: '9.99'.to_s, count: 2 - end -end diff --git a/spec/views/payments/new.html.erb_spec.rb b/spec/views/payments/new.html.erb_spec.rb deleted file mode 100644 index ab879b0..0000000 --- a/spec/views/payments/new.html.erb_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'payments/new', type: :view do - before(:each) do - assign(:payment, Payment.new( - name: 'MyString', - amount: '9.99' - )) - end - - it 'renders new payment form' do - render - - assert_select 'form[action=?][method=?]', payments_path, 'post' do - assert_select 'input[name=?]', 'payment[name]' - - assert_select 'input[name=?]', 'payment[amount]' - end - end -end diff --git a/spec/views/payments/show.html.erb_spec.rb b/spec/views/payments/show.html.erb_spec.rb deleted file mode 100644 index 3441791..0000000 --- a/spec/views/payments/show.html.erb_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'payments/show', type: :view do - before(:each) do - @payment = assign(:payment, Payment.create!( - name: 'Name', - amount: '9.99' - )) - end - - it 'renders attributes in

' do - render - expect(rendered).to match(/Name/) - expect(rendered).to match(/9.99/) - end -end diff --git a/spec/views/users/edit.html.erb_spec.rb b/spec/views/users/edit.html.erb_spec.rb deleted file mode 100644 index f5e466e..0000000 --- a/spec/views/users/edit.html.erb_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'users/edit', type: :view do - before(:each) do - @user = assign(:user, User.create!( - name: 'MyString' - )) - end - - it 'renders the edit user form' do - render - - assert_select 'form[action=?][method=?]', user_path(@user), 'post' do - assert_select 'input[name=?]', 'user[name]' - end - end -end diff --git a/spec/views/users/index.html.erb_spec.rb b/spec/views/users/index.html.erb_spec.rb deleted file mode 100644 index 192ac7d..0000000 --- a/spec/views/users/index.html.erb_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'users/index', type: :view do - before(:each) do - assign(:users, [ - User.create!( - name: 'Name' - ), - User.create!( - name: 'Name' - ) - ]) - end - - it 'renders a list of users' do - render - assert_select 'tr>td', text: 'Name'.to_s, count: 2 - end -end diff --git a/spec/views/users/new.html.erb_spec.rb b/spec/views/users/new.html.erb_spec.rb deleted file mode 100644 index 79751dc..0000000 --- a/spec/views/users/new.html.erb_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'users/new', type: :view do - before(:each) do - assign(:user, User.new( - name: 'MyString' - )) - end - - it 'renders new user form' do - render - - assert_select 'form[action=?][method=?]', users_path, 'post' do - assert_select 'input[name=?]', 'user[name]' - end - end -end diff --git a/spec/views/users/show.html.erb_spec.rb b/spec/views/users/show.html.erb_spec.rb deleted file mode 100644 index 960c003..0000000 --- a/spec/views/users/show.html.erb_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'users/show', type: :view do - before(:each) do - @user = assign(:user, User.create!( - name: 'Name' - )) - end - - it 'renders attributes in

' do - render - expect(rendered).to match(/Name/) - end -end From f7738d20d7dc2c24099f564205d5e990973bc53e Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Fri, 12 Aug 2022 22:07:50 +0100 Subject: [PATCH 14/21] clean up --- config/database.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/database.yml b/config/database.yml index 1f2b6d2..ae40478 100644 --- a/config/database.yml +++ b/config/database.yml @@ -17,8 +17,8 @@ default: &default adapter: postgresql encoding: unicode - username: postgres - password: deyemiobaa + username: + password: # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> From 63e913893ed8bb66d939edb29147b1b7f3910a25 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Fri, 12 Aug 2022 22:15:16 +0100 Subject: [PATCH 15/21] add production password --- config/database.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/database.yml b/config/database.yml index ae40478..86893bc 100644 --- a/config/database.yml +++ b/config/database.yml @@ -17,8 +17,8 @@ default: &default adapter: postgresql encoding: unicode - username: - password: + # username: + # password: # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> @@ -85,4 +85,4 @@ production: <<: *default database: budgit_production username: budgit - password: <%= ENV["BUDGIT_DATABASE_PASSWORD"] %> + password: <%= Figaro.env.production_db_password %> From a4b746e78e28af0101a344f129a0a62fc8c9245a Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Fri, 12 Aug 2022 23:34:23 +0100 Subject: [PATCH 16/21] fix layout --- app/views/welcome/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb index d8533d7..b8803e6 100644 --- a/app/views/welcome/index.html.erb +++ b/app/views/welcome/index.html.erb @@ -1,4 +1,4 @@ -

+
<%= image_tag 'logo.png', alt: 'logo', class: 'mx-auto' %>
From e0093c64407bc8c527bde781ebe5cda47675ecc4 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Sat, 13 Aug 2022 00:11:31 +0100 Subject: [PATCH 17/21] fix linters --- package.json | 3 +++ yarn.lock | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b73ff29..90204e6 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,9 @@ "dependencies": { "autoprefixer": "^10.4.8", "postcss": "^8.4.16", + "stylelint-config-standard": "21.x", + "stylelint-csstree-validator": "1.x", + "stylelint-scss": "3.x", "tailwindcss": "^3.1.8" }, "scripts": { diff --git a/yarn.lock b/yarn.lock index bf32acc..8132b02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -119,6 +119,14 @@ color-name@^1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +css-tree@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -255,6 +263,16 @@ lilconfig@^2.0.5, lilconfig@^2.0.6: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== +lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -342,6 +360,11 @@ postcss-load-config@^3.1.4: lilconfig "^2.0.5" yaml "^1.10.2" +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== + postcss-nested@5.0.6: version "5.0.6" resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" @@ -349,7 +372,12 @@ postcss-nested@5.0.6: dependencies: postcss-selector-parser "^6.0.6" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.6: +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" + integrity sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw== + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.6: version "6.0.10" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== @@ -357,7 +385,7 @@ postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.6: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== @@ -421,6 +449,41 @@ source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +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== + +stylelint-config-recommended@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-4.0.0.tgz#665a0034065e6704d5032ba51bf4efa37d328ef9" + integrity sha512-sgna89Ng+25Hr9kmmaIxpGWt2LStVm1xf1807PdcWasiPDaOTkOHRL61sINw0twky7QMzafCGToGDnHT/kTHtQ== + +stylelint-config-standard@21.x: + version "21.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-21.0.0.tgz#4942cfa27301eb6702fa8fc46a44da35d1a5cfd7" + integrity sha512-Yf6mx5oYEbQQJxWuW7X3t1gcxqbUx52qC9SMS3saC2ruOVYEyqmr5zSW6k3wXflDjjFrPhar3kp68ugRopmlzg== + dependencies: + stylelint-config-recommended "^4.0.0" + +stylelint-csstree-validator@1.x: + version "1.9.0" + resolved "https://registry.yarnpkg.com/stylelint-csstree-validator/-/stylelint-csstree-validator-1.9.0.tgz#9f7971d87bf525f54e20434329fa5e27ee4e9491" + integrity sha512-fVbtWDEWzux/bZSPBk9tD/bvyc8bSmb52BvUDjcduOzXqKqOyFHUvFayVr9ic88l8KJEVV0Ujab9ah5oTdX4Uw== + dependencies: + css-tree "^1.0.0" + +stylelint-scss@3.x: + version "3.21.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.21.0.tgz#9f50898691b16b1c1ca3945837381d98c5b22331" + integrity sha512-CMI2wSHL+XVlNExpauy/+DbUcB/oUZLARDtMIXkpV/5yd8nthzylYd1cdHeDMJVBXeYHldsnebUX6MoV5zPW4A== + dependencies: + lodash "^4.17.15" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" From 47eb1ffdef0deb9f77e75cc3dfd61f34e90025aa Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Sat, 13 Aug 2022 02:37:43 +0100 Subject: [PATCH 18/21] fix linters --- README.md | 1 + app/assets/stylesheets/application.css | 3 +- .../stylesheets/application.tailwind.css | 5 +- package.json | 1 + yarn.lock | 1606 ++++++++++++++++- 5 files changed, 1603 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 7d5cd4f..37218f5 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ A web application where you can manage your budget: you have a list of transactions associated with a category, so that you can see how much money you spent and on what. +### Live demo: [Budgit](https://stark-everglades-12691.herokuapp.com/) ## Built With diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 549a72b..9f6a8e2 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -13,6 +13,7 @@ *= require_tree . *= require_self */ + /* direct_uploads.css */ .direct-upload { @@ -51,4 +52,4 @@ input[type=file][data-direct-upload-url][disabled] { display: none; -} \ No newline at end of file +} diff --git a/app/assets/stylesheets/application.tailwind.css b/app/assets/stylesheets/application.tailwind.css index da2d924..bb44ba0 100644 --- a/app/assets/stylesheets/application.tailwind.css +++ b/app/assets/stylesheets/application.tailwind.css @@ -1,4 +1,7 @@ +/* stylelint-disable */ + @tailwind base; @tailwind components; @tailwind utilities; -@import url('https://fonts.googleapis.com/css2?family=Raleway:wght@300;700&display=swap'); \ No newline at end of file + +@import url('https://fonts.googleapis.com/css2?family=Raleway:wght@300;700&display=swap'); diff --git a/package.json b/package.json index 90204e6..136f706 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "dependencies": { "autoprefixer": "^10.4.8", "postcss": "^8.4.16", + "stylelint": "^13.13.1", "stylelint-config-standard": "21.x", "stylelint-csstree-validator": "1.x", "stylelint-scss": "3.x", diff --git a/yarn.lock b/yarn.lock index 8132b02..f6ee2af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,233 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" + integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== + +"@babel/core@^7.17.9": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" + integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.10" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.10" + "@babel/types" "^7.18.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.18.10": + version "7.18.12" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4" + integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== + dependencies: + "@babel/types" "^7.18.10" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== + dependencies: + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.18.10", "@babel/parser@^7.18.11": + version "7.18.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" + integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== + +"@babel/template@^7.18.10", "@babel/template@^7.18.6": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9": + version "7.18.11" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.11.tgz#3d51f2afbd83ecf9912bcbb5c4d94e3d2ddaa16f" + integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.11" + "@babel/types" "^7.18.10" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" + integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== + dependencies: + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.15" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" + integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -23,6 +250,48 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@stylelint/postcss-css-in-js@^0.37.2": + version "0.37.3" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.3.tgz#d149a385e07ae365b0107314c084cb6c11adbf49" + integrity sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg== + dependencies: + "@babel/core" "^7.17.9" + +"@stylelint/postcss-markdown@^0.36.2": + version "0.36.2" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz#0a540c4692f8dcdfc13c8e352c17e7bfee2bb391" + integrity sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ== + dependencies: + remark "^13.0.0" + unist-util-find-all-after "^3.0.2" + +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@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/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + acorn-node@^1.8.2: version "1.8.2" resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" @@ -42,6 +311,35 @@ acorn@^7.0.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +ajv@^8.0.1: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +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" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -55,6 +353,21 @@ arg@^5.0.2: resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + autoprefixer@^10.4.8: version "10.4.8" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.8.tgz#92c7a0199e1cfb2ad5d9427bd585a3d75895b9e5" @@ -67,11 +380,47 @@ autoprefixer@^10.4.8: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +autoprefixer@^9.8.6: + version "9.8.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + picocolors "^0.2.1" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +balanced-match@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" + integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +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@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -79,7 +428,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3: +browserslist@^4.12.0, browserslist@^4.20.2, browserslist@^4.21.3: version "4.21.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== @@ -89,16 +438,72 @@ browserslist@^4.21.3: node-releases "^2.0.6" update-browserslist-db "^1.0.5" +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-css@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001109: + version "1.0.30001375" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz#8e73bc3d1a4c800beb39f3163bf0190d7e5d7672" + integrity sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw== + caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001373: version "1.0.30001374" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz#3dab138e3f5485ba2e74bd13eca7fe1037ce6f57" integrity sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw== +chalk@^2.0.0: + 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@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -114,11 +519,60 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -color-name@^1.1.4: +clone-regexp@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" + integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== + dependencies: + is-regexp "^2.0.0" + +color-convert@^1.9.0: + 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-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + css-tree@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -132,6 +586,26 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +debug@^4.0.0, debug@^4.1.0, debug@^4.3.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" @@ -151,22 +625,106 @@ didyoumean@^1.2.2: resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + dlv@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== +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" + +domelementtype@1, domelementtype@^1.3.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.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@^1.5.1: + 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" + electron-to-chromium@^1.4.202: version "1.4.211" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.211.tgz#afaa8b58313807501312d598d99b953568d60f91" integrity sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +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" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -fast-glob@^3.2.11: +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 sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +execall@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" + integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== + dependencies: + clone-regexp "^2.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +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-glob@^3.2.11, fast-glob@^3.2.5, fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== @@ -177,6 +735,11 @@ fast-glob@^3.2.11: merge2 "^1.3.0" micromatch "^4.0.4" +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + fastq@^1.6.0: version "1.13.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" @@ -184,6 +747,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -191,11 +761,37 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-up@^4.1.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" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" + integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== + fraction.js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -206,6 +802,16 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -220,6 +826,78 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +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@^11.0.3: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== + +gonzales-pe@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== + dependencies: + minimist "^1.2.5" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +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@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -227,6 +905,99 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +html-tags@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" + integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== + +htmlparser2@^3.10.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +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== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, 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== + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + 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" @@ -234,18 +1005,33 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-core-module@^2.9.0: +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.10.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== dependencies: has "^1.0.3" +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -253,31 +1039,207 @@ is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + 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-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-regexp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" + integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +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== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +kind-of@^6.0.2, kind-of@^6.0.3: + 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== + +known-css-properties@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.21.0.tgz#15fbd0bbb83447f3ce09d8af247ed47c68ede80d" + integrity sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw== + lilconfig@^2.0.5, lilconfig@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== -lodash@^4.17.15: +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +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.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +longest-streak@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-to-markdown@^0.6.0: + version "0.6.5" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" + integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== -merge2@^1.3.0: +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" + integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize "^1.2.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +micromark@~2.11.0: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -286,11 +1248,37 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -minimist@^1.2.6: +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.5, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + nanoid@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" @@ -301,6 +1289,26 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +normalize-package-data@^2.5.0: + 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-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + normalize-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" @@ -311,16 +1319,101 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== +normalize-selector@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" + integrity sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw== + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== + object-hash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +p-limit@^2.2.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@^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-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== + +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-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-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 sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +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== + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -336,6 +1429,13 @@ pify@^2.3.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== +postcss-html@^0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204" + integrity sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw== + dependencies: + htmlparser2 "^3.10.0" + postcss-import@^14.1.0: version "14.1.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" @@ -352,6 +1452,13 @@ postcss-js@^4.0.0: dependencies: camelcase-css "^2.0.1" +postcss-less@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" + integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA== + dependencies: + postcss "^7.0.14" + postcss-load-config@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" @@ -377,7 +1484,29 @@ postcss-resolve-nested-selector@^0.1.1: resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" integrity sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw== -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.6: +postcss-safe-parser@^4.0.2: + 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-sass@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3" + integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg== + dependencies: + gonzales-pe "^4.3.0" + postcss "^7.0.21" + +postcss-scss@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383" + integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA== + dependencies: + postcss "^7.0.6" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6: version "6.0.10" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== @@ -385,11 +1514,24 @@ postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selecto cssesc "^3.0.0" util-deprecate "^1.0.2" +postcss-syntax@^0.36.2: + version "0.36.2" + resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c" + integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w== + postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@^7.0.14, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.6: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + postcss@^8.4.14, postcss@^8.4.16: version "8.4.16" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" @@ -399,11 +1541,21 @@ postcss@^8.4.14, postcss@^8.4.16: picocolors "^1.0.0" source-map-js "^1.0.2" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -416,6 +1568,34 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^3.1.1: + version "3.6.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@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -423,7 +1603,58 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -resolve@^1.1.7, resolve@^1.22.1: +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + +remark-stringify@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" + integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg== + dependencies: + mdast-util-to-markdown "^0.6.0" + +remark@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425" + integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA== + dependencies: + remark-parse "^9.0.0" + remark-stringify "^9.0.0" + unified "^9.1.0" + +repeat-string@^1.0.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +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-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -437,6 +1668,13 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -444,6 +1682,52 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +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.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== + +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +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@^7.3.4: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -454,6 +1738,72 @@ source-map@^0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +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.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + +specificity@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" + integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== + +string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_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" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" + integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== + stylelint-config-recommended@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-4.0.0.tgz#665a0034065e6704d5032ba51bf4efa37d328ef9" @@ -484,11 +1834,102 @@ stylelint-scss@3.x: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" +stylelint@^13.13.1: + version "13.13.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.13.1.tgz#fca9c9f5de7990ab26a00f167b8978f083a18f3c" + integrity sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ== + dependencies: + "@stylelint/postcss-css-in-js" "^0.37.2" + "@stylelint/postcss-markdown" "^0.36.2" + autoprefixer "^9.8.6" + balanced-match "^2.0.0" + chalk "^4.1.1" + cosmiconfig "^7.0.0" + debug "^4.3.1" + execall "^2.0.0" + fast-glob "^3.2.5" + fastest-levenshtein "^1.0.12" + file-entry-cache "^6.0.1" + get-stdin "^8.0.0" + global-modules "^2.0.0" + globby "^11.0.3" + globjoin "^0.1.4" + html-tags "^3.1.0" + ignore "^5.1.8" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + known-css-properties "^0.21.0" + lodash "^4.17.21" + log-symbols "^4.1.0" + mathml-tag-names "^2.1.3" + meow "^9.0.0" + micromatch "^4.0.4" + normalize-selector "^0.2.0" + postcss "^7.0.35" + postcss-html "^0.36.0" + postcss-less "^3.1.4" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^4.0.2" + postcss-sass "^0.4.4" + postcss-scss "^2.1.1" + postcss-selector-parser "^6.0.5" + postcss-syntax "^0.36.2" + postcss-value-parser "^4.1.0" + resolve-from "^5.0.0" + slash "^3.0.0" + specificity "^0.4.1" + string-width "^4.2.2" + strip-ansi "^6.0.0" + style-search "^0.1.0" + sugarss "^2.0.0" + svg-tags "^1.0.0" + table "^6.6.0" + v8-compile-cache "^2.3.0" + write-file-atomic "^3.0.3" + +sugarss@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d" + integrity sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ== + dependencies: + postcss "^7.0.2" + +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.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + +table@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + tailwindcss@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.1.8.tgz#4f8520550d67a835d32f2f4021580f9fddb7b741" @@ -517,6 +1958,11 @@ tailwindcss@^3.1.8: quick-lru "^5.1.1" resolve "^1.22.1" +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 sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + 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" @@ -524,6 +1970,69 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +unified@^9.1.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unist-util-find-all-after@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6" + integrity sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ== + dependencies: + unist-util-is "^4.0.0" + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + update-browserslist-db@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" @@ -532,17 +2041,92 @@ update-browserslist-db@^1.0.5: escalade "^3.1.1" picocolors "^1.0.0" -util-deprecate@^1.0.2: +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +v8-compile-cache@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +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" + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +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" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + xtend@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -yaml@^1.10.2: +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.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== From bef69c390416da4be42a088bd7d26085941a1016 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Sun, 14 Aug 2022 14:19:48 +0100 Subject: [PATCH 19/21] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 37218f5..6a570ee 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,11 @@ A web application where you can manage your budget: you have a list of transactions associated with a category, so that you can see how much money you spent and on what. +

+ +

+ + ### Live demo: [Budgit](https://stark-everglades-12691.herokuapp.com/) ## Built With From 5ef37874a74fda1c4f1b6d6c1a3b1b8143c69e23 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Sun, 14 Aug 2022 14:31:24 +0100 Subject: [PATCH 20/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6a570ee..0baab76 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A web application where you can manage your budget: you have a list of transacti

-### Live demo: [Budgit](https://stark-everglades-12691.herokuapp.com/) +### Live demo: [Budgit](https://my-budgit-app.herokuapp.com/) ## Built With From 58c2f7d7550c211baff5652bae101c77f04eb8c7 Mon Sep 17 00:00:00 2001 From: Sodiq Aderibigbe Date: Sun, 14 Aug 2022 15:06:44 +0100 Subject: [PATCH 21/21] Update README.md --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0baab76..6c1a36b 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,8 @@ A web application where you can manage your budget: you have a list of transactions associated with a category, so that you can see how much money you spent and on what. -

- -

+![image](https://user-images.githubusercontent.com/55185309/184540699-4353c054-c3e5-49e9-9b55-ece9ea3f6721.png) + ### Live demo: [Budgit](https://my-budgit-app.herokuapp.com/)