Merge branch 'main' into feature/stimulus-character-count

This commit is contained in:
Andreas Nedbal 2022-10-24 23:26:31 +02:00
commit 559ed3ecf8
25 changed files with 193 additions and 136 deletions

2
.github/FUNDING.yml vendored
View File

@ -1,3 +1,5 @@
# These are supported funding model platforms
github: retrospring
open_collective: retrospring
patreon: retrospring

View File

@ -65,6 +65,9 @@ gem "redis"
gem "fake_email_validator"
# TLD validation
gem "tldv", "~> 0.1.0"
gem "jwt", "~> 2.5"
group :development do
@ -94,7 +97,7 @@ group :development, :test do
gem "rspec-mocks"
gem "rspec-rails", "~> 5.1"
gem "rspec-sidekiq", "~> 3.0", require: false
gem "rubocop", "~> 1.36"
gem "rubocop", "~> 1.37"
gem "rubocop-rails", "~> 2.16"
gem "shoulda-matchers", "~> 5.2"
gem "simplecov", require: false

View File

@ -315,7 +315,7 @@ GEM
net-smtp (0.3.2)
net-protocol
nio4r (2.5.8)
nokogiri (1.13.8)
nokogiri (1.13.9)
mini_portile2 (~> 2.8.0)
racc (~> 1.4)
notiffany (0.1.3)
@ -444,17 +444,17 @@ GEM
rspec-core (~> 3.0, >= 3.0.0)
sidekiq (>= 2.4.0)
rspec-support (3.11.0)
rubocop (1.36.0)
rubocop (1.37.1)
json (~> 2.3)
parallel (~> 1.10)
parser (>= 3.1.2.1)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.20.1, < 2.0)
rubocop-ast (>= 1.23.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.21.0)
rubocop-ast (1.23.0)
parser (>= 3.1.1.0)
rubocop-rails (2.16.1)
activesupport (>= 4.2.0)
@ -518,6 +518,9 @@ GEM
thread_safe (0.3.6)
tilt (2.0.11)
timeout (0.3.0)
tldv (0.1.0)
tldv-data (~> 1.0)
tldv-data (1.0.2022101300)
turbo-rails (1.1.1)
actionpack (>= 6.0.0)
activejob (>= 6.0.0)
@ -627,7 +630,7 @@ DEPENDENCIES
rspec-mocks
rspec-rails (~> 5.1)
rspec-sidekiq (~> 3.0)
rubocop (~> 1.36)
rubocop (~> 1.37)
rubocop-rails (~> 2.16)
ruby-progressbar
sanitize
@ -641,6 +644,7 @@ DEPENDENCIES
simplecov-cobertura
simplecov-json
spring (~> 4.1)
tldv (~> 0.1.0)
turbo-rails
twitter
twitter-text

View File

@ -2,14 +2,15 @@
class TimelineController < ApplicationController
before_action :authenticate_user!
before_action :set_list, only: %i[list]
before_action :set_lists
def index
paginate_timeline { |args| current_user.cursored_timeline(**args) }
end
def list
@list = current_user.lists.find_by!(name: params[:list_name])
@title = list_title(current_user.lists.find_by!(name: params[:list_name]))
@title = list_title(@list)
paginate_timeline { |args| @list.cursored_timeline(**args) }
end
@ -20,6 +21,15 @@ class TimelineController < ApplicationController
private
def set_list
@list = current_user.lists.find_by!(name: params[:list_name]) if params[:list_name].present?
end
def set_lists
@lists = current_user.lists
@lists = @lists.where.not(id: @list.id) if @list.present?
end
def paginate_timeline
@timeline = yield(last_id: params[:last_id])
@timeline_last_id = @timeline.map(&:id).min

View File

@ -79,6 +79,7 @@
"components/entry",
"components/flags",
"components/icons",
"components/inbox-actions",
"components/inbox-entry",
"components/jumbotron",
"components/locales",

View File

@ -0,0 +1,9 @@
.inbox-actions {
.form-group {
margin-bottom: 0;
}
.card-body {
padding: $card-spacer-y $card-spacer-x;
}
}

View File

@ -6,6 +6,14 @@
&:focus {
color: RGB(var(--primary-text));
}
/* svg-logo! \o/ */
svg {
height: $navbar-brand-font-size;
path {
fill: RGB(var(--primary-text));
}
}
}
.navbar-nav {
@ -47,4 +55,4 @@
color: RGB(var(--primary-text));
}
}
}
}

View File

@ -1,15 +1,10 @@
# frozen_string_literal: true
require "tldv"
class TypoedEmailValidator < ActiveModel::EachValidator
# this array contains "forbidden" email address endings
INVALID_ENDINGS = [
# without @:
".carrd",
".con",
".coom",
".cmo",
".mail",
# with @:
*%w[
fmail.com
@ -50,7 +45,13 @@ class TypoedEmailValidator < ActiveModel::EachValidator
return false unless value.include?("@")
# part after the @ needs to have at least one period
return false if value.split("@", 2).last.count(".").zero?
_prefix, domain = value.split("@", 2)
domain_parts = domain.split(".")
return false if domain_parts.length == 1
# check if the TLD is valid
tld = domain_parts.last
return false unless TLDv.valid?(tld)
# finally, common typos
return false if INVALID_ENDINGS.any? { value.end_with?(_1) }

View File

@ -0,0 +1,23 @@
.card.inbox-actions
.card-body
.d-md-flex
= bootstrap_form_tag url: inbox_path, method: :get, html: { class: "d-block" } do |f|
= f.text_field :author, value: params[:author], placeholder: t(".author.placeholder"), prepend: "@", hide_label: true,
append: f.button(t(".author.button"), name: nil, class: "btn btn-light", id: "ib-author")
.d-flex.ml-auto.mt-2.mt-md-0
%button.btn.btn-info.mr-auto{ type: :button, id: "ib-generate-question" }
= t(".questions.button")
.button-group.ml-1
%button.btn.btn-default{ title: t(".share.heading"), data: { toggle: :dropdown }, aria: { expanded: false } }
%i.fa.fa-fw.fa-share-alt
%span.sr-only= t(".share.heading")
.dropdown-menu.dropdown-menu-right{ role: :menu }
%a.dropdown-item{ href: "https://twitter.com/intent/tweet?text=Ask%20me%20anything%21&url=#{user_url(current_user)}", target: "_blank" }
%i.fa.fa-fw.fa-twitter
= t(".share.button", service: "Twitter")
%a.dropdown-item{ href: "https://www.tumblr.com/share/link?url=#{user_url(current_user)}&name=Ask%20me%20anything%21", target: "_blank" }
%i.fa.fa-fw.fa-tumblr
= t(".share.button", service: "Tumblr")
%button.btn.btn-danger.ml-1{ type: :button, title: t(".actions.delete"), id: delete_id, disabled: (disabled ? :disabled : nil), data: { ib_count: inbox_count } }
%i.fa.fa-fw.fa-trash-o
%span.sr-only= t(".actions.delete")

View File

@ -1,27 +0,0 @@
.card
.card-header= t(".questions.heading")
.card-body
%button.btn.btn-block.btn-info{ type: :button, id: "ib-generate-question" }= t(".questions.button")
.card
.card-header= t(".share.heading")
.card-body
%a.btn.btn-block.btn-primary{ target: "_blank",
href: "https://twitter.com/intent/tweet?text=Ask%20me%20anything%21&url=#{user_url(current_user)}" }
%i.fa.fa-fw.fa-twitter
= t(".share.button", service: "Twitter")
%a.btn.btn-block.btn-primary{ target: "_blank",
href: "https://www.tumblr.com/share/link?url=#{user_url(current_user)}&name=Ask%20me%20anything%21" }
%i.fa.fa-fw.fa-tumblr
= t(".share.button", service: "Tumblr")
.card
.card-header= t(".author.heading")
.card-body
%form#author-form
= bootstrap_form_tag url: inbox_path, method: :get do |f|
= f.text_field :author, value: params[:author], placeholder: t(".author.placeholder"), prepend: "@", hide_label: true
= f.button t(".author.button"), name: nil, class: "btn btn-light btn-block btn-sm", id: "ib-author"
.card
.card-header= t(".actions.heading")
.card-body
%button.btn.btn-block.btn-danger{ type: :button, id: delete_id, disabled: (disabled ? :disabled : nil), data: { ib_count: inbox_count } }
= t(".actions.delete")

View File

@ -1,9 +1,7 @@
.container-lg.container--main
.row
.col-md-3.col-sm-4.d-none.d-sm-block
= render 'shared/sidebar'
.col-md-9.col-xs-12.col-sm-8
.col-sm-10.col-md-10.col-lg-9.mx-auto
= render 'layouts/messages'
= render 'tabs/feed', list: @list
= render 'tabs/feed', lists: @lists, list: @list
= yield
.d-block.d-sm-none= render 'shared/links'

View File

@ -1,8 +1,7 @@
.container-lg.container--main
.row
.col-md-3.col-xs-12.col-sm-4.order-2.order-sm-1
= render 'inbox/sidebar', delete_id: @delete_id, disabled: @disabled, inbox_count: @inbox_count
.col-md-9.col-xs-12.col-sm-8.order-1.order-sm-2
.col-sm-10.col-md-10.col-lg-9.mx-auto
= render 'inbox/actions', delete_id: @delete_id, disabled: @disabled, inbox_count: @inbox_count
= render 'layouts/messages'
= yield

View File

@ -1,7 +1,10 @@
%nav.navbar.navbar-themed.navbar-expand-lg.bg-primary.fixed-top.d-lg-block.d-none.d-print-none{ role: :navigation }
.container{ class: ios_web_app? ? 'ios-web-app' : '' }
%a.navbar-brand{ href: '/' }
= APP_CONFIG['site_name']
%a.navbar-brand{ href: '/', title: APP_CONFIG["site_name"] }
- if APP_CONFIG["use_svg_logo"]
= render inline: Rails.application.config.justask_svg_logo
- else
= APP_CONFIG["site_name"]
%ul.nav.navbar-nav.mr-auto
= nav_entry t("navigation.timeline"), root_path, icon: 'home'
= nav_entry t("navigation.inbox"), '/inbox', icon: 'inbox', badge: inbox_count

View File

@ -1,6 +1,10 @@
%nav.navbar.navbar-themed.navbar-expand-lg.bg-primary.fixed-top{ role: :navigation }
.container{ class: ios_web_app? ? 'ios-web-app' : '' }
%a.navbar-brand{ href: '/' }= APP_CONFIG['site_name']
%a.navbar-brand{ href: '/', title: APP_CONFIG["site_name"] }
- if APP_CONFIG["use_svg_logo"]
= render inline: Rails.application.config.justask_svg_logo
- else
= APP_CONFIG["site_name"]
%button.navbar-toggler{ data: { target: '#j2-main-navbar-collapse', toggle: :collapse }, type: :button }
%span.sr-only= t("navigation.toggle")
%span.navbar-toggler-icon

View File

@ -1,21 +0,0 @@
.card.userbox
%img.userbox__header{ src: current_user.profile_header.url(:mobile) }
.card-body
%img.userbox__avatar{ src: current_user.profile_picture.url(:small) }
.profile__name
- unless current_user.profile.display_name.blank?
.profile__display-name
= current_user.profile.display_name
.profile__screen-name
= current_user.screen_name
- unless @list.nil?
.card
.card-header= t(".list.title")
.card-body
- if @list.members.empty?
%p.text-muted= t(".list.none")
- @list.members.each do |member|
%a{ href: user_path(member.user), title: member.user.screen_name, data: { toggle: :tooltip, placement: :top } }
%img.avatar-xs{ src: member.user.profile_picture.url(:medium) }
= render "shared/links"

View File

@ -10,7 +10,16 @@
- else
= t(".lists.title")
.dropdown-menu.dropdown-menu-right.dropdown-menu--lists
- if current_user.lists.empty?
- if list
%h6.dropdown-header= t(".lists.members.title")
- if list.members.empty?
%p.text-muted= t(".list.members.none")
- else
%p.px-4.pb-2
- list.members.each do |member|
%a{ href: user_path(member.user), title: member.user.screen_name, data: { toggle: :tooltip, placement: :top } }
%img.avatar-xs{ src: member.user.profile_picture.url(:small), loading: :lazy }
- if !list && lists.empty?
.p-3= t(".lists.notice_html")
- current_user.lists.each do |list|
- lists.each do |list|
%a.dropdown-item{ href: list_timeline_path(list.name) }= list.display_name

View File

@ -0,0 +1,20 @@
# frozen_string_literal: true
return unless APP_CONFIG[:use_svg_logo]
begin
logo_path = Rails.public_path.join("logo.svg")
# we are only interested in the first element which should be the <svg> node --> extract it and transform some attributes
logo_svg = File.read(logo_path)
svg_doc = Nokogiri::XML(logo_svg)
svg_node = svg_doc.first_element_child
# remove some attributes that might interfere with the rest of the layout
%w[id name class width height].each do |attr|
svg_node.remove_attribute attr
end
Rails.application.config.justask_svg_logo = svg_node.to_xml
rescue => e
warn "use_svg_logo is enabled, but the SVG could not be read due to: #{e.message} (#{e.class.name}). Disabling SVG logo."
APP_CONFIG[:use_svg_logo] = false
end

View File

@ -1,6 +1,9 @@
# The site name, shown everywhere.
site_name: "justask"
# Use the SVG logo from `/public/logo.svg`
use_svg_logo: false
hostname: "justask.rrerr.net"
https: true

View File

@ -100,7 +100,7 @@ en:
title: "Share"
comments:
none: "There are no comments yet."
placeholder: "Comment..."
placeholder: "Comment..."
smiles:
none: "No one smiled this yet."
application:
@ -200,17 +200,14 @@ en:
settings: "service settings"
show:
empty: "Nothing to see here."
sidebar:
actions:
actions:
heading: "Actions"
delete: "Delete all questions"
author:
heading: "Show author"
button: "Show"
placeholder: "username"
placeholder: "Filter by username"
questions:
heading: "Out of questions?"
button: "Get new question"
button: "Generate question"
share:
heading: "Share"
button: "Share on %{service}"
@ -514,10 +511,6 @@ en:
anonymous_block:
deleted_question: "Deleted question"
blocked: "blocked %{time} ago"
sidebar:
list:
title: "Members"
none: "No members yet."
tabs:
feed:
public: "Public"
@ -534,6 +527,9 @@ en:
Once you have done that, the lists will be shown here.
When you select a list you'll get a timeline view of all users within that list.
</p>
members:
title: "Members"
none: "No members yet."
moderation:
all: "All reports"
answers: :activerecord.models.answer.other

View File

@ -21,14 +21,14 @@
"lato-font": "^3.0.0",
"popper.js": "^1.16.1",
"rails_admin": "3.0.0",
"regenerator-runtime": "^0.13.7",
"regenerator-runtime": "^0.13.10",
"sweetalert": "1.1.3",
"toastify-js": "^1.12.0",
"typescript": "^4.8.4"
},
"devDependencies": {
"@babel/core": "^7.19.3",
"@babel/preset-env": "^7.19.3",
"@babel/preset-env": "^7.19.4",
"@rails/webpacker": "5.4.3",
"@typescript-eslint/eslint-plugin": "^4.11.0",
"@typescript-eslint/parser": "^4.11.0",

1
public/logo.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 958.75 170.24"><defs><style>.cls-1{fill:#5e35b1;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="main_stuff" data-name="main stuff"><path class="cls-1" d="M210.08,93.09H137.94c3.53,13.17,15,20,29.49,20,9.45,0,17.8-2.6,24.85-8.72l11.31,12.06c-8,10-21.88,17.06-38.94,17.06-26.52,0-50.26-18-50.26-50.07,0-32.45,24.11-50.07,48.77-50.07C187.64,33.38,215.46,50.63,210.08,93.09ZM137.57,74.92H188c-1.48-13.72-13-20.59-24.66-20.59C151.85,54.33,140.72,61,137.57,74.92Z"/><path class="cls-1" d="M271.65,109.22v19.11c-3.71,3.33-10.75,4.45-16.87,4.45-16.32,0-28.19-8-28.19-27.82V55.08H212.87V35.23h13.72V10.57h25V35.23h19.84V55.08H251.63v45.8c0,5,2.78,9.83,10.94,9.83A31.27,31.27,0,0,0,271.65,109.22Z"/><path class="cls-1" d="M343.61,34.12V57.86a36.36,36.36,0,0,0-6.31-.56c-18.73,0-30.41,13-30.41,32.27v42.09H282V35.23h24.85v25c3.34-14.84,12.79-26.89,30.23-26.89A25.72,25.72,0,0,1,343.61,34.12Z"/><path class="cls-1" d="M345.65,83.45c0-32.64,25.59-50.07,50.81-50.07,25,0,50.81,17.43,50.81,50.07s-25.78,50.07-50.81,50.07C371.24,133.52,345.65,116.09,345.65,83.45Zm77,0c0-17.25-12.24-27.63-26.15-27.63S370.13,66.2,370.13,83.45s12.42,27.63,26.33,27.63S422.61,100.69,422.61,83.45Z"/><path class="cls-1" d="M451,106.44l19.84-5.37c1.85,6.3,6.49,12.79,15.95,12.79,6.3,0,12.42-3.15,12.42-10,0-4.64-3-8-10.57-10.76l-11.87-4.45c-15.95-5.75-22.62-16-22.62-27.63,0-17.25,15.2-27.63,33.38-27.63,17.43,0,30.23,9.83,33.38,24.66l-19.47,5c-2.6-7.79-7.61-10.2-12.8-10.2-6.49,0-10.38,3.71-10.38,8.35,0,4.08,2.41,7.6,10,10.19L499,75.47c11.86,4.27,24.84,11.32,24.84,28.38,0,19.28-16.5,29.67-36.71,29.67C468.05,133.52,454,124.25,451,106.44Z"/><path class="cls-1" d="M635.87,83.45c0,33.38-23.92,50.07-46.36,50.07-17.24,0-28.37-9.46-30.78-14.84h-.56V166.9H533.33V35.23h24.84v13h.56c2.41-5.37,13.54-14.83,30.78-14.83C612,33.38,635.87,50.07,635.87,83.45Zm-24.66,0c0-18-13-27.82-26.7-27.82-14.1,0-26.89,9.65-26.89,27.82s12.79,27.81,26.89,27.81C598.23,111.26,611.21,101.44,611.21,83.45Z"/><path class="cls-1" d="M707.09,34.12V57.86a36.25,36.25,0,0,0-6.3-.56c-18.73,0-30.42,13-30.42,32.27v42.09H645.52V35.23h24.85v25c3.34-14.84,12.8-26.89,30.23-26.89A25.61,25.61,0,0,1,707.09,34.12Z"/><path class="cls-1" d="M716.55,0H741.4V21.88H716.55Zm0,35.23H741.4v96.43H716.55Z"/><path class="cls-1" d="M846.55,74.92v56.74H821.7V79c0-14.1-7.6-23.37-20.59-23.37-12.79,0-20.58,9.27-20.58,23.37v52.66H755.68V35.23h24.85V48.4c5.38-8.53,15-15,29.49-15C829.86,33.38,846.55,45.62,846.55,74.92Z"/><path class="cls-1" d="M958.75,35.23v89.2c0,36.9-28.93,45.81-50.82,45.81-11.12,0-22.25-2.23-28-5.94V144.09c4.45,3,14.1,5.38,23.55,5.38,18.55,0,30.42-8.72,30.42-23.37v-7.42h-1.12c-2.41,5.38-13.16,14.84-30.22,14.84-22.26,0-46.36-16.69-46.36-50.07s24.1-50.07,46.36-50.07c17.06,0,27.81,9.46,30.22,14.83h1.12v-13Zm-24.3,48.22c0-18.17-12.79-27.82-26.89-27.82-13.9,0-26.89,9.83-26.89,27.82s13,27.81,26.89,27.81C921.66,111.26,934.45,101.62,934.45,83.45Z"/><path class="cls-1" d="M24.74,102.21a39.48,39.48,0,0,0,5.17,1.08c14.53,2,31.15-.92,45.28-7.56a73.4,73.4,0,0,1,8.48,34.89h22.65A93.26,93.26,0,0,0,93.59,83.5C103.67,74,108.76,62.39,108,50.35A39.88,39.88,0,0,0,84.36,16.86C68.54,9.65,50.13,9.84,36.68,10c-5.27.06-18.07.24-24.9.34H0V130.62H24.74Zm8.65-19.07c-4.22-.59-8.15-3.12-8.57-5.53a3.34,3.34,0,0,1,1.05-3.3c2.3-2.32,7.52-4,12.13-4h.66a38.36,38.36,0,0,1,23,8.67C52.48,82.67,42.07,84.35,33.39,83.14ZM24.74,30.52l12.2-.16c11.72-.12,26.31-.26,37.19,4.69A19.67,19.67,0,0,1,85.37,51.54c.39,6-2.15,11.06-5.37,14.92A61.43,61.43,0,0,0,39.59,49.9a46.85,46.85,0,0,0-14.85,1.91Z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -92,6 +92,11 @@ describe TimelineController do
it { should have_http_status(200) }
it_behaves_like "paginates", :followed_user_answers
it "assigns all lists to an instance variable" do
subject
expect(assigns(:lists)).to eq(user.lists)
end
end
describe "#list" do
@ -108,6 +113,11 @@ describe TimelineController do
subject
expect(assigns(:list)).to eq(list)
end
it "excludes the current selected list from the list of lists" do
subject
expect(assigns(:lists)).not_to include(list)
end
end
end

View File

@ -30,7 +30,7 @@ describe User::RegistrationsController, type: :controller do
{
user: {
screen_name: "dio",
email: "the-world-21@somewhere.everywhere",
email: "the-world-21@somewhere.everywhere.now",
password: "AReallySecurePassword456!",
password_confirmation: "AReallySecurePassword456!"
}
@ -85,7 +85,7 @@ describe User::RegistrationsController, type: :controller do
{
user: {
screen_name: "Dio Brando",
email: "the-world-21@somewhere.everywhere",
email: "the-world-21@somewhere.everywhere.now",
password: "AReallySecurePassword456!",
password_confirmation: "AReallySecurePassword456!"
}
@ -102,7 +102,7 @@ describe User::RegistrationsController, type: :controller do
{
user: {
screen_name: "moderator",
email: "the-world-21@somewhere.everywhere",
email: "the-world-21@somewhere.everywhere.now",
password: "AReallySecurePassword456!",
password_confirmation: "AReallySecurePassword456!"
}

View File

@ -64,6 +64,7 @@ RSpec.describe User, type: :model do
include_examples "valid email", "fritz.fantom@protonmail.com"
include_examples "valid email", "fritz.fantom@example.email"
include_examples "valid email", "fritz.fantom@enterprise.k8s.420stripes.k8s.needs.more.k8s.jira.atlassian.k8s.eu-central-1.s3.amazonaws.com"
include_examples "valid email", "fritz.fantom@emacs.horse"
include_examples "invalid email", "@jack"
# examples from the real world:

View File

@ -24,10 +24,10 @@
dependencies:
"@babel/highlight" "^7.18.6"
"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.3":
version "7.19.3"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151"
integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==
"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.19.3", "@babel/compat-data@^7.19.4":
version "7.19.4"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747"
integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==
"@babel/core@^7.15.0", "@babel/core@^7.19.3":
version "7.19.3"
@ -316,10 +316,10 @@
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-string-parser@^7.19.4":
version "7.19.4"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
"@babel/helper-validator-identifier@^7.16.7":
version "7.16.7"
@ -484,14 +484,14 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
"@babel/plugin-proposal-object-rest-spread@^7.14.7", "@babel/plugin-proposal-object-rest-spread@^7.18.9":
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7"
integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==
"@babel/plugin-proposal-object-rest-spread@^7.14.7", "@babel/plugin-proposal-object-rest-spread@^7.19.4":
version "7.19.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz#a8fc86e8180ff57290c91a75d83fe658189b642d"
integrity sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==
dependencies:
"@babel/compat-data" "^7.18.8"
"@babel/helper-compilation-targets" "^7.18.9"
"@babel/helper-plugin-utils" "^7.18.9"
"@babel/compat-data" "^7.19.4"
"@babel/helper-compilation-targets" "^7.19.3"
"@babel/helper-plugin-utils" "^7.19.0"
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
"@babel/plugin-transform-parameters" "^7.18.8"
@ -673,12 +673,12 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-block-scoping@^7.18.9":
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d"
integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==
"@babel/plugin-transform-block-scoping@^7.19.4":
version "7.19.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz#315d70f68ce64426db379a3d830e7ac30be02e9b"
integrity sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==
dependencies:
"@babel/helper-plugin-utils" "^7.18.9"
"@babel/helper-plugin-utils" "^7.19.0"
"@babel/plugin-transform-classes@^7.19.0":
version "7.19.0"
@ -702,12 +702,12 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.9"
"@babel/plugin-transform-destructuring@^7.14.7", "@babel/plugin-transform-destructuring@^7.18.13":
version "7.18.13"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz#9e03bc4a94475d62b7f4114938e6c5c33372cbf5"
integrity sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==
"@babel/plugin-transform-destructuring@^7.14.7", "@babel/plugin-transform-destructuring@^7.19.4":
version "7.19.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz#46890722687b9b89e1369ad0bd8dc6c5a3b4319d"
integrity sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==
dependencies:
"@babel/helper-plugin-utils" "^7.18.9"
"@babel/helper-plugin-utils" "^7.19.0"
"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4":
version "7.18.6"
@ -924,12 +924,12 @@
"@babel/helper-create-regexp-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/preset-env@^7.15.0", "@babel/preset-env@^7.19.3":
version "7.19.3"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.3.tgz#52cd19abaecb3f176a4ff9cc5e15b7bf06bec754"
integrity sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==
"@babel/preset-env@^7.15.0", "@babel/preset-env@^7.19.4":
version "7.19.4"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.4.tgz#4c91ce2e1f994f717efb4237891c3ad2d808c94b"
integrity sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==
dependencies:
"@babel/compat-data" "^7.19.3"
"@babel/compat-data" "^7.19.4"
"@babel/helper-compilation-targets" "^7.19.3"
"@babel/helper-plugin-utils" "^7.19.0"
"@babel/helper-validator-option" "^7.18.6"
@ -944,7 +944,7 @@
"@babel/plugin-proposal-logical-assignment-operators" "^7.18.9"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6"
"@babel/plugin-proposal-numeric-separator" "^7.18.6"
"@babel/plugin-proposal-object-rest-spread" "^7.18.9"
"@babel/plugin-proposal-object-rest-spread" "^7.19.4"
"@babel/plugin-proposal-optional-catch-binding" "^7.18.6"
"@babel/plugin-proposal-optional-chaining" "^7.18.9"
"@babel/plugin-proposal-private-methods" "^7.18.6"
@ -968,10 +968,10 @@
"@babel/plugin-transform-arrow-functions" "^7.18.6"
"@babel/plugin-transform-async-to-generator" "^7.18.6"
"@babel/plugin-transform-block-scoped-functions" "^7.18.6"
"@babel/plugin-transform-block-scoping" "^7.18.9"
"@babel/plugin-transform-block-scoping" "^7.19.4"
"@babel/plugin-transform-classes" "^7.19.0"
"@babel/plugin-transform-computed-properties" "^7.18.9"
"@babel/plugin-transform-destructuring" "^7.18.13"
"@babel/plugin-transform-destructuring" "^7.19.4"
"@babel/plugin-transform-dotall-regex" "^7.18.6"
"@babel/plugin-transform-duplicate-keys" "^7.18.9"
"@babel/plugin-transform-exponentiation-operator" "^7.18.6"
@ -998,7 +998,7 @@
"@babel/plugin-transform-unicode-escapes" "^7.18.10"
"@babel/plugin-transform-unicode-regex" "^7.18.6"
"@babel/preset-modules" "^0.1.5"
"@babel/types" "^7.19.3"
"@babel/types" "^7.19.4"
babel-plugin-polyfill-corejs2 "^0.3.3"
babel-plugin-polyfill-corejs3 "^0.6.0"
babel-plugin-polyfill-regenerator "^0.4.1"
@ -1064,12 +1064,12 @@
debug "^4.1.0"
globals "^11.1.0"
"@babel/types@^7.16.7", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.4.4":
version "7.19.3"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624"
integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==
"@babel/types@^7.16.7", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.19.4", "@babel/types@^7.4.4":
version "7.19.4"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7"
integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==
dependencies:
"@babel/helper-string-parser" "^7.18.10"
"@babel/helper-string-parser" "^7.19.4"
"@babel/helper-validator-identifier" "^7.19.1"
to-fast-properties "^2.0.0"
@ -6577,10 +6577,10 @@ regenerate@^1.4.2:
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7, regenerator-runtime@^0.13.9:
version "0.13.9"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
regenerator-runtime@^0.13.10, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9:
version "0.13.10"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee"
integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==
regenerator-transform@^0.15.0:
version "0.15.0"