~cytrogen/masto-fe

dfc05ec8df1752c53c3f05848169c474e00e02fa — Claire 2 years ago 5ed72f6 + 6273416
Merge commit '6273416292090b2f6bfda33f070cea325a1759df' into glitch-soc/merge-upstream

Conflicts:
- `.github/workflows/build-nightly.yml`:
  Upstream modified this file close to a line modified by glitch-soc to
  disable the ARMv64 builder (as glitch-soc doesn't have one).
  Ported upstream's changes.
- `.github/workflows/build-releases.yml`:
  Upstream modified this file close to lines changed by glitch-soc to
  change the Docker image repositories used (only ghcr, and based on the
  organization's name).
  Ported upstream's changes.
M .github/workflows/build-container-image.yml => .github/workflows/build-container-image.yml +5 -2
@@ 4,6 4,9 @@ on:
      platforms:
        required: true
        type: string
      cache:
        type: boolean
        default: true
      use_native_arm64_builder:
        type: boolean
      push_to_images:


@@ 92,5 95,5 @@ jobs:
          push: ${{ inputs.push_to_images != '' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          cache-from: ${{ inputs.cache && 'type=gha' || '' }}
          cache-to: ${{ inputs.cache && 'type=gha,mode=max' || '' }}

M .github/workflows/build-nightly.yml => .github/workflows/build-nightly.yml +1 -0
@@ 26,6 26,7 @@ jobs:
    with:
      platforms: linux/amd64,linux/arm64
      use_native_arm64_builder: false
      cache: false
      push_to_images: |
        ghcr.io/${{ github.repository_owner }}/mastodon
      version_prerelease: ${{ needs.compute-suffix.outputs.prerelease }}

M .github/workflows/build-releases.yml => .github/workflows/build-releases.yml +2 -0
@@ 16,6 16,8 @@ jobs:
      use_native_arm64_builder: false
      push_to_images: |
        ghcr.io/${{ github.repository_owner }}/mastodon
      # Do not use cache when building releases, so apt update is always ran and the release always contain the latest packages
      cache: false
      # Only tag with latest when ran against the latest stable branch
      # This needs to be updated after each minor version release
      flavor: |

M Dockerfile => Dockerfile +1 -0
@@ 17,6 17,7 @@ COPY Gemfile* package.json yarn.lock /opt/mastodon/

# hadolint ignore=DL3008
RUN apt-get update && \
    apt-get -yq dist-upgrade && \
    apt-get install -y --no-install-recommends build-essential \
        git \
        libicu-dev \

M app/javascript/mastodon/components/dismissable_banner.tsx => app/javascript/mastodon/components/dismissable_banner.tsx +2 -2
@@ 33,8 33,6 @@ export const DismissableBanner: React.FC<PropsWithChildren<Props>> = ({

  return (
    <div className='dismissable-banner'>
      <div className='dismissable-banner__message'>{children}</div>

      <div className='dismissable-banner__action'>
        <IconButton
          icon='times'


@@ 42,6 40,8 @@ export const DismissableBanner: React.FC<PropsWithChildren<Props>> = ({
          onClick={handleDismiss}
        />
      </div>

      <div className='dismissable-banner__message'>{children}</div>
    </div>
  );
};

M app/javascript/styles/mastodon/components.scss => app/javascript/styles/mastodon/components.scss +1 -3
@@ 8941,9 8941,7 @@ noscript {
  }

  &__action {
    position: absolute;
    inset-inline-end: 0;
    top: 0;
    float: right;
    padding: 15px 10px;

    .icon-button {

M app/javascript/styles/mastodon/rtl.scss => app/javascript/styles/mastodon/rtl.scss +7 -0
@@ 58,4 58,11 @@ body.rtl {
  .fa-chevron-right::before {
    content: '\F053';
  }

  .dismissable-banner,
  .warning-banner {
    &__action {
      float: left;
    }
  }
}

M app/lib/activitypub/activity/update.rb => app/lib/activitypub/activity/update.rb +1 -1
@@ 30,6 30,6 @@ class ActivityPub::Activity::Update < ActivityPub::Activity

    return if @status.nil?

    ActivityPub::ProcessStatusUpdateService.new.call(@status, @object, request_id: @options[:request_id])
    ActivityPub::ProcessStatusUpdateService.new.call(@status, @json, @object, request_id: @options[:request_id])
  end
end

M app/models/media_attachment.rb => app/models/media_attachment.rb +1 -1
@@ 407,6 407,6 @@ class MediaAttachment < ApplicationRecord
  end

  def reset_parent_cache
    Rails.cache.delete("statuses/#{status_id}") if status_id.present?
    Rails.cache.delete("v3:statuses/#{status_id}") if status_id.present?
  end
end

M app/models/poll.rb => app/models/poll.rb +1 -1
@@ 108,7 108,7 @@ class Poll < ApplicationRecord
  def reset_parent_cache
    return if status_id.nil?

    Rails.cache.delete("statuses/#{status_id}")
    Rails.cache.delete("v3:statuses/#{status_id}")
  end

  def last_fetched_before_expiration?

M app/models/status_stat.rb => app/models/status_stat.rb +0 -8
@@ 16,8 16,6 @@
class StatusStat < ApplicationRecord
  belongs_to :status, inverse_of: :status_stat

  after_commit :reset_parent_cache

  def replies_count
    [attributes['replies_count'], 0].max
  end


@@ 29,10 27,4 @@ class StatusStat < ApplicationRecord
  def favourites_count
    [attributes['favourites_count'], 0].max
  end

  private

  def reset_parent_cache
    Rails.cache.delete("statuses/#{status_id}")
  end
end

M app/services/activitypub/fetch_remote_poll_service.rb => app/services/activitypub/fetch_remote_poll_service.rb +1 -1
@@ 8,6 8,6 @@ class ActivityPub::FetchRemotePollService < BaseService

    return unless supported_context?(json)

    ActivityPub::ProcessStatusUpdateService.new.call(poll.status, json)
    ActivityPub::ProcessStatusUpdateService.new.call(poll.status, json, json)
  end
end

M app/services/activitypub/process_status_update_service.rb => app/services/activitypub/process_status_update_service.rb +4 -3
@@ 5,10 5,11 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
  include Redisable
  include Lockable

  def call(status, json, request_id: nil)
  def call(status, activity_json, object_json, request_id: nil)
    raise ArgumentError, 'Status has unsaved changes' if status.changed?

    @json                      = json
    @activity_json             = activity_json
    @json                      = object_json
    @status_parser             = ActivityPub::Parser::StatusParser.new(@json)
    @uri                       = @status_parser.uri
    @status                    = status


@@ 306,6 307,6 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
  end

  def forwarder
    @forwarder ||= ActivityPub::Forwarder.new(@account, @json, @status)
    @forwarder ||= ActivityPub::Forwarder.new(@account, @activity_json, @status)
  end
end

M app/services/statuses_search_service.rb => app/services/statuses_search_service.rb +2 -2
@@ 39,12 39,12 @@ class StatusesSearchService < BaseService
    end

    if @options[:min_id]
      timestamp = Mastodon::Snowflake.to_time(@options[:min_id])
      timestamp = Mastodon::Snowflake.to_time(@options[:min_id].to_i)
      syntax_options << "after:\"#{timestamp.iso8601}\""
    end

    if @options[:max_id]
      timestamp = Mastodon::Snowflake.to_time(@options[:max_id])
      timestamp = Mastodon::Snowflake.to_time(@options[:max_id].to_i)
      syntax_options << "before:\"#{timestamp.iso8601}\""
    end


M spec/services/activitypub/process_status_update_service_spec.rb => spec/services/activitypub/process_status_update_service_spec.rb +20 -20
@@ 41,12 41,12 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do

  describe '#call' do
    it 'updates text' do
      subject.call(status, json)
      subject.call(status, json, json)
      expect(status.reload.text).to eq 'Hello universe'
    end

    it 'updates content warning' do
      subject.call(status, json)
      subject.call(status, json, json)
      expect(status.reload.spoiler_text).to eq 'Show more'
    end



@@ 64,7 64,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
      end

      before do
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'does not create any edits' do


@@ 87,7 87,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
      end

      before do
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'does not create any edits' do


@@ 134,7 134,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
      end

      before do
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'does not create any edits' do


@@ 186,7 186,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
      end

      before do
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'does not create any edits' do


@@ 214,11 214,11 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
      end

      it 'does not create any edits' do
        expect { subject.call(status, json) }.to_not(change { status.reload.edits.pluck(&:id) })
        expect { subject.call(status, json, json) }.to_not(change { status.reload.edits.pluck(&:id) })
      end

      it 'does not update the text, spoiler_text or edited_at' do
        expect { subject.call(status, json) }.to_not(change { s = status.reload; [s.text, s.spoiler_text, s.edited_at] })
        expect { subject.call(status, json, json) }.to_not(change { s = status.reload; [s.text, s.spoiler_text, s.edited_at] })
      end
    end



@@ 233,7 233,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
      end

      before do
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'does not create any edits' do


@@ 257,7 257,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do

      before do
        status.update(ordered_media_attachment_ids: nil)
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'does not create any edits' do


@@ 271,7 271,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do

    context 'when originally without tags' do
      before do
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'updates tags' do


@@ 297,7 297,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
      end

      before do
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'updates tags' do


@@ 307,7 307,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do

    context 'when originally without mentions' do
      before do
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'updates mentions' do


@@ 319,7 319,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
      let(:mentions) { [alice, bob] }

      before do
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'updates mentions' do


@@ 330,7 330,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
    context 'when originally without media attachments' do
      before do
        stub_request(:get, 'https://example.com/foo.png').to_return(body: attachment_fixture('emojo.png'))
        subject.call(status, json)
        subject.call(status, json, json)
      end

      let(:payload) do


@@ 380,7 380,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do

      before do
        allow(RedownloadMediaWorker).to receive(:perform_async)
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'updates the existing media attachment in-place' do


@@ 408,7 408,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
      before do
        poll = Fabricate(:poll, status: status)
        status.update(preloadable_poll: poll)
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'removes poll' do


@@ 438,7 438,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
      end

      before do
        subject.call(status, json)
        subject.call(status, json, json)
      end

      it 'creates a poll' do


@@ 454,12 454,12 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
    end

    it 'creates edit history' do
      subject.call(status, json)
      subject.call(status, json, json)
      expect(status.edits.reload.map(&:text)).to eq ['Hello world', 'Hello universe']
    end

    it 'sets edited timestamp' do
      subject.call(status, json)
      subject.call(status, json, json)
      expect(status.reload.edited_at.to_s).to eq '2021-09-08 22:39:25 UTC'
    end
  end

M yarn.lock => yarn.lock +58 -22
@@ 58,20 58,20 @@
  integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==

"@babel/core@^7.10.4", "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.22.1":
  version "7.22.17"
  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.17.tgz#2f9b0b395985967203514b24ee50f9fd0639c866"
  integrity sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==
  version "7.22.19"
  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.19.tgz#b38162460a6f3baf2a424bda720b24a8aafea241"
  integrity sha512-Q8Yj5X4LHVYTbLCKVz0//2D2aDmHF4xzCdEttYvKOnWvErGsa6geHXD6w46x64n5tP69VfeH+IfSrdyH3MLhwA==
  dependencies:
    "@ampproject/remapping" "^2.2.0"
    "@babel/code-frame" "^7.22.13"
    "@babel/generator" "^7.22.15"
    "@babel/helper-compilation-targets" "^7.22.15"
    "@babel/helper-module-transforms" "^7.22.17"
    "@babel/helper-module-transforms" "^7.22.19"
    "@babel/helpers" "^7.22.15"
    "@babel/parser" "^7.22.16"
    "@babel/template" "^7.22.15"
    "@babel/traverse" "^7.22.17"
    "@babel/types" "^7.22.17"
    "@babel/traverse" "^7.22.19"
    "@babel/types" "^7.22.19"
    convert-source-map "^1.7.0"
    debug "^4.1.0"
    gensync "^1.0.0-beta.2"


@@ 207,7 207,7 @@
  dependencies:
    "@babel/types" "^7.22.15"

"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.17":
"@babel/helper-module-transforms@^7.22.15":
  version "7.22.17"
  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz#7edf129097a51ccc12443adbc6320e90eab76693"
  integrity sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==


@@ 218,6 218,17 @@
    "@babel/helper-split-export-declaration" "^7.22.6"
    "@babel/helper-validator-identifier" "^7.22.15"

"@babel/helper-module-transforms@^7.22.19":
  version "7.22.19"
  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.19.tgz#94b1f281caa6518f02ec0f5ea2b5348e298ce266"
  integrity sha512-m6h1cJvn+OJ+R3jOHp30faq5xKJ7VbjwDj5RGgHuRlU9hrMeKsGC+JpihkR5w1g7IfseCPPtZ0r7/hB4UKaYlA==
  dependencies:
    "@babel/helper-environment-visitor" "^7.22.5"
    "@babel/helper-module-imports" "^7.22.15"
    "@babel/helper-simple-access" "^7.22.5"
    "@babel/helper-split-export-declaration" "^7.22.6"
    "@babel/helper-validator-identifier" "^7.22.19"

"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9":
  version "7.22.15"
  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz#40ad2f6950f143900e9c1c72363c0b431a606082"


@@ 285,10 296,10 @@
  resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
  integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==

"@babel/helper-validator-identifier@^7.22.15", "@babel/helper-validator-identifier@^7.22.5":
  version "7.22.15"
  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044"
  integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==
"@babel/helper-validator-identifier@^7.22.15", "@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.5":
  version "7.22.19"
  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.19.tgz#2f34ab1e445f5b95e2e6edfe50ea2449e610583a"
  integrity sha512-Tinq7ybnEPFFXhlYOYFiSjespWQk0dq2dRNAiMdRTOYQzEGqnnNyrTxPYHP5r6wGjlF1rFgABdDV0g8EwD6Qbg==

"@babel/helper-validator-option@^7.22.15":
  version "7.22.15"


@@ 1123,7 1134,7 @@
    "@babel/parser" "^7.22.5"
    "@babel/types" "^7.22.5"

"@babel/traverse@7", "@babel/traverse@^7.22.15", "@babel/traverse@^7.22.17":
"@babel/traverse@7":
  version "7.22.17"
  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.17.tgz#b23c203ab3707e3be816043081b4a994fcacec44"
  integrity sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==


@@ 1139,7 1150,23 @@
    debug "^4.1.0"
    globals "^11.1.0"

"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.5":
"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.19":
  version "7.22.19"
  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.19.tgz#bb2b12b7de9d7fec9e812ed89eea097b941954f8"
  integrity sha512-ZCcpVPK64krfdScRbpxF6xA5fz7IOsfMwx1tcACvCzt6JY+0aHkBk7eIU8FRDSZRU5Zei6Z4JfgAxN1bqXGECg==
  dependencies:
    "@babel/code-frame" "^7.22.13"
    "@babel/generator" "^7.22.15"
    "@babel/helper-environment-visitor" "^7.22.5"
    "@babel/helper-function-name" "^7.22.5"
    "@babel/helper-hoist-variables" "^7.22.5"
    "@babel/helper-split-export-declaration" "^7.22.6"
    "@babel/parser" "^7.22.16"
    "@babel/types" "^7.22.19"
    debug "^4.1.0"
    globals "^11.1.0"

"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.20.7":
  version "7.22.17"
  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.17.tgz#f753352c4610ffddf9c8bc6823f9ff03e2303eee"
  integrity sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==


@@ 1166,6 1193,15 @@
    "@babel/helper-validator-identifier" "^7.22.15"
    to-fast-properties "^2.0.0"

"@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.19", "@babel/types@^7.22.5":
  version "7.22.19"
  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684"
  integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==
  dependencies:
    "@babel/helper-string-parser" "^7.22.5"
    "@babel/helper-validator-identifier" "^7.22.19"
    to-fast-properties "^2.0.0"

"@babel/types@^7.3.3":
  version "7.22.10"
  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03"


@@ 3937,9 3973,9 @@ caniuse-lite@^1.0.30001502:
  integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==

caniuse-lite@^1.0.30001517:
  version "1.0.30001532"
  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001532.tgz#c6a4d5d2da6d2b967f0ee5e12e7f680db6ad2fca"
  integrity sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==
  version "1.0.30001534"
  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz#f24a9b2a6d39630bac5c132b5dff89b39a12e7dd"
  integrity sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==

caniuse-lite@^1.0.30001520:
  version "1.0.30001520"


@@ 5084,9 5120,9 @@ electron-to-chromium@^1.4.428:
  integrity sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA==

electron-to-chromium@^1.4.477:
  version "1.4.513"
  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.513.tgz#41a50bf749aa7d8058ffbf7a131fc3327a7b1675"
  integrity sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw==
  version "1.4.520"
  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.520.tgz#c19c25a10d87bd88a9aae2b76cae9235a50c2994"
  integrity sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g==

elliptic@^6.5.3:
  version "6.5.4"


@@ 10717,9 10753,9 @@ sass-loader@^10.2.0:
    semver "^7.3.2"

sass@^1.62.1:
  version "1.66.1"
  resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1"
  integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==
  version "1.67.0"
  resolved "https://registry.yarnpkg.com/sass/-/sass-1.67.0.tgz#fed84d74b9cd708db603b1380d6dc1f71bb24f6f"
  integrity sha512-SVrO9ZeX/QQyEGtuZYCVxoeAL5vGlYjJ9p4i4HFuekWl8y/LtJ7tJc10Z+ck1c8xOuoBm2MYzcLfTAffD0pl/A==
  dependencies:
    chokidar ">=3.0.0 <4.0.0"
    immutable "^4.0.0"