Merge pull request #2144 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changespull/59/head
commit
867790e07a
|
@ -245,7 +245,7 @@ Metrics/BlockNesting:
|
||||||
|
|
||||||
# Configuration parameters: CountComments, CountAsOne.
|
# Configuration parameters: CountComments, CountAsOne.
|
||||||
Metrics/ClassLength:
|
Metrics/ClassLength:
|
||||||
Max: 368
|
Max: 375
|
||||||
|
|
||||||
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
||||||
Metrics/CyclomaticComplexity:
|
Metrics/CyclomaticComplexity:
|
||||||
|
@ -1670,8 +1670,6 @@ Rails/InverseOf:
|
||||||
# Include: app/controllers/**/*.rb, app/mailers/**/*.rb
|
# Include: app/controllers/**/*.rb, app/mailers/**/*.rb
|
||||||
Rails/LexicallyScopedActionFilter:
|
Rails/LexicallyScopedActionFilter:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/controllers/admin/domain_blocks_controller.rb'
|
|
||||||
- 'app/controllers/admin/email_domain_blocks_controller.rb'
|
|
||||||
- 'app/controllers/auth/passwords_controller.rb'
|
- 'app/controllers/auth/passwords_controller.rb'
|
||||||
- 'app/controllers/auth/registrations_controller.rb'
|
- 'app/controllers/auth/registrations_controller.rb'
|
||||||
- 'app/controllers/auth/sessions_controller.rb'
|
- 'app/controllers/auth/sessions_controller.rb'
|
||||||
|
|
51
CHANGELOG.md
51
CHANGELOG.md
|
@ -2,6 +2,57 @@
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
## [4.1.1] - 2023-03-16
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add redirection from paths with url-encoded `@` to their decoded form ([thijskh](https://github.com/mastodon/mastodon/pull/23593))
|
||||||
|
- Add `lang` attribute to native language names in language picker in Web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23749))
|
||||||
|
- Add headers to outgoing mails to avoid auto-replies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23597))
|
||||||
|
- Add support for refreshing many accounts at once with `tootctl accounts refresh` ([9p4](https://github.com/mastodon/mastodon/pull/23304))
|
||||||
|
- Add confirmation modal when clicking to edit a post with a non-empty compose form ([PauloVilarinho](https://github.com/mastodon/mastodon/pull/23936))
|
||||||
|
- Add support for the HAproxy PROXY protocol through the `PROXY_PROTO_V1` environment variable ([CSDUMMI](https://github.com/mastodon/mastodon/pull/24064))
|
||||||
|
- Add `SENDFILE_HEADER` environment variable ([Gargron](https://github.com/mastodon/mastodon/pull/24123))
|
||||||
|
- Add cache headers to static files served through Rails ([Gargron](https://github.com/mastodon/mastodon/pull/24120))
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Increase contrast of upload progress bar background ([toolmantim](https://github.com/mastodon/mastodon/pull/23836))
|
||||||
|
- Change post auto-deletion throttling constants to better scale with server size ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23320))
|
||||||
|
- Change order of bookmark and favourite sidebar entries in single-column UI for consistency ([TerryGarcia](https://github.com/mastodon/mastodon/pull/23701))
|
||||||
|
- Change `ActivityPub::DeliveryWorker` retries to be spread out more ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21956))
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix “Remove all followers from the selected domains” also removing follows and notifications ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23805))
|
||||||
|
- Fix streaming metrics format ([emilweth](https://github.com/mastodon/mastodon/pull/23519), [emilweth](https://github.com/mastodon/mastodon/pull/23520))
|
||||||
|
- Fix case-sensitive check for previously used hashtags in hashtag autocompletion ([deanveloper](https://github.com/mastodon/mastodon/pull/23526))
|
||||||
|
- Fix focus point of already-attached media not saving after edit ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23566))
|
||||||
|
- Fix sidebar behavior in settings/admin UI on mobile ([wxt2005](https://github.com/mastodon/mastodon/pull/23764))
|
||||||
|
- Fix inefficiency when searching accounts per username in admin interface ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23801))
|
||||||
|
- Fix duplicate “Publish” button on mobile ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23804))
|
||||||
|
- Fix server error when failing to follow back followers from `/relationships` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23787))
|
||||||
|
- Fix server error when attempting to display the edit history of a trendable post in the admin interface ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23574))
|
||||||
|
- Fix `tootctl accounts migrate` crashing because of a typo ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23567))
|
||||||
|
- Fix original account being unfollowed on migration before the follow request to the new account could be sent ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21957))
|
||||||
|
- Fix the “Back” button in column headers sometimes leaving Mastodon ([c960657](https://github.com/mastodon/mastodon/pull/23953))
|
||||||
|
- Fix pgBouncer resetting application name on every transaction ([Gargron](https://github.com/mastodon/mastodon/pull/23958))
|
||||||
|
- Fix unconfirmed accounts being counted as active users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23803))
|
||||||
|
- Fix `/api/v1/streaming` sub-paths not being redirected ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23988))
|
||||||
|
- Fix drag'n'drop upload area text that spans multiple lines not being centered ([vintprox](https://github.com/mastodon/mastodon/pull/24029))
|
||||||
|
- Fix sidekiq jobs not triggering Elasticsearch index updates ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24046))
|
||||||
|
- Fix tags being unnecessarily stripped from plain-text short site description ([c960657](https://github.com/mastodon/mastodon/pull/23975))
|
||||||
|
- Fix HTML entities not being un-escaped in extracted plain-text from remote posts ([c960657](https://github.com/mastodon/mastodon/pull/24019))
|
||||||
|
- Fix dashboard crash on ElasticSearch server error ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23751))
|
||||||
|
- Fix incorrect post links in strikes when the account is remote ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23611))
|
||||||
|
- Fix misleading error code when receiving invalid WebAuthn credentials ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23568))
|
||||||
|
- Fix duplicate mails being sent when the SMTP server is too slow to close the connection ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23750))
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
- Change user backups to use expiring URLs for download when possible ([Gargron](https://github.com/mastodon/mastodon/pull/24136))
|
||||||
|
- Add warning for object storage misconfiguration ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24137))
|
||||||
|
|
||||||
## [4.1.0] - 2023-02-10
|
## [4.1.0] - 2023-02-10
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
2
Gemfile
2
Gemfile
|
@ -69,7 +69,7 @@ gem 'public_suffix', '~> 5.0'
|
||||||
gem 'pundit', '~> 2.3'
|
gem 'pundit', '~> 2.3'
|
||||||
gem 'premailer-rails'
|
gem 'premailer-rails'
|
||||||
gem 'rack-attack', '~> 6.6'
|
gem 'rack-attack', '~> 6.6'
|
||||||
gem 'rack-cors', '~> 1.1', require: 'rack/cors'
|
gem 'rack-cors', '~> 2.0', require: 'rack/cors'
|
||||||
gem 'rails-i18n', '~> 6.0'
|
gem 'rails-i18n', '~> 6.0'
|
||||||
gem 'rails-settings-cached', '~> 0.6', git: 'https://github.com/mastodon/rails-settings-cached.git', branch: 'v0.6.6-aliases-true'
|
gem 'rails-settings-cached', '~> 0.6', git: 'https://github.com/mastodon/rails-settings-cached.git', branch: 'v0.6.6-aliases-true'
|
||||||
gem 'redcarpet', '~> 3.6'
|
gem 'redcarpet', '~> 3.6'
|
||||||
|
|
|
@ -487,7 +487,7 @@ GEM
|
||||||
pastel (0.8.0)
|
pastel (0.8.0)
|
||||||
tty-color (~> 0.5)
|
tty-color (~> 0.5)
|
||||||
pg (1.4.6)
|
pg (1.4.6)
|
||||||
pghero (3.3.0)
|
pghero (3.3.1)
|
||||||
activerecord (>= 6)
|
activerecord (>= 6)
|
||||||
pkg-config (1.5.1)
|
pkg-config (1.5.1)
|
||||||
posix-spawn (0.3.15)
|
posix-spawn (0.3.15)
|
||||||
|
@ -510,7 +510,7 @@ GEM
|
||||||
rack (2.2.6.4)
|
rack (2.2.6.4)
|
||||||
rack-attack (6.6.1)
|
rack-attack (6.6.1)
|
||||||
rack (>= 1.0, < 3)
|
rack (>= 1.0, < 3)
|
||||||
rack-cors (1.1.1)
|
rack-cors (2.0.1)
|
||||||
rack (>= 2.0.0)
|
rack (>= 2.0.0)
|
||||||
rack-oauth2 (1.21.3)
|
rack-oauth2 (1.21.3)
|
||||||
activesupport
|
activesupport
|
||||||
|
@ -681,7 +681,7 @@ GEM
|
||||||
sshkit (1.21.4)
|
sshkit (1.21.4)
|
||||||
net-scp (>= 1.1.2)
|
net-scp (>= 1.1.2)
|
||||||
net-ssh (>= 2.8.0)
|
net-ssh (>= 2.8.0)
|
||||||
stackprof (0.2.23)
|
stackprof (0.2.24)
|
||||||
statsd-ruby (1.5.0)
|
statsd-ruby (1.5.0)
|
||||||
stoplight (3.0.1)
|
stoplight (3.0.1)
|
||||||
redlock (~> 1.0)
|
redlock (~> 1.0)
|
||||||
|
@ -851,7 +851,7 @@ DEPENDENCIES
|
||||||
pundit (~> 2.3)
|
pundit (~> 2.3)
|
||||||
rack (~> 2.2.6)
|
rack (~> 2.2.6)
|
||||||
rack-attack (~> 6.6)
|
rack-attack (~> 6.6)
|
||||||
rack-cors (~> 1.1)
|
rack-cors (~> 2.0)
|
||||||
rack-test (~> 2.1)
|
rack-test (~> 2.1)
|
||||||
rails (~> 6.1.7)
|
rails (~> 6.1.7)
|
||||||
rails-controller-testing (~> 1.0)
|
rails-controller-testing (~> 1.0)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
module Admin
|
module Admin
|
||||||
class DomainBlocksController < BaseController
|
class DomainBlocksController < BaseController
|
||||||
before_action :set_domain_block, only: [:show, :destroy, :edit, :update]
|
before_action :set_domain_block, only: [:destroy, :edit, :update]
|
||||||
|
|
||||||
def batch
|
def batch
|
||||||
authorize :domain_block, :create?
|
authorize :domain_block, :create?
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
module Admin
|
module Admin
|
||||||
class EmailDomainBlocksController < BaseController
|
class EmailDomainBlocksController < BaseController
|
||||||
before_action :set_email_domain_block, only: [:show, :destroy]
|
|
||||||
|
|
||||||
def index
|
def index
|
||||||
authorize :email_domain_block, :index?
|
authorize :email_domain_block, :index?
|
||||||
|
|
||||||
|
@ -59,10 +57,6 @@ module Admin
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_email_domain_block
|
|
||||||
@email_domain_block = EmailDomainBlock.find(params[:id])
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_resolved_records
|
def set_resolved_records
|
||||||
Resolv::DNS.open do |dns|
|
Resolv::DNS.open do |dns|
|
||||||
dns.timeouts = 5
|
dns.timeouts = 5
|
||||||
|
|
|
@ -187,7 +187,7 @@ module CacheConcern
|
||||||
return [] if raw.empty?
|
return [] if raw.empty?
|
||||||
|
|
||||||
cached_keys_with_value = begin
|
cached_keys_with_value = begin
|
||||||
Rails.cache.read_multi(*raw, namespace: 'v2').transform_keys(&:id).transform_values { |r| ActiveRecordCoder.load(r) }
|
Rails.cache.read_multi(*raw).transform_keys(&:id).transform_values { |r| ActiveRecordCoder.load(r) }
|
||||||
rescue ActiveRecordCoder::Error
|
rescue ActiveRecordCoder::Error
|
||||||
{} # The serialization format may have changed, let's pretend it's a cache miss.
|
{} # The serialization format may have changed, let's pretend it's a cache miss.
|
||||||
end
|
end
|
||||||
|
@ -200,7 +200,7 @@ module CacheConcern
|
||||||
uncached = klass.where(id: uncached_ids).with_includes.index_by(&:id)
|
uncached = klass.where(id: uncached_ids).with_includes.index_by(&:id)
|
||||||
|
|
||||||
uncached.each_value do |item|
|
uncached.each_value do |item|
|
||||||
Rails.cache.write(item, ActiveRecordCoder.dump(item), namespace: 'v2')
|
Rails.cache.write(item, ActiveRecordCoder.dump(item))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -26,11 +26,13 @@
|
||||||
img {
|
img {
|
||||||
margin-top: 2em;
|
margin-top: 2em;
|
||||||
margin-bottom: 2em;
|
margin-bottom: 2em;
|
||||||
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
video {
|
video {
|
||||||
margin-top: 2em;
|
margin-top: 2em;
|
||||||
margin-bottom: 2em;
|
margin-bottom: 2em;
|
||||||
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
figure {
|
figure {
|
||||||
|
|
|
@ -8249,11 +8249,13 @@ noscript {
|
||||||
img {
|
img {
|
||||||
margin-top: 2em;
|
margin-top: 2em;
|
||||||
margin-bottom: 2em;
|
margin-bottom: 2em;
|
||||||
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
video {
|
video {
|
||||||
margin-top: 2em;
|
margin-top: 2em;
|
||||||
margin-bottom: 2em;
|
margin-bottom: 2em;
|
||||||
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
figure {
|
figure {
|
||||||
|
|
|
@ -126,6 +126,8 @@ class Account < ApplicationRecord
|
||||||
scope :not_excluded_by_account, ->(account) { where.not(id: account.excluded_from_timeline_account_ids) }
|
scope :not_excluded_by_account, ->(account) { where.not(id: account.excluded_from_timeline_account_ids) }
|
||||||
scope :not_domain_blocked_by_account, ->(account) { where(arel_table[:domain].eq(nil).or(arel_table[:domain].not_in(account.excluded_from_timeline_domains))) }
|
scope :not_domain_blocked_by_account, ->(account) { where(arel_table[:domain].eq(nil).or(arel_table[:domain].not_in(account.excluded_from_timeline_domains))) }
|
||||||
|
|
||||||
|
after_update_commit :trigger_update_webhooks
|
||||||
|
|
||||||
delegate :email,
|
delegate :email,
|
||||||
:unconfirmed_email,
|
:unconfirmed_email,
|
||||||
:current_sign_in_at,
|
:current_sign_in_at,
|
||||||
|
@ -591,4 +593,9 @@ class Account < ApplicationRecord
|
||||||
|
|
||||||
CanonicalEmailBlock.where(reference_account: self).delete_all
|
CanonicalEmailBlock.where(reference_account: self).delete_all
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# NOTE: the `account.created` webhook is triggered by the `User` model, not `Account`.
|
||||||
|
def trigger_update_webhooks
|
||||||
|
TriggerWebhookWorker.perform_async('account.updated', 'Account', id) if local?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -292,6 +292,21 @@ module AccountInteractions
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def relations_map(account_ids, domains = nil, **options)
|
||||||
|
relations = {
|
||||||
|
blocked_by: Account.blocked_by_map(account_ids, id),
|
||||||
|
following: Account.following_map(account_ids, id),
|
||||||
|
}
|
||||||
|
|
||||||
|
return relations if options[:skip_blocking_and_muting]
|
||||||
|
|
||||||
|
relations.merge!({
|
||||||
|
blocking: Account.blocking_map(account_ids, id),
|
||||||
|
muting: Account.muting_map(account_ids, id),
|
||||||
|
domain_blocking_by_domain: Account.domain_blocking_map_by_domain(domains, id),
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def remove_potential_friendship(other_account)
|
def remove_potential_friendship(other_account)
|
||||||
|
|
|
@ -79,7 +79,7 @@ module StatusThreadingConcern
|
||||||
statuses = Status.with_accounts(ids).to_a
|
statuses = Status.with_accounts(ids).to_a
|
||||||
account_ids = statuses.map(&:account_id).uniq
|
account_ids = statuses.map(&:account_id).uniq
|
||||||
domains = statuses.filter_map(&:account_domain).uniq
|
domains = statuses.filter_map(&:account_domain).uniq
|
||||||
relations = relations_map_for_account(account, account_ids, domains)
|
relations = account&.relations_map(account_ids, domains) || {}
|
||||||
|
|
||||||
statuses.reject! { |status| StatusFilter.new(status, account, relations).filtered? }
|
statuses.reject! { |status| StatusFilter.new(status, account, relations).filtered? }
|
||||||
|
|
||||||
|
@ -108,16 +108,4 @@ module StatusThreadingConcern
|
||||||
|
|
||||||
arr
|
arr
|
||||||
end
|
end
|
||||||
|
|
||||||
def relations_map_for_account(account, account_ids, domains)
|
|
||||||
return {} if account.nil?
|
|
||||||
|
|
||||||
{
|
|
||||||
blocking: Account.blocking_map(account_ids, account.id),
|
|
||||||
blocked_by: Account.blocked_by_map(account_ids, account.id),
|
|
||||||
muting: Account.muting_map(account_ids, account.id),
|
|
||||||
following: Account.following_map(account_ids, account.id),
|
|
||||||
domain_blocking_by_domain: Account.domain_blocking_map_by_domain(domains, account.id),
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -116,6 +116,9 @@ class Status < ApplicationRecord
|
||||||
|
|
||||||
scope :not_local_only, -> { where(local_only: [false, nil]) }
|
scope :not_local_only, -> { where(local_only: [false, nil]) }
|
||||||
|
|
||||||
|
after_create_commit :trigger_create_webhooks
|
||||||
|
after_update_commit :trigger_update_webhooks
|
||||||
|
|
||||||
cache_associated :application,
|
cache_associated :application,
|
||||||
:media_attachments,
|
:media_attachments,
|
||||||
:conversation,
|
:conversation,
|
||||||
|
@ -142,6 +145,10 @@ class Status < ApplicationRecord
|
||||||
|
|
||||||
REAL_TIME_WINDOW = 6.hours
|
REAL_TIME_WINDOW = 6.hours
|
||||||
|
|
||||||
|
def cache_key
|
||||||
|
"v2:#{super}"
|
||||||
|
end
|
||||||
|
|
||||||
def searchable_by(preloaded = nil)
|
def searchable_by(preloaded = nil)
|
||||||
ids = []
|
ids = []
|
||||||
|
|
||||||
|
@ -597,4 +604,12 @@ class Status < ApplicationRecord
|
||||||
reblog&.decrement_count!(:reblogs_count) if reblog?
|
reblog&.decrement_count!(:reblogs_count) if reblog?
|
||||||
thread&.decrement_count!(:replies_count) if in_reply_to_id.present? && distributable?
|
thread&.decrement_count!(:replies_count) if in_reply_to_id.present? && distributable?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def trigger_create_webhooks
|
||||||
|
TriggerWebhookWorker.perform_async('status.created', 'Status', id) if local?
|
||||||
|
end
|
||||||
|
|
||||||
|
def trigger_update_webhooks
|
||||||
|
TriggerWebhookWorker.perform_async('status.updated', 'Status', id) if local?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,7 +17,10 @@ class Webhook < ApplicationRecord
|
||||||
EVENTS = %w(
|
EVENTS = %w(
|
||||||
account.approved
|
account.approved
|
||||||
account.created
|
account.created
|
||||||
|
account.updated
|
||||||
report.created
|
report.created
|
||||||
|
status.created
|
||||||
|
status.updated
|
||||||
).freeze
|
).freeze
|
||||||
|
|
||||||
scope :enabled, -> { where(enabled: true) }
|
scope :enabled, -> { where(enabled: true) }
|
||||||
|
|
|
@ -22,10 +22,6 @@ class InstancePresenter < ActiveModelSerializers::Model
|
||||||
ContactPresenter.new
|
ContactPresenter.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def closed_registrations_message
|
|
||||||
Setting.closed_registrations_message
|
|
||||||
end
|
|
||||||
|
|
||||||
def description
|
def description
|
||||||
Setting.site_short_description
|
Setting.site_short_description
|
||||||
end
|
end
|
||||||
|
@ -34,10 +30,6 @@ class InstancePresenter < ActiveModelSerializers::Model
|
||||||
Setting.site_extended_description
|
Setting.site_extended_description
|
||||||
end
|
end
|
||||||
|
|
||||||
def privacy_policy
|
|
||||||
Setting.site_terms
|
|
||||||
end
|
|
||||||
|
|
||||||
def status_page_url
|
def status_page_url
|
||||||
Setting.status_page_url
|
Setting.status_page_url
|
||||||
end
|
end
|
||||||
|
|
|
@ -120,7 +120,7 @@ class ImportService < BaseService
|
||||||
end
|
end
|
||||||
|
|
||||||
account_ids = statuses.map(&:account_id)
|
account_ids = statuses.map(&:account_id)
|
||||||
preloaded_relations = relations_map_for_account(@account, account_ids)
|
preloaded_relations = @account.relations_map(account_ids, skip_blocking_and_muting: true)
|
||||||
|
|
||||||
statuses.keep_if { |status| StatusPolicy.new(@account, status, preloaded_relations).show? }
|
statuses.keep_if { |status| StatusPolicy.new(@account, status, preloaded_relations).show? }
|
||||||
|
|
||||||
|
@ -138,14 +138,4 @@ class ImportService < BaseService
|
||||||
def import_data
|
def import_data
|
||||||
Paperclip.io_adapters.for(@import.data).read.force_encoding(Encoding::UTF_8)
|
Paperclip.io_adapters.for(@import.data).read.force_encoding(Encoding::UTF_8)
|
||||||
end
|
end
|
||||||
|
|
||||||
def relations_map_for_account(account, account_ids)
|
|
||||||
{
|
|
||||||
blocking: {},
|
|
||||||
blocked_by: Account.blocked_by_map(account_ids, account.id),
|
|
||||||
muting: {},
|
|
||||||
following: Account.following_map(account_ids, account.id),
|
|
||||||
domain_blocking_by_domain: {},
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -49,7 +49,7 @@ class SearchService < BaseService
|
||||||
results = definition.limit(@limit).offset(@offset).objects.compact
|
results = definition.limit(@limit).offset(@offset).objects.compact
|
||||||
account_ids = results.map(&:account_id)
|
account_ids = results.map(&:account_id)
|
||||||
account_domains = results.map(&:account_domain)
|
account_domains = results.map(&:account_domain)
|
||||||
preloaded_relations = relations_map_for_account(@account, account_ids, account_domains)
|
preloaded_relations = @account.relations_map(account_ids, account_domains)
|
||||||
|
|
||||||
results.reject { |status| StatusFilter.new(status, @account, preloaded_relations).filtered? }
|
results.reject { |status| StatusFilter.new(status, @account, preloaded_relations).filtered? }
|
||||||
rescue Faraday::ConnectionFailed, Parslet::ParseFailed
|
rescue Faraday::ConnectionFailed, Parslet::ParseFailed
|
||||||
|
@ -111,16 +111,6 @@ class SearchService < BaseService
|
||||||
@options[:type].blank? || @options[:type] == 'statuses'
|
@options[:type].blank? || @options[:type] == 'statuses'
|
||||||
end
|
end
|
||||||
|
|
||||||
def relations_map_for_account(account, account_ids, domains)
|
|
||||||
{
|
|
||||||
blocking: Account.blocking_map(account_ids, account.id),
|
|
||||||
blocked_by: Account.blocked_by_map(account_ids, account.id),
|
|
||||||
muting: Account.muting_map(account_ids, account.id),
|
|
||||||
following: Account.following_map(account_ids, account.id),
|
|
||||||
domain_blocking_by_domain: Account.domain_blocking_map_by_domain(domains, account.id),
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def parsed_query
|
def parsed_query
|
||||||
SearchQueryTransformer.new.apply(SearchQueryParser.new.parse(@query))
|
SearchQueryTransformer.new.apply(SearchQueryParser.new.parse(@query))
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,7 +19,7 @@ class Webhooks::DeliveryWorker
|
||||||
private
|
private
|
||||||
|
|
||||||
def perform_request
|
def perform_request
|
||||||
request = Request.new(:post, @webhook.url, body: @body)
|
request = Request.new(:post, @webhook.url, body: @body, allow_local: true)
|
||||||
|
|
||||||
request.add_headers(
|
request.add_headers(
|
||||||
'Content-Type' => 'application/json',
|
'Content-Type' => 'application/json',
|
||||||
|
|
|
@ -127,7 +127,6 @@ Rails.application.configure do
|
||||||
'X-Frame-Options' => 'DENY',
|
'X-Frame-Options' => 'DENY',
|
||||||
'X-Content-Type-Options' => 'nosniff',
|
'X-Content-Type-Options' => 'nosniff',
|
||||||
'X-XSS-Protection' => '0',
|
'X-XSS-Protection' => '0',
|
||||||
'Permissions-Policy' => 'interest-cohort=()',
|
|
||||||
'X-Clacks-Overhead' => 'GNU Natalie Nguyen',
|
'X-Clacks-Overhead' => 'GNU Natalie Nguyen',
|
||||||
'Referrer-Policy' => 'same-origin',
|
'Referrer-Policy' => 'same-origin',
|
||||||
}
|
}
|
||||||
|
|
|
@ -1697,7 +1697,7 @@ en:
|
||||||
seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available.
|
seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available.
|
||||||
signed_in_as: 'Signed in as:'
|
signed_in_as: 'Signed in as:'
|
||||||
verification:
|
verification:
|
||||||
explanation_html: 'You can <strong>verify yourself as the owner of the links in your profile metadata</strong>. For that, the linked website must contain a link back to your Mastodon profile. The link back <strong>must</strong> have a <code>rel="me"</code> attribute. The text content of the link does not matter. Here is an example:'
|
explanation_html: 'You can <strong>verify yourself as the owner of the links in your profile metadata</strong>. For that, the linked website must contain a link back to your Mastodon profile. After adding the link you may need to come back here and re-save your profile for the verification to take effect. The link back <strong>must</strong> have a <code>rel="me"</code> attribute. The text content of the link does not matter. Here is an example:'
|
||||||
verification: Verification
|
verification: Verification
|
||||||
webauthn_credentials:
|
webauthn_credentials:
|
||||||
add: Add new security key
|
add: Add new security key
|
||||||
|
|
|
@ -233,7 +233,7 @@ Rails.application.routes.draw do
|
||||||
get '/dashboard', to: 'dashboard#index'
|
get '/dashboard', to: 'dashboard#index'
|
||||||
|
|
||||||
resources :domain_allows, only: [:new, :create, :show, :destroy]
|
resources :domain_allows, only: [:new, :create, :show, :destroy]
|
||||||
resources :domain_blocks, only: [:new, :create, :show, :destroy, :update, :edit] do
|
resources :domain_blocks, only: [:new, :create, :destroy, :update, :edit] do
|
||||||
collection do
|
collection do
|
||||||
post :batch
|
post :batch
|
||||||
end
|
end
|
||||||
|
|
|
@ -52,6 +52,7 @@ module Mastodon
|
||||||
|
|
||||||
progress.log("Processing #{item.id}") if options[:verbose]
|
progress.log("Processing #{item.id}") if options[:verbose]
|
||||||
|
|
||||||
|
Chewy.strategy(:mastodon) do
|
||||||
result = ActiveRecord::Base.connection_pool.with_connection do
|
result = ActiveRecord::Base.connection_pool.with_connection do
|
||||||
yield(item)
|
yield(item)
|
||||||
ensure
|
ensure
|
||||||
|
@ -60,6 +61,7 @@ module Mastodon
|
||||||
end
|
end
|
||||||
|
|
||||||
aggregate.increment(result) if result.is_a?(Integer)
|
aggregate.increment(result) if result.is_a?(Integer)
|
||||||
|
end
|
||||||
rescue => e
|
rescue => e
|
||||||
progress.log pastel.red("Error processing #{item.id}: #{e}")
|
progress.log pastel.red("Error processing #{item.id}: #{e}")
|
||||||
ensure
|
ensure
|
||||||
|
|
|
@ -13,7 +13,7 @@ module Mastodon
|
||||||
end
|
end
|
||||||
|
|
||||||
def patch
|
def patch
|
||||||
0
|
1
|
||||||
end
|
end
|
||||||
|
|
||||||
def flags
|
def flags
|
||||||
|
|
|
@ -105,7 +105,7 @@
|
||||||
"react-redux-loading-bar": "^5.0.4",
|
"react-redux-loading-bar": "^5.0.4",
|
||||||
"react-router-dom": "^4.1.1",
|
"react-router-dom": "^4.1.1",
|
||||||
"react-router-scroll-4": "^1.0.0-beta.1",
|
"react-router-scroll-4": "^1.0.0-beta.1",
|
||||||
"react-select": "^5.7.0",
|
"react-select": "^5.7.1",
|
||||||
"react-sparklines": "^1.7.0",
|
"react-sparklines": "^1.7.0",
|
||||||
"react-swipeable-views": "^0.14.0",
|
"react-swipeable-views": "^0.14.0",
|
||||||
"react-textarea-autosize": "^8.4.0",
|
"react-textarea-autosize": "^8.4.0",
|
||||||
|
@ -156,11 +156,11 @@
|
||||||
"jest": "^29.5.0",
|
"jest": "^29.5.0",
|
||||||
"jest-environment-jsdom": "^29.5.0",
|
"jest-environment-jsdom": "^29.5.0",
|
||||||
"postcss-scss": "^4.0.6",
|
"postcss-scss": "^4.0.6",
|
||||||
"prettier": "^2.8.4",
|
"prettier": "^2.8.5",
|
||||||
"raf": "^3.4.1",
|
"raf": "^3.4.1",
|
||||||
"react-intl-translations-manager": "^5.0.3",
|
"react-intl-translations-manager": "^5.0.3",
|
||||||
"react-test-renderer": "^16.14.0",
|
"react-test-renderer": "^16.14.0",
|
||||||
"stylelint": "^15.2.0",
|
"stylelint": "^15.3.0",
|
||||||
"stylelint-config-standard-scss": "^7.0.1",
|
"stylelint-config-standard-scss": "^7.0.1",
|
||||||
"webpack-dev-server": "^3.11.3",
|
"webpack-dev-server": "^3.11.3",
|
||||||
"yargs": "^17.7.1"
|
"yargs": "^17.7.1"
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe Importer::AccountsIndexImporter do
|
||||||
|
describe 'import!' do
|
||||||
|
let(:pool) { Concurrent::FixedThreadPool.new(5) }
|
||||||
|
let(:importer) { described_class.new(batch_size: 123, executor: pool) }
|
||||||
|
|
||||||
|
before { Fabricate(:account) }
|
||||||
|
|
||||||
|
it 'indexes relevant accounts' do
|
||||||
|
expect { importer.import! }.to update_index(AccountsIndex)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,16 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe Importer::StatusesIndexImporter do
|
||||||
|
describe 'import!' do
|
||||||
|
let(:pool) { Concurrent::FixedThreadPool.new(5) }
|
||||||
|
let(:importer) { described_class.new(batch_size: 123, executor: pool) }
|
||||||
|
|
||||||
|
before { Fabricate(:status) }
|
||||||
|
|
||||||
|
it 'indexes relevant statuses' do
|
||||||
|
expect { importer.import! }.to update_index(StatusesIndex)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,16 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe Importer::TagsIndexImporter do
|
||||||
|
describe 'import!' do
|
||||||
|
let(:pool) { Concurrent::FixedThreadPool.new(5) }
|
||||||
|
let(:importer) { described_class.new(batch_size: 123, executor: pool) }
|
||||||
|
|
||||||
|
before { Fabricate(:tag) }
|
||||||
|
|
||||||
|
it 'indexes relevant tags' do
|
||||||
|
expect { importer.import! }.to update_index(TagsIndex)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
64
yarn.lock
64
yarn.lock
|
@ -1098,10 +1098,10 @@
|
||||||
resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz#ff02629c7c95d1f4f8ea84d5ef1173461610535e"
|
resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz#ff02629c7c95d1f4f8ea84d5ef1173461610535e"
|
||||||
integrity sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==
|
integrity sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==
|
||||||
|
|
||||||
"@csstools/css-tokenizer@^2.0.1":
|
"@csstools/css-tokenizer@^2.1.0":
|
||||||
version "2.0.1"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.0.1.tgz#cb1e11752db57e69d9aa0e84c3105a25845d4055"
|
resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.1.0.tgz#fee4de3d444db3ce9007f3af6474af8ba3e4b930"
|
||||||
integrity sha512-sYD3H7ReR88S/4+V5VbKiBEUJF4FqvG+8aNJkxqoPAnbhFziDG22IDZc4+h+xA63SfgM+h15lq5OnLeCxQ9nPA==
|
integrity sha512-dtqFyoJBHUxGi9zPZdpCKP1xk8tq6KPHJ/NY4qWXiYo6IcSGwzk3L8x2XzZbbyOyBs9xQARoGveU2AsgLj6D2A==
|
||||||
|
|
||||||
"@csstools/media-query-list-parser@^2.0.1":
|
"@csstools/media-query-list-parser@^2.0.1":
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
|
@ -3592,10 +3592,10 @@ cosmiconfig@^7.0.0:
|
||||||
path-type "^4.0.0"
|
path-type "^4.0.0"
|
||||||
yaml "^1.10.0"
|
yaml "^1.10.0"
|
||||||
|
|
||||||
cosmiconfig@^8.0.0:
|
cosmiconfig@^8.1.0:
|
||||||
version "8.0.0"
|
version "8.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97"
|
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689"
|
||||||
integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==
|
integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==
|
||||||
dependencies:
|
dependencies:
|
||||||
import-fresh "^3.2.1"
|
import-fresh "^3.2.1"
|
||||||
js-yaml "^4.1.0"
|
js-yaml "^4.1.0"
|
||||||
|
@ -6989,10 +6989,10 @@ klona@^2.0.4:
|
||||||
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
|
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
|
||||||
integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
|
integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
|
||||||
|
|
||||||
known-css-properties@^0.26.0:
|
known-css-properties@^0.27.0:
|
||||||
version "0.26.0"
|
version "0.27.0"
|
||||||
resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.26.0.tgz#008295115abddc045a9f4ed7e2a84dc8b3a77649"
|
resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.27.0.tgz#82a9358dda5fe7f7bd12b5e7142c0a205393c0c5"
|
||||||
integrity sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==
|
integrity sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==
|
||||||
|
|
||||||
language-subtag-registry@~0.3.2:
|
language-subtag-registry@~0.3.2:
|
||||||
version "0.3.20"
|
version "0.3.20"
|
||||||
|
@ -8616,10 +8616,10 @@ prelude-ls@~1.1.2:
|
||||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
|
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
|
||||||
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
|
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
|
||||||
|
|
||||||
prettier@^2.8.4:
|
prettier@^2.8.5:
|
||||||
version "2.8.4"
|
version "2.8.5"
|
||||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3"
|
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.5.tgz#3dd8ae1ebddc4f6aa419c9b64d8c8319a7e0d982"
|
||||||
integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==
|
integrity sha512-3gzuxrHbKUePRBB4ZeU08VNkUcqEHaUaouNt0m7LGP4Hti/NuB07C7PPTM/LkWqXoJYJn2McEo5+kxPNrtQkLQ==
|
||||||
|
|
||||||
pretty-bytes@^5.3.0, pretty-bytes@^5.4.1:
|
pretty-bytes@^5.3.0, pretty-bytes@^5.4.1:
|
||||||
version "5.6.0"
|
version "5.6.0"
|
||||||
|
@ -9026,10 +9026,10 @@ react-router@^4.3.1:
|
||||||
prop-types "^15.6.1"
|
prop-types "^15.6.1"
|
||||||
warning "^4.0.1"
|
warning "^4.0.1"
|
||||||
|
|
||||||
react-select@^5.7.0:
|
react-select@^5.7.1:
|
||||||
version "5.7.0"
|
version "5.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.0.tgz#82921b38f1fcf1471a0b62304da01f2896cd8ce6"
|
resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.1.tgz#c85afa8a771d75c935ec698726a8fbfece662ed0"
|
||||||
integrity sha512-lJGiMxCa3cqnUr2Jjtg9YHsaytiZqeNOKeibv6WF5zbK/fPegZ1hg3y/9P1RZVLhqBTs0PfqQLKuAACednYGhQ==
|
integrity sha512-u/brzm3B6vgI+PtxNyE4/18kXgaf6bn5sOAjKhaQ54EItBfW41SRLH1AJC5fefPnGM4JmMcM51t/HAVCi5GrpQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime" "^7.12.0"
|
"@babel/runtime" "^7.12.0"
|
||||||
"@emotion/cache" "^11.4.0"
|
"@emotion/cache" "^11.4.0"
|
||||||
|
@ -10302,18 +10302,18 @@ stylelint-scss@^4.4.0:
|
||||||
postcss-selector-parser "^6.0.6"
|
postcss-selector-parser "^6.0.6"
|
||||||
postcss-value-parser "^4.1.0"
|
postcss-value-parser "^4.1.0"
|
||||||
|
|
||||||
stylelint@^15.2.0:
|
stylelint@^15.3.0:
|
||||||
version "15.2.0"
|
version "15.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.2.0.tgz#e906eb59df83bde075d148623216f298f9ceb03a"
|
resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.3.0.tgz#5f0f3264abeb29c54f571ea3f3934eba2c2be96d"
|
||||||
integrity sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==
|
integrity sha512-9UYBYk7K9rtlKcTUDZrtntE840sZM00qyYBQHHe7tjwMNUsPsGvR6Fd43IxHEAhRrDLzpy3TVaHb6CReBB3eFg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@csstools/css-parser-algorithms" "^2.0.1"
|
"@csstools/css-parser-algorithms" "^2.0.1"
|
||||||
"@csstools/css-tokenizer" "^2.0.1"
|
"@csstools/css-tokenizer" "^2.1.0"
|
||||||
"@csstools/media-query-list-parser" "^2.0.1"
|
"@csstools/media-query-list-parser" "^2.0.1"
|
||||||
"@csstools/selector-specificity" "^2.1.1"
|
"@csstools/selector-specificity" "^2.1.1"
|
||||||
balanced-match "^2.0.0"
|
balanced-match "^2.0.0"
|
||||||
colord "^2.9.3"
|
colord "^2.9.3"
|
||||||
cosmiconfig "^8.0.0"
|
cosmiconfig "^8.1.0"
|
||||||
css-functions-list "^3.1.0"
|
css-functions-list "^3.1.0"
|
||||||
css-tree "^2.3.1"
|
css-tree "^2.3.1"
|
||||||
debug "^4.3.4"
|
debug "^4.3.4"
|
||||||
|
@ -10328,7 +10328,7 @@ stylelint@^15.2.0:
|
||||||
import-lazy "^4.0.0"
|
import-lazy "^4.0.0"
|
||||||
imurmurhash "^0.1.4"
|
imurmurhash "^0.1.4"
|
||||||
is-plain-object "^5.0.0"
|
is-plain-object "^5.0.0"
|
||||||
known-css-properties "^0.26.0"
|
known-css-properties "^0.27.0"
|
||||||
mathml-tag-names "^2.1.3"
|
mathml-tag-names "^2.1.3"
|
||||||
meow "^9.0.0"
|
meow "^9.0.0"
|
||||||
micromatch "^4.0.5"
|
micromatch "^4.0.5"
|
||||||
|
@ -10344,7 +10344,7 @@ stylelint@^15.2.0:
|
||||||
string-width "^4.2.3"
|
string-width "^4.2.3"
|
||||||
strip-ansi "^6.0.1"
|
strip-ansi "^6.0.1"
|
||||||
style-search "^0.1.0"
|
style-search "^0.1.0"
|
||||||
supports-hyperlinks "^2.3.0"
|
supports-hyperlinks "^3.0.0"
|
||||||
svg-tags "^1.0.0"
|
svg-tags "^1.0.0"
|
||||||
table "^6.8.1"
|
table "^6.8.1"
|
||||||
v8-compile-cache "^2.3.0"
|
v8-compile-cache "^2.3.0"
|
||||||
|
@ -10388,10 +10388,10 @@ supports-color@^8.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
has-flag "^4.0.0"
|
has-flag "^4.0.0"
|
||||||
|
|
||||||
supports-hyperlinks@^2.3.0:
|
supports-hyperlinks@^3.0.0:
|
||||||
version "2.3.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624"
|
resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz#c711352a5c89070779b4dad54c05a2f14b15c94b"
|
||||||
integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==
|
integrity sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==
|
||||||
dependencies:
|
dependencies:
|
||||||
has-flag "^4.0.0"
|
has-flag "^4.0.0"
|
||||||
supports-color "^7.0.0"
|
supports-color "^7.0.0"
|
||||||
|
|
Loading…
Reference in New Issue