diff --git a/.github/workflows/crowdin-download.yml b/.github/workflows/crowdin-download.yml index bb82f65c75..41050b6f75 100644 --- a/.github/workflows/crowdin-download.yml +++ b/.github/workflows/crowdin-download.yml @@ -53,7 +53,7 @@ jobs: # Create or update the pull request - name: Create Pull Request - uses: peter-evans/create-pull-request@v6.0.3 + uses: peter-evans/create-pull-request@v6.0.4 with: commit-message: 'New Crowdin translations' title: 'New Crowdin Translations (automated)' diff --git a/.rubocop.yml b/.rubocop.yml index e80f3b2938..1b5ce67ee7 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -9,6 +9,7 @@ inherit_mode: require: - rubocop-rails - rubocop-rspec + - rubocop-rspec_rails - rubocop-performance - rubocop-capybara - ./lib/linter/rubocop_middle_dot diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 5b683e26c2..4b1292580c 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -54,15 +54,6 @@ Rails/OutputSafety: Exclude: - 'config/initializers/simple_form.rb' -# Configuration parameters: Include. -# Include: app/models/**/*.rb -Rails/UniqueValidationWithoutIndex: - Exclude: - - 'app/models/account_alias.rb' - - 'app/models/custom_filter_status.rb' - - 'app/models/identity.rb' - - 'app/models/webauthn_credential.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: AllowedMethods, AllowedPatterns. # AllowedMethods: ==, equal?, eql? @@ -197,13 +188,6 @@ Style/OptionalBooleanParameter: - 'app/workers/unfollow_follow_worker.rb' - 'lib/mastodon/redis_config.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: PreferredDelimiters. -Style/PercentLiteralDelimiters: - Exclude: - - 'config/deploy.rb' - - 'config/initializers/doorkeeper.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle. # SupportedStyles: short, verbose @@ -248,33 +232,6 @@ Style/StringConcatenation: Exclude: - 'config/initializers/paperclip.rb' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline. -# SupportedStyles: single_quotes, double_quotes -Style/StringLiterals: - Exclude: - - 'config/environments/production.rb' - - 'config/initializers/backtrace_silencers.rb' - - 'config/initializers/http_client_proxy.rb' - - 'config/initializers/rack_attack.rb' - - 'config/initializers/webauthn.rb' - - 'config/routes.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyleForMultiline. -# SupportedStylesForMultiline: comma, consistent_comma, no_comma -Style/TrailingCommaInArguments: - Exclude: - - 'config/initializers/paperclip.rb' - -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyleForMultiline. -# SupportedStylesForMultiline: comma, consistent_comma, no_comma -Style/TrailingCommaInHashLiteral: - Exclude: - - 'config/environments/production.rb' - - 'config/environments/test.rb' - # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: WordRegex. # SupportedStyles: percent, brackets diff --git a/Gemfile b/Gemfile index 3361f2dc33..3f621ddc52 100644 --- a/Gemfile +++ b/Gemfile @@ -12,7 +12,7 @@ gem 'thor', '~> 1.2' # For why irb is in the Gemfile, see: https://ruby.social/@st0012/111444685161478182 gem 'irb', '~> 1.8' -gem 'dotenv-rails', '~> 2.8' +gem 'dotenv' gem 'haml-rails', '~>2.0' gem 'pg', '~> 1.5' gem 'pghero' diff --git a/Gemfile.lock b/Gemfile.lock index 752d4e05e0..aadd52d641 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -102,8 +102,8 @@ GEM attr_required (1.0.2) awrence (1.2.1) aws-eventstream (1.3.0) - aws-partitions (1.914.0) - aws-sdk-core (3.192.0) + aws-partitions (1.916.0) + aws-sdk-core (3.192.1) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) @@ -186,7 +186,7 @@ GEM bigdecimal rexml crass (1.0.6) - css_parser (1.16.0) + css_parser (1.17.1) addressable csv (3.3.0) database_cleaner-active_record (2.1.0) @@ -220,10 +220,7 @@ GEM domain_name (0.6.20240107) doorkeeper (5.6.9) railties (>= 5) - dotenv (2.8.1) - dotenv-rails (2.8.1) - dotenv (= 2.8.1) - railties (>= 3.2) + dotenv (3.1.0) drb (2.2.1) ed25519 (1.3.0) elasticsearch (7.13.3) @@ -241,7 +238,7 @@ GEM mail (~> 2.7) encryptor (3.0.0) erubi (1.12.0) - et-orbi (1.2.10) + et-orbi (1.2.11) tzinfo excon (0.110.0) fabrication (2.31.0) @@ -275,8 +272,8 @@ GEM fast_blank (1.0.1) fastimage (2.3.1) ffi (1.16.3) - ffi-compiler (1.0.1) - ffi (>= 1.0.0) + ffi-compiler (1.3.2) + ffi (>= 1.15.5) rake fog-core (2.4.0) builder @@ -317,7 +314,7 @@ GEM hashie (5.0.0) hcaptcha (7.1.0) json - highline (2.1.0) + highline (3.0.1) hiredis (0.6.3) hkdf (0.3.0) htmlentities (4.3.4) @@ -435,11 +432,11 @@ GEM mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) mini_mime (1.1.5) - mini_portile2 (2.8.5) + mini_portile2 (2.8.6) minitest (5.22.3) msgpack (1.7.2) multi_json (1.15.0) - multipart-post (2.3.0) + multipart-post (2.4.0) mutex_m (0.2.0) net-http (0.4.1) uri @@ -453,7 +450,7 @@ GEM net-protocol net-protocol (0.2.2) timeout - net-smtp (0.4.0.1) + net-smtp (0.5.0) net-protocol nio4r (2.7.1) nokogiri (1.16.4) @@ -546,7 +543,7 @@ GEM rack-protection (3.2.0) base64 (>= 0.1.0) rack (~> 2.2, >= 2.2.4) - rack-proxy (0.7.6) + rack-proxy (0.7.7) rack rack-session (1.0.2) rack (< 3) @@ -592,7 +589,7 @@ GEM thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) rdf (3.3.1) bcp47_spec (~> 0.2) link_header (~> 0.0, >= 0.0.8) @@ -607,9 +604,9 @@ GEM redlock (1.3.2) redis (>= 3.0.0, < 6.0) regexp_parser (2.9.0) - reline (0.5.1) + reline (0.5.2) io-console (~> 0.5) - request_store (1.5.1) + request_store (1.6.0) rack (>= 1.4) responders (3.1.1) actionpack (>= 5.2) @@ -676,11 +673,11 @@ GEM rubocop-capybara (~> 2.17) rubocop-factory_bot (~> 2.22) rubocop-rspec_rails (~> 2.28) - rubocop-rspec_rails (2.28.2) + rubocop-rspec_rails (2.28.3) rubocop (~> 1.40) ruby-prof (1.7.0) ruby-progressbar (1.13.0) - ruby-saml (1.15.0) + ruby-saml (1.16.0) nokogiri (>= 1.13.10) rexml ruby2_keywords (0.0.5) @@ -747,7 +744,7 @@ GEM unicode-display_width (>= 1.1.1, < 3) terrapin (1.0.1) climate_control - test-prof (1.3.2) + test-prof (1.3.3) thor (1.3.1) tilt (2.3.0) timeout (0.4.1) @@ -776,7 +773,7 @@ GEM unf_ext unf_ext (0.0.9.1) unicode-display_width (2.5.0) - uri (0.12.2) + uri (0.13.0) validate_email (0.1.6) activemodel (>= 3.0) mail (>= 2.2.5) @@ -848,7 +845,7 @@ DEPENDENCIES devise_pam_authenticatable2 (~> 9.2) discard (~> 1.2) doorkeeper (~> 5.6) - dotenv-rails (~> 2.8) + dotenv ed25519 (~> 1.3) email_spec fabrication (~> 2.30) diff --git a/config/application.rb b/config/application.rb index bab1b46cb0..a17a48b093 100644 --- a/config/application.rb +++ b/config/application.rb @@ -52,7 +52,7 @@ require_relative '../lib/active_record/batches' require_relative '../lib/simple_navigation/item_extensions' require_relative '../lib/http_extensions' -Dotenv::Railtie.load +Dotenv::Rails.load Bundler.require(:pam_authentication) if ENV['PAM_ENABLED'] == 'true' diff --git a/config/deploy.rb b/config/deploy.rb deleted file mode 100644 index 75bfcc26f4..0000000000 --- a/config/deploy.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -lock '3.17.2' - -set :repo_url, ENV.fetch('REPO', 'https://github.com/mastodon/mastodon.git') -set :branch, ENV.fetch('BRANCH', 'main') - -set :application, 'mastodon' -set :rbenv_type, :user -set :rbenv_ruby, File.read('.ruby-version').strip -set :migration_role, :app - -append :linked_files, '.env.production', 'public/robots.txt' -append :linked_dirs, 'vendor/bundle', 'node_modules', 'public/system' - -SYSTEMD_SERVICES = %i[sidekiq streaming web].freeze -SERVICE_ACTIONS = %i[reload restart status].freeze - -namespace :systemd do - SYSTEMD_SERVICES.each do |service| - SERVICE_ACTIONS.each do |action| - desc "Perform a #{action} on #{service} service" - task :"#{service}:#{action}" do - on roles(:app) do - # runs e.g. "sudo restart mastodon-sidekiq.service" - sudo :systemctl, action, "#{fetch(:application)}-#{service}.service" - end - end - end - end -end - -after 'deploy:publishing', 'systemd:web:reload' -after 'deploy:publishing', 'systemd:sidekiq:restart' -after 'deploy:publishing', 'systemd:streaming:restart' diff --git a/config/environments/production.rb b/config/environments/production.rb index 005b5f43d9..4a75eb27ca 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require "active_support/core_ext/integer/time" +require 'active_support/core_ext/integer/time' Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. @@ -44,8 +44,8 @@ Rails.application.configure do config.force_ssl = true config.ssl_options = { redirect: { - exclude: ->(request) { request.path.start_with?('/health') || request.headers["Host"].end_with?('.onion') || request.headers["Host"].end_with?('.i2p') } - } + exclude: ->(request) { request.path.start_with?('/health') || request.headers['Host'].end_with?('.onion') || request.headers['Host'].end_with?('.i2p') }, + }, } # Info include generic and useful information about system operation, but avoids logging too much diff --git a/config/environments/test.rb b/config/environments/test.rb index 0b2f57fba7..13e1973380 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -88,7 +88,7 @@ if ENV['PAM_ENABLED'] == 'true' usernames: Set['pam_user1', 'pam_user2'], servicenames: Set['pam_test', 'pam_test_controlled'], password: '123456', - env: { email: 'pam@example.com' } + env: { email: 'pam@example.com' }, } end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb index 74f30e8875..d43cc1d2fe 100644 --- a/config/initializers/backtrace_silencers.rb +++ b/config/initializers/backtrace_silencers.rb @@ -7,4 +7,4 @@ # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code # by setting BACKTRACE=1 before calling your invocation, like "BACKTRACE=1 ./bin/rails runner 'MyClass.perform'". -Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"] +Rails.backtrace_cleaner.remove_silencers! if ENV['BACKTRACE'] diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index f9d47a205c..428e473913 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -150,7 +150,7 @@ Doorkeeper.configure do # # You can use this option in order to forbid URI's with 'javascript' scheme # for example. - forbid_redirect_uri { |uri| %w[data vbscript javascript].include?(uri.scheme.to_s.downcase) } + forbid_redirect_uri { |uri| %w(data vbscript javascript).include?(uri.scheme.to_s.downcase) } # Specify what grant flows are enabled in array of Strings. The valid # strings and the flows they enable are: diff --git a/config/initializers/http_client_proxy.rb b/config/initializers/http_client_proxy.rb index 7332ffb53b..93a8d33ff9 100644 --- a/config/initializers/http_client_proxy.rb +++ b/config/initializers/http_client_proxy.rb @@ -7,7 +7,7 @@ Rails.application.configure do proxy = URI.parse(ENV['http_proxy']) raise "Unsupported proxy type: #{proxy.scheme}" unless %w(http https).include? proxy.scheme - raise "No proxy host" unless proxy.host + raise 'No proxy host' unless proxy.host host = proxy.host host = host[1...-1] if host[0] == '[' # for IPv6 address @@ -24,7 +24,7 @@ Rails.application.configure do proxy = URI.parse(ENV['http_hidden_proxy']) raise "Unsupported proxy type: #{proxy.scheme}" unless %w(http https).include? proxy.scheme - raise "No proxy host" unless proxy.host + raise 'No proxy host' unless proxy.host host = proxy.host host = host[1...-1] if host[0] == '[' # for IPv6 address diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb index a44c2ab847..b54fc6cf0c 100644 --- a/config/initializers/paperclip.rb +++ b/config/initializers/paperclip.rb @@ -73,7 +73,7 @@ if ENV['S3_ENABLED'] == 'true' if ENV.has_key?('S3_ENDPOINT') Paperclip::Attachment.default_options[:s3_options].merge!( endpoint: ENV['S3_ENDPOINT'], - force_path_style: ENV['S3_OVERRIDE_PATH_STYLE'] != 'true', + force_path_style: ENV['S3_OVERRIDE_PATH_STYLE'] != 'true' ) Paperclip::Attachment.default_options[:url] = ':s3_path_url' @@ -159,7 +159,7 @@ else Paperclip::Attachment.default_options.merge!( storage: :filesystem, path: File.join(ENV.fetch('PAPERCLIP_ROOT_PATH', File.join(':rails_root', 'public', 'system')), ':prefix_path:class', ':attachment', ':id_partition', ':style', ':filename'), - url: ENV.fetch('PAPERCLIP_ROOT_URL', '/system') + '/:prefix_url:class/:attachment/:id_partition/:style/:filename', + url: ENV.fetch('PAPERCLIP_ROOT_URL', '/system') + '/:prefix_url:class/:attachment/:id_partition/:style/:filename' ) end diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb index 429dbd3248..fa1bdca544 100644 --- a/config/initializers/rack_attack.rb +++ b/config/initializers/rack_attack.rb @@ -14,7 +14,7 @@ class Rack::Attack end def remote_ip - @remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s + @remote_ip ||= (@env['action_dispatch.remote_ip'] || ip).to_s end def throttleable_remote_ip diff --git a/config/initializers/webauthn.rb b/config/initializers/webauthn.rb index 924ce6d877..40dfeb8317 100644 --- a/config/initializers/webauthn.rb +++ b/config/initializers/webauthn.rb @@ -6,7 +6,7 @@ WebAuthn.configure do |config| config.origin = "#{Rails.configuration.x.use_https ? 'https' : 'http'}://#{Rails.configuration.x.web_domain}" # Relying Party name for display purposes - config.rp_name = "Mastodon" + config.rp_name = 'Mastodon' # Optionally configure a client timeout hint, in milliseconds. # This hint specifies how long the browser should wait for an diff --git a/config/routes.rb b/config/routes.rb index e198a527d1..b9d4799279 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -140,7 +140,7 @@ Rails.application.routes.draw do resource :inbox, only: [:create], module: :activitypub - get '/:encoded_at(*path)', to: redirect("/@%{path}"), constraints: { encoded_at: /%40/ } + get '/:encoded_at(*path)', to: redirect('/@%{path}'), constraints: { encoded_at: /%40/ } constraints(username: %r{[^@/.]+}) do with_options to: 'accounts#show' do diff --git a/db/migrate/20231018192110_add_index_to_webauthn_credentials_user_id_nickname.rb b/db/migrate/20231018192110_add_index_to_webauthn_credentials_user_id_nickname.rb new file mode 100644 index 0000000000..2e608eeade --- /dev/null +++ b/db/migrate/20231018192110_add_index_to_webauthn_credentials_user_id_nickname.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +class AddIndexToWebauthnCredentialsUserIdNickname < ActiveRecord::Migration[7.0] + disable_ddl_transaction! + + def up + add_index_to_table + rescue ActiveRecord::RecordNotUnique + remove_duplicates_and_reindex + end + + def down + remove_index_from_table + end + + private + + def remove_duplicates_and_reindex + deduplicate_records + reindex_records + rescue ActiveRecord::RecordNotUnique + retry + end + + def reindex_records + remove_index_from_table + add_index_to_table + end + + def add_index_to_table + add_index :webauthn_credentials, [:user_id, :nickname], unique: true, algorithm: :concurrently + end + + def remove_index_from_table + remove_index :webauthn_credentials, [:user_id, :nickname] + end + + def deduplicate_records + safety_assured do + execute <<~SQL.squish + DELETE FROM webauthn_credentials + WHERE id NOT IN ( + SELECT DISTINCT ON(user_id, nickname) id FROM webauthn_credentials + ORDER BY user_id, nickname, id ASC + ) + SQL + end + end +end diff --git a/db/migrate/20231018193209_add_index_to_account_alias_uri_account_id.rb b/db/migrate/20231018193209_add_index_to_account_alias_uri_account_id.rb new file mode 100644 index 0000000000..4d9036fdf8 --- /dev/null +++ b/db/migrate/20231018193209_add_index_to_account_alias_uri_account_id.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +class AddIndexToAccountAliasUriAccountId < ActiveRecord::Migration[7.0] + disable_ddl_transaction! + + def up + add_index_to_table + rescue ActiveRecord::RecordNotUnique + remove_duplicates_and_reindex + end + + def down + remove_index_from_table + end + + private + + def remove_duplicates_and_reindex + deduplicate_records + reindex_records + rescue ActiveRecord::RecordNotUnique + retry + end + + def reindex_records + remove_index_from_table + add_index_to_table + end + + def add_index_to_table + add_index :account_aliases, [:account_id, :uri], unique: true, algorithm: :concurrently + end + + def remove_index_from_table + remove_index :account_aliases, [:account_id, :uri] + end + + def deduplicate_records + safety_assured do + execute <<~SQL.squish + DELETE FROM account_aliases + WHERE id NOT IN ( + SELECT DISTINCT ON(account_id, uri) id FROM account_aliases + ORDER BY account_id, uri, id ASC + ) + SQL + end + end +end diff --git a/db/migrate/20231018193355_add_index_to_custom_filter_statuses_status_custom_filter.rb b/db/migrate/20231018193355_add_index_to_custom_filter_statuses_status_custom_filter.rb new file mode 100644 index 0000000000..4a23a8a943 --- /dev/null +++ b/db/migrate/20231018193355_add_index_to_custom_filter_statuses_status_custom_filter.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +class AddIndexToCustomFilterStatusesStatusCustomFilter < ActiveRecord::Migration[7.0] + disable_ddl_transaction! + + def up + add_index_to_table + rescue ActiveRecord::RecordNotUnique + remove_duplicates_and_reindex + end + + def down + remove_index_from_table + end + + private + + def remove_duplicates_and_reindex + deduplicate_records + reindex_records + rescue ActiveRecord::RecordNotUnique + retry + end + + def reindex_records + remove_index_from_table + add_index_to_table + end + + def add_index_to_table + add_index :custom_filter_statuses, [:status_id, :custom_filter_id], unique: true, algorithm: :concurrently + end + + def remove_index_from_table + remove_index :custom_filter_statuses, [:status_id, :custom_filter_id] + end + + def deduplicate_records + safety_assured do + execute <<~SQL.squish + DELETE FROM custom_filter_statuses + WHERE id NOT IN ( + SELECT DISTINCT ON(status_id, custom_filter_id) id FROM custom_filter_statuses + ORDER BY status_id, custom_filter_id, id ASC + ) + SQL + end + end +end diff --git a/db/migrate/20231018193659_add_index_to_identities_uid_provider.rb b/db/migrate/20231018193659_add_index_to_identities_uid_provider.rb new file mode 100644 index 0000000000..f0ba08b57b --- /dev/null +++ b/db/migrate/20231018193659_add_index_to_identities_uid_provider.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +class AddIndexToIdentitiesUidProvider < ActiveRecord::Migration[7.0] + disable_ddl_transaction! + + def up + add_index_to_table + rescue ActiveRecord::RecordNotUnique + remove_duplicates_and_reindex + end + + def down + remove_index_from_table + end + + private + + def remove_duplicates_and_reindex + deduplicate_records + reindex_records + rescue ActiveRecord::RecordNotUnique + retry + end + + def reindex_records + remove_index_from_table + add_index_to_table + end + + def add_index_to_table + add_index :identities, [:uid, :provider], unique: true, algorithm: :concurrently + end + + def remove_index_from_table + remove_index :identities, [:uid, :provider] + end + + def deduplicate_records + safety_assured do + execute <<~SQL.squish + DELETE FROM identities + WHERE id NOT IN ( + SELECT DISTINCT ON(uid, provider) id FROM identities + ORDER BY uid, provider, id ASC + ) + SQL + end + end +end diff --git a/db/schema.rb b/db/schema.rb index f262cd21c9..c39da8e099 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -20,6 +20,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do t.string "uri", default: "", null: false t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false + t.index ["account_id", "uri"], name: "index_account_aliases_on_account_id_and_uri", unique: true t.index ["account_id"], name: "index_account_aliases_on_account_id" end @@ -395,6 +396,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["custom_filter_id"], name: "index_custom_filter_statuses_on_custom_filter_id" + t.index ["status_id", "custom_filter_id"], name: "index_custom_filter_statuses_on_status_id_and_custom_filter_id", unique: true t.index ["status_id"], name: "index_custom_filter_statuses_on_status_id" end @@ -545,6 +547,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false t.bigint "user_id" + t.index ["uid", "provider"], name: "index_identities_on_uid_and_provider", unique: true t.index ["user_id"], name: "index_identities_on_user_id" end @@ -1238,6 +1241,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false t.index ["external_id"], name: "index_webauthn_credentials_on_external_id", unique: true + t.index ["user_id", "nickname"], name: "index_webauthn_credentials_on_user_id_and_nickname", unique: true t.index ["user_id"], name: "index_webauthn_credentials_on_user_id" end diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake index 6afc013ede..0caebf92a1 100644 --- a/lib/tasks/tests.rake +++ b/lib/tasks/tests.rake @@ -8,6 +8,7 @@ namespace :tests do '2' => 2017_10_10_025614, '2_4' => 2018_05_14_140000, '2_4_3' => 2018_07_07_154237, + '3_3_0' => 2020_12_18_054746, }.each do |release, version| ActiveRecord::Tasks::DatabaseTasks .migration_connection @@ -111,9 +112,41 @@ namespace :tests do exit(1) end + unless Identity.where(provider: 'foo', uid: 0).count == 1 + puts 'Identities not deduplicated as expected' + exit(1) + end + + unless WebauthnCredential.where(user_id: 1, nickname: 'foo').count == 1 + puts 'Webauthn credentials not deduplicated as expected' + exit(1) + end + + unless AccountAlias.where(account_id: 1, uri: 'https://example.com/users/foobar').count == 1 + puts 'Account aliases not deduplicated as expected' + exit(1) + end + puts 'No errors found. Database state is consistent with a successful migration process.' end + desc 'Populate the database with test data for 3.3.0' + task populate_v3_3_0: :environment do # rubocop:disable Naming/VariableNumber + ActiveRecord::Base.connection.execute(<<~SQL.squish) + INSERT INTO "webauthn_credentials" + (user_id, nickname, external_id, public_key, created_at, updated_at) + VALUES + (1, 'foo', 1, 'foo', now(), now()), + (1, 'foo', 2, 'bar', now(), now()); + + INSERT INTO "account_aliases" + (account_id, uri, acct, created_at, updated_at) + VALUES + (1, 'https://example.com/users/foobar', 'foobar@example.com', now(), now()), + (1, 'https://example.com/users/foobar', 'foobar@example.com', now(), now()); + SQL + end + desc 'Populate the database with test data for 2.4.3' task populate_v2_4_3: :environment do # rubocop:disable Naming/VariableNumber user_key = OpenSSL::PKey::RSA.new(2048) @@ -189,6 +222,12 @@ namespace :tests do VALUES (5, 'User', 4, 'default_language', E'--- kmr\n', now(), now()), (6, 'User', 1, 'interactions', E'--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess\nmust_be_follower: false\nmust_be_following: true\nmust_be_following_dm: false\n', now(), now()); + + INSERT INTO "identities" + (provider, uid, user_id, created_at, updated_at) + VALUES + ('foo', 0, 1, now(), now()), + ('foo', 0, 1, now(), now()); SQL end diff --git a/spec/services/remove_featured_tag_service_spec.rb b/spec/services/remove_featured_tag_service_spec.rb index 6cf5388c7f..2f0694bc65 100644 --- a/spec/services/remove_featured_tag_service_spec.rb +++ b/spec/services/remove_featured_tag_service_spec.rb @@ -29,7 +29,7 @@ RSpec.describe RemoveFeaturedTagService do expect { featured_tag.reload } .to raise_error(ActiveRecord::RecordNotFound) expect(ActivityPub::AccountRawDistributionWorker) - .to_not have_enqueued_sidekiq_job + .to_not have_enqueued_sidekiq_job(any_args) end end end diff --git a/spec/services/update_status_service_spec.rb b/spec/services/update_status_service_spec.rb index 930f673e10..47be53f4fc 100644 --- a/spec/services/update_status_service_spec.rb +++ b/spec/services/update_status_service_spec.rb @@ -40,7 +40,7 @@ RSpec.describe UpdateStatusService do end it 'saves edit history' do - expect(status.edits.pluck(:text)).to eq %w(Foo Bar) + expect(status.edits.ordered.pluck(:text)).to eq %w(Foo Bar) end end @@ -58,7 +58,7 @@ RSpec.describe UpdateStatusService do end it 'saves edit history' do - expect(status.edits.pluck(:text, :spoiler_text)).to eq [['Foo', ''], ['Foo', 'Bar']] + expect(status.edits.ordered.pluck(:text, :spoiler_text)).to eq [['Foo', ''], ['Foo', 'Bar']] end end @@ -85,7 +85,7 @@ RSpec.describe UpdateStatusService do end it 'saves edit history' do - expect(status.edits.pluck(:ordered_media_attachment_ids)).to eq [[detached_media_attachment.id], [attached_media_attachment.id]] + expect(status.edits.ordered.pluck(:ordered_media_attachment_ids)).to eq [[detached_media_attachment.id], [attached_media_attachment.id]] end end @@ -107,7 +107,7 @@ RSpec.describe UpdateStatusService do end it 'saves edit history' do - expect(status.edits.map { |edit| edit.ordered_media_attachments.map(&:description) }).to eq [['Old description'], ['New description']] + expect(status.edits.ordered.map { |edit| edit.ordered_media_attachments.map(&:description) }).to eq [['Old description'], ['New description']] end end @@ -136,7 +136,7 @@ RSpec.describe UpdateStatusService do end it 'saves edit history' do - expect(status.edits.pluck(:poll_options)).to eq [%w(Foo Bar), %w(Bar Baz Foo)] + expect(status.edits.ordered.pluck(:poll_options)).to eq [%w(Foo Bar), %w(Bar Baz Foo)] end it 'requeues expiration notification' do diff --git a/yarn.lock b/yarn.lock index 12363780c9..efdaa0b2ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1561,10 +1561,10 @@ __metadata: languageName: node linkType: hard -"@csstools/color-helpers@npm:^4.1.0": - version: 4.1.0 - resolution: "@csstools/color-helpers@npm:4.1.0" - checksum: 10c0/0e41fd04dd28361717b161e7000c3a3b64b8b01119e93758297ea0b8a87c04121c3e3ef02e29c56fdd133227dd879163aa4b52e2370853d9fe64af6b6821668d +"@csstools/color-helpers@npm:^4.2.0": + version: 4.2.0 + resolution: "@csstools/color-helpers@npm:4.2.0" + checksum: 10c0/3f1feac43c2ef35f38b3b06fe74e0acc130283d7efb6874f6624e45e178c1a7b3c7e39816c7421cddbffc2666430906aa6f0d3dd7c7209db1369c0afd4a29b1b languageName: node linkType: hard @@ -1578,16 +1578,16 @@ __metadata: languageName: node linkType: hard -"@csstools/css-color-parser@npm:^1.6.3": - version: 1.6.3 - resolution: "@csstools/css-color-parser@npm:1.6.3" +"@csstools/css-color-parser@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/css-color-parser@npm:2.0.0" dependencies: - "@csstools/color-helpers": "npm:^4.1.0" + "@csstools/color-helpers": "npm:^4.2.0" "@csstools/css-calc": "npm:^1.2.0" peerDependencies: "@csstools/css-parser-algorithms": ^2.6.1 "@csstools/css-tokenizer": ^2.2.4 - checksum: 10c0/3b15d9974105fe6e5d5e839953ee06153bc308bd62feacdeb88b7da7486ef1625254d0df908c68654596e477ca6be0c312d0c02a62d6dc4bddee61821be17d27 + checksum: 10c0/295f844a194dec4f51439e8760dbb4a142901b8b60cd9d676a62c15c0e8408eb7bcdcbb40be52cdd5f67d020e655a1c3267a28923cfc4f6bae2b74aa48fce426 languageName: node linkType: hard @@ -1629,33 +1629,33 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-color-function@npm:^3.0.13": - version: 3.0.13 - resolution: "@csstools/postcss-color-function@npm:3.0.13" +"@csstools/postcss-color-function@npm:^3.0.14": + version: 3.0.14 + resolution: "@csstools/postcss-color-function@npm:3.0.14" dependencies: - "@csstools/css-color-parser": "npm:^1.6.3" + "@csstools/css-color-parser": "npm:^2.0.0" "@csstools/css-parser-algorithms": "npm:^2.6.1" "@csstools/css-tokenizer": "npm:^2.2.4" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/9d0fa25cd258653ad3227ccf1ee89dfee7099284c28b1d9ae7f7e8b15ed526e4e8cc7724f8e21cc073ed186891c3acb5b9c190a75e3c38d9c75e49197a824db6 + checksum: 10c0/81592b0eb3ad7022313ecafd028908b167de42acc6765f708c9b10631f86123c2b803aca27378f021c2b3dab8cc47770c0364fe5a3c1e18ec006deaf72e17c38 languageName: node linkType: hard -"@csstools/postcss-color-mix-function@npm:^2.0.13": - version: 2.0.13 - resolution: "@csstools/postcss-color-mix-function@npm:2.0.13" +"@csstools/postcss-color-mix-function@npm:^2.0.14": + version: 2.0.14 + resolution: "@csstools/postcss-color-mix-function@npm:2.0.14" dependencies: - "@csstools/css-color-parser": "npm:^1.6.3" + "@csstools/css-color-parser": "npm:^2.0.0" "@csstools/css-parser-algorithms": "npm:^2.6.1" "@csstools/css-tokenizer": "npm:^2.2.4" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/6011ce0b328cd3ee1d5720dc6eb23da807ba5a218a4a3c65a4844a82c0ff37e69d27cbee14abf9b928a3068f429ab86f2dd2bebab4ab64cd8fc7e39e562d7073 + checksum: 10c0/1dd3c63bbbbb9d3094699f169bbb9d26e86a49accb5f9abaa2441b54cb8a6f4cd332409666684a275eca867e3ef0ea3f6eafdf9fb87f2cbfa17c6296fb1ed4d7 languageName: node linkType: hard @@ -1684,46 +1684,46 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-gamut-mapping@npm:^1.0.6": - version: 1.0.6 - resolution: "@csstools/postcss-gamut-mapping@npm:1.0.6" +"@csstools/postcss-gamut-mapping@npm:^1.0.7": + version: 1.0.7 + resolution: "@csstools/postcss-gamut-mapping@npm:1.0.7" dependencies: - "@csstools/css-color-parser": "npm:^1.6.3" + "@csstools/css-color-parser": "npm:^2.0.0" "@csstools/css-parser-algorithms": "npm:^2.6.1" "@csstools/css-tokenizer": "npm:^2.2.4" peerDependencies: postcss: ^8.4 - checksum: 10c0/a258a2ceac9d9be4374ec5b504895bd1de1196fe7d8c1377863a25c6cb50ee1fb1c65387c5440bae3c5d59e6ebf4e0c1990595c5cd09291224b31a1d23bdc250 + checksum: 10c0/7b349db44fcd697d57172ab63b7a02a56c0b49bce17e48cb72aa0fa246bd2be83fe693c507fd400a9ed83597a711d18ece9319ee3af8000c8fd3a2761e228a11 languageName: node linkType: hard -"@csstools/postcss-gradients-interpolation-method@npm:^4.0.14": - version: 4.0.14 - resolution: "@csstools/postcss-gradients-interpolation-method@npm:4.0.14" +"@csstools/postcss-gradients-interpolation-method@npm:^4.0.15": + version: 4.0.15 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:4.0.15" dependencies: - "@csstools/css-color-parser": "npm:^1.6.3" + "@csstools/css-color-parser": "npm:^2.0.0" "@csstools/css-parser-algorithms": "npm:^2.6.1" "@csstools/css-tokenizer": "npm:^2.2.4" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/88147b2d7067b9bc6c90340c0be8450ca1175a7e927ff7b682c26d377237bec12f1cbe0dd930dd72dec661603348d1e71ca2a56f0a3b6fa2ca7d3f1b962f001d + checksum: 10c0/dc0bbf6a4787d5ad3f9fe268dfa9776ecdc25b6cc0a49486bf53238341a339647f1e475240ead3cec1f4af9a237f6518ace015103e90ce8afe4d44539a566e04 languageName: node linkType: hard -"@csstools/postcss-hwb-function@npm:^3.0.12": - version: 3.0.12 - resolution: "@csstools/postcss-hwb-function@npm:3.0.12" +"@csstools/postcss-hwb-function@npm:^3.0.13": + version: 3.0.13 + resolution: "@csstools/postcss-hwb-function@npm:3.0.13" dependencies: - "@csstools/css-color-parser": "npm:^1.6.3" + "@csstools/css-color-parser": "npm:^2.0.0" "@csstools/css-parser-algorithms": "npm:^2.6.1" "@csstools/css-tokenizer": "npm:^2.2.4" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/20e0b2a4547fe619f38fe56c33974750d4a8b64a67a4169740ee0e67a9dec9f3a243f2370408901aacc35690aa36135028fafbbc866ff934b66cc4c9e4e89cac + checksum: 10c0/684c3d408ceb027e7276c4f25c9a17ef9bd52f0948268cf58b5184097e9b71f5364a41b42bab44691938c6fadffcba0c8e66f809a339a8b282f4a432d32d00ef languageName: node linkType: hard @@ -1875,18 +1875,18 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-oklab-function@npm:^3.0.13": - version: 3.0.13 - resolution: "@csstools/postcss-oklab-function@npm:3.0.13" +"@csstools/postcss-oklab-function@npm:^3.0.14": + version: 3.0.14 + resolution: "@csstools/postcss-oklab-function@npm:3.0.14" dependencies: - "@csstools/css-color-parser": "npm:^1.6.3" + "@csstools/css-color-parser": "npm:^2.0.0" "@csstools/css-parser-algorithms": "npm:^2.6.1" "@csstools/css-tokenizer": "npm:^2.2.4" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/26915f65ccc8b631a08542c4b088f9e5155f95a6c1f3a6bd2a33207f96d33438b930de60f493a5bbfee1b9f2abc8dfcab3ecbf20b5c7445d729fc434234fb046 + checksum: 10c0/dfe0b12c2256dded995c64825fac9507be9c747d776cfa09eeefff6dee0efa5eed6a92a1ecba39069a751a7fc3cefa8891c34209a7a3c7ea33d356c95d01a02d languageName: node linkType: hard @@ -1901,18 +1901,18 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-relative-color-syntax@npm:^2.0.13": - version: 2.0.13 - resolution: "@csstools/postcss-relative-color-syntax@npm:2.0.13" +"@csstools/postcss-relative-color-syntax@npm:^2.0.14": + version: 2.0.14 + resolution: "@csstools/postcss-relative-color-syntax@npm:2.0.14" dependencies: - "@csstools/css-color-parser": "npm:^1.6.3" + "@csstools/css-color-parser": "npm:^2.0.0" "@csstools/css-parser-algorithms": "npm:^2.6.1" "@csstools/css-tokenizer": "npm:^2.2.4" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/5c9fdec029e3d9a5c688d2e04995fec0cf6d91b48dbc5f450cf9c9dbb45e2819afbd63b3279676087a13f54914b0ec7d005e478b70b43e94fc8eeef9c5973390 + checksum: 10c0/64cd5f8054e4403f4e25ed11a5b9d157098af639dbc30ac25b94660b3af489c0bacc49fc439cba1ccceefa4caa5831a913e3d1d889a9796cc6fbf3902c7c31c1 languageName: node linkType: hard @@ -1940,15 +1940,15 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-text-decoration-shorthand@npm:^3.0.5": - version: 3.0.5 - resolution: "@csstools/postcss-text-decoration-shorthand@npm:3.0.5" +"@csstools/postcss-text-decoration-shorthand@npm:^3.0.6": + version: 3.0.6 + resolution: "@csstools/postcss-text-decoration-shorthand@npm:3.0.6" dependencies: - "@csstools/color-helpers": "npm:^4.1.0" + "@csstools/color-helpers": "npm:^4.2.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/e7e08c643c7084e60c0b22982e00ce21c579af3810ebbebac6838801b2ac622026ce96fd0cbca785613b1559f2337833cfc0f525685f8543ee39078a32fd7f89 + checksum: 10c0/5abdc4fad1c3f15e9d47c7af3995dec9cdf4e6f87c5857eb2e149764779b8389f4f4b21d11e6f2509c57c554a0dc5c11f68f212acd04bbc47defa15911ac3eb9 languageName: node linkType: hard @@ -2154,7 +2154,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": version: 4.10.0 resolution: "@eslint-community/regexpp@npm:4.10.0" checksum: 10c0/c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 @@ -3622,10 +3622,10 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8": - version: 7.0.14 - resolution: "@types/json-schema@npm:7.0.14" - checksum: 10c0/da68689ccd44cb93ca4c9a4af3b25c6091ecf45fb370d1ed0d0ac5b780e235bf0b9bdc1f7e28f19e6713b22567c3db11fefcbcc6d48ac6b356d035a8f9f4ea30 +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db languageName: node linkType: hard @@ -3865,12 +3865,12 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7": - version: 18.2.78 - resolution: "@types/react@npm:18.2.78" + version: 18.2.79 + resolution: "@types/react@npm:18.2.79" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/5eb8e1dd98c29aeddf40b90f466d1a9ce83b113d42a096633d632b834e7ae9821f24ba7999928de9d98cca37764532a7ea35355a8103a377d8baa750f1841b5c + checksum: 10c0/c8a8a005d8830a48cc1ef93c3510c4935a2a03e5557dbecaa8f1038450cbfcb18eb206fa7fba7077d54b8da21faeb25577e897a333392770a7797f625b62c78a languageName: node linkType: hard @@ -3900,10 +3900,10 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.5.0": - version: 7.5.4 - resolution: "@types/semver@npm:7.5.4" - checksum: 10c0/dee66a71d9f089c118be74b5937d4fef42864d68d9472a3f4f5399b9e3ad74d56a8e155020c846667b9ecf9de78fdb9ea55a53fff5067af28e06779b282b6c40 +"@types/semver@npm:^7.5.0, @types/semver@npm:^7.5.8": + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: 10c0/8663ff927234d1c5fcc04b33062cb2b9fcfbe0f5f351ed26c4d1e1581657deebd506b41ff7fdf89e787e3d33ce05854bc01686379b89e9c49b564c4cfa988efa languageName: node linkType: hard @@ -4044,45 +4044,45 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^7.0.0": - version: 7.5.0 - resolution: "@typescript-eslint/eslint-plugin@npm:7.5.0" + version: 7.7.0 + resolution: "@typescript-eslint/eslint-plugin@npm:7.7.0" dependencies: - "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:7.5.0" - "@typescript-eslint/type-utils": "npm:7.5.0" - "@typescript-eslint/utils": "npm:7.5.0" - "@typescript-eslint/visitor-keys": "npm:7.5.0" + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:7.7.0" + "@typescript-eslint/type-utils": "npm:7.7.0" + "@typescript-eslint/utils": "npm:7.7.0" + "@typescript-eslint/visitor-keys": "npm:7.7.0" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.4" + ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^1.3.0" peerDependencies: "@typescript-eslint/parser": ^7.0.0 eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/932a7b5a09c0138ef5a0bf00f8e6039fa209d4047092ffc187de048543c21f7ce24dc14f25f4c87b6f3bbb62335fc952e259e271fde88baf793217bde6460cfa + checksum: 10c0/d1f4c40523d284bce4b8272750c68aae5c0289ddb1c9267dd3477e0bfb8c8855bfb0c6e86dfec9911ca8302ef729d5f4e47d686a566f363b0f89bf7dc7670b5c languageName: node linkType: hard "@typescript-eslint/parser@npm:^7.0.0": - version: 7.5.0 - resolution: "@typescript-eslint/parser@npm:7.5.0" + version: 7.7.0 + resolution: "@typescript-eslint/parser@npm:7.7.0" dependencies: - "@typescript-eslint/scope-manager": "npm:7.5.0" - "@typescript-eslint/types": "npm:7.5.0" - "@typescript-eslint/typescript-estree": "npm:7.5.0" - "@typescript-eslint/visitor-keys": "npm:7.5.0" + "@typescript-eslint/scope-manager": "npm:7.7.0" + "@typescript-eslint/types": "npm:7.7.0" + "@typescript-eslint/typescript-estree": "npm:7.7.0" + "@typescript-eslint/visitor-keys": "npm:7.7.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/65521202ff024e79594272fbb7e4731ecf9d2fdd2f58fc81450bfd2bca94ce9c17b0eadd7338c01701f5cf16d38b6c025ed3fc322380b1e4b5424b7484098cda + checksum: 10c0/d756c2292737499a93913647af7493aded5dc720a5f4ab6f8e96d6cc81f19cf6a1769a1df0f516f8facd276d34f8464f1711e57b0216082e32eb6b75da81b12e languageName: node linkType: hard @@ -4096,30 +4096,30 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/scope-manager@npm:7.5.0" +"@typescript-eslint/scope-manager@npm:7.7.0": + version: 7.7.0 + resolution: "@typescript-eslint/scope-manager@npm:7.7.0" dependencies: - "@typescript-eslint/types": "npm:7.5.0" - "@typescript-eslint/visitor-keys": "npm:7.5.0" - checksum: 10c0/a017b151a6b39ef591f8e2e65598e005e1b4b2d5494e4b91bddb5856b3a4d57dd8a58d2bc7a140e627eb574f93a2c8fe55f1307aa264c928ffd31d9e190bc5dd + "@typescript-eslint/types": "npm:7.7.0" + "@typescript-eslint/visitor-keys": "npm:7.7.0" + checksum: 10c0/014a3631c12bfbd5e33146a48e4b9eb5cc1c5c95bb458de33f8847eed33c04d7b9e66283971e48297673c4b92c3239d67e6dc3717efbe5836e0269a538c13d2e languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/type-utils@npm:7.5.0" +"@typescript-eslint/type-utils@npm:7.7.0": + version: 7.7.0 + resolution: "@typescript-eslint/type-utils@npm:7.7.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.5.0" - "@typescript-eslint/utils": "npm:7.5.0" + "@typescript-eslint/typescript-estree": "npm:7.7.0" + "@typescript-eslint/utils": "npm:7.7.0" debug: "npm:^4.3.4" - ts-api-utils: "npm:^1.0.1" + ts-api-utils: "npm:^1.3.0" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/12915d4d1872638f5281e222a0d191676c478f250699c84864862e95a59e708222acefbf7ffdafc0872a007261219a3a2b1e667ff45eeafea7c4bcc5b955262c + checksum: 10c0/064c28d4087a97fd175e07e02c0a9cf4526f61cc6a17b4199fba626932979210037643a30f868bda8174fad567a8ac6aed34120631d1ecfd502e0ea1e830f9e9 languageName: node linkType: hard @@ -4130,10 +4130,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/types@npm:7.5.0" - checksum: 10c0/f3394f71f422dbd89f63b230f20e9769c12e47a287ff30ca03a80714e57ea21279b6f12a8ab14bafb00b59926f20a88894b2d1e72679f7ff298bae112679d4b3 +"@typescript-eslint/types@npm:7.7.0": + version: 7.7.0 + resolution: "@typescript-eslint/types@npm:7.7.0" + checksum: 10c0/eb50793650c9a911c73586150807912e7b7a0ae12eeb26c7a322ac8ebb8edef15960cc9a4b7049dbb89b82500079963145f67d15583f5de270fe8290974db533 languageName: node linkType: hard @@ -4156,39 +4156,39 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.5.0" +"@typescript-eslint/typescript-estree@npm:7.7.0": + version: 7.7.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.7.0" dependencies: - "@typescript-eslint/types": "npm:7.5.0" - "@typescript-eslint/visitor-keys": "npm:7.5.0" + "@typescript-eslint/types": "npm:7.7.0" + "@typescript-eslint/visitor-keys": "npm:7.7.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" - minimatch: "npm:9.0.3" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^1.3.0" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/ea3a270c725d6be273188b86110e0393052cd64d1c54a56eb5ea405e6d3fbbe84fb3b1ce1b8496a4078ac1eefd37aedcf12be91876764f6de31d5aa5131c7bcd + checksum: 10c0/19da9bf0948c9800fde19c5a408a80a3a4cf357ff67d47b516df5d2a05701a4fdd2b9ab5b692866bd84bfc17cea9132d1575a1423e01763a4c2918b5d77d0b34 languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/utils@npm:7.5.0" +"@typescript-eslint/utils@npm:7.7.0": + version: 7.7.0 + resolution: "@typescript-eslint/utils@npm:7.7.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@types/json-schema": "npm:^7.0.12" - "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:7.5.0" - "@typescript-eslint/types": "npm:7.5.0" - "@typescript-eslint/typescript-estree": "npm:7.5.0" - semver: "npm:^7.5.4" + "@types/json-schema": "npm:^7.0.15" + "@types/semver": "npm:^7.5.8" + "@typescript-eslint/scope-manager": "npm:7.7.0" + "@typescript-eslint/types": "npm:7.7.0" + "@typescript-eslint/typescript-estree": "npm:7.7.0" + semver: "npm:^7.6.0" peerDependencies: eslint: ^8.56.0 - checksum: 10c0/c815ed6909769648953d6963c069038f7cac0c979051b25718feb30e0d3337b9647b75b8de00ac03fe960f0cc8dc4e8a81d4aac4719090a99785e0068712bd24 + checksum: 10c0/c5f18ce198b420bdc201fd4278b4fa97bfe86178db565f3c4e1991bb452c9ea0b657e7980572555e2ec2fe218d07c42c794d217b9369903019cf784eea7e2164 languageName: node linkType: hard @@ -4219,13 +4219,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.5.0": - version: 7.5.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.5.0" +"@typescript-eslint/visitor-keys@npm:7.7.0": + version: 7.7.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.7.0" dependencies: - "@typescript-eslint/types": "npm:7.5.0" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/eecf02b8dd54e83738a143aca87b902af4b357028a90fd34ed7a2f40a3ae2f6a188b9ba53903f23c80e868f1fffbb039e9ddb63525438d659707cc7bfb269317 + "@typescript-eslint/types": "npm:7.7.0" + eslint-visitor-keys: "npm:^3.4.3" + checksum: 10c0/0f3b9720a962c04462a75d4872714c07320c8f672841881ada797ae960f9f6bd0e5f7494178917034f42635ef76f0f09fa3c8d4bd84f31ec58ee968fe75bada7 languageName: node linkType: hard @@ -9421,7 +9421,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": +"ignore@npm:^5.2.0, ignore@npm:^5.3.1": version: 5.3.1 resolution: "ignore@npm:5.3.1" checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd @@ -11785,7 +11785,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:9.0.3, minimatch@npm:^9.0.1": +"minimatch@npm:9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" dependencies: @@ -11812,6 +11812,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.1, minimatch@npm:^9.0.4": + version: 9.0.4 + resolution: "minimatch@npm:9.0.4" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414 + languageName: node + linkType: hard + "minimist@npm:^1.2.0, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -13093,18 +13102,18 @@ __metadata: languageName: node linkType: hard -"postcss-color-functional-notation@npm:^6.0.8": - version: 6.0.8 - resolution: "postcss-color-functional-notation@npm:6.0.8" +"postcss-color-functional-notation@npm:^6.0.9": + version: 6.0.9 + resolution: "postcss-color-functional-notation@npm:6.0.9" dependencies: - "@csstools/css-color-parser": "npm:^1.6.3" + "@csstools/css-color-parser": "npm:^2.0.0" "@csstools/css-parser-algorithms": "npm:^2.6.1" "@csstools/css-tokenizer": "npm:^2.2.4" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/ae2ff7769970fb403ea71d5613e041d97bb647cfc54e4a428bcc75f98ff06c888b064384df12b18f609bfcc4395c31d6db4ad2b9c9385a829ba594d2692c31d1 + checksum: 10c0/120f7bc23bf46dd1c008b3aa806fb02dd988ae180f9c0c10dca9f5ea3473bf20d7743aafae1441df5b4a3945a63ebb0dae1d4d55f7c8bcd34540529b627c4e3e languageName: node linkType: hard @@ -13313,18 +13322,18 @@ __metadata: languageName: node linkType: hard -"postcss-lab-function@npm:^6.0.13": - version: 6.0.13 - resolution: "postcss-lab-function@npm:6.0.13" +"postcss-lab-function@npm:^6.0.14": + version: 6.0.14 + resolution: "postcss-lab-function@npm:6.0.14" dependencies: - "@csstools/css-color-parser": "npm:^1.6.3" + "@csstools/css-color-parser": "npm:^2.0.0" "@csstools/css-parser-algorithms": "npm:^2.6.1" "@csstools/css-tokenizer": "npm:^2.2.4" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" "@csstools/utilities": "npm:^1.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/3ffb82d0012e49df49b44f38a131f4b13ba3edeeca5ecc0062c1c1b6bd8961c06f05b1dd8ec620c50c2c406fc61a505d79488745185d69ed325603600f0a1bc8 + checksum: 10c0/0b5d998ddb98ec6243448f1eca216f6e23872431885b152843feef1e844fc5b6b3ebe16ea8940f3d6abea732aa0c51b2ec0e57437e4326e5b2cb2bcb949e6d9f languageName: node linkType: hard @@ -13480,16 +13489,16 @@ __metadata: languageName: node linkType: hard -"postcss-nesting@npm:^12.1.1": - version: 12.1.1 - resolution: "postcss-nesting@npm:12.1.1" +"postcss-nesting@npm:^12.1.2": + version: 12.1.2 + resolution: "postcss-nesting@npm:12.1.2" dependencies: "@csstools/selector-resolve-nested": "npm:^1.1.0" "@csstools/selector-specificity": "npm:^3.0.3" postcss-selector-parser: "npm:^6.0.13" peerDependencies: postcss: ^8.4 - checksum: 10c0/8fac718e69ee2ac93179cc59810a8184581c04715fe34621ec5d504fc680cad4a11219ed0c918cbe15c468994c9aba88e729f35eef698c5d44cadd824425c47d + checksum: 10c0/39d1d100f61863f904393b17169be83cdf82bd50d530efb3e3ae0c7b0f838b254e10e5d12e25119cf31dce9e351a2b770a03f9b2029ff33bef0ec924c0d2f642 languageName: node linkType: hard @@ -13644,17 +13653,17 @@ __metadata: linkType: hard "postcss-preset-env@npm:^9.5.2": - version: 9.5.6 - resolution: "postcss-preset-env@npm:9.5.6" + version: 9.5.8 + resolution: "postcss-preset-env@npm:9.5.8" dependencies: "@csstools/postcss-cascade-layers": "npm:^4.0.4" - "@csstools/postcss-color-function": "npm:^3.0.13" - "@csstools/postcss-color-mix-function": "npm:^2.0.13" + "@csstools/postcss-color-function": "npm:^3.0.14" + "@csstools/postcss-color-mix-function": "npm:^2.0.14" "@csstools/postcss-exponential-functions": "npm:^1.0.5" "@csstools/postcss-font-format-keywords": "npm:^3.0.2" - "@csstools/postcss-gamut-mapping": "npm:^1.0.6" - "@csstools/postcss-gradients-interpolation-method": "npm:^4.0.14" - "@csstools/postcss-hwb-function": "npm:^3.0.12" + "@csstools/postcss-gamut-mapping": "npm:^1.0.7" + "@csstools/postcss-gradients-interpolation-method": "npm:^4.0.15" + "@csstools/postcss-hwb-function": "npm:^3.0.13" "@csstools/postcss-ic-unit": "npm:^3.0.6" "@csstools/postcss-initial": "npm:^1.0.1" "@csstools/postcss-is-pseudo-class": "npm:^4.0.6" @@ -13668,12 +13677,12 @@ __metadata: "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^2.0.7" "@csstools/postcss-nested-calc": "npm:^3.0.2" "@csstools/postcss-normalize-display-values": "npm:^3.0.2" - "@csstools/postcss-oklab-function": "npm:^3.0.13" + "@csstools/postcss-oklab-function": "npm:^3.0.14" "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0" - "@csstools/postcss-relative-color-syntax": "npm:^2.0.13" + "@csstools/postcss-relative-color-syntax": "npm:^2.0.14" "@csstools/postcss-scope-pseudo-class": "npm:^3.0.1" "@csstools/postcss-stepped-value-functions": "npm:^3.0.6" - "@csstools/postcss-text-decoration-shorthand": "npm:^3.0.5" + "@csstools/postcss-text-decoration-shorthand": "npm:^3.0.6" "@csstools/postcss-trigonometric-functions": "npm:^3.0.6" "@csstools/postcss-unset-value": "npm:^3.0.1" autoprefixer: "npm:^10.4.19" @@ -13684,7 +13693,7 @@ __metadata: cssdb: "npm:^8.0.0" postcss-attribute-case-insensitive: "npm:^6.0.3" postcss-clamp: "npm:^4.1.0" - postcss-color-functional-notation: "npm:^6.0.8" + postcss-color-functional-notation: "npm:^6.0.9" postcss-color-hex-alpha: "npm:^9.0.4" postcss-color-rebeccapurple: "npm:^9.0.3" postcss-custom-media: "npm:^10.0.4" @@ -13697,30 +13706,30 @@ __metadata: postcss-font-variant: "npm:^5.0.0" postcss-gap-properties: "npm:^5.0.1" postcss-image-set-function: "npm:^6.0.3" - postcss-lab-function: "npm:^6.0.13" + postcss-lab-function: "npm:^6.0.14" postcss-logical: "npm:^7.0.1" - postcss-nesting: "npm:^12.1.1" + postcss-nesting: "npm:^12.1.2" postcss-opacity-percentage: "npm:^2.0.0" postcss-overflow-shorthand: "npm:^5.0.1" postcss-page-break: "npm:^3.0.4" postcss-place: "npm:^9.0.1" - postcss-pseudo-class-any-link: "npm:^9.0.1" + postcss-pseudo-class-any-link: "npm:^9.0.2" postcss-replace-overflow-wrap: "npm:^4.0.0" postcss-selector-not: "npm:^7.0.2" peerDependencies: postcss: ^8.4 - checksum: 10c0/21738ecac400cca9a96841959308538516ed00ca80d4c53beb20e080c7d963120fa77b7435b02e1beefc20043abce666419b81eccf6dacdc4298f540778c111d + checksum: 10c0/5f77272eb7a938e5bedc3a0877f3fb0cdc6f20c8829730ccafbbd999db78ba4e6ac60f485aa7c292f70e011cf3edfadb7d2cc5459cbf9851abc25139eeb061b7 languageName: node linkType: hard -"postcss-pseudo-class-any-link@npm:^9.0.1": - version: 9.0.1 - resolution: "postcss-pseudo-class-any-link@npm:9.0.1" +"postcss-pseudo-class-any-link@npm:^9.0.2": + version: 9.0.2 + resolution: "postcss-pseudo-class-any-link@npm:9.0.2" dependencies: postcss-selector-parser: "npm:^6.0.13" peerDependencies: postcss: ^8.4 - checksum: 10c0/2d33f486af442a0ee095b7b8875701ed3f54ea3f80d2c4d1c1b35d105088b569c847e1c71fde2adf6cefb4920e8fb7d057ff1ad56e62c65892c7b68e26213b98 + checksum: 10c0/cc2cb455a793b1f5dc0ac290e02296eafb317d9ce987dc9f2102027e22f265299666dbd1e78f1d7836fce549dead73f41e24251c08a2dd0cf482f3cc43cf7909 languageName: node linkType: hard @@ -16885,12 +16894,12 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" +"ts-api-utils@npm:^1.0.1, ts-api-utils@npm:^1.3.0": + version: 1.3.0 + resolution: "ts-api-utils@npm:1.3.0" peerDependencies: typescript: ">=4.2.0" - checksum: 10c0/9408338819c3aca2a709f0bc54e3f874227901506cacb1163612a6c8a43df224174feb965a5eafdae16f66fc68fd7bfee8d3275d0fa73fbb8699e03ed26520c9 + checksum: 10c0/f54a0ba9ed56ce66baea90a3fa087a484002e807f28a8ccb2d070c75e76bde64bd0f6dce98b3802834156306050871b67eec325cb4e918015a360a3f0868c77c languageName: node linkType: hard