├── .discourse-compatibility ├── .eslintignore ├── .github └── workflows │ └── discourse-plugin.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc.cjs ├── .rubocop.yml ├── .streerc ├── .template-lintrc.cjs ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── app ├── controllers │ └── discourse_shared_edits │ │ └── revision_controller.rb ├── jobs │ └── commit_shared_revision.rb └── models │ └── shared_edit_revision.rb ├── assets ├── javascripts │ └── discourse │ │ ├── components │ │ └── shared-edit-button.gjs │ │ ├── connectors │ │ └── composer-fields-below │ │ │ └── shared-edit-buttons.gjs │ │ ├── initializers │ │ ├── extend-composer-service.js │ │ └── shared-edits-init.js │ │ └── services │ │ └── shared-edit-manager.js └── stylesheets │ └── common │ └── discourse-shared-edits.scss ├── config ├── locales │ ├── client.ar.yml │ ├── client.be.yml │ ├── client.bg.yml │ ├── client.bs_BA.yml │ ├── client.ca.yml │ ├── client.cs.yml │ ├── client.da.yml │ ├── client.de.yml │ ├── client.el.yml │ ├── client.en.yml │ ├── client.en_GB.yml │ ├── client.es.yml │ ├── client.et.yml │ ├── client.fa_IR.yml │ ├── client.fi.yml │ ├── client.fr.yml │ ├── client.gl.yml │ ├── client.he.yml │ ├── client.hr.yml │ ├── client.hu.yml │ ├── client.hy.yml │ ├── client.id.yml │ ├── client.it.yml │ ├── client.ja.yml │ ├── client.ko.yml │ ├── client.lt.yml │ ├── client.lv.yml │ ├── client.nb_NO.yml │ ├── client.nl.yml │ ├── client.pl_PL.yml │ ├── client.pt.yml │ ├── client.pt_BR.yml │ ├── client.ro.yml │ ├── client.ru.yml │ ├── client.sk.yml │ ├── client.sl.yml │ ├── client.sq.yml │ ├── client.sr.yml │ ├── client.sv.yml │ ├── client.sw.yml │ ├── client.te.yml │ ├── client.th.yml │ ├── client.tr_TR.yml │ ├── client.ug.yml │ ├── client.uk.yml │ ├── client.ur.yml │ ├── client.vi.yml │ ├── client.zh_CN.yml │ ├── client.zh_TW.yml │ ├── server.ar.yml │ ├── server.be.yml │ ├── server.bg.yml │ ├── server.bs_BA.yml │ ├── server.ca.yml │ ├── server.cs.yml │ ├── server.da.yml │ ├── server.de.yml │ ├── server.el.yml │ ├── server.en.yml │ ├── server.en_GB.yml │ ├── server.es.yml │ ├── server.et.yml │ ├── server.fa_IR.yml │ ├── server.fi.yml │ ├── server.fr.yml │ ├── server.gl.yml │ ├── server.he.yml │ ├── server.hr.yml │ ├── server.hu.yml │ ├── server.hy.yml │ ├── server.id.yml │ ├── server.it.yml │ ├── server.ja.yml │ ├── server.ko.yml │ ├── server.lt.yml │ ├── server.lv.yml │ ├── server.nb_NO.yml │ ├── server.nl.yml │ ├── server.pl_PL.yml │ ├── server.pt.yml │ ├── server.pt_BR.yml │ ├── server.ro.yml │ ├── server.ru.yml │ ├── server.sk.yml │ ├── server.sl.yml │ ├── server.sq.yml │ ├── server.sr.yml │ ├── server.sv.yml │ ├── server.sw.yml │ ├── server.te.yml │ ├── server.th.yml │ ├── server.tr_TR.yml │ ├── server.ug.yml │ ├── server.uk.yml │ ├── server.ur.yml │ ├── server.vi.yml │ ├── server.zh_CN.yml │ └── server.zh_TW.yml └── settings.yml ├── db └── migrate │ └── 20200721001123_migrate_shared_edits.rb ├── eslint.config.mjs ├── lib ├── discourse_shared_edits │ └── guardian_extension.rb └── ot_text_unicode.rb ├── package.json ├── plugin.rb ├── pnpm-lock.yaml ├── public └── javascripts │ └── text-unicode-dist.js ├── readme.md ├── spec ├── lib │ ├── guardian_spec.rb │ └── ot_text_unicode_spec.rb ├── models │ └── shared_edit_revision_spec.rb ├── requests │ └── revision_controller_spec.rb ├── serializers │ └── post_serializer_spec.rb └── system │ ├── core_features_spec.rb │ └── edit_spec.rb ├── stylelint.config.mjs ├── support ├── fake_writer.rb └── text-unicode-webpack │ ├── package.json │ ├── src │ └── index.js │ ├── webpack.config.js │ └── yarn.lock ├── test └── javascripts │ └── acceptance │ └── composer-test.js └── translator.yml /.discourse-compatibility: -------------------------------------------------------------------------------- 1 | < 3.5.0.beta3-dev: 3373b37aa1ca50095efa0657e3992c86c824e29f 2 | < 3.5.0.beta2-dev: d9bd732d058e67694e15422f6c19779f78f87231 3 | < 3.5.0.beta1-dev: 17024d2d5a35172bd5f665d1f3aa0416db77e5ef 4 | < 3.4.0.beta3-dev: d2ca0b892b1c5613b477a327c059430bf67e66d2 5 | < 3.4.0.beta2-dev: d6e32339851d30d5477fdeb3ec9a7d7450d84920 6 | < 3.4.0.beta1-dev: 0c6709d138ec6618536ff78fc637cd77e5126eac 7 | < 3.3.0.beta1-dev: 60977e100a0f6e278bb146a86352c721e52682f0 8 | 3.1.999: a9d259402541b3079e17ae2b61a15110f38cd059 9 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /support 2 | /public 3 | -------------------------------------------------------------------------------- /.github/workflows/discourse-plugin.yml: -------------------------------------------------------------------------------- 1 | name: Discourse Plugin 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | 9 | jobs: 10 | ci: 11 | uses: discourse/.github/.github/workflows/discourse-plugin.yml@v1 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | /gems 3 | /auto_generated 4 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict = true 2 | auto-install-peers = false 3 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /public 2 | -------------------------------------------------------------------------------- /.prettierrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = require("@discourse/lint-configs/prettier"); 2 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | inherit_gem: 2 | rubocop-discourse: stree-compat.yml 3 | -------------------------------------------------------------------------------- /.streerc: -------------------------------------------------------------------------------- 1 | --print-width=100 2 | --plugins=plugin/trailing_comma 3 | -------------------------------------------------------------------------------- /.template-lintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = require("@discourse/lint-configs/template-lint"); 2 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | source "https://rubygems.org" 4 | 5 | group :development do 6 | gem "rubocop-discourse" 7 | gem "syntax_tree" 8 | end 9 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (8.0.2) 5 | base64 6 | benchmark (>= 0.3) 7 | bigdecimal 8 | concurrent-ruby (~> 1.0, >= 1.3.1) 9 | connection_pool (>= 2.2.5) 10 | drb 11 | i18n (>= 1.6, < 2) 12 | logger (>= 1.4.2) 13 | minitest (>= 5.1) 14 | securerandom (>= 0.3) 15 | tzinfo (~> 2.0, >= 2.0.5) 16 | uri (>= 0.13.1) 17 | ast (2.4.3) 18 | base64 (0.2.0) 19 | benchmark (0.4.0) 20 | bigdecimal (3.1.9) 21 | concurrent-ruby (1.3.5) 22 | connection_pool (2.5.3) 23 | drb (2.2.3) 24 | i18n (1.14.7) 25 | concurrent-ruby (~> 1.0) 26 | json (2.12.2) 27 | language_server-protocol (3.17.0.5) 28 | lint_roller (1.1.0) 29 | logger (1.7.0) 30 | minitest (5.25.5) 31 | parallel (1.27.0) 32 | parser (3.3.8.0) 33 | ast (~> 2.4.1) 34 | racc 35 | prettier_print (1.2.1) 36 | prism (1.4.0) 37 | racc (1.8.1) 38 | rack (3.1.15) 39 | rainbow (3.1.1) 40 | regexp_parser (2.10.0) 41 | rubocop (1.75.8) 42 | json (~> 2.3) 43 | language_server-protocol (~> 3.17.0.2) 44 | lint_roller (~> 1.1.0) 45 | parallel (~> 1.10) 46 | parser (>= 3.3.0.2) 47 | rainbow (>= 2.2.2, < 4.0) 48 | regexp_parser (>= 2.9.3, < 3.0) 49 | rubocop-ast (>= 1.44.0, < 2.0) 50 | ruby-progressbar (~> 1.7) 51 | unicode-display_width (>= 2.4.0, < 4.0) 52 | rubocop-ast (1.44.1) 53 | parser (>= 3.3.7.2) 54 | prism (~> 1.4) 55 | rubocop-capybara (2.22.1) 56 | lint_roller (~> 1.1) 57 | rubocop (~> 1.72, >= 1.72.1) 58 | rubocop-discourse (3.12.1) 59 | activesupport (>= 6.1) 60 | lint_roller (>= 1.1.0) 61 | rubocop (>= 1.73.2) 62 | rubocop-capybara (>= 2.22.0) 63 | rubocop-factory_bot (>= 2.27.0) 64 | rubocop-rails (>= 2.30.3) 65 | rubocop-rspec (>= 3.0.1) 66 | rubocop-rspec_rails (>= 2.31.0) 67 | rubocop-factory_bot (2.27.1) 68 | lint_roller (~> 1.1) 69 | rubocop (~> 1.72, >= 1.72.1) 70 | rubocop-rails (2.32.0) 71 | activesupport (>= 4.2.0) 72 | lint_roller (~> 1.1) 73 | rack (>= 1.1) 74 | rubocop (>= 1.75.0, < 2.0) 75 | rubocop-ast (>= 1.44.0, < 2.0) 76 | rubocop-rspec (3.6.0) 77 | lint_roller (~> 1.1) 78 | rubocop (~> 1.72, >= 1.72.1) 79 | rubocop-rspec_rails (2.31.0) 80 | lint_roller (~> 1.1) 81 | rubocop (~> 1.72, >= 1.72.1) 82 | rubocop-rspec (~> 3.5) 83 | ruby-progressbar (1.13.0) 84 | securerandom (0.4.1) 85 | syntax_tree (6.2.0) 86 | prettier_print (>= 1.2.0) 87 | tzinfo (2.0.6) 88 | concurrent-ruby (~> 1.0) 89 | unicode-display_width (3.1.4) 90 | unicode-emoji (~> 4.0, >= 4.0.4) 91 | unicode-emoji (4.0.4) 92 | uri (1.0.3) 93 | 94 | PLATFORMS 95 | ruby 96 | 97 | DEPENDENCIES 98 | rubocop-discourse 99 | syntax_tree 100 | 101 | BUNDLED WITH 102 | 2.6.9 103 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 Sam Saffron 2 | 3 | http://creativecommons.org/licenses/MIT/ 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/controllers/discourse_shared_edits/revision_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module ::DiscourseSharedEdits 4 | class RevisionController < ::ApplicationController 5 | requires_plugin PLUGIN_NAME 6 | 7 | requires_login 8 | before_action :ensure_logged_in, :ensure_shared_edits 9 | skip_before_action :preload_json, :check_xhr 10 | 11 | def enable 12 | guardian.ensure_can_toggle_shared_edits! 13 | SharedEditRevision.toggle_shared_edits!(params[:post_id].to_i, true) 14 | render json: success_json 15 | end 16 | 17 | def disable 18 | guardian.ensure_can_toggle_shared_edits! 19 | SharedEditRevision.toggle_shared_edits!(params[:post_id].to_i, false) 20 | render json: success_json 21 | end 22 | 23 | def latest 24 | post = Post.find(params[:post_id].to_i) 25 | guardian.ensure_can_see!(post) 26 | SharedEditRevision.commit!(post.id, apply_to_post: false) 27 | version, raw = SharedEditRevision.latest_raw(post) 28 | render json: { raw: raw, version: version } 29 | end 30 | 31 | def commit 32 | params.require(:post_id) 33 | 34 | post = Post.find(params[:post_id].to_i) 35 | guardian.ensure_can_see!(post) 36 | SharedEditRevision.commit!(post.id) 37 | 38 | render json: success_json 39 | end 40 | 41 | def revise 42 | params.require(:revision) 43 | params.require(:client_id) 44 | params.require(:version) 45 | 46 | master_version = params[:version].to_i 47 | 48 | post = Post.find(params[:post_id].to_i) 49 | guardian.ensure_can_see!(post) 50 | 51 | version, revision = 52 | SharedEditRevision.revise!( 53 | post_id: post.id, 54 | user_id: current_user.id, 55 | client_id: params[:client_id], 56 | version: master_version, 57 | revision: params[:revision], 58 | ) 59 | 60 | revisions = 61 | if version == master_version + 1 62 | [{ version: version, revision: revision, client_id: params[:client_id] }] 63 | else 64 | SharedEditRevision 65 | .where(post_id: post.id) 66 | .where("version > ?", master_version) 67 | .order(:version) 68 | .pluck(:revision, :version, :client_id) 69 | .map { |r, v, c| { version: v, revision: r, client_id: c } } 70 | end 71 | 72 | SharedEditRevision.ensure_will_commit(post.id) 73 | 74 | render json: { version: version, revisions: revisions } 75 | end 76 | 77 | protected 78 | 79 | def ensure_shared_edits 80 | raise Discourse::InvalidAccess if !SiteSetting.shared_edits_enabled 81 | end 82 | end 83 | end 84 | -------------------------------------------------------------------------------- /app/jobs/commit_shared_revision.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module Jobs 4 | class CommitSharedRevision < ::Jobs::Base 5 | def execute(args) 6 | post_id = args[:post_id] 7 | Discourse.redis.del SharedEditRevision.will_commit_key(post_id) 8 | SharedEditRevision.commit!(post_id) 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/models/shared_edit_revision.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class SharedEditRevision < ActiveRecord::Base 4 | belongs_to :post 5 | belongs_to :post_revision 6 | 7 | def self.will_commit_key(post_id) 8 | "shared_revision_will_commit_#{post_id}" 9 | end 10 | 11 | def self.ensure_will_commit(post_id) 12 | key = will_commit_key(post_id) 13 | if !Discourse.redis.get(key) 14 | Discourse.redis.setex(key, 60, "1") 15 | Jobs.enqueue_in(10.seconds, :commit_shared_revision, post_id: post_id) 16 | end 17 | end 18 | 19 | def self.last_revision_id_for_post(post) 20 | PostRevision.where(post: post).limit(1).order("number desc").pluck(:id).first || -1 21 | end 22 | 23 | def self.toggle_shared_edits!(post_id, enable) 24 | post = Post.find(post_id) 25 | if enable 26 | init!(post) 27 | post.custom_fields[DiscourseSharedEdits::SHARED_EDITS_ENABLED] = true 28 | else 29 | commit!(post_id) 30 | SharedEditRevision.where(post_id: post_id).delete_all 31 | post.custom_fields.delete(DiscourseSharedEdits::SHARED_EDITS_ENABLED) 32 | end 33 | post.save_custom_fields 34 | end 35 | 36 | def self.init!(post) 37 | if !SharedEditRevision.where(post_id: post.id).exists? 38 | revision_id = last_revision_id_for_post(post) 39 | 40 | SharedEditRevision.create!( 41 | post: post, 42 | client_id: "system", 43 | user_id: Discourse.system_user.id, 44 | version: 1, 45 | revision: "[]", 46 | raw: post.raw, 47 | post_revision_id: revision_id, 48 | ) 49 | end 50 | end 51 | 52 | def self.commit!(post_id, apply_to_post: true) 53 | version_with_raw = 54 | SharedEditRevision 55 | .where(post_id: post_id) 56 | .where("raw IS NOT NULL") 57 | .order("version desc") 58 | .first 59 | 60 | return if !version_with_raw 61 | 62 | raw = version_with_raw.raw 63 | 64 | to_resolve = 65 | SharedEditRevision 66 | .where(post_id: post_id) 67 | .where("version > ?", version_with_raw.version) 68 | .order(:version) 69 | 70 | last_revision = version_with_raw 71 | 72 | editors = [] 73 | 74 | to_resolve.each do |rev| 75 | raw = OtTextUnicode.apply(raw, rev.revision) 76 | last_revision = rev 77 | editors << rev.user_id 78 | end 79 | 80 | last_revision.update!(raw: raw) if last_revision.raw != raw 81 | return if last_revision.post_revision_id 82 | return if !apply_to_post 83 | 84 | post = Post.find(post_id) 85 | revisor = PostRevisor.new(post) 86 | 87 | # TODO decide if we need fidelity here around skip_revision 88 | # skip_revision: true 89 | 90 | opts = { bypass_rate_limiter: true, bypass_bump: true, skip_staff_log: true } 91 | 92 | # revise must be called outside of transaction 93 | # otherwise you get phantom edits where and edit can take 2 cycles 94 | # to take 95 | done = revisor.revise!(Discourse.system_user, { raw: raw }, opts) 96 | 97 | Post.transaction do 98 | if done 99 | last_post_revision = PostRevision.where(post: post).limit(1).order("number desc").first 100 | 101 | reason = last_post_revision.modifications["edit_reason"] || "" 102 | 103 | reason = reason[1] if Array === reason 104 | 105 | usernames = reason&.split(",")&.map(&:strip) || [] 106 | 107 | if usernames.length > 0 108 | reason_length = I18n.t("shared_edits.reason", users: "").length 109 | usernames[0] = usernames[0][reason_length..-1] 110 | end 111 | 112 | User.where(id: editors).pluck(:username).each { |name| usernames << name } 113 | 114 | usernames.uniq! 115 | 116 | new_reason = I18n.t("shared_edits.reason", users: usernames.join(", ")) 117 | 118 | if new_reason != reason 119 | last_post_revision.modifications["edit_reason"] = [nil, new_reason] 120 | last_post_revision.save! 121 | post.update!(edit_reason: new_reason) 122 | end 123 | 124 | last_revision.update!(post_revision_id: last_post_revision.id) 125 | end 126 | end 127 | 128 | raw 129 | end 130 | 131 | def self.latest_raw(post_id) 132 | SharedEditRevision 133 | .where("raw IS NOT NULL") 134 | .where(post_id: post_id) 135 | .order("version desc") 136 | .limit(1) 137 | .pluck(:version, :raw) 138 | .first 139 | end 140 | 141 | def self.revise!(post_id:, user_id:, client_id:, revision:, version:) 142 | revision = revision.to_json if !(String === revision) 143 | 144 | args = { 145 | user_id: user_id, 146 | client_id: client_id, 147 | revision: revision, 148 | post_id: post_id, 149 | version: version + 1, 150 | now: Time.zone.now, 151 | } 152 | 153 | rows = DB.exec(<<~SQL, args) 154 | INSERT INTO shared_edit_revisions 155 | ( 156 | post_id, 157 | user_id, 158 | client_id, 159 | revision, 160 | version, 161 | created_at, 162 | updated_at 163 | ) 164 | SELECT 165 | :post_id, 166 | :user_id, 167 | :client_id, 168 | :revision, 169 | :version, 170 | :now, 171 | :now 172 | WHERE :version = ( 173 | SELECT MAX(version) + 1 174 | FROM shared_edit_revisions 175 | WHERE post_id = :post_id 176 | ) 177 | SQL 178 | 179 | if rows == 1 180 | post = Post.find(post_id) 181 | message = { version: version + 1, revision: revision, client_id: client_id, user_id: user_id } 182 | post.publish_message!("/shared_edits/#{post.id}", message) 183 | [version + 1, revision] 184 | else 185 | missing = 186 | SharedEditRevision 187 | .where(post_id: post_id) 188 | .where("version > ?", version) 189 | .order(:version) 190 | .pluck(:version, :revision) 191 | 192 | raise StandardError, "no revisions to apply" if missing.length == 0 193 | 194 | missing.each do |missing_version, missing_revision| 195 | revision = OtTextUnicode.transform(revision, missing_revision) 196 | version = missing_version 197 | end 198 | 199 | revise!( 200 | post_id: post_id, 201 | user_id: user_id, 202 | client_id: client_id, 203 | revision: revision, 204 | version: version, 205 | ) 206 | end 207 | end 208 | end 209 | 210 | # == Schema Information 211 | # 212 | # Table name: shared_edit_revisions 213 | # 214 | # id :bigint not null, primary key 215 | # post_id :integer not null 216 | # raw :string 217 | # revision :string not null 218 | # user_id :integer not null 219 | # client_id :string not null 220 | # version :integer not null 221 | # post_revision_id :integer 222 | # created_at :datetime not null 223 | # updated_at :datetime not null 224 | # 225 | # Indexes 226 | # 227 | # index_shared_edit_revisions_on_post_id_and_version (post_id,version) UNIQUE 228 | # 229 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/components/shared-edit-button.gjs: -------------------------------------------------------------------------------- 1 | import Component from "@glimmer/component"; 2 | import { action } from "@ember/object"; 3 | import { service } from "@ember/service"; 4 | import DButton from "discourse/components/d-button"; 5 | import concatClass from "discourse/helpers/concat-class"; 6 | 7 | export default class SharedEditButton extends Component { 8 | static shouldRender(args) { 9 | return args.post.can_edit; 10 | } 11 | 12 | @service appEvents; 13 | @service site; 14 | 15 | get showLabel() { 16 | return this.args.showLabel ?? this.site.desktopView; 17 | } 18 | 19 | @action 20 | sharedEdit() { 21 | this.appEvents.trigger("shared-edit-on-post", this.args.post); 22 | } 23 | 24 | 38 | } 39 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/connectors/composer-fields-below/shared-edit-buttons.gjs: -------------------------------------------------------------------------------- 1 | import Component from "@glimmer/component"; 2 | import { action } from "@ember/object"; 3 | import { service } from "@ember/service"; 4 | import DButton from "discourse/components/d-button"; 5 | import { i18n } from "discourse-i18n"; 6 | 7 | export default class SharedEditButtons extends Component { 8 | @service composer; 9 | @service site; 10 | 11 | @action 12 | endSharedEdit() { 13 | this.composer.close(); 14 | } 15 | 16 | 29 | } 30 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/initializers/extend-composer-service.js: -------------------------------------------------------------------------------- 1 | import { service } from "@ember/service"; 2 | import { withPluginApi } from "discourse/lib/plugin-api"; 3 | 4 | const SHARED_EDIT_ACTION = "sharedEdit"; 5 | 6 | export default { 7 | name: "discourse-shared-edits-composer-service", 8 | 9 | initialize: (container) => { 10 | const siteSettings = container.lookup("service:site-settings"); 11 | if (!siteSettings.shared_edits_enabled) { 12 | return; 13 | } 14 | 15 | withPluginApi("0.8.6", (api) => { 16 | api.modifyClass( 17 | "service:composer", 18 | (Superclass) => 19 | class extends Superclass { 20 | @service sharedEditManager; 21 | 22 | async open(opts) { 23 | await super.open(...arguments); 24 | 25 | if (opts.action === SHARED_EDIT_ACTION) { 26 | await this.sharedEditManager.subscribe(); 27 | } 28 | } 29 | 30 | collapse() { 31 | if (this.model?.action === SHARED_EDIT_ACTION) { 32 | return this.close(); 33 | } 34 | return super.collapse(...arguments); 35 | } 36 | 37 | close() { 38 | if (this.model?.action === SHARED_EDIT_ACTION) { 39 | this.sharedEditManager.commit(); 40 | } 41 | return super.close(...arguments); 42 | } 43 | 44 | save() { 45 | if (this.model?.action === SHARED_EDIT_ACTION) { 46 | return this.close(); 47 | } 48 | return super.save(...arguments); 49 | } 50 | 51 | _saveDraft() { 52 | if (this.model?.action === SHARED_EDIT_ACTION) { 53 | return; 54 | } 55 | return super._saveDraft(...arguments); 56 | } 57 | } 58 | ); 59 | }); 60 | }, 61 | }; 62 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/initializers/shared-edits-init.js: -------------------------------------------------------------------------------- 1 | import { ajax } from "discourse/lib/ajax"; 2 | import { popupAjaxError } from "discourse/lib/ajax-error"; 3 | import { withPluginApi } from "discourse/lib/plugin-api"; 4 | import { SAVE_ICONS, SAVE_LABELS } from "discourse/models/composer"; 5 | import SharedEditButton from "../components/shared-edit-button"; 6 | 7 | const SHARED_EDIT_ACTION = "sharedEdit"; 8 | 9 | function initWithApi(api) { 10 | SAVE_LABELS[SHARED_EDIT_ACTION] = "composer.save_edit"; 11 | SAVE_ICONS[SHARED_EDIT_ACTION] = "pencil"; 12 | 13 | customizePostMenu(api); 14 | 15 | const currentUser = api.getCurrentUser(); 16 | 17 | api.addPostAdminMenuButton((attrs) => { 18 | if (!currentUser?.staff && currentUser?.trust_level < 4) { 19 | return; 20 | } 21 | 22 | return { 23 | icon: "far-pen-to-square", 24 | className: "admin-toggle-shared-edits", 25 | label: attrs.shared_edits_enabled 26 | ? "shared_edits.disable_shared_edits" 27 | : "shared_edits.enable_shared_edits", 28 | action: async (post) => { 29 | const url = `/shared_edits/p/${post.id}/${ 30 | post.shared_edits_enabled ? "disable" : "enable" 31 | }.json`; 32 | 33 | try { 34 | await ajax(url, { type: "PUT" }); 35 | post.set("shared_edits_enabled", !post.shared_edits_enabled); 36 | } catch (e) { 37 | popupAjaxError(e); 38 | } 39 | }, 40 | }; 41 | }); 42 | 43 | api.addTrackedPostProperties("shared_edits_enabled"); 44 | 45 | api.addPostClassesCallback((attrs) => { 46 | if (attrs.shared_edits_enabled && attrs.canEdit) { 47 | return ["shared-edits-post"]; 48 | } 49 | }); 50 | 51 | api.modifyClass( 52 | "component:scrolling-post-stream", 53 | (Superclass) => 54 | class extends Superclass { 55 | sharedEdit() { 56 | this.appEvents.trigger("shared-edit-on-post"); 57 | } 58 | } 59 | ); 60 | 61 | api.modifyClass( 62 | "model:composer", 63 | (Superclass) => 64 | class extends Superclass { 65 | get creatingSharedEdit() { 66 | return this.get("action") === SHARED_EDIT_ACTION; 67 | } 68 | 69 | get editingPost() { 70 | return super.editingPost || this.creatingSharedEdit; 71 | } 72 | } 73 | ); 74 | 75 | api.modifyClass( 76 | "controller:topic", 77 | (Superclass) => 78 | class extends Superclass { 79 | init() { 80 | super.init(...arguments); 81 | 82 | this.appEvents.on( 83 | "shared-edit-on-post", 84 | this, 85 | this._handleSharedEditOnPost 86 | ); 87 | } 88 | 89 | willDestroy() { 90 | super.willDestroy(...arguments); 91 | this.appEvents.off( 92 | "shared-edit-on-post", 93 | this, 94 | this._handleSharedEditOnPost 95 | ); 96 | } 97 | 98 | _handleSharedEditOnPost(post) { 99 | const draftKey = post.get("topic.draft_key"); 100 | const draftSequence = post.get("topic.draft_sequence"); 101 | 102 | this.get("composer").open({ 103 | post, 104 | action: SHARED_EDIT_ACTION, 105 | draftKey, 106 | draftSequence, 107 | }); 108 | } 109 | } 110 | ); 111 | } 112 | 113 | function customizePostMenu(api) { 114 | api.registerValueTransformer( 115 | "post-menu-buttons", 116 | ({ value: dag, context: { post, buttonLabels, buttonKeys } }) => { 117 | if (!post.shared_edits_enabled || !post.canEdit) { 118 | return; 119 | } 120 | 121 | dag.replace(buttonKeys.EDIT, SharedEditButton, { 122 | after: [buttonKeys.SHOW_MORE, buttonKeys.REPLY], 123 | }); 124 | dag.reposition(buttonKeys.REPLY, { 125 | after: buttonKeys.SHOW_MORE, 126 | before: buttonKeys.EDIT, 127 | }); 128 | 129 | buttonLabels.hide(buttonKeys.REPLY); 130 | } 131 | ); 132 | 133 | // register the property as tracked to ensure the button is correctly updated 134 | api.addTrackedPostProperties("shared_edits_enabled"); 135 | } 136 | 137 | export default { 138 | name: "discourse-shared-edits", 139 | initialize: (container) => { 140 | const siteSettings = container.lookup("service:site-settings"); 141 | if (!siteSettings.shared_edits_enabled) { 142 | return; 143 | } 144 | 145 | withPluginApi("1.39.2", initWithApi); 146 | }, 147 | }; 148 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/services/shared-edit-manager.js: -------------------------------------------------------------------------------- 1 | import { debounce } from "@ember/runloop"; 2 | import Service, { service } from "@ember/service"; 3 | import { ajax } from "discourse/lib/ajax"; 4 | import { popupAjaxError } from "discourse/lib/ajax-error"; 5 | import loadScript from "discourse/lib/load-script"; 6 | 7 | const THROTTLE_SAVE = 500; 8 | 9 | let loadedTextUnicode = false; 10 | 11 | function diff(before, after) { 12 | const diffLib = window.otLib.default.OtDiff.diff; 13 | const changes = diffLib(before, after); 14 | return compress(changes); 15 | } 16 | 17 | function compress(change) { 18 | const compressed = []; 19 | 20 | if (change.action !== "noop") { 21 | if (change.start > 0) { 22 | compressed.push(change.start); 23 | } 24 | 25 | switch (change.action) { 26 | case "replace": 27 | compressed.push({ d: change.remove }); 28 | compressed.push(change.payload); 29 | break; 30 | case "insert": 31 | compressed.push(change.payload); 32 | break; 33 | case "delete": 34 | compressed.push({ d: change.remove }); 35 | break; 36 | } 37 | } 38 | 39 | return compressed; 40 | } 41 | 42 | export default class SharedEditManager extends Service { 43 | @service composer; 44 | @service messageBus; 45 | 46 | ajaxInProgress = false; 47 | raw = null; 48 | version = null; 49 | 50 | async subscribe() { 51 | try { 52 | const data = await ajax(`/shared_edits/p/${this.#postId}`); 53 | 54 | if (!this.composer.model || this.isDestroying || this.isDestroyed) { 55 | return; 56 | } 57 | 58 | this.version = data.version; 59 | this.raw = data.raw; 60 | this.composer.model.set("reply", data.raw); 61 | 62 | this.addObserver("composer.model.reply", this, this.#update); 63 | this.messageBus.subscribe(`/shared_edits/${this.#postId}`, (message) => { 64 | if ( 65 | message.client_id !== this.messageBus.clientId && 66 | !this.ajaxInProgress 67 | ) { 68 | this.#applyRevisions([message]); 69 | } 70 | }); 71 | } catch (e) { 72 | popupAjaxError(e); 73 | } 74 | } 75 | 76 | async commit() { 77 | try { 78 | this.removeObserver("composer.model.reply", this, this.#update); 79 | this.messageBus.unsubscribe(`/shared_edits/${this.#postId}`); 80 | this.raw = null; 81 | this.version = null; 82 | 83 | await ajax(`/shared_edits/p/${this.#postId}/commit`, { 84 | method: "PUT", 85 | }); 86 | } catch (e) { 87 | popupAjaxError(e); 88 | } 89 | } 90 | 91 | async #update() { 92 | if (!loadedTextUnicode) { 93 | await loadScript( 94 | "/plugins/discourse-shared-edits/javascripts/text-unicode-dist.js" 95 | ); 96 | loadedTextUnicode = true; 97 | } 98 | 99 | this.#sendDiffThrottled(); 100 | } 101 | 102 | get #postId() { 103 | return this.composer.model?.post.id; 104 | } 105 | 106 | #sendDiffThrottled() { 107 | debounce(this, this.#sendDiff, THROTTLE_SAVE); 108 | } 109 | 110 | async #sendDiff() { 111 | if (!this.composer.model || !this.version) { 112 | return; 113 | } 114 | 115 | if (this.ajaxInProgress) { 116 | this.#sendDiffThrottled(); 117 | return; 118 | } 119 | 120 | const changes = diff(this.raw, this.composer.model.reply); 121 | const submittedRaw = this.composer.model.reply; 122 | 123 | if (changes.length === 0) { 124 | return; 125 | } 126 | 127 | this.ajaxInProgress = true; 128 | 129 | try { 130 | const result = await ajax(`/shared_edits/p/${this.#postId}`, { 131 | method: "PUT", 132 | data: { 133 | revision: JSON.stringify(changes), 134 | version: this.version, 135 | client_id: this.messageBus.clientId, 136 | }, 137 | }); 138 | 139 | const inProgressChanges = diff(submittedRaw, this.composer.model.reply); 140 | this.#applyRevisions(result.revisions, inProgressChanges); 141 | } finally { 142 | this.ajaxInProgress = false; 143 | } 144 | } 145 | 146 | #applyRevisions(revs, inProgressChanges) { 147 | let newRaw = this.raw; 148 | let newVersion = this.version; 149 | let currentChanges = 150 | inProgressChanges || diff(this.raw, this.composer.model.reply); 151 | 152 | const otUnicode = window.otLib.default.OtUnicode; 153 | 154 | let newChanges = []; 155 | 156 | for (const revision of revs) { 157 | if (revision.version !== newVersion + 1) { 158 | continue; 159 | } 160 | 161 | const parsedRevision = JSON.parse(revision.revision); 162 | newRaw = otUnicode.apply(newRaw, parsedRevision); 163 | newVersion = revision.version; 164 | 165 | if (revision.client_id !== this.messageBus.clientId) { 166 | newChanges = otUnicode.compose(newChanges, parsedRevision); 167 | currentChanges = otUnicode.transform( 168 | currentChanges, 169 | parsedRevision, 170 | "left" 171 | ); 172 | } 173 | } 174 | 175 | this.raw = newRaw; 176 | this.version = newVersion; 177 | 178 | if (currentChanges.length > 0) { 179 | newRaw = otUnicode.apply(newRaw, currentChanges); 180 | } 181 | 182 | if (newRaw !== this.composer.model.reply) { 183 | const input = document.querySelector( 184 | "#reply-control textarea.d-editor-input" 185 | ); 186 | 187 | if (input.selectionStart || input.selectionStart === 0) { 188 | const selLength = input.selectionEnd - input.selectionStart; 189 | const position = otUnicode.transformPosition( 190 | input.selectionStart, 191 | newChanges 192 | ); 193 | 194 | // still need to compensate for scrollHeight changes 195 | // but at least this is mostly stable 196 | const scrollTop = input.scrollTop; 197 | 198 | input.value = newRaw; 199 | input.selectionStart = position; 200 | input.selectionEnd = position + selLength; 201 | 202 | window.requestAnimationFrame(() => { 203 | input.scrollTop = scrollTop; 204 | }); 205 | } 206 | 207 | this.composer.model.set("reply", newRaw); 208 | } 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /assets/stylesheets/common/discourse-shared-edits.scss: -------------------------------------------------------------------------------- 1 | #reply-control.composer-action-sharedEdit { 2 | .save-or-cancel { 3 | button, 4 | a { 5 | display: none; 6 | } 7 | } 8 | 9 | .title-and-category, 10 | .composer-actions { 11 | display: none; 12 | } 13 | 14 | .d-editor-preview-wrapper { 15 | margin-top: 0; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /config/locales/client.ar.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ar: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "تفعيل التعديلات المشتركة" 11 | disable_shared_edits: "تعطيل التعديلات المشتركة" 12 | edit: "تعديل" 13 | button_title: "تعديل المنشور بشكلٍ تعاوني" 14 | done: "تم" 15 | -------------------------------------------------------------------------------- /config/locales/client.be.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | be: 8 | js: 9 | shared_edits: 10 | edit: "рэдагаваць" 11 | done: "Выканана" 12 | -------------------------------------------------------------------------------- /config/locales/client.bg.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | bg: 8 | js: 9 | shared_edits: 10 | edit: "Редактирай" 11 | done: "Готово" 12 | -------------------------------------------------------------------------------- /config/locales/client.bs_BA.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | bs_BA: 8 | js: 9 | shared_edits: 10 | edit: "Edit" 11 | done: "Urađeno" 12 | -------------------------------------------------------------------------------- /config/locales/client.ca.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ca: 8 | js: 9 | shared_edits: 10 | edit: "Edita" 11 | done: "Fet" 12 | -------------------------------------------------------------------------------- /config/locales/client.cs.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | cs: 8 | js: 9 | shared_edits: 10 | edit: "Upravit" 11 | done: "Hotovo" 12 | -------------------------------------------------------------------------------- /config/locales/client.da.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | da: 8 | js: 9 | shared_edits: 10 | edit: "Rediger" 11 | done: "Færdig" 12 | -------------------------------------------------------------------------------- /config/locales/client.de.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | de: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "Gemeinsame Bearbeitungen aktivieren" 11 | disable_shared_edits: "Gemeinsame Bearbeitungen deaktivieren" 12 | edit: "Bearbeiten" 13 | button_title: "Beitrag gemeinsam bearbeiten" 14 | done: "Erledigt" 15 | -------------------------------------------------------------------------------- /config/locales/client.el.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | el: 8 | js: 9 | shared_edits: 10 | edit: "Επεξεργασία" 11 | done: "Ολοκληρώθηκε" 12 | -------------------------------------------------------------------------------- /config/locales/client.en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | js: 3 | shared_edits: 4 | enable_shared_edits: "Enable Shared Edits" 5 | disable_shared_edits: "Disable Shared Edits" 6 | edit: "Edit" 7 | button_title: "Edit Post Collaboratively" 8 | done: "Done" 9 | -------------------------------------------------------------------------------- /config/locales/client.en_GB.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | en_GB: 8 | -------------------------------------------------------------------------------- /config/locales/client.es.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | es: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "Habilitar ediciones compartidas" 11 | disable_shared_edits: "Deshabilitar ediciones compartidas" 12 | edit: "Editar" 13 | button_title: "Editar publicación de forma colaborativa" 14 | done: "Hecho" 15 | -------------------------------------------------------------------------------- /config/locales/client.et.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | et: 8 | js: 9 | shared_edits: 10 | edit: "Muuda" 11 | done: "Tehtud" 12 | -------------------------------------------------------------------------------- /config/locales/client.fa_IR.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | fa_IR: 8 | js: 9 | shared_edits: 10 | edit: "ویرایش" 11 | done: "انجام شد" 12 | -------------------------------------------------------------------------------- /config/locales/client.fi.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | fi: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "Ota jaetut muokkaukset käyttöön" 11 | disable_shared_edits: "Poista jaetut muokkaukset käytöstä" 12 | edit: "Muokkaa" 13 | button_title: "Muokkaa viestiä yhteistyössä" 14 | done: "Valmis" 15 | -------------------------------------------------------------------------------- /config/locales/client.fr.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | fr: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "Activer les modifications partagées" 11 | disable_shared_edits: "Désactiver les modifications partagées" 12 | edit: "Modifier" 13 | button_title: "Modifier la publication en collaboration" 14 | done: "Terminé" 15 | -------------------------------------------------------------------------------- /config/locales/client.gl.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | gl: 8 | js: 9 | shared_edits: 10 | edit: "Editar" 11 | done: "Feito" 12 | -------------------------------------------------------------------------------- /config/locales/client.he.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | he: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "הפעלת עריכות משותפות" 11 | disable_shared_edits: "השבתת עריכות משותפות" 12 | edit: "עריכה" 13 | button_title: "עריכת הפוסט בשיתוף פעולה" 14 | done: "סיום" 15 | -------------------------------------------------------------------------------- /config/locales/client.hr.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | hr: 8 | js: 9 | shared_edits: 10 | edit: "Uredi" 11 | done: "Gotovo" 12 | -------------------------------------------------------------------------------- /config/locales/client.hu.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | hu: 8 | js: 9 | shared_edits: 10 | edit: "Szerkesztés" 11 | done: "Kész" 12 | -------------------------------------------------------------------------------- /config/locales/client.hy.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | hy: 8 | js: 9 | shared_edits: 10 | edit: "Խմբագրել" 11 | done: "Կատարված է" 12 | -------------------------------------------------------------------------------- /config/locales/client.id.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | id: 8 | js: 9 | shared_edits: 10 | edit: "Ubah" 11 | -------------------------------------------------------------------------------- /config/locales/client.it.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | it: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "Abilita modifiche condivise" 11 | disable_shared_edits: "Disabilita modifiche condivise" 12 | edit: "Modifica" 13 | button_title: "Modifica messaggio in collaborazione" 14 | done: "Fatto" 15 | -------------------------------------------------------------------------------- /config/locales/client.ja.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ja: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "共同編集を有効にする" 11 | disable_shared_edits: "共同編集を無効にする" 12 | edit: "編集" 13 | button_title: "投稿を共同で編集する" 14 | done: "完了" 15 | -------------------------------------------------------------------------------- /config/locales/client.ko.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ko: 8 | js: 9 | shared_edits: 10 | edit: "편집" 11 | done: "완료" 12 | -------------------------------------------------------------------------------- /config/locales/client.lt.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | lt: 8 | js: 9 | shared_edits: 10 | edit: "Redaguoti" 11 | done: "Baigta" 12 | -------------------------------------------------------------------------------- /config/locales/client.lv.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | lv: 8 | js: 9 | shared_edits: 10 | edit: "Rediģēt" 11 | done: "Pabeigt" 12 | -------------------------------------------------------------------------------- /config/locales/client.nb_NO.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | nb_NO: 8 | js: 9 | shared_edits: 10 | edit: "Endre" 11 | done: "Ferdig" 12 | -------------------------------------------------------------------------------- /config/locales/client.nl.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | nl: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "Gedeelde bewerkingen inschakelen" 11 | disable_shared_edits: "Gedeelde bewerkingen uitschakelen" 12 | edit: "Bewerken" 13 | button_title: "Bericht gezamenlijk bewerken" 14 | done: "Gereed" 15 | -------------------------------------------------------------------------------- /config/locales/client.pl_PL.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | pl_PL: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "Włącz wspólne edycje" 11 | disable_shared_edits: "Wyłącz wspólne edycje" 12 | edit: "Edytuj" 13 | button_title: "Edytuj post wspólnie" 14 | done: "Zrobione" 15 | -------------------------------------------------------------------------------- /config/locales/client.pt.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | pt: 8 | js: 9 | shared_edits: 10 | edit: "Editar" 11 | done: "Concluído" 12 | -------------------------------------------------------------------------------- /config/locales/client.pt_BR.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | pt_BR: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "Ativar edições compartilhadas" 11 | disable_shared_edits: "Desativar edições compartilhadas" 12 | edit: "Editar" 13 | button_title: "Editar postagem colaborativamente" 14 | done: "Concluído(a)" 15 | -------------------------------------------------------------------------------- /config/locales/client.ro.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ro: 8 | js: 9 | shared_edits: 10 | edit: "Modifică" 11 | done: "Terminat" 12 | -------------------------------------------------------------------------------- /config/locales/client.ru.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ru: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "Включить совместное редактирование" 11 | disable_shared_edits: "Отключить совместное редактирование" 12 | edit: "Редактировать" 13 | button_title: "Совместное редактирование записи" 14 | done: "Готово" 15 | -------------------------------------------------------------------------------- /config/locales/client.sk.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sk: 8 | js: 9 | shared_edits: 10 | edit: "Upraviť" 11 | done: "Hotovo" 12 | -------------------------------------------------------------------------------- /config/locales/client.sl.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sl: 8 | js: 9 | shared_edits: 10 | edit: "Uredi" 11 | done: "Končano" 12 | -------------------------------------------------------------------------------- /config/locales/client.sq.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sq: 8 | js: 9 | shared_edits: 10 | edit: "Redakto" 11 | done: "Përfundo" 12 | -------------------------------------------------------------------------------- /config/locales/client.sr.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sr: 8 | js: 9 | shared_edits: 10 | edit: "Izmeni" 11 | done: "Gotovo" 12 | -------------------------------------------------------------------------------- /config/locales/client.sv.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sv: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "Aktivera delade redigeringar" 11 | disable_shared_edits: "Inaktivera delade redigeringar" 12 | edit: "Redigera" 13 | button_title: "Redigera inlägg genom samarbete" 14 | done: "Klar" 15 | -------------------------------------------------------------------------------- /config/locales/client.sw.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sw: 8 | js: 9 | shared_edits: 10 | edit: "Hariri" 11 | done: "Imekwisha" 12 | -------------------------------------------------------------------------------- /config/locales/client.te.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | te: 8 | js: 9 | shared_edits: 10 | edit: "సవరణ" 11 | done: "పూర్తయింది" 12 | -------------------------------------------------------------------------------- /config/locales/client.th.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | th: 8 | js: 9 | shared_edits: 10 | edit: "แก้ไข" 11 | done: "เสร็จ" 12 | -------------------------------------------------------------------------------- /config/locales/client.tr_TR.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | tr_TR: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "Paylaşılan Düzenlemeleri Etkinleştir" 11 | disable_shared_edits: "Paylaşılan Düzenlemeleri Devre Dışı Bırak" 12 | edit: "Düzenle" 13 | button_title: "Gönderiyi İş Birliği İçinde Düzenleyin" 14 | done: "Tamamlandı" 15 | -------------------------------------------------------------------------------- /config/locales/client.ug.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ug: 8 | js: 9 | shared_edits: 10 | edit: "تەھرىر" 11 | -------------------------------------------------------------------------------- /config/locales/client.uk.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | uk: 8 | js: 9 | shared_edits: 10 | edit: "Редагувати" 11 | done: "Виконано" 12 | -------------------------------------------------------------------------------- /config/locales/client.ur.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ur: 8 | js: 9 | shared_edits: 10 | edit: "ترمیم کریں" 11 | done: "مکمل" 12 | -------------------------------------------------------------------------------- /config/locales/client.vi.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | vi: 8 | js: 9 | shared_edits: 10 | edit: "Sửa" 11 | done: "Hoàn tất" 12 | -------------------------------------------------------------------------------- /config/locales/client.zh_CN.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | zh_CN: 8 | js: 9 | shared_edits: 10 | enable_shared_edits: "启用共享编辑" 11 | disable_shared_edits: "禁用共享编辑" 12 | edit: "编辑" 13 | button_title: "协作编辑帖子" 14 | done: "完成" 15 | -------------------------------------------------------------------------------- /config/locales/client.zh_TW.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | zh_TW: 8 | js: 9 | shared_edits: 10 | edit: "編輯" 11 | done: "完成" 12 | -------------------------------------------------------------------------------- /config/locales/server.ar.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ar: 8 | shared_edits: 9 | reason: "تم التعديل بواسطة: %{users}" 10 | site_settings: 11 | shared_edits_enabled: تفعيل التعديل التعاوني على المنشورات المحدَّدة. 12 | -------------------------------------------------------------------------------- /config/locales/server.be.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | be: 8 | -------------------------------------------------------------------------------- /config/locales/server.bg.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | bg: 8 | -------------------------------------------------------------------------------- /config/locales/server.bs_BA.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | bs_BA: 8 | -------------------------------------------------------------------------------- /config/locales/server.ca.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ca: 8 | -------------------------------------------------------------------------------- /config/locales/server.cs.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | cs: 8 | -------------------------------------------------------------------------------- /config/locales/server.da.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | da: 8 | -------------------------------------------------------------------------------- /config/locales/server.de.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | de: 8 | shared_edits: 9 | reason: "Bearbeitet von: %{users}" 10 | site_settings: 11 | shared_edits_enabled: Ermögliche die gemeinsame Bearbeitung von bestimmten Beiträgen. 12 | -------------------------------------------------------------------------------- /config/locales/server.el.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | el: 8 | -------------------------------------------------------------------------------- /config/locales/server.en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | shared_edits: 3 | reason: "Edited By: %{users}" 4 | site_settings: 5 | shared_edits_enabled: Enable shared, collaborative, editing on designated posts. 6 | -------------------------------------------------------------------------------- /config/locales/server.en_GB.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | en_GB: 8 | -------------------------------------------------------------------------------- /config/locales/server.es.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | es: 8 | shared_edits: 9 | reason: "Editado por: %{users}" 10 | site_settings: 11 | shared_edits_enabled: Habilitar la edición compartida y colaborativa en las publicaciones designadas. 12 | -------------------------------------------------------------------------------- /config/locales/server.et.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | et: 8 | -------------------------------------------------------------------------------- /config/locales/server.fa_IR.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | fa_IR: 8 | -------------------------------------------------------------------------------- /config/locales/server.fi.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | fi: 8 | shared_edits: 9 | reason: "Muokannut: %{users}" 10 | site_settings: 11 | shared_edits_enabled: Ota käyttöön määritettyjen viestien jakaminen, yhteistyö ja muokkaaminen. 12 | -------------------------------------------------------------------------------- /config/locales/server.fr.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | fr: 8 | shared_edits: 9 | reason: "Modifié par : %{users}" 10 | site_settings: 11 | shared_edits_enabled: Activer le partage, la collaboration et l'édition sur les messages désignés. 12 | -------------------------------------------------------------------------------- /config/locales/server.gl.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | gl: 8 | -------------------------------------------------------------------------------- /config/locales/server.he.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | he: 8 | shared_edits: 9 | reason: "נערך על ידי: %{users}" 10 | site_settings: 11 | shared_edits_enabled: לאפשר עריכה בשיתוף פעולה של פוסטים יעודיים. 12 | -------------------------------------------------------------------------------- /config/locales/server.hr.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | hr: 8 | -------------------------------------------------------------------------------- /config/locales/server.hu.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | hu: 8 | -------------------------------------------------------------------------------- /config/locales/server.hy.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | hy: 8 | -------------------------------------------------------------------------------- /config/locales/server.id.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | id: 8 | -------------------------------------------------------------------------------- /config/locales/server.it.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | it: 8 | shared_edits: 9 | reason: "Modificato da: %{users}" 10 | site_settings: 11 | shared_edits_enabled: Abilita la modifica condivisa e in collaborazione sui messaggi indicati. 12 | -------------------------------------------------------------------------------- /config/locales/server.ja.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ja: 8 | shared_edits: 9 | reason: "編集者: %{users}" 10 | site_settings: 11 | shared_edits_enabled: 指定された投稿での共有、コラボレーション、編集を有効にします。 12 | -------------------------------------------------------------------------------- /config/locales/server.ko.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ko: 8 | -------------------------------------------------------------------------------- /config/locales/server.lt.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | lt: 8 | -------------------------------------------------------------------------------- /config/locales/server.lv.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | lv: 8 | -------------------------------------------------------------------------------- /config/locales/server.nb_NO.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | nb_NO: 8 | -------------------------------------------------------------------------------- /config/locales/server.nl.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | nl: 8 | shared_edits: 9 | reason: "Bewerkt door: %{users}" 10 | site_settings: 11 | shared_edits_enabled: Schakel gedeeld, gezamenlijk bewerken in voor opgegeven berichten. 12 | -------------------------------------------------------------------------------- /config/locales/server.pl_PL.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | pl_PL: 8 | shared_edits: 9 | reason: "Edytowany przez: %{users}" 10 | site_settings: 11 | shared_edits_enabled: Włącz udostępnianie, współpracę, edycję na wyznaczonych postach. 12 | -------------------------------------------------------------------------------- /config/locales/server.pt.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | pt: 8 | -------------------------------------------------------------------------------- /config/locales/server.pt_BR.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | pt_BR: 8 | shared_edits: 9 | reason: "Edição de: %{users}" 10 | site_settings: 11 | shared_edits_enabled: Ative edições colaborativas e compartilhadas nas postagens designadas. 12 | -------------------------------------------------------------------------------- /config/locales/server.ro.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ro: 8 | -------------------------------------------------------------------------------- /config/locales/server.ru.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ru: 8 | shared_edits: 9 | reason: "Отредактировано пользователями: %{users}" 10 | site_settings: 11 | shared_edits_enabled: Разрешить совместное редактирование определенных записей. 12 | -------------------------------------------------------------------------------- /config/locales/server.sk.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sk: 8 | -------------------------------------------------------------------------------- /config/locales/server.sl.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sl: 8 | -------------------------------------------------------------------------------- /config/locales/server.sq.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sq: 8 | -------------------------------------------------------------------------------- /config/locales/server.sr.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sr: 8 | -------------------------------------------------------------------------------- /config/locales/server.sv.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sv: 8 | shared_edits: 9 | reason: "Redigerad av: %{users}" 10 | site_settings: 11 | shared_edits_enabled: Aktivera delad, samverkande, redigering på angivna inlägg. 12 | -------------------------------------------------------------------------------- /config/locales/server.sw.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | sw: 8 | -------------------------------------------------------------------------------- /config/locales/server.te.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | te: 8 | -------------------------------------------------------------------------------- /config/locales/server.th.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | th: 8 | -------------------------------------------------------------------------------- /config/locales/server.tr_TR.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | tr_TR: 8 | shared_edits: 9 | reason: "Düzenleyen: %{users}" 10 | site_settings: 11 | shared_edits_enabled: Belirlenen gönderilerde paylaşılan, iş birliğine dayalı düzenlemeyi etkinleştirin. 12 | -------------------------------------------------------------------------------- /config/locales/server.ug.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ug: 8 | -------------------------------------------------------------------------------- /config/locales/server.uk.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | uk: 8 | -------------------------------------------------------------------------------- /config/locales/server.ur.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | ur: 8 | -------------------------------------------------------------------------------- /config/locales/server.vi.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | vi: 8 | -------------------------------------------------------------------------------- /config/locales/server.zh_CN.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | zh_CN: 8 | shared_edits: 9 | reason: "编辑者:%{users}" 10 | site_settings: 11 | shared_edits_enabled: 在指定帖子上启用共享协作编辑。 12 | -------------------------------------------------------------------------------- /config/locales/server.zh_TW.yml: -------------------------------------------------------------------------------- 1 | # WARNING: Never edit this file. 2 | # It will be overwritten when translations are pulled from Crowdin. 3 | # 4 | # To work with us on translations, join this project: 5 | # https://translate.discourse.org/ 6 | 7 | zh_TW: 8 | -------------------------------------------------------------------------------- /config/settings.yml: -------------------------------------------------------------------------------- 1 | plugins: 2 | shared_edits_enabled: 3 | default: true 4 | client: true 5 | -------------------------------------------------------------------------------- /db/migrate/20200721001123_migrate_shared_edits.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class MigrateSharedEdits < ActiveRecord::Migration[6.0] 4 | def up 5 | create_table :shared_edit_revisions do |t| 6 | t.integer :post_id, null: false 7 | t.string :raw 8 | t.string :revision, null: false 9 | t.integer :user_id, null: false 10 | t.string :client_id, null: false 11 | t.integer :version, null: false 12 | t.integer :post_revision_id 13 | t.timestamps 14 | end 15 | 16 | add_index :shared_edit_revisions, %i[post_id version], unique: true 17 | end 18 | 19 | def down 20 | drop_table :shared_edit_revisions 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import DiscourseRecommended from "@discourse/lint-configs/eslint"; 2 | 3 | export default [...DiscourseRecommended]; 4 | -------------------------------------------------------------------------------- /lib/discourse_shared_edits/guardian_extension.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module DiscourseSharedEdits 4 | module GuardianExtension 5 | extend ActiveSupport::Concern 6 | 7 | def can_toggle_shared_edits? 8 | SiteSetting.shared_edits_enabled && authenticated? && 9 | (is_staff? || @user.has_trust_level?(TrustLevel[4])) 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /lib/ot_text_unicode.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module OtTextUnicode 4 | LOCK = Mutex.new 5 | 6 | def self.context 7 | LOCK.synchronize do 8 | return @context if @context 9 | context = MiniRacer::Context.new 10 | context.eval("module = {exports: {}}") 11 | ot_path = File.expand_path("../../public/javascripts/text-unicode-dist.js", __FILE__) 12 | 13 | context.eval("window = {}; #{File.read(ot_path)}; ot = window.otLib.default.OtUnicode") 14 | 15 | @context = context 16 | end 17 | end 18 | 19 | def self.apply(text, ops = []) 20 | json = String === ops ? ops : ops.to_json 21 | context.eval("ot.apply(#{text.inspect}, #{json})") 22 | end 23 | 24 | def self.compose(ops1 = [], ops2 = []) 25 | json1 = String === ops1 ? ops1 : ops1.to_json 26 | json2 = String === ops2 ? ops2 : ops2.to_json 27 | context.eval("ot.compose(#{json1}, #{json2})") 28 | end 29 | 30 | def self.transform(ops1 = [], ops2 = [], side = "right") 31 | json1 = String === ops1 ? ops1 : ops1.to_json 32 | json2 = String === ops2 ? ops2 : ops2.to_json 33 | context.eval("ot.transform(#{json1}, #{json2}, #{side.inspect})") 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "devDependencies": { 4 | "@discourse/lint-configs": "2.21.0", 5 | "ember-template-lint": "7.7.0", 6 | "eslint": "9.27.0", 7 | "prettier": "3.5.3", 8 | "stylelint": "16.19.1" 9 | }, 10 | "engines": { 11 | "node": ">= 22", 12 | "npm": "please-use-pnpm", 13 | "yarn": "please-use-pnpm", 14 | "pnpm": "9.x" 15 | }, 16 | "packageManager": "pnpm@9.15.5" 17 | } 18 | -------------------------------------------------------------------------------- /plugin.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # name: discourse-shared-edits 4 | # about: Allows multiple users to collaboratively edit posts in real time. 5 | # meta_topic_id: 167583 6 | # version: 0.1.0 7 | # authors: Sam Saffron 8 | # url: https://github.com/discourse/discourse-shared-edits 9 | 10 | enabled_site_setting :shared_edits_enabled 11 | 12 | register_asset "stylesheets/common/discourse-shared-edits.scss" 13 | 14 | after_initialize do 15 | module ::DiscourseSharedEdits 16 | SHARED_EDITS_ENABLED = "shared_edits_enabled" 17 | PLUGIN_NAME = "discourse-shared-edits" 18 | 19 | class Engine < ::Rails::Engine 20 | engine_name PLUGIN_NAME 21 | isolate_namespace ::DiscourseSharedEdits 22 | end 23 | end 24 | 25 | require_relative "lib/ot_text_unicode" 26 | require_relative "app/models/shared_edit_revision" 27 | require_relative "app/controllers/discourse_shared_edits/revision_controller" 28 | require_relative "app/jobs/commit_shared_revision" 29 | require_relative "lib/discourse_shared_edits/guardian_extension" 30 | 31 | ::DiscourseSharedEdits::Engine.routes.draw do 32 | put "/p/:post_id/enable" => "revision#enable" 33 | put "/p/:post_id/disable" => "revision#disable" 34 | put "/p/:post_id" => "revision#revise" 35 | get "/p/:post_id" => "revision#latest" 36 | put "/p/:post_id/commit" => "revision#commit" 37 | end 38 | 39 | Discourse::Application.routes.append { mount ::DiscourseSharedEdits::Engine, at: "/shared_edits" } 40 | 41 | reloadable_patch { Guardian.prepend(DiscourseSharedEdits::GuardianExtension) } 42 | 43 | register_post_custom_field_type(DiscourseSharedEdits::SHARED_EDITS_ENABLED, :boolean) 44 | topic_view_post_custom_fields_allowlister { [DiscourseSharedEdits::SHARED_EDITS_ENABLED] } 45 | 46 | add_to_serializer(:post, :shared_edits_enabled) do 47 | if SiteSetting.shared_edits_enabled 48 | post_custom_fields[DiscourseSharedEdits::SHARED_EDITS_ENABLED] 49 | end 50 | end 51 | end 52 | -------------------------------------------------------------------------------- /public/javascripts/text-unicode-dist.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.otLib=t():e.otLib=t()}(window,(()=>(()=>{var e={75:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t){for(var n=0;nn&&t.length-r>n&&e[e.length-1-r]==t[t.length-1-r];)r++;return r}},{key:"getChangeStart",value:function(e,t){for(var n=0;n0?{action:"insert",start:e.changeStart,payload:e.newString.slice(e.changeStart,e.changeEndIndexNew)}:e.charsRemoved>0&&0===e.charsAdded?{action:"delete",start:e.changeStart,remove:e.charsRemoved}:e.charsRemoved>0&&e.charsAdded>0?{action:"replace",start:e.changeStart,remove:e.charsRemoved,payload:e.newString.substr(e.changeStart,e.charsAdded)}:{action:"noop"},e.raw&&(t.raw=e),t}}]),e}();t.default=new r},935:(e,t,n)=>{"use strict";var r,o=function(){function e(e,t){for(var n=0;n2&&void 0!==arguments[2]&&arguments[2],r=i.default.assignOpts(e,t,n);return i.default.payload(r)}},{key:"transform",value:function(e,t){return this[t.action](e,t)}},{key:"insert",value:function(e,t){return e.slice(0,parseInt(t.start))+t.payload+e.slice(parseInt(t.start))}},{key:"delete",value:function(e,t){return e.slice(0,parseInt(t.start))+e.slice(parseInt(t.start)+parseInt(t.remove))}},{key:"replace",value:function(e,t){return this.insert(this.delete(e,t),t)}},{key:"noop",value:function(e){return e}}]),e}();t.default=new s},213:(e,t,n)=>{e.exports=n(935)},48:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(562),o=n(681);function i(e,t){return{get:e,getLength:()=>e().length,insert(n,r,i){const s=o.strPosToUni(e(),n);return t([s,r],i)},remove(n,r,i){const s=o.strPosToUni(e(),n);return t([s,{d:r}],i)},_onOp(e){r.eachOp(e,((e,t,n)=>{switch(typeof e){case"string":this.onInsert&&this.onInsert(n,e);break;case"object":const t=r.dlen(e.d);this.onRemove&&this.onRemove(n,t)}}))},onInsert:null,onRemove:null}}t.default=i,i.provides={text:!0}},700:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.type=t.remove=t.insert=void 0;const a=n(681),c=i(n(562)),u=s(n(48)),l={create:e=>e,toString:e=>e,builder(e){if("string"!=typeof e)throw Error("Invalid document snapshot: "+e);const t=[];return{skip(n){let r=a.uniToStrPos(e,n);if(r>e.length)throw Error("The op is too long for this document");t.push(e.slice(0,r)),e=e.slice(r)},append(e){t.push(e)},del(t){e=e.slice(a.uniToStrPos(e,t))},build:()=>t.join("")+e}},slice:c.uniSlice},d=c.default(l),f=Object.assign(Object.assign({},d),{api:u.default});t.type=f,t.insert=(e,t)=>0===t.length?[]:0===e?[t]:[e,t],t.remove=(e,t)=>0===c.dlen(t)?[]:0===e?[{d:t}]:[e,{d:t}];var p=n(562);Object.defineProperty(t,"makeType",{enumerable:!0,get:function(){return p.default}})},562:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.uniSlice=t.dlen=t.eachOp=void 0;const r=n(681),o=e=>{if(!Array.isArray(e))throw Error("Op must be an array of components");let n=null;for(let r=0;r0))throw Error("Inserts cannot be empty");break;case"number":if(!(o>0))throw Error("Skip components must be >0");if("number"==typeof n)throw Error("Adjacent skip components should be combined")}n=o}if("number"==typeof n)throw Error("Op has a trailing skip")};function i(e,n){let o=0,i=0;for(let s=0;s{r(t(e,n,o))})),p(n)}t.eachOp=i;const a=e=>e,c=e=>s(e,a);t.dlen=e=>"number"==typeof e?e:r.strPosToUni(e);const u=e=>n=>{if(n&&0!==n.d&&""!==n.d)if(0===e.length)e.push(n);else if(typeof n==typeof e[e.length-1])if("object"==typeof n){const r=e[e.length-1];r.d="string"==typeof r.d&&"string"==typeof n.d?r.d+n.d:t.dlen(r.d)+t.dlen(n.d)}else e[e.length-1]+=n;else e.push(n)},l=e=>"number"==typeof e?e:"string"==typeof e?r.strPosToUni(e):"number"==typeof e.d?e.d:r.strPosToUni(e.d);t.uniSlice=(e,t,n)=>{const o=r.uniToStrPos(e,t),i=null==n?1/0:r.uniToStrPos(e,n);return e.slice(o,i)};const d=(e,n,r)=>"number"==typeof e?null==r?e-n:Math.min(e,r)-n:t.uniSlice(e,n,r),f=e=>{let n=0,o=0;return{take:(i,s)=>{if(n===e.length)return-1===i?null:i;const a=e[n];let c;if("number"==typeof a)return-1===i||a-o<=i?(c=a-o,++n,o=0,c):(o+=i,i);if("string"==typeof a){if(-1===i||"i"===s||r.strPosToUni(a.slice(o))<=i)return c=a.slice(o),++n,o=0,c;{const e=o+r.uniToStrPos(a.slice(o),i);return c=a.slice(o,e),o=e,c}}if(-1===i||"d"===s||t.dlen(a.d)-o<=i)return c={d:d(a.d,o)},++n,o=0,c;{let e=d(a.d,o,o+i);return o+=i,{d:e}}},peek:()=>e[n]}},p=e=>(e.length>0&&"number"==typeof e[e.length-1]&&e.pop(),e);function h(e,n,i){if("left"!==i&&"right"!==i)throw Error("side ("+i+") must be 'left' or 'right'");o(e),o(n);const s=[],a=u(s),{take:c,peek:d}=f(e);for(let e=0;e0;)u=c(s,"i"),a(u),"string"!=typeof u&&(s-=l(u));break;case"string":"left"===i&&"string"==typeof d()&&a(c(-1)),a(r.strPosToUni(o));break;case"object":for(s=t.dlen(o.d);s>0;)switch(u=c(s,"i"),typeof u){case"number":s-=u;break;case"string":a(u);break;case"object":s-=t.dlen(u.d)}}}let h;for(;h=c(-1);)a(h);return p(s)}function b(e,n){o(e),o(n);const i=[],s=u(i),{take:a}=f(e);for(let e=0;e0;)c=a(i,"d"),s(c),"object"!=typeof c&&(i-=l(c));break;case"string":s(o);break;case"object":i=t.dlen(o.d);let e=0;for(;e{let o=0;for(let i=0;io;i++){const s=n[i];switch(typeof s){case"number":o+=s;break;case"string":const n=r.strPosToUni(s);o+=n,e+=n;break;case"object":e-=Math.min(t.dlen(s.d),e-o)}}return e},y=(e,t)=>"number"==typeof e?g(e,t):e.map((e=>g(e,t)));function m(e,t,n){return s(e,((e,r)=>"object"==typeof e&&"number"==typeof e.d?{d:n.slice(t,r,r+e.d)}:e))}function v(e){return s(e,(e=>{switch(typeof e){case"object":if("number"==typeof e.d)throw Error("Cannot invert text op: Deleted characters missing from operation. makeInvertible must be called first.");return e.d;case"string":return{d:e};case"number":return e}}))}function w(e){return s(e,(e=>"object"==typeof e&&"string"==typeof e.d?{d:r.strPosToUni(e.d)}:e))}function k(e){let t=!0;return i(e,(e=>{"object"==typeof e&&"number"==typeof e.d&&(t=!1)})),t}t.default=function(e){return{name:"text-unicode",uri:"http://sharejs.org/types/text-unicode",trim:p,normalize:c,checkOp:o,create(t=""){if("string"!=typeof t)throw Error("Initial data must be a string");return e.create(t)},apply(n,r){o(r);const i=e.builder(n);for(let e=0;em(t,n,e),stripInvertible:w,invert:v,invertWithDoc:(t,n)=>v(m(t,n,e)),isNoop:e=>0===e.length}}},681:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.uniToStrPos=t.strPosToUni=void 0,t.strPosToUni=(e,t=e.length)=>{let n=0,r=0;for(;r=55296&&t<=57343&&(n++,r++)}if(r!==t)throw Error("Invalid offset - splits unicode bytes");return r-n},t.uniToStrPos=(e,t)=>{let n=0;for(;t>0;t--){const t=e.charCodeAt(n);n+=t>=55296&&t<=57343?2:1}return n}}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};return(()=>{"use strict";n.r(r),n.d(r,{default:()=>o});var e=n(213),t=n(700);const o={OtDiff:e.default,OtUnicode:t.type}})(),r})())); -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Discourse Shared Edits Plugin 2 | 3 | Discourse shared edits allows multiple users to collaboratively edit posts in real time. 4 | This feature is default disabled and must be enabled explicitly by moderators on posts. 5 | 6 | For more information, please see: https://meta.discourse.org/t/discourse-shared-edits/167583 7 | -------------------------------------------------------------------------------- /spec/lib/guardian_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | RSpec.describe Guardian do 4 | fab!(:moderator) 5 | fab!(:user) 6 | 7 | it "disallows shared edits from anon" do 8 | expect(Guardian.new.can_toggle_shared_edits?).to eq(false) 9 | end 10 | 11 | it "disallows shared edits for tl3 users" do 12 | user.trust_level = 3 13 | expect(Guardian.new(user).can_toggle_shared_edits?).to eq(false) 14 | end 15 | 16 | it "allows shared edits for staff" do 17 | expect(Guardian.new(moderator).can_toggle_shared_edits?).to eq(true) 18 | end 19 | 20 | it "allows shared edits for tl4" do 21 | user.trust_level = 4 22 | expect(Guardian.new(user).can_toggle_shared_edits?).to eq(true) 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /spec/lib/ot_text_unicode_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | RSpec.describe OtTextUnicode do 4 | it "can apply operations to text" do 5 | result = OtTextUnicode.apply("😎hello world", [7, { d: 9 }, "hello"]) 6 | expect(result).to eq("😎hello hello") 7 | end 8 | 9 | it "what happens when stuff is stacked" do 10 | text = "I like bananas" 11 | op1 = [2, { d: 4 }, "eat"] 12 | op2 = [7, { d: 7 }, "apples"] 13 | 14 | op1a = OtTextUnicode.transform(op1, op2) 15 | 16 | result = OtTextUnicode.apply(text, op2) 17 | result = OtTextUnicode.apply(result, op1a) 18 | 19 | expect(result).to eq("I eat apples") 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /spec/models/shared_edit_revision_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | RSpec.describe SharedEditRevision do 4 | def fake_edit(post, user_id, data, version:) 5 | SharedEditRevision.revise!( 6 | post_id: post.id, 7 | user_id: user_id, 8 | client_id: user_id, 9 | revision: data.to_json, 10 | version: version, 11 | ) 12 | end 13 | 14 | it "can resolve complex edits and notify" do 15 | raw = <<~RAW 16 | 0123456 17 | 0123456 18 | 0123456 19 | RAW 20 | 21 | user1 = Fabricate(:user) 22 | user2 = Fabricate(:user) 23 | 24 | post = Fabricate(:post, raw: raw) 25 | SharedEditRevision.init!(post) 26 | 27 | version, revision = nil 28 | 29 | messages = 30 | MessageBus.track_publish("/shared_edits/#{post.id}") do 31 | version, revision = fake_edit(post, user1.id, [8, { d: 7 }, "mister"], version: 1) 32 | end 33 | 34 | expected_rev = [8, { d: 7 }, "mister"].to_json 35 | expect(messages.length).to eq(1) 36 | expect(messages.first.data[:version]).to eq(2) 37 | expect(messages.first.data[:revision]).to eq(expected_rev) 38 | 39 | expect(version).to eq(2) 40 | expect(revision).to eq(expected_rev) 41 | 42 | SharedEditRevision.commit!(post.id) 43 | 44 | new_raw = (<<~RAW).strip 45 | 0123456 46 | mister 47 | 0123456 48 | RAW 49 | 50 | post.reload 51 | expect(post.raw).to eq(new_raw) 52 | 53 | version, revision = fake_edit(post, user2.id, [{ d: 7 }, "hello"], version: 1) 54 | 55 | expect(version).to eq(3) 56 | expect(revision).to eq("[{\"d\":7},\"hello\"]") 57 | 58 | version, revision = fake_edit(post, user1.id, [16, { d: 7 }, "world"], version: 1) 59 | 60 | expect(version).to eq(4) 61 | expect(revision).to eq("[13,{\"d\":7},\"world\"]") 62 | 63 | fake_edit(post, 3, [{ d: 1 }, "H"], version: 3) 64 | 65 | SharedEditRevision.commit!(post.id) 66 | 67 | new_raw = (<<~RAW).strip 68 | Hello 69 | mister 70 | world 71 | RAW 72 | 73 | post.reload 74 | 75 | expect(post.raw).to eq(new_raw) 76 | 77 | rev = post.revisions.order(:number).first 78 | 79 | reason = rev.modifications["edit_reason"][1].to_s 80 | expect(reason).to include(user1.username) 81 | expect(reason).to include(user2.username) 82 | expect(reason).not_to include("d,") 83 | 84 | edit_rev = SharedEditRevision.where(post_id: post.id).order("version desc").first 85 | 86 | expect(edit_rev.post_revision_id).to eq(rev.id) 87 | end 88 | 89 | it "does not update the post if validation fails" do 90 | user = Fabricate(:admin) 91 | post = Fabricate(:post, user: user, raw: "Hello world") 92 | 93 | SharedEditRevision.init!(post) 94 | SharedEditRevision.revise!( 95 | post_id: post.id, 96 | user_id: user.id, 97 | client_id: user.id, 98 | revision: [{ d: 11 }, "Test"], 99 | version: 1, 100 | ) 101 | 102 | expect(post.reload.raw).to eq("Hello world") 103 | end 104 | end 105 | -------------------------------------------------------------------------------- /spec/requests/revision_controller_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | RSpec.describe DiscourseSharedEdits::RevisionController do 4 | fab!(:post1) { Fabricate(:post) } 5 | fab!(:admin) 6 | fab!(:user) 7 | 8 | context :admin do 9 | before { sign_in admin } 10 | 11 | it "is hard disabled when plugin is disabled" do 12 | SiteSetting.shared_edits_enabled = false 13 | put "/shared_edits/p/#{post1.id}/enable" 14 | expect(response.status).to eq(404) 15 | end 16 | 17 | it "is able to enable revisions on a post" do 18 | put "/shared_edits/p/#{post1.id}/enable" 19 | expect(response.status).to eq(200) 20 | 21 | post1.reload 22 | expect(post1.custom_fields[DiscourseSharedEdits::SHARED_EDITS_ENABLED]).to eq(true) 23 | 24 | put "/shared_edits/p/#{post1.id}/disable" 25 | expect(response.status).to eq(200) 26 | 27 | post1.reload 28 | expect(post1.custom_fields[DiscourseSharedEdits::SHARED_EDITS_ENABLED]).to eq(nil) 29 | end 30 | end 31 | 32 | context :user do 33 | before do 34 | sign_in user 35 | SharedEditRevision.toggle_shared_edits!(post1.id, true) 36 | end 37 | 38 | it "can submit edits on a post" do 39 | put "/shared_edits/p/#{post1.id}", 40 | params: { 41 | client_id: "abc", 42 | version: 1, 43 | revision: [{ d: 4 }, "1234"].to_json, 44 | } 45 | expect(response.status).to eq(200) 46 | 47 | SharedEditRevision.commit!(post1.id) 48 | 49 | post1.reload 50 | expect(post1.raw[0..3]).to eq("1234") 51 | end 52 | 53 | it "can get the latest version" do 54 | put "/shared_edits/p/#{post1.id}", 55 | params: { 56 | client_id: "abc", 57 | version: 1, 58 | revision: [{ d: 4 }, "1234"].to_json, 59 | } 60 | 61 | get "/shared_edits/p/#{post1.id}" 62 | expect(response.status).to eq(200) 63 | 64 | raw = response.parsed_body["raw"] 65 | version = response.parsed_body["version"] 66 | 67 | expect(raw[0..3]).to eq("1234") 68 | expect(version).to eq(2) 69 | end 70 | 71 | it "will defer commit" do 72 | Discourse.redis.del SharedEditRevision.will_commit_key(post1.id) 73 | 74 | Sidekiq::Testing.inline! do 75 | put "/shared_edits/p/#{post1.id}", 76 | params: { 77 | client_id: "abc", 78 | version: 1, 79 | revision: [{ d: 4 }, "1234"].to_json, 80 | } 81 | 82 | get "/shared_edits/p/#{post1.id}" 83 | expect(response.status).to eq(200) 84 | 85 | raw = response.parsed_body["raw"] 86 | version = response.parsed_body["version"] 87 | 88 | expect(raw[0..3]).to eq("1234") 89 | expect(version).to eq(2) 90 | end 91 | end 92 | 93 | it "can submit old edits to a post and get sane info" do 94 | put "/shared_edits/p/#{post1.id}", 95 | params: { 96 | client_id: "abc", 97 | version: 1, 98 | revision: [{ d: 4 }, "1234"].to_json, 99 | } 100 | 101 | put "/shared_edits/p/#{post1.id}", 102 | params: { 103 | client_id: "123", 104 | version: 1, 105 | revision: [4, { d: 4 }, "abcd"].to_json, 106 | } 107 | expect(response.status).to eq(200) 108 | 109 | SharedEditRevision.commit!(post1.id) 110 | 111 | post1.reload 112 | expect(post1.raw[4..7]).to eq("abcd") 113 | end 114 | 115 | it "can not enable revisions as normal user" do 116 | put "/shared_edits/p/#{post1.id}/enable" 117 | expect(response.status).to eq(403) 118 | put "/shared_edits/p/#{post1.id}/disable" 119 | expect(response.status).to eq(403) 120 | end 121 | end 122 | end 123 | -------------------------------------------------------------------------------- /spec/serializers/post_serializer_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | RSpec.describe PostSerializer do 4 | fab!(:post) 5 | 6 | before { SiteSetting.shared_edits_enabled } 7 | 8 | describe "#shared_edits_enabled" do 9 | before do 10 | post.custom_fields[DiscourseSharedEdits::SHARED_EDITS_ENABLED] = true 11 | post.save_custom_fields 12 | end 13 | 14 | it "returns the right value when shared edits exists for a post" do 15 | payload = PostSerializer.new(post, scope: Guardian.new, root: false).as_json 16 | 17 | expect(payload[:shared_edits_enabled]).to eq(true) 18 | end 19 | 20 | it "returns the right value when shared edits exists in the topic view context" do 21 | serializer = PostSerializer.new(post, scope: Guardian.new, root: false) 22 | serializer.topic_view = TopicView.new(post.topic) 23 | 24 | expect(serializer.as_json[:shared_edits_enabled]).to eq(true) 25 | end 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /spec/system/core_features_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | RSpec.describe "Core features", type: :system do 4 | before { enable_current_plugin } 5 | 6 | it_behaves_like "having working core features" 7 | end 8 | -------------------------------------------------------------------------------- /spec/system/edit_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | RSpec.describe "Discourse Shared Edits | Editing a post", system: true do 4 | fab!(:admin) 5 | fab!(:post) { Fabricate(:post, user: admin, raw: "lorem ipsum\n") } 6 | let(:composer) { PageObjects::Components::Composer.new } 7 | 8 | before { sign_in(admin) } 9 | 10 | %w[enabled disabled].each do |value| 11 | before { SiteSetting.glimmer_post_stream_mode = value } 12 | 13 | context "when glimmer_post_stream_mode=#{value}" do 14 | it "allows the user to edit and save a post" do 15 | visit(post.topic.relative_url) 16 | 17 | find(".show-more-actions").click 18 | find(".show-post-admin-menu").click 19 | find(".admin-toggle-shared-edits").click 20 | 21 | try_until_success do 22 | revision = SharedEditRevision.find_by(post_id: post.id, version: 1) 23 | expect(revision).to be_present 24 | expect(revision.raw).to eq("lorem ipsum\n") 25 | expect(revision.revision).to eq("[]") 26 | expect(SharedEditRevision.count).to eq(1) 27 | end 28 | 29 | find(".shared-edit").click 30 | expect(composer).to have_content("lorem ipsum") 31 | 32 | composer.type_content "foo" 33 | try_until_success do 34 | revision = SharedEditRevision.find_by(post_id: post.id, version: 2) 35 | expect(revision).to be_present 36 | expect(revision.revision).to eq("[12,\"foo\"]") 37 | expect(SharedEditRevision.count).to eq(2) 38 | end 39 | 40 | composer.type_content " bar" 41 | try_until_success do 42 | revision = SharedEditRevision.find_by(post_id: post.id, version: 3) 43 | expect(revision).to be_present 44 | expect(revision.revision).to eq("[15,\" bar\"]") 45 | expect(SharedEditRevision.count).to eq(3) 46 | end 47 | 48 | find(".leave-shared-edit .btn-primary").click 49 | try_until_success do 50 | expect(post.reload.raw).to eq("lorem ipsum\nfoo bar") 51 | expect(find("#post_1 .cooked > p")).to have_content("lorem ipsum\nfoo bar") 52 | expect(SharedEditRevision.count).to eq(3) 53 | end 54 | end 55 | end 56 | end 57 | end 58 | -------------------------------------------------------------------------------- /stylelint.config.mjs: -------------------------------------------------------------------------------- 1 | export default { 2 | extends: ["@discourse/lint-configs/stylelint"], 3 | }; 4 | -------------------------------------------------------------------------------- /support/fake_writer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | require "fileutils" 3 | 4 | Dir.chdir(File.expand_path("../../../..", __FILE__)) do # rubocop:disable Discourse/NoChdir 5 | require File.expand_path("../../config/environment", __FILE__) 6 | 7 | post_id = ARGV[0].to_i 8 | 9 | if post_id == 0 10 | STDERR.puts "Please specify a post id" 11 | exit 1 12 | end 13 | 14 | puts "Simulating writing on #{post_id}" 15 | 16 | post = Post.find(post_id) 17 | 18 | revisions = %w[the quick brown fox jumped over the lazy fox.].map { |s| s + " " } 19 | 20 | revisions << { d: revisions.join.length } 21 | 22 | i = 0 23 | while true 24 | rev = [revisions[i % revisions.length]] 25 | ver = SharedEditRevision.where(post_id: post_id).maximum(:version) 26 | SharedEditRevision.revise!( 27 | post_id: post.id, 28 | user_id: 1, 29 | client_id: "a", 30 | revision: rev, 31 | version: ver, 32 | ) 33 | sleep(rand * 0.2 + 0.5) 34 | print "." 35 | i += 1 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /support/text-unicode-webpack/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "text-unicode-webpack", 3 | "private": true, 4 | "main": "index.js", 5 | "dependencies": { 6 | "ot-diff": "^1.1.1", 7 | "ot-text-unicode": "^4.0.0" 8 | }, 9 | "devDependencies": { 10 | "@babel/core": "^7.24.0", 11 | "@babel/preset-env": "^7.24.0", 12 | "babel-loader": "^9.1.3", 13 | "webpack": "^5.94.0", 14 | "webpack-cli": "^5.1.4" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /support/text-unicode-webpack/src/index.js: -------------------------------------------------------------------------------- 1 | import OtDiff from "ot-diff"; 2 | import { type } from "ot-text-unicode"; 3 | 4 | export default { OtDiff, OtUnicode: type }; 5 | -------------------------------------------------------------------------------- /support/text-unicode-webpack/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | 3 | module.exports = { 4 | mode: "production", 5 | output: { 6 | path: path.resolve(__dirname, "..", "..", "public", "javascripts"), 7 | filename: "text-unicode-dist.js", 8 | library: "otLib", 9 | libraryTarget: "umd", 10 | globalObject: "window", 11 | }, 12 | module: { 13 | rules: [ 14 | { 15 | test: /\.js$/, 16 | use: { loader: "babel-loader" }, 17 | }, 18 | ], 19 | }, 20 | }; 21 | -------------------------------------------------------------------------------- /support/text-unicode-webpack/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ampproject/remapping@^2.2.0": 6 | version "2.3.0" 7 | resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" 8 | integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== 9 | dependencies: 10 | "@jridgewell/gen-mapping" "^0.3.5" 11 | "@jridgewell/trace-mapping" "^0.3.24" 12 | 13 | "@babel/code-frame@^7.23.5": 14 | version "7.23.5" 15 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" 16 | integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== 17 | dependencies: 18 | "@babel/highlight" "^7.23.4" 19 | chalk "^2.4.2" 20 | 21 | "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5": 22 | version "7.23.5" 23 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" 24 | integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== 25 | 26 | "@babel/core@^7.24.0": 27 | version "7.24.0" 28 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.0.tgz#56cbda6b185ae9d9bed369816a8f4423c5f2ff1b" 29 | integrity sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw== 30 | dependencies: 31 | "@ampproject/remapping" "^2.2.0" 32 | "@babel/code-frame" "^7.23.5" 33 | "@babel/generator" "^7.23.6" 34 | "@babel/helper-compilation-targets" "^7.23.6" 35 | "@babel/helper-module-transforms" "^7.23.3" 36 | "@babel/helpers" "^7.24.0" 37 | "@babel/parser" "^7.24.0" 38 | "@babel/template" "^7.24.0" 39 | "@babel/traverse" "^7.24.0" 40 | "@babel/types" "^7.24.0" 41 | convert-source-map "^2.0.0" 42 | debug "^4.1.0" 43 | gensync "^1.0.0-beta.2" 44 | json5 "^2.2.3" 45 | semver "^6.3.1" 46 | 47 | "@babel/generator@^7.23.6": 48 | version "7.23.6" 49 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" 50 | integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== 51 | dependencies: 52 | "@babel/types" "^7.23.6" 53 | "@jridgewell/gen-mapping" "^0.3.2" 54 | "@jridgewell/trace-mapping" "^0.3.17" 55 | jsesc "^2.5.1" 56 | 57 | "@babel/helper-annotate-as-pure@^7.22.5": 58 | version "7.22.5" 59 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" 60 | integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== 61 | dependencies: 62 | "@babel/types" "^7.22.5" 63 | 64 | "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": 65 | version "7.22.15" 66 | resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" 67 | integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== 68 | dependencies: 69 | "@babel/types" "^7.22.15" 70 | 71 | "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": 72 | version "7.23.6" 73 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" 74 | integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== 75 | dependencies: 76 | "@babel/compat-data" "^7.23.5" 77 | "@babel/helper-validator-option" "^7.23.5" 78 | browserslist "^4.22.2" 79 | lru-cache "^5.1.1" 80 | semver "^6.3.1" 81 | 82 | "@babel/helper-create-class-features-plugin@^7.22.15": 83 | version "7.24.0" 84 | resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz#fc7554141bdbfa2d17f7b4b80153b9b090e5d158" 85 | integrity sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g== 86 | dependencies: 87 | "@babel/helper-annotate-as-pure" "^7.22.5" 88 | "@babel/helper-environment-visitor" "^7.22.20" 89 | "@babel/helper-function-name" "^7.23.0" 90 | "@babel/helper-member-expression-to-functions" "^7.23.0" 91 | "@babel/helper-optimise-call-expression" "^7.22.5" 92 | "@babel/helper-replace-supers" "^7.22.20" 93 | "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" 94 | "@babel/helper-split-export-declaration" "^7.22.6" 95 | semver "^6.3.1" 96 | 97 | "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": 98 | version "7.22.15" 99 | resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" 100 | integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== 101 | dependencies: 102 | "@babel/helper-annotate-as-pure" "^7.22.5" 103 | regexpu-core "^5.3.1" 104 | semver "^6.3.1" 105 | 106 | "@babel/helper-define-polyfill-provider@^0.5.0": 107 | version "0.5.0" 108 | resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b" 109 | integrity sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q== 110 | dependencies: 111 | "@babel/helper-compilation-targets" "^7.22.6" 112 | "@babel/helper-plugin-utils" "^7.22.5" 113 | debug "^4.1.1" 114 | lodash.debounce "^4.0.8" 115 | resolve "^1.14.2" 116 | 117 | "@babel/helper-define-polyfill-provider@^0.6.0": 118 | version "0.6.0" 119 | resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.0.tgz#4d1a8b898c8299a2fcf295d7d356d2648471ab31" 120 | integrity sha512-efwOM90nCG6YeT8o3PCyBVSxRfmILxCNL+TNI8CGQl7a62M0Wd9VkV+XHwIlkOz1r4b+lxu6gBjdWiOMdUCrCQ== 121 | dependencies: 122 | "@babel/helper-compilation-targets" "^7.22.6" 123 | "@babel/helper-plugin-utils" "^7.22.5" 124 | debug "^4.1.1" 125 | lodash.debounce "^4.0.8" 126 | resolve "^1.14.2" 127 | 128 | "@babel/helper-environment-visitor@^7.22.20": 129 | version "7.22.20" 130 | resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" 131 | integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== 132 | 133 | "@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": 134 | version "7.23.0" 135 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" 136 | integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== 137 | dependencies: 138 | "@babel/template" "^7.22.15" 139 | "@babel/types" "^7.23.0" 140 | 141 | "@babel/helper-hoist-variables@^7.22.5": 142 | version "7.22.5" 143 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" 144 | integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== 145 | dependencies: 146 | "@babel/types" "^7.22.5" 147 | 148 | "@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": 149 | version "7.23.0" 150 | resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" 151 | integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== 152 | dependencies: 153 | "@babel/types" "^7.23.0" 154 | 155 | "@babel/helper-module-imports@^7.22.15": 156 | version "7.22.15" 157 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" 158 | integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== 159 | dependencies: 160 | "@babel/types" "^7.22.15" 161 | 162 | "@babel/helper-module-transforms@^7.23.3": 163 | version "7.23.3" 164 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" 165 | integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== 166 | dependencies: 167 | "@babel/helper-environment-visitor" "^7.22.20" 168 | "@babel/helper-module-imports" "^7.22.15" 169 | "@babel/helper-simple-access" "^7.22.5" 170 | "@babel/helper-split-export-declaration" "^7.22.6" 171 | "@babel/helper-validator-identifier" "^7.22.20" 172 | 173 | "@babel/helper-optimise-call-expression@^7.22.5": 174 | version "7.22.5" 175 | resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" 176 | integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== 177 | dependencies: 178 | "@babel/types" "^7.22.5" 179 | 180 | "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": 181 | version "7.24.0" 182 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" 183 | integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== 184 | 185 | "@babel/helper-remap-async-to-generator@^7.22.20": 186 | version "7.22.20" 187 | resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" 188 | integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== 189 | dependencies: 190 | "@babel/helper-annotate-as-pure" "^7.22.5" 191 | "@babel/helper-environment-visitor" "^7.22.20" 192 | "@babel/helper-wrap-function" "^7.22.20" 193 | 194 | "@babel/helper-replace-supers@^7.22.20": 195 | version "7.22.20" 196 | resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" 197 | integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== 198 | dependencies: 199 | "@babel/helper-environment-visitor" "^7.22.20" 200 | "@babel/helper-member-expression-to-functions" "^7.22.15" 201 | "@babel/helper-optimise-call-expression" "^7.22.5" 202 | 203 | "@babel/helper-simple-access@^7.22.5": 204 | version "7.22.5" 205 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" 206 | integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== 207 | dependencies: 208 | "@babel/types" "^7.22.5" 209 | 210 | "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": 211 | version "7.22.5" 212 | resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" 213 | integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== 214 | dependencies: 215 | "@babel/types" "^7.22.5" 216 | 217 | "@babel/helper-split-export-declaration@^7.22.6": 218 | version "7.22.6" 219 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" 220 | integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== 221 | dependencies: 222 | "@babel/types" "^7.22.5" 223 | 224 | "@babel/helper-string-parser@^7.23.4": 225 | version "7.23.4" 226 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" 227 | integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== 228 | 229 | "@babel/helper-validator-identifier@^7.22.20": 230 | version "7.22.20" 231 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" 232 | integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== 233 | 234 | "@babel/helper-validator-option@^7.23.5": 235 | version "7.23.5" 236 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" 237 | integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== 238 | 239 | "@babel/helper-wrap-function@^7.22.20": 240 | version "7.22.20" 241 | resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" 242 | integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== 243 | dependencies: 244 | "@babel/helper-function-name" "^7.22.5" 245 | "@babel/template" "^7.22.15" 246 | "@babel/types" "^7.22.19" 247 | 248 | "@babel/helpers@^7.24.0": 249 | version "7.24.0" 250 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.0.tgz#a3dd462b41769c95db8091e49cfe019389a9409b" 251 | integrity sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA== 252 | dependencies: 253 | "@babel/template" "^7.24.0" 254 | "@babel/traverse" "^7.24.0" 255 | "@babel/types" "^7.24.0" 256 | 257 | "@babel/highlight@^7.23.4": 258 | version "7.23.4" 259 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" 260 | integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== 261 | dependencies: 262 | "@babel/helper-validator-identifier" "^7.22.20" 263 | chalk "^2.4.2" 264 | js-tokens "^4.0.0" 265 | 266 | "@babel/parser@^7.24.0": 267 | version "7.24.0" 268 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" 269 | integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== 270 | 271 | "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": 272 | version "7.23.3" 273 | resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" 274 | integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== 275 | dependencies: 276 | "@babel/helper-plugin-utils" "^7.22.5" 277 | 278 | "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": 279 | version "7.23.3" 280 | resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" 281 | integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== 282 | dependencies: 283 | "@babel/helper-plugin-utils" "^7.22.5" 284 | "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" 285 | "@babel/plugin-transform-optional-chaining" "^7.23.3" 286 | 287 | "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7": 288 | version "7.23.7" 289 | resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b" 290 | integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw== 291 | dependencies: 292 | "@babel/helper-environment-visitor" "^7.22.20" 293 | "@babel/helper-plugin-utils" "^7.22.5" 294 | 295 | "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": 296 | version "7.21.0-placeholder-for-preset-env.2" 297 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" 298 | integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== 299 | 300 | "@babel/plugin-syntax-async-generators@^7.8.4": 301 | version "7.8.4" 302 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" 303 | integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== 304 | dependencies: 305 | "@babel/helper-plugin-utils" "^7.8.0" 306 | 307 | "@babel/plugin-syntax-class-properties@^7.12.13": 308 | version "7.12.13" 309 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" 310 | integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== 311 | dependencies: 312 | "@babel/helper-plugin-utils" "^7.12.13" 313 | 314 | "@babel/plugin-syntax-class-static-block@^7.14.5": 315 | version "7.14.5" 316 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" 317 | integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== 318 | dependencies: 319 | "@babel/helper-plugin-utils" "^7.14.5" 320 | 321 | "@babel/plugin-syntax-dynamic-import@^7.8.3": 322 | version "7.8.3" 323 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" 324 | integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== 325 | dependencies: 326 | "@babel/helper-plugin-utils" "^7.8.0" 327 | 328 | "@babel/plugin-syntax-export-namespace-from@^7.8.3": 329 | version "7.8.3" 330 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" 331 | integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== 332 | dependencies: 333 | "@babel/helper-plugin-utils" "^7.8.3" 334 | 335 | "@babel/plugin-syntax-import-assertions@^7.23.3": 336 | version "7.23.3" 337 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" 338 | integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== 339 | dependencies: 340 | "@babel/helper-plugin-utils" "^7.22.5" 341 | 342 | "@babel/plugin-syntax-import-attributes@^7.23.3": 343 | version "7.23.3" 344 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" 345 | integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== 346 | dependencies: 347 | "@babel/helper-plugin-utils" "^7.22.5" 348 | 349 | "@babel/plugin-syntax-import-meta@^7.10.4": 350 | version "7.10.4" 351 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" 352 | integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== 353 | dependencies: 354 | "@babel/helper-plugin-utils" "^7.10.4" 355 | 356 | "@babel/plugin-syntax-json-strings@^7.8.3": 357 | version "7.8.3" 358 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" 359 | integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== 360 | dependencies: 361 | "@babel/helper-plugin-utils" "^7.8.0" 362 | 363 | "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": 364 | version "7.10.4" 365 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" 366 | integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== 367 | dependencies: 368 | "@babel/helper-plugin-utils" "^7.10.4" 369 | 370 | "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": 371 | version "7.8.3" 372 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" 373 | integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== 374 | dependencies: 375 | "@babel/helper-plugin-utils" "^7.8.0" 376 | 377 | "@babel/plugin-syntax-numeric-separator@^7.10.4": 378 | version "7.10.4" 379 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" 380 | integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== 381 | dependencies: 382 | "@babel/helper-plugin-utils" "^7.10.4" 383 | 384 | "@babel/plugin-syntax-object-rest-spread@^7.8.3": 385 | version "7.8.3" 386 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" 387 | integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== 388 | dependencies: 389 | "@babel/helper-plugin-utils" "^7.8.0" 390 | 391 | "@babel/plugin-syntax-optional-catch-binding@^7.8.3": 392 | version "7.8.3" 393 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" 394 | integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== 395 | dependencies: 396 | "@babel/helper-plugin-utils" "^7.8.0" 397 | 398 | "@babel/plugin-syntax-optional-chaining@^7.8.3": 399 | version "7.8.3" 400 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" 401 | integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== 402 | dependencies: 403 | "@babel/helper-plugin-utils" "^7.8.0" 404 | 405 | "@babel/plugin-syntax-private-property-in-object@^7.14.5": 406 | version "7.14.5" 407 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" 408 | integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== 409 | dependencies: 410 | "@babel/helper-plugin-utils" "^7.14.5" 411 | 412 | "@babel/plugin-syntax-top-level-await@^7.14.5": 413 | version "7.14.5" 414 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" 415 | integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== 416 | dependencies: 417 | "@babel/helper-plugin-utils" "^7.14.5" 418 | 419 | "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": 420 | version "7.18.6" 421 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" 422 | integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== 423 | dependencies: 424 | "@babel/helper-create-regexp-features-plugin" "^7.18.6" 425 | "@babel/helper-plugin-utils" "^7.18.6" 426 | 427 | "@babel/plugin-transform-arrow-functions@^7.23.3": 428 | version "7.23.3" 429 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" 430 | integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== 431 | dependencies: 432 | "@babel/helper-plugin-utils" "^7.22.5" 433 | 434 | "@babel/plugin-transform-async-generator-functions@^7.23.9": 435 | version "7.23.9" 436 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz#9adaeb66fc9634a586c5df139c6240d41ed801ce" 437 | integrity sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ== 438 | dependencies: 439 | "@babel/helper-environment-visitor" "^7.22.20" 440 | "@babel/helper-plugin-utils" "^7.22.5" 441 | "@babel/helper-remap-async-to-generator" "^7.22.20" 442 | "@babel/plugin-syntax-async-generators" "^7.8.4" 443 | 444 | "@babel/plugin-transform-async-to-generator@^7.23.3": 445 | version "7.23.3" 446 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" 447 | integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== 448 | dependencies: 449 | "@babel/helper-module-imports" "^7.22.15" 450 | "@babel/helper-plugin-utils" "^7.22.5" 451 | "@babel/helper-remap-async-to-generator" "^7.22.20" 452 | 453 | "@babel/plugin-transform-block-scoped-functions@^7.23.3": 454 | version "7.23.3" 455 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" 456 | integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== 457 | dependencies: 458 | "@babel/helper-plugin-utils" "^7.22.5" 459 | 460 | "@babel/plugin-transform-block-scoping@^7.23.4": 461 | version "7.23.4" 462 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" 463 | integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== 464 | dependencies: 465 | "@babel/helper-plugin-utils" "^7.22.5" 466 | 467 | "@babel/plugin-transform-class-properties@^7.23.3": 468 | version "7.23.3" 469 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" 470 | integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== 471 | dependencies: 472 | "@babel/helper-create-class-features-plugin" "^7.22.15" 473 | "@babel/helper-plugin-utils" "^7.22.5" 474 | 475 | "@babel/plugin-transform-class-static-block@^7.23.4": 476 | version "7.23.4" 477 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" 478 | integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== 479 | dependencies: 480 | "@babel/helper-create-class-features-plugin" "^7.22.15" 481 | "@babel/helper-plugin-utils" "^7.22.5" 482 | "@babel/plugin-syntax-class-static-block" "^7.14.5" 483 | 484 | "@babel/plugin-transform-classes@^7.23.8": 485 | version "7.23.8" 486 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" 487 | integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg== 488 | dependencies: 489 | "@babel/helper-annotate-as-pure" "^7.22.5" 490 | "@babel/helper-compilation-targets" "^7.23.6" 491 | "@babel/helper-environment-visitor" "^7.22.20" 492 | "@babel/helper-function-name" "^7.23.0" 493 | "@babel/helper-plugin-utils" "^7.22.5" 494 | "@babel/helper-replace-supers" "^7.22.20" 495 | "@babel/helper-split-export-declaration" "^7.22.6" 496 | globals "^11.1.0" 497 | 498 | "@babel/plugin-transform-computed-properties@^7.23.3": 499 | version "7.23.3" 500 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" 501 | integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== 502 | dependencies: 503 | "@babel/helper-plugin-utils" "^7.22.5" 504 | "@babel/template" "^7.22.15" 505 | 506 | "@babel/plugin-transform-destructuring@^7.23.3": 507 | version "7.23.3" 508 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" 509 | integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== 510 | dependencies: 511 | "@babel/helper-plugin-utils" "^7.22.5" 512 | 513 | "@babel/plugin-transform-dotall-regex@^7.23.3": 514 | version "7.23.3" 515 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" 516 | integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== 517 | dependencies: 518 | "@babel/helper-create-regexp-features-plugin" "^7.22.15" 519 | "@babel/helper-plugin-utils" "^7.22.5" 520 | 521 | "@babel/plugin-transform-duplicate-keys@^7.23.3": 522 | version "7.23.3" 523 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" 524 | integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== 525 | dependencies: 526 | "@babel/helper-plugin-utils" "^7.22.5" 527 | 528 | "@babel/plugin-transform-dynamic-import@^7.23.4": 529 | version "7.23.4" 530 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" 531 | integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== 532 | dependencies: 533 | "@babel/helper-plugin-utils" "^7.22.5" 534 | "@babel/plugin-syntax-dynamic-import" "^7.8.3" 535 | 536 | "@babel/plugin-transform-exponentiation-operator@^7.23.3": 537 | version "7.23.3" 538 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" 539 | integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== 540 | dependencies: 541 | "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" 542 | "@babel/helper-plugin-utils" "^7.22.5" 543 | 544 | "@babel/plugin-transform-export-namespace-from@^7.23.4": 545 | version "7.23.4" 546 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" 547 | integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== 548 | dependencies: 549 | "@babel/helper-plugin-utils" "^7.22.5" 550 | "@babel/plugin-syntax-export-namespace-from" "^7.8.3" 551 | 552 | "@babel/plugin-transform-for-of@^7.23.6": 553 | version "7.23.6" 554 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" 555 | integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== 556 | dependencies: 557 | "@babel/helper-plugin-utils" "^7.22.5" 558 | "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" 559 | 560 | "@babel/plugin-transform-function-name@^7.23.3": 561 | version "7.23.3" 562 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" 563 | integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== 564 | dependencies: 565 | "@babel/helper-compilation-targets" "^7.22.15" 566 | "@babel/helper-function-name" "^7.23.0" 567 | "@babel/helper-plugin-utils" "^7.22.5" 568 | 569 | "@babel/plugin-transform-json-strings@^7.23.4": 570 | version "7.23.4" 571 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" 572 | integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== 573 | dependencies: 574 | "@babel/helper-plugin-utils" "^7.22.5" 575 | "@babel/plugin-syntax-json-strings" "^7.8.3" 576 | 577 | "@babel/plugin-transform-literals@^7.23.3": 578 | version "7.23.3" 579 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" 580 | integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== 581 | dependencies: 582 | "@babel/helper-plugin-utils" "^7.22.5" 583 | 584 | "@babel/plugin-transform-logical-assignment-operators@^7.23.4": 585 | version "7.23.4" 586 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" 587 | integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== 588 | dependencies: 589 | "@babel/helper-plugin-utils" "^7.22.5" 590 | "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" 591 | 592 | "@babel/plugin-transform-member-expression-literals@^7.23.3": 593 | version "7.23.3" 594 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" 595 | integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== 596 | dependencies: 597 | "@babel/helper-plugin-utils" "^7.22.5" 598 | 599 | "@babel/plugin-transform-modules-amd@^7.23.3": 600 | version "7.23.3" 601 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" 602 | integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== 603 | dependencies: 604 | "@babel/helper-module-transforms" "^7.23.3" 605 | "@babel/helper-plugin-utils" "^7.22.5" 606 | 607 | "@babel/plugin-transform-modules-commonjs@^7.23.3": 608 | version "7.23.3" 609 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" 610 | integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== 611 | dependencies: 612 | "@babel/helper-module-transforms" "^7.23.3" 613 | "@babel/helper-plugin-utils" "^7.22.5" 614 | "@babel/helper-simple-access" "^7.22.5" 615 | 616 | "@babel/plugin-transform-modules-systemjs@^7.23.9": 617 | version "7.23.9" 618 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz#105d3ed46e4a21d257f83a2f9e2ee4203ceda6be" 619 | integrity sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw== 620 | dependencies: 621 | "@babel/helper-hoist-variables" "^7.22.5" 622 | "@babel/helper-module-transforms" "^7.23.3" 623 | "@babel/helper-plugin-utils" "^7.22.5" 624 | "@babel/helper-validator-identifier" "^7.22.20" 625 | 626 | "@babel/plugin-transform-modules-umd@^7.23.3": 627 | version "7.23.3" 628 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" 629 | integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== 630 | dependencies: 631 | "@babel/helper-module-transforms" "^7.23.3" 632 | "@babel/helper-plugin-utils" "^7.22.5" 633 | 634 | "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": 635 | version "7.22.5" 636 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" 637 | integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== 638 | dependencies: 639 | "@babel/helper-create-regexp-features-plugin" "^7.22.5" 640 | "@babel/helper-plugin-utils" "^7.22.5" 641 | 642 | "@babel/plugin-transform-new-target@^7.23.3": 643 | version "7.23.3" 644 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" 645 | integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== 646 | dependencies: 647 | "@babel/helper-plugin-utils" "^7.22.5" 648 | 649 | "@babel/plugin-transform-nullish-coalescing-operator@^7.23.4": 650 | version "7.23.4" 651 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" 652 | integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== 653 | dependencies: 654 | "@babel/helper-plugin-utils" "^7.22.5" 655 | "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" 656 | 657 | "@babel/plugin-transform-numeric-separator@^7.23.4": 658 | version "7.23.4" 659 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" 660 | integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== 661 | dependencies: 662 | "@babel/helper-plugin-utils" "^7.22.5" 663 | "@babel/plugin-syntax-numeric-separator" "^7.10.4" 664 | 665 | "@babel/plugin-transform-object-rest-spread@^7.24.0": 666 | version "7.24.0" 667 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz#7b836ad0088fdded2420ce96d4e1d3ed78b71df1" 668 | integrity sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w== 669 | dependencies: 670 | "@babel/compat-data" "^7.23.5" 671 | "@babel/helper-compilation-targets" "^7.23.6" 672 | "@babel/helper-plugin-utils" "^7.24.0" 673 | "@babel/plugin-syntax-object-rest-spread" "^7.8.3" 674 | "@babel/plugin-transform-parameters" "^7.23.3" 675 | 676 | "@babel/plugin-transform-object-super@^7.23.3": 677 | version "7.23.3" 678 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" 679 | integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== 680 | dependencies: 681 | "@babel/helper-plugin-utils" "^7.22.5" 682 | "@babel/helper-replace-supers" "^7.22.20" 683 | 684 | "@babel/plugin-transform-optional-catch-binding@^7.23.4": 685 | version "7.23.4" 686 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" 687 | integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== 688 | dependencies: 689 | "@babel/helper-plugin-utils" "^7.22.5" 690 | "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" 691 | 692 | "@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4": 693 | version "7.23.4" 694 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" 695 | integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== 696 | dependencies: 697 | "@babel/helper-plugin-utils" "^7.22.5" 698 | "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" 699 | "@babel/plugin-syntax-optional-chaining" "^7.8.3" 700 | 701 | "@babel/plugin-transform-parameters@^7.23.3": 702 | version "7.23.3" 703 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" 704 | integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== 705 | dependencies: 706 | "@babel/helper-plugin-utils" "^7.22.5" 707 | 708 | "@babel/plugin-transform-private-methods@^7.23.3": 709 | version "7.23.3" 710 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" 711 | integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== 712 | dependencies: 713 | "@babel/helper-create-class-features-plugin" "^7.22.15" 714 | "@babel/helper-plugin-utils" "^7.22.5" 715 | 716 | "@babel/plugin-transform-private-property-in-object@^7.23.4": 717 | version "7.23.4" 718 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" 719 | integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== 720 | dependencies: 721 | "@babel/helper-annotate-as-pure" "^7.22.5" 722 | "@babel/helper-create-class-features-plugin" "^7.22.15" 723 | "@babel/helper-plugin-utils" "^7.22.5" 724 | "@babel/plugin-syntax-private-property-in-object" "^7.14.5" 725 | 726 | "@babel/plugin-transform-property-literals@^7.23.3": 727 | version "7.23.3" 728 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" 729 | integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== 730 | dependencies: 731 | "@babel/helper-plugin-utils" "^7.22.5" 732 | 733 | "@babel/plugin-transform-regenerator@^7.23.3": 734 | version "7.23.3" 735 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" 736 | integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== 737 | dependencies: 738 | "@babel/helper-plugin-utils" "^7.22.5" 739 | regenerator-transform "^0.15.2" 740 | 741 | "@babel/plugin-transform-reserved-words@^7.23.3": 742 | version "7.23.3" 743 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" 744 | integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== 745 | dependencies: 746 | "@babel/helper-plugin-utils" "^7.22.5" 747 | 748 | "@babel/plugin-transform-shorthand-properties@^7.23.3": 749 | version "7.23.3" 750 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" 751 | integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== 752 | dependencies: 753 | "@babel/helper-plugin-utils" "^7.22.5" 754 | 755 | "@babel/plugin-transform-spread@^7.23.3": 756 | version "7.23.3" 757 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" 758 | integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== 759 | dependencies: 760 | "@babel/helper-plugin-utils" "^7.22.5" 761 | "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" 762 | 763 | "@babel/plugin-transform-sticky-regex@^7.23.3": 764 | version "7.23.3" 765 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" 766 | integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== 767 | dependencies: 768 | "@babel/helper-plugin-utils" "^7.22.5" 769 | 770 | "@babel/plugin-transform-template-literals@^7.23.3": 771 | version "7.23.3" 772 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" 773 | integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== 774 | dependencies: 775 | "@babel/helper-plugin-utils" "^7.22.5" 776 | 777 | "@babel/plugin-transform-typeof-symbol@^7.23.3": 778 | version "7.23.3" 779 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" 780 | integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== 781 | dependencies: 782 | "@babel/helper-plugin-utils" "^7.22.5" 783 | 784 | "@babel/plugin-transform-unicode-escapes@^7.23.3": 785 | version "7.23.3" 786 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" 787 | integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== 788 | dependencies: 789 | "@babel/helper-plugin-utils" "^7.22.5" 790 | 791 | "@babel/plugin-transform-unicode-property-regex@^7.23.3": 792 | version "7.23.3" 793 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" 794 | integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== 795 | dependencies: 796 | "@babel/helper-create-regexp-features-plugin" "^7.22.15" 797 | "@babel/helper-plugin-utils" "^7.22.5" 798 | 799 | "@babel/plugin-transform-unicode-regex@^7.23.3": 800 | version "7.23.3" 801 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" 802 | integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== 803 | dependencies: 804 | "@babel/helper-create-regexp-features-plugin" "^7.22.15" 805 | "@babel/helper-plugin-utils" "^7.22.5" 806 | 807 | "@babel/plugin-transform-unicode-sets-regex@^7.23.3": 808 | version "7.23.3" 809 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" 810 | integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== 811 | dependencies: 812 | "@babel/helper-create-regexp-features-plugin" "^7.22.15" 813 | "@babel/helper-plugin-utils" "^7.22.5" 814 | 815 | "@babel/preset-env@^7.24.0": 816 | version "7.24.0" 817 | resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.0.tgz#11536a7f4b977294f0bdfad780f01a8ac8e183fc" 818 | integrity sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA== 819 | dependencies: 820 | "@babel/compat-data" "^7.23.5" 821 | "@babel/helper-compilation-targets" "^7.23.6" 822 | "@babel/helper-plugin-utils" "^7.24.0" 823 | "@babel/helper-validator-option" "^7.23.5" 824 | "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" 825 | "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" 826 | "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7" 827 | "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" 828 | "@babel/plugin-syntax-async-generators" "^7.8.4" 829 | "@babel/plugin-syntax-class-properties" "^7.12.13" 830 | "@babel/plugin-syntax-class-static-block" "^7.14.5" 831 | "@babel/plugin-syntax-dynamic-import" "^7.8.3" 832 | "@babel/plugin-syntax-export-namespace-from" "^7.8.3" 833 | "@babel/plugin-syntax-import-assertions" "^7.23.3" 834 | "@babel/plugin-syntax-import-attributes" "^7.23.3" 835 | "@babel/plugin-syntax-import-meta" "^7.10.4" 836 | "@babel/plugin-syntax-json-strings" "^7.8.3" 837 | "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" 838 | "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" 839 | "@babel/plugin-syntax-numeric-separator" "^7.10.4" 840 | "@babel/plugin-syntax-object-rest-spread" "^7.8.3" 841 | "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" 842 | "@babel/plugin-syntax-optional-chaining" "^7.8.3" 843 | "@babel/plugin-syntax-private-property-in-object" "^7.14.5" 844 | "@babel/plugin-syntax-top-level-await" "^7.14.5" 845 | "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" 846 | "@babel/plugin-transform-arrow-functions" "^7.23.3" 847 | "@babel/plugin-transform-async-generator-functions" "^7.23.9" 848 | "@babel/plugin-transform-async-to-generator" "^7.23.3" 849 | "@babel/plugin-transform-block-scoped-functions" "^7.23.3" 850 | "@babel/plugin-transform-block-scoping" "^7.23.4" 851 | "@babel/plugin-transform-class-properties" "^7.23.3" 852 | "@babel/plugin-transform-class-static-block" "^7.23.4" 853 | "@babel/plugin-transform-classes" "^7.23.8" 854 | "@babel/plugin-transform-computed-properties" "^7.23.3" 855 | "@babel/plugin-transform-destructuring" "^7.23.3" 856 | "@babel/plugin-transform-dotall-regex" "^7.23.3" 857 | "@babel/plugin-transform-duplicate-keys" "^7.23.3" 858 | "@babel/plugin-transform-dynamic-import" "^7.23.4" 859 | "@babel/plugin-transform-exponentiation-operator" "^7.23.3" 860 | "@babel/plugin-transform-export-namespace-from" "^7.23.4" 861 | "@babel/plugin-transform-for-of" "^7.23.6" 862 | "@babel/plugin-transform-function-name" "^7.23.3" 863 | "@babel/plugin-transform-json-strings" "^7.23.4" 864 | "@babel/plugin-transform-literals" "^7.23.3" 865 | "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" 866 | "@babel/plugin-transform-member-expression-literals" "^7.23.3" 867 | "@babel/plugin-transform-modules-amd" "^7.23.3" 868 | "@babel/plugin-transform-modules-commonjs" "^7.23.3" 869 | "@babel/plugin-transform-modules-systemjs" "^7.23.9" 870 | "@babel/plugin-transform-modules-umd" "^7.23.3" 871 | "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" 872 | "@babel/plugin-transform-new-target" "^7.23.3" 873 | "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" 874 | "@babel/plugin-transform-numeric-separator" "^7.23.4" 875 | "@babel/plugin-transform-object-rest-spread" "^7.24.0" 876 | "@babel/plugin-transform-object-super" "^7.23.3" 877 | "@babel/plugin-transform-optional-catch-binding" "^7.23.4" 878 | "@babel/plugin-transform-optional-chaining" "^7.23.4" 879 | "@babel/plugin-transform-parameters" "^7.23.3" 880 | "@babel/plugin-transform-private-methods" "^7.23.3" 881 | "@babel/plugin-transform-private-property-in-object" "^7.23.4" 882 | "@babel/plugin-transform-property-literals" "^7.23.3" 883 | "@babel/plugin-transform-regenerator" "^7.23.3" 884 | "@babel/plugin-transform-reserved-words" "^7.23.3" 885 | "@babel/plugin-transform-shorthand-properties" "^7.23.3" 886 | "@babel/plugin-transform-spread" "^7.23.3" 887 | "@babel/plugin-transform-sticky-regex" "^7.23.3" 888 | "@babel/plugin-transform-template-literals" "^7.23.3" 889 | "@babel/plugin-transform-typeof-symbol" "^7.23.3" 890 | "@babel/plugin-transform-unicode-escapes" "^7.23.3" 891 | "@babel/plugin-transform-unicode-property-regex" "^7.23.3" 892 | "@babel/plugin-transform-unicode-regex" "^7.23.3" 893 | "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" 894 | "@babel/preset-modules" "0.1.6-no-external-plugins" 895 | babel-plugin-polyfill-corejs2 "^0.4.8" 896 | babel-plugin-polyfill-corejs3 "^0.9.0" 897 | babel-plugin-polyfill-regenerator "^0.5.5" 898 | core-js-compat "^3.31.0" 899 | semver "^6.3.1" 900 | 901 | "@babel/preset-modules@0.1.6-no-external-plugins": 902 | version "0.1.6-no-external-plugins" 903 | resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" 904 | integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== 905 | dependencies: 906 | "@babel/helper-plugin-utils" "^7.0.0" 907 | "@babel/types" "^7.4.4" 908 | esutils "^2.0.2" 909 | 910 | "@babel/regjsgen@^0.8.0": 911 | version "0.8.0" 912 | resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" 913 | integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== 914 | 915 | "@babel/runtime@^7.8.4": 916 | version "7.20.7" 917 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" 918 | integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== 919 | dependencies: 920 | regenerator-runtime "^0.13.11" 921 | 922 | "@babel/template@^7.22.15", "@babel/template@^7.24.0": 923 | version "7.24.0" 924 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" 925 | integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== 926 | dependencies: 927 | "@babel/code-frame" "^7.23.5" 928 | "@babel/parser" "^7.24.0" 929 | "@babel/types" "^7.24.0" 930 | 931 | "@babel/traverse@^7.24.0": 932 | version "7.24.0" 933 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" 934 | integrity sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw== 935 | dependencies: 936 | "@babel/code-frame" "^7.23.5" 937 | "@babel/generator" "^7.23.6" 938 | "@babel/helper-environment-visitor" "^7.22.20" 939 | "@babel/helper-function-name" "^7.23.0" 940 | "@babel/helper-hoist-variables" "^7.22.5" 941 | "@babel/helper-split-export-declaration" "^7.22.6" 942 | "@babel/parser" "^7.24.0" 943 | "@babel/types" "^7.24.0" 944 | debug "^4.3.1" 945 | globals "^11.1.0" 946 | 947 | "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.24.0", "@babel/types@^7.4.4": 948 | version "7.24.0" 949 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" 950 | integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== 951 | dependencies: 952 | "@babel/helper-string-parser" "^7.23.4" 953 | "@babel/helper-validator-identifier" "^7.22.20" 954 | to-fast-properties "^2.0.0" 955 | 956 | "@discoveryjs/json-ext@^0.5.0": 957 | version "0.5.7" 958 | resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" 959 | integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== 960 | 961 | "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": 962 | version "0.3.5" 963 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" 964 | integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== 965 | dependencies: 966 | "@jridgewell/set-array" "^1.2.1" 967 | "@jridgewell/sourcemap-codec" "^1.4.10" 968 | "@jridgewell/trace-mapping" "^0.3.24" 969 | 970 | "@jridgewell/resolve-uri@^3.1.0": 971 | version "3.1.1" 972 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" 973 | integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== 974 | 975 | "@jridgewell/set-array@^1.2.1": 976 | version "1.2.1" 977 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" 978 | integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== 979 | 980 | "@jridgewell/source-map@^0.3.3": 981 | version "0.3.5" 982 | resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" 983 | integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== 984 | dependencies: 985 | "@jridgewell/gen-mapping" "^0.3.0" 986 | "@jridgewell/trace-mapping" "^0.3.9" 987 | 988 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 989 | version "1.4.15" 990 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 991 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 992 | 993 | "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.9": 994 | version "0.3.25" 995 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" 996 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 997 | dependencies: 998 | "@jridgewell/resolve-uri" "^3.1.0" 999 | "@jridgewell/sourcemap-codec" "^1.4.14" 1000 | 1001 | "@types/estree@^1.0.5": 1002 | version "1.0.5" 1003 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" 1004 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== 1005 | 1006 | "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": 1007 | version "7.0.15" 1008 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" 1009 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 1010 | 1011 | "@types/node@*": 1012 | version "20.11.25" 1013 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.25.tgz#0f50d62f274e54dd7a49f7704cc16bfbcccaf49f" 1014 | integrity sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw== 1015 | dependencies: 1016 | undici-types "~5.26.4" 1017 | 1018 | "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": 1019 | version "1.12.1" 1020 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" 1021 | integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== 1022 | dependencies: 1023 | "@webassemblyjs/helper-numbers" "1.11.6" 1024 | "@webassemblyjs/helper-wasm-bytecode" "1.11.6" 1025 | 1026 | "@webassemblyjs/floating-point-hex-parser@1.11.6": 1027 | version "1.11.6" 1028 | resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" 1029 | integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== 1030 | 1031 | "@webassemblyjs/helper-api-error@1.11.6": 1032 | version "1.11.6" 1033 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" 1034 | integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== 1035 | 1036 | "@webassemblyjs/helper-buffer@1.12.1": 1037 | version "1.12.1" 1038 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" 1039 | integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== 1040 | 1041 | "@webassemblyjs/helper-numbers@1.11.6": 1042 | version "1.11.6" 1043 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" 1044 | integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== 1045 | dependencies: 1046 | "@webassemblyjs/floating-point-hex-parser" "1.11.6" 1047 | "@webassemblyjs/helper-api-error" "1.11.6" 1048 | "@xtuc/long" "4.2.2" 1049 | 1050 | "@webassemblyjs/helper-wasm-bytecode@1.11.6": 1051 | version "1.11.6" 1052 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" 1053 | integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== 1054 | 1055 | "@webassemblyjs/helper-wasm-section@1.12.1": 1056 | version "1.12.1" 1057 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" 1058 | integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== 1059 | dependencies: 1060 | "@webassemblyjs/ast" "1.12.1" 1061 | "@webassemblyjs/helper-buffer" "1.12.1" 1062 | "@webassemblyjs/helper-wasm-bytecode" "1.11.6" 1063 | "@webassemblyjs/wasm-gen" "1.12.1" 1064 | 1065 | "@webassemblyjs/ieee754@1.11.6": 1066 | version "1.11.6" 1067 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" 1068 | integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== 1069 | dependencies: 1070 | "@xtuc/ieee754" "^1.2.0" 1071 | 1072 | "@webassemblyjs/leb128@1.11.6": 1073 | version "1.11.6" 1074 | resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" 1075 | integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== 1076 | dependencies: 1077 | "@xtuc/long" "4.2.2" 1078 | 1079 | "@webassemblyjs/utf8@1.11.6": 1080 | version "1.11.6" 1081 | resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" 1082 | integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== 1083 | 1084 | "@webassemblyjs/wasm-edit@^1.12.1": 1085 | version "1.12.1" 1086 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" 1087 | integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== 1088 | dependencies: 1089 | "@webassemblyjs/ast" "1.12.1" 1090 | "@webassemblyjs/helper-buffer" "1.12.1" 1091 | "@webassemblyjs/helper-wasm-bytecode" "1.11.6" 1092 | "@webassemblyjs/helper-wasm-section" "1.12.1" 1093 | "@webassemblyjs/wasm-gen" "1.12.1" 1094 | "@webassemblyjs/wasm-opt" "1.12.1" 1095 | "@webassemblyjs/wasm-parser" "1.12.1" 1096 | "@webassemblyjs/wast-printer" "1.12.1" 1097 | 1098 | "@webassemblyjs/wasm-gen@1.12.1": 1099 | version "1.12.1" 1100 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" 1101 | integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== 1102 | dependencies: 1103 | "@webassemblyjs/ast" "1.12.1" 1104 | "@webassemblyjs/helper-wasm-bytecode" "1.11.6" 1105 | "@webassemblyjs/ieee754" "1.11.6" 1106 | "@webassemblyjs/leb128" "1.11.6" 1107 | "@webassemblyjs/utf8" "1.11.6" 1108 | 1109 | "@webassemblyjs/wasm-opt@1.12.1": 1110 | version "1.12.1" 1111 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" 1112 | integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== 1113 | dependencies: 1114 | "@webassemblyjs/ast" "1.12.1" 1115 | "@webassemblyjs/helper-buffer" "1.12.1" 1116 | "@webassemblyjs/wasm-gen" "1.12.1" 1117 | "@webassemblyjs/wasm-parser" "1.12.1" 1118 | 1119 | "@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": 1120 | version "1.12.1" 1121 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" 1122 | integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== 1123 | dependencies: 1124 | "@webassemblyjs/ast" "1.12.1" 1125 | "@webassemblyjs/helper-api-error" "1.11.6" 1126 | "@webassemblyjs/helper-wasm-bytecode" "1.11.6" 1127 | "@webassemblyjs/ieee754" "1.11.6" 1128 | "@webassemblyjs/leb128" "1.11.6" 1129 | "@webassemblyjs/utf8" "1.11.6" 1130 | 1131 | "@webassemblyjs/wast-printer@1.12.1": 1132 | version "1.12.1" 1133 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" 1134 | integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== 1135 | dependencies: 1136 | "@webassemblyjs/ast" "1.12.1" 1137 | "@xtuc/long" "4.2.2" 1138 | 1139 | "@webpack-cli/configtest@^2.1.1": 1140 | version "2.1.1" 1141 | resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" 1142 | integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== 1143 | 1144 | "@webpack-cli/info@^2.0.2": 1145 | version "2.0.2" 1146 | resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" 1147 | integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== 1148 | 1149 | "@webpack-cli/serve@^2.0.5": 1150 | version "2.0.5" 1151 | resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" 1152 | integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== 1153 | 1154 | "@xtuc/ieee754@^1.2.0": 1155 | version "1.2.0" 1156 | resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" 1157 | integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== 1158 | 1159 | "@xtuc/long@4.2.2": 1160 | version "4.2.2" 1161 | resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" 1162 | integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== 1163 | 1164 | acorn-import-attributes@^1.9.5: 1165 | version "1.9.5" 1166 | resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" 1167 | integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== 1168 | 1169 | acorn@^8.7.1, acorn@^8.8.2: 1170 | version "8.11.3" 1171 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" 1172 | integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== 1173 | 1174 | ajv-formats@^2.1.1: 1175 | version "2.1.1" 1176 | resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" 1177 | integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== 1178 | dependencies: 1179 | ajv "^8.0.0" 1180 | 1181 | ajv-keywords@^3.5.2: 1182 | version "3.5.2" 1183 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" 1184 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== 1185 | 1186 | ajv-keywords@^5.1.0: 1187 | version "5.1.0" 1188 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" 1189 | integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== 1190 | dependencies: 1191 | fast-deep-equal "^3.1.3" 1192 | 1193 | ajv@^6.12.5: 1194 | version "6.12.6" 1195 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 1196 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 1197 | dependencies: 1198 | fast-deep-equal "^3.1.1" 1199 | fast-json-stable-stringify "^2.0.0" 1200 | json-schema-traverse "^0.4.1" 1201 | uri-js "^4.2.2" 1202 | 1203 | ajv@^8.0.0, ajv@^8.9.0: 1204 | version "8.12.0" 1205 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" 1206 | integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== 1207 | dependencies: 1208 | fast-deep-equal "^3.1.1" 1209 | json-schema-traverse "^1.0.0" 1210 | require-from-string "^2.0.2" 1211 | uri-js "^4.2.2" 1212 | 1213 | ansi-styles@^3.2.1: 1214 | version "3.2.1" 1215 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 1216 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 1217 | dependencies: 1218 | color-convert "^1.9.0" 1219 | 1220 | babel-loader@^9.1.3: 1221 | version "9.1.3" 1222 | resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" 1223 | integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== 1224 | dependencies: 1225 | find-cache-dir "^4.0.0" 1226 | schema-utils "^4.0.0" 1227 | 1228 | babel-plugin-polyfill-corejs2@^0.4.8: 1229 | version "0.4.9" 1230 | resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.9.tgz#15a285f681e1c5495093d85f1cf72bd1cbed41ce" 1231 | integrity sha512-BXIWIaO3MewbXWdJdIGDWZurv5OGJlFNo7oy20DpB3kWDVJLcY2NRypRsRUbRe5KMqSNLuOGnWTFQQtY5MAsRw== 1232 | dependencies: 1233 | "@babel/compat-data" "^7.22.6" 1234 | "@babel/helper-define-polyfill-provider" "^0.6.0" 1235 | semver "^6.3.1" 1236 | 1237 | babel-plugin-polyfill-corejs3@^0.9.0: 1238 | version "0.9.0" 1239 | resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz#9eea32349d94556c2ad3ab9b82ebb27d4bf04a81" 1240 | integrity sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg== 1241 | dependencies: 1242 | "@babel/helper-define-polyfill-provider" "^0.5.0" 1243 | core-js-compat "^3.34.0" 1244 | 1245 | babel-plugin-polyfill-regenerator@^0.5.5: 1246 | version "0.5.5" 1247 | resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a" 1248 | integrity sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg== 1249 | dependencies: 1250 | "@babel/helper-define-polyfill-provider" "^0.5.0" 1251 | 1252 | browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.22.3: 1253 | version "4.23.0" 1254 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" 1255 | integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== 1256 | dependencies: 1257 | caniuse-lite "^1.0.30001587" 1258 | electron-to-chromium "^1.4.668" 1259 | node-releases "^2.0.14" 1260 | update-browserslist-db "^1.0.13" 1261 | 1262 | buffer-from@^1.0.0: 1263 | version "1.1.2" 1264 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 1265 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 1266 | 1267 | caniuse-lite@^1.0.30001587: 1268 | version "1.0.30001596" 1269 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz#da06b79c3d9c3d9958eb307aa832ac68ead79bee" 1270 | integrity sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ== 1271 | 1272 | chalk@^2.4.2: 1273 | version "2.4.2" 1274 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 1275 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 1276 | dependencies: 1277 | ansi-styles "^3.2.1" 1278 | escape-string-regexp "^1.0.5" 1279 | supports-color "^5.3.0" 1280 | 1281 | chrome-trace-event@^1.0.2: 1282 | version "1.0.3" 1283 | resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" 1284 | integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== 1285 | 1286 | clone-deep@^4.0.1: 1287 | version "4.0.1" 1288 | resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" 1289 | integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== 1290 | dependencies: 1291 | is-plain-object "^2.0.4" 1292 | kind-of "^6.0.2" 1293 | shallow-clone "^3.0.0" 1294 | 1295 | color-convert@^1.9.0: 1296 | version "1.9.3" 1297 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 1298 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 1299 | dependencies: 1300 | color-name "1.1.3" 1301 | 1302 | color-name@1.1.3: 1303 | version "1.1.3" 1304 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 1305 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 1306 | 1307 | colorette@^2.0.14: 1308 | version "2.0.20" 1309 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" 1310 | integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== 1311 | 1312 | commander@^10.0.1: 1313 | version "10.0.1" 1314 | resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" 1315 | integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== 1316 | 1317 | commander@^2.20.0: 1318 | version "2.20.3" 1319 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 1320 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 1321 | 1322 | common-path-prefix@^3.0.0: 1323 | version "3.0.0" 1324 | resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" 1325 | integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== 1326 | 1327 | convert-source-map@^2.0.0: 1328 | version "2.0.0" 1329 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" 1330 | integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== 1331 | 1332 | core-js-compat@^3.31.0, core-js-compat@^3.34.0: 1333 | version "3.36.0" 1334 | resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.0.tgz#087679119bc2fdbdefad0d45d8e5d307d45ba190" 1335 | integrity sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw== 1336 | dependencies: 1337 | browserslist "^4.22.3" 1338 | 1339 | cross-spawn@^7.0.3: 1340 | version "7.0.6" 1341 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 1342 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 1343 | dependencies: 1344 | path-key "^3.1.0" 1345 | shebang-command "^2.0.0" 1346 | which "^2.0.1" 1347 | 1348 | debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: 1349 | version "4.3.4" 1350 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 1351 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 1352 | dependencies: 1353 | ms "2.1.2" 1354 | 1355 | electron-to-chromium@^1.4.668: 1356 | version "1.4.699" 1357 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.699.tgz#dd53c939e13da64e94b341e563f0a3011b4ef0e9" 1358 | integrity sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw== 1359 | 1360 | enhanced-resolve@^5.17.1: 1361 | version "5.17.1" 1362 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" 1363 | integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== 1364 | dependencies: 1365 | graceful-fs "^4.2.4" 1366 | tapable "^2.2.0" 1367 | 1368 | envinfo@^7.7.3: 1369 | version "7.11.1" 1370 | resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.1.tgz#2ffef77591057081b0129a8fd8cf6118da1b94e1" 1371 | integrity sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg== 1372 | 1373 | es-module-lexer@^1.2.1: 1374 | version "1.4.1" 1375 | resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" 1376 | integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== 1377 | 1378 | escalade@^3.1.1: 1379 | version "3.1.1" 1380 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 1381 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 1382 | 1383 | escape-string-regexp@^1.0.5: 1384 | version "1.0.5" 1385 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1386 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 1387 | 1388 | eslint-scope@5.1.1: 1389 | version "5.1.1" 1390 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 1391 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 1392 | dependencies: 1393 | esrecurse "^4.3.0" 1394 | estraverse "^4.1.1" 1395 | 1396 | esrecurse@^4.3.0: 1397 | version "4.3.0" 1398 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 1399 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 1400 | dependencies: 1401 | estraverse "^5.2.0" 1402 | 1403 | estraverse@^4.1.1: 1404 | version "4.3.0" 1405 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 1406 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 1407 | 1408 | estraverse@^5.2.0: 1409 | version "5.3.0" 1410 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 1411 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 1412 | 1413 | esutils@^2.0.2: 1414 | version "2.0.3" 1415 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 1416 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 1417 | 1418 | events@^3.2.0: 1419 | version "3.3.0" 1420 | resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" 1421 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== 1422 | 1423 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 1424 | version "3.1.3" 1425 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1426 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1427 | 1428 | fast-json-stable-stringify@^2.0.0: 1429 | version "2.1.0" 1430 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1431 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1432 | 1433 | fastest-levenshtein@^1.0.12: 1434 | version "1.0.16" 1435 | resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" 1436 | integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== 1437 | 1438 | find-cache-dir@^4.0.0: 1439 | version "4.0.0" 1440 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" 1441 | integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== 1442 | dependencies: 1443 | common-path-prefix "^3.0.0" 1444 | pkg-dir "^7.0.0" 1445 | 1446 | find-up@^4.0.0: 1447 | version "4.1.0" 1448 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 1449 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 1450 | dependencies: 1451 | locate-path "^5.0.0" 1452 | path-exists "^4.0.0" 1453 | 1454 | find-up@^6.3.0: 1455 | version "6.3.0" 1456 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" 1457 | integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== 1458 | dependencies: 1459 | locate-path "^7.1.0" 1460 | path-exists "^5.0.0" 1461 | 1462 | flat@^5.0.2: 1463 | version "5.0.2" 1464 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 1465 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 1466 | 1467 | function-bind@^1.1.2: 1468 | version "1.1.2" 1469 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 1470 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 1471 | 1472 | gensync@^1.0.0-beta.2: 1473 | version "1.0.0-beta.2" 1474 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 1475 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 1476 | 1477 | glob-to-regexp@^0.4.1: 1478 | version "0.4.1" 1479 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 1480 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 1481 | 1482 | globals@^11.1.0: 1483 | version "11.12.0" 1484 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 1485 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1486 | 1487 | graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4: 1488 | version "4.2.11" 1489 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 1490 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 1491 | 1492 | has-flag@^3.0.0: 1493 | version "3.0.0" 1494 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1495 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 1496 | 1497 | has-flag@^4.0.0: 1498 | version "4.0.0" 1499 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1500 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1501 | 1502 | hasown@^2.0.0: 1503 | version "2.0.2" 1504 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 1505 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 1506 | dependencies: 1507 | function-bind "^1.1.2" 1508 | 1509 | import-local@^3.0.2: 1510 | version "3.1.0" 1511 | resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" 1512 | integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== 1513 | dependencies: 1514 | pkg-dir "^4.2.0" 1515 | resolve-cwd "^3.0.0" 1516 | 1517 | interpret@^3.1.1: 1518 | version "3.1.1" 1519 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" 1520 | integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== 1521 | 1522 | is-core-module@^2.13.0: 1523 | version "2.13.1" 1524 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" 1525 | integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== 1526 | dependencies: 1527 | hasown "^2.0.0" 1528 | 1529 | is-plain-object@^2.0.4: 1530 | version "2.0.4" 1531 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1532 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 1533 | dependencies: 1534 | isobject "^3.0.1" 1535 | 1536 | isexe@^2.0.0: 1537 | version "2.0.0" 1538 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1539 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1540 | 1541 | isobject@^3.0.1: 1542 | version "3.0.1" 1543 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1544 | integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== 1545 | 1546 | jest-worker@^27.4.5: 1547 | version "27.5.1" 1548 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" 1549 | integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== 1550 | dependencies: 1551 | "@types/node" "*" 1552 | merge-stream "^2.0.0" 1553 | supports-color "^8.0.0" 1554 | 1555 | js-tokens@^4.0.0: 1556 | version "4.0.0" 1557 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1558 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1559 | 1560 | jsesc@^2.5.1: 1561 | version "2.5.2" 1562 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 1563 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 1564 | 1565 | jsesc@~0.5.0: 1566 | version "0.5.0" 1567 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1568 | integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== 1569 | 1570 | json-parse-even-better-errors@^2.3.1: 1571 | version "2.3.1" 1572 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 1573 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 1574 | 1575 | json-schema-traverse@^0.4.1: 1576 | version "0.4.1" 1577 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1578 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1579 | 1580 | json-schema-traverse@^1.0.0: 1581 | version "1.0.0" 1582 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 1583 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 1584 | 1585 | json5@^2.2.3: 1586 | version "2.2.3" 1587 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" 1588 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 1589 | 1590 | kind-of@^6.0.2: 1591 | version "6.0.3" 1592 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 1593 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 1594 | 1595 | loader-runner@^4.2.0: 1596 | version "4.3.0" 1597 | resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" 1598 | integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== 1599 | 1600 | locate-path@^5.0.0: 1601 | version "5.0.0" 1602 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1603 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1604 | dependencies: 1605 | p-locate "^4.1.0" 1606 | 1607 | locate-path@^7.1.0: 1608 | version "7.2.0" 1609 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" 1610 | integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== 1611 | dependencies: 1612 | p-locate "^6.0.0" 1613 | 1614 | lodash.debounce@^4.0.8: 1615 | version "4.0.8" 1616 | resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" 1617 | integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== 1618 | 1619 | lru-cache@^5.1.1: 1620 | version "5.1.1" 1621 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 1622 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1623 | dependencies: 1624 | yallist "^3.0.2" 1625 | 1626 | merge-stream@^2.0.0: 1627 | version "2.0.0" 1628 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1629 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1630 | 1631 | mime-db@1.52.0: 1632 | version "1.52.0" 1633 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1634 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1635 | 1636 | mime-types@^2.1.27: 1637 | version "2.1.35" 1638 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1639 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1640 | dependencies: 1641 | mime-db "1.52.0" 1642 | 1643 | ms@2.1.2: 1644 | version "2.1.2" 1645 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1646 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1647 | 1648 | neo-async@^2.6.2: 1649 | version "2.6.2" 1650 | resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" 1651 | integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== 1652 | 1653 | node-releases@^2.0.14: 1654 | version "2.0.14" 1655 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" 1656 | integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== 1657 | 1658 | ot-diff@^1.1.1: 1659 | version "1.1.1" 1660 | resolved "https://registry.yarnpkg.com/ot-diff/-/ot-diff-1.1.1.tgz#c587f17d15efd0d9170a5d38e606368a57643ad4" 1661 | integrity sha512-Nf6vUblD0oKsMJA+dKbQ1njBjU/BHZjj9A00IdHdk7AjvXk42U/7uhiCZMuUr/OIbft5YZn9cUwFXG4E8oLjIg== 1662 | 1663 | ot-text-unicode@^4.0.0: 1664 | version "4.0.0" 1665 | resolved "https://registry.yarnpkg.com/ot-text-unicode/-/ot-text-unicode-4.0.0.tgz#778a327535c81ed265b36ebe1bd677f31bae1e32" 1666 | integrity sha512-W7ZLU8QXesY2wagYFv47zErXud3E93FGImmSGJsQnBzE+idcPPyo2u2KMilIrTwBh4pbCizy71qRjmmV6aDhcQ== 1667 | dependencies: 1668 | unicount "1.1" 1669 | 1670 | p-limit@^2.2.0: 1671 | version "2.3.0" 1672 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1673 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1674 | dependencies: 1675 | p-try "^2.0.0" 1676 | 1677 | p-limit@^4.0.0: 1678 | version "4.0.0" 1679 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" 1680 | integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== 1681 | dependencies: 1682 | yocto-queue "^1.0.0" 1683 | 1684 | p-locate@^4.1.0: 1685 | version "4.1.0" 1686 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1687 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1688 | dependencies: 1689 | p-limit "^2.2.0" 1690 | 1691 | p-locate@^6.0.0: 1692 | version "6.0.0" 1693 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" 1694 | integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== 1695 | dependencies: 1696 | p-limit "^4.0.0" 1697 | 1698 | p-try@^2.0.0: 1699 | version "2.2.0" 1700 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1701 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1702 | 1703 | path-exists@^4.0.0: 1704 | version "4.0.0" 1705 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1706 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1707 | 1708 | path-exists@^5.0.0: 1709 | version "5.0.0" 1710 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" 1711 | integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== 1712 | 1713 | path-key@^3.1.0: 1714 | version "3.1.1" 1715 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1716 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1717 | 1718 | path-parse@^1.0.7: 1719 | version "1.0.7" 1720 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1721 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1722 | 1723 | picocolors@^1.0.0: 1724 | version "1.0.0" 1725 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1726 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1727 | 1728 | pkg-dir@^4.2.0: 1729 | version "4.2.0" 1730 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1731 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1732 | dependencies: 1733 | find-up "^4.0.0" 1734 | 1735 | pkg-dir@^7.0.0: 1736 | version "7.0.0" 1737 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" 1738 | integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== 1739 | dependencies: 1740 | find-up "^6.3.0" 1741 | 1742 | punycode@^2.1.0: 1743 | version "2.3.1" 1744 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 1745 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1746 | 1747 | randombytes@^2.1.0: 1748 | version "2.1.0" 1749 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1750 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1751 | dependencies: 1752 | safe-buffer "^5.1.0" 1753 | 1754 | rechoir@^0.8.0: 1755 | version "0.8.0" 1756 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" 1757 | integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== 1758 | dependencies: 1759 | resolve "^1.20.0" 1760 | 1761 | regenerate-unicode-properties@^10.1.0: 1762 | version "10.1.0" 1763 | resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" 1764 | integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== 1765 | dependencies: 1766 | regenerate "^1.4.2" 1767 | 1768 | regenerate@^1.4.2: 1769 | version "1.4.2" 1770 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" 1771 | integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== 1772 | 1773 | regenerator-runtime@^0.13.11: 1774 | version "0.13.11" 1775 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" 1776 | integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== 1777 | 1778 | regenerator-transform@^0.15.2: 1779 | version "0.15.2" 1780 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" 1781 | integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== 1782 | dependencies: 1783 | "@babel/runtime" "^7.8.4" 1784 | 1785 | regexpu-core@^5.3.1: 1786 | version "5.3.2" 1787 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" 1788 | integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== 1789 | dependencies: 1790 | "@babel/regjsgen" "^0.8.0" 1791 | regenerate "^1.4.2" 1792 | regenerate-unicode-properties "^10.1.0" 1793 | regjsparser "^0.9.1" 1794 | unicode-match-property-ecmascript "^2.0.0" 1795 | unicode-match-property-value-ecmascript "^2.1.0" 1796 | 1797 | regjsparser@^0.9.1: 1798 | version "0.9.1" 1799 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" 1800 | integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== 1801 | dependencies: 1802 | jsesc "~0.5.0" 1803 | 1804 | require-from-string@^2.0.2: 1805 | version "2.0.2" 1806 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 1807 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 1808 | 1809 | resolve-cwd@^3.0.0: 1810 | version "3.0.0" 1811 | resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" 1812 | integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== 1813 | dependencies: 1814 | resolve-from "^5.0.0" 1815 | 1816 | resolve-from@^5.0.0: 1817 | version "5.0.0" 1818 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1819 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1820 | 1821 | resolve@^1.14.2, resolve@^1.20.0: 1822 | version "1.22.8" 1823 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" 1824 | integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== 1825 | dependencies: 1826 | is-core-module "^2.13.0" 1827 | path-parse "^1.0.7" 1828 | supports-preserve-symlinks-flag "^1.0.0" 1829 | 1830 | safe-buffer@^5.1.0: 1831 | version "5.2.1" 1832 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1833 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1834 | 1835 | schema-utils@^3.1.1, schema-utils@^3.2.0: 1836 | version "3.3.0" 1837 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" 1838 | integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== 1839 | dependencies: 1840 | "@types/json-schema" "^7.0.8" 1841 | ajv "^6.12.5" 1842 | ajv-keywords "^3.5.2" 1843 | 1844 | schema-utils@^4.0.0: 1845 | version "4.2.0" 1846 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" 1847 | integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== 1848 | dependencies: 1849 | "@types/json-schema" "^7.0.9" 1850 | ajv "^8.9.0" 1851 | ajv-formats "^2.1.1" 1852 | ajv-keywords "^5.1.0" 1853 | 1854 | semver@^6.3.1: 1855 | version "6.3.1" 1856 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 1857 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1858 | 1859 | serialize-javascript@^6.0.1: 1860 | version "6.0.2" 1861 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" 1862 | integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== 1863 | dependencies: 1864 | randombytes "^2.1.0" 1865 | 1866 | shallow-clone@^3.0.0: 1867 | version "3.0.1" 1868 | resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" 1869 | integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== 1870 | dependencies: 1871 | kind-of "^6.0.2" 1872 | 1873 | shebang-command@^2.0.0: 1874 | version "2.0.0" 1875 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1876 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1877 | dependencies: 1878 | shebang-regex "^3.0.0" 1879 | 1880 | shebang-regex@^3.0.0: 1881 | version "3.0.0" 1882 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1883 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1884 | 1885 | source-map-support@~0.5.20: 1886 | version "0.5.21" 1887 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 1888 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 1889 | dependencies: 1890 | buffer-from "^1.0.0" 1891 | source-map "^0.6.0" 1892 | 1893 | source-map@^0.6.0: 1894 | version "0.6.1" 1895 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1896 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1897 | 1898 | supports-color@^5.3.0: 1899 | version "5.5.0" 1900 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1901 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1902 | dependencies: 1903 | has-flag "^3.0.0" 1904 | 1905 | supports-color@^8.0.0: 1906 | version "8.1.1" 1907 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1908 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1909 | dependencies: 1910 | has-flag "^4.0.0" 1911 | 1912 | supports-preserve-symlinks-flag@^1.0.0: 1913 | version "1.0.0" 1914 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1915 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1916 | 1917 | tapable@^2.1.1, tapable@^2.2.0: 1918 | version "2.2.1" 1919 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" 1920 | integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== 1921 | 1922 | terser-webpack-plugin@^5.3.10: 1923 | version "5.3.10" 1924 | resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" 1925 | integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== 1926 | dependencies: 1927 | "@jridgewell/trace-mapping" "^0.3.20" 1928 | jest-worker "^27.4.5" 1929 | schema-utils "^3.1.1" 1930 | serialize-javascript "^6.0.1" 1931 | terser "^5.26.0" 1932 | 1933 | terser@^5.26.0: 1934 | version "5.29.1" 1935 | resolved "https://registry.yarnpkg.com/terser/-/terser-5.29.1.tgz#44e58045b70c09792ba14bfb7b4e14ca8755b9fa" 1936 | integrity sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ== 1937 | dependencies: 1938 | "@jridgewell/source-map" "^0.3.3" 1939 | acorn "^8.8.2" 1940 | commander "^2.20.0" 1941 | source-map-support "~0.5.20" 1942 | 1943 | to-fast-properties@^2.0.0: 1944 | version "2.0.0" 1945 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1946 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 1947 | 1948 | undici-types@~5.26.4: 1949 | version "5.26.5" 1950 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 1951 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 1952 | 1953 | unicode-canonical-property-names-ecmascript@^2.0.0: 1954 | version "2.0.0" 1955 | resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" 1956 | integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== 1957 | 1958 | unicode-match-property-ecmascript@^2.0.0: 1959 | version "2.0.0" 1960 | resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" 1961 | integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== 1962 | dependencies: 1963 | unicode-canonical-property-names-ecmascript "^2.0.0" 1964 | unicode-property-aliases-ecmascript "^2.0.0" 1965 | 1966 | unicode-match-property-value-ecmascript@^2.1.0: 1967 | version "2.1.0" 1968 | resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" 1969 | integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== 1970 | 1971 | unicode-property-aliases-ecmascript@^2.0.0: 1972 | version "2.1.0" 1973 | resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" 1974 | integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== 1975 | 1976 | unicount@1.1: 1977 | version "1.1.0" 1978 | resolved "https://registry.yarnpkg.com/unicount/-/unicount-1.1.0.tgz#396a3df661c19675a93861ac878c2c9c0042abf0" 1979 | integrity sha512-RlwWt1ywVW4WErPGAVHw/rIuJ2+MxvTME0siJ6lk9zBhpDfExDbspe6SRlWT3qU6AucNjotPl9qAJRVjP7guCQ== 1980 | 1981 | update-browserslist-db@^1.0.13: 1982 | version "1.0.13" 1983 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" 1984 | integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== 1985 | dependencies: 1986 | escalade "^3.1.1" 1987 | picocolors "^1.0.0" 1988 | 1989 | uri-js@^4.2.2: 1990 | version "4.4.1" 1991 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1992 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1993 | dependencies: 1994 | punycode "^2.1.0" 1995 | 1996 | watchpack@^2.4.1: 1997 | version "2.4.2" 1998 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" 1999 | integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== 2000 | dependencies: 2001 | glob-to-regexp "^0.4.1" 2002 | graceful-fs "^4.1.2" 2003 | 2004 | webpack-cli@^5.1.4: 2005 | version "5.1.4" 2006 | resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" 2007 | integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== 2008 | dependencies: 2009 | "@discoveryjs/json-ext" "^0.5.0" 2010 | "@webpack-cli/configtest" "^2.1.1" 2011 | "@webpack-cli/info" "^2.0.2" 2012 | "@webpack-cli/serve" "^2.0.5" 2013 | colorette "^2.0.14" 2014 | commander "^10.0.1" 2015 | cross-spawn "^7.0.3" 2016 | envinfo "^7.7.3" 2017 | fastest-levenshtein "^1.0.12" 2018 | import-local "^3.0.2" 2019 | interpret "^3.1.1" 2020 | rechoir "^0.8.0" 2021 | webpack-merge "^5.7.3" 2022 | 2023 | webpack-merge@^5.7.3: 2024 | version "5.10.0" 2025 | resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" 2026 | integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== 2027 | dependencies: 2028 | clone-deep "^4.0.1" 2029 | flat "^5.0.2" 2030 | wildcard "^2.0.0" 2031 | 2032 | webpack-sources@^3.2.3: 2033 | version "3.2.3" 2034 | resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" 2035 | integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== 2036 | 2037 | webpack@^5.94.0: 2038 | version "5.94.0" 2039 | resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" 2040 | integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== 2041 | dependencies: 2042 | "@types/estree" "^1.0.5" 2043 | "@webassemblyjs/ast" "^1.12.1" 2044 | "@webassemblyjs/wasm-edit" "^1.12.1" 2045 | "@webassemblyjs/wasm-parser" "^1.12.1" 2046 | acorn "^8.7.1" 2047 | acorn-import-attributes "^1.9.5" 2048 | browserslist "^4.21.10" 2049 | chrome-trace-event "^1.0.2" 2050 | enhanced-resolve "^5.17.1" 2051 | es-module-lexer "^1.2.1" 2052 | eslint-scope "5.1.1" 2053 | events "^3.2.0" 2054 | glob-to-regexp "^0.4.1" 2055 | graceful-fs "^4.2.11" 2056 | json-parse-even-better-errors "^2.3.1" 2057 | loader-runner "^4.2.0" 2058 | mime-types "^2.1.27" 2059 | neo-async "^2.6.2" 2060 | schema-utils "^3.2.0" 2061 | tapable "^2.1.1" 2062 | terser-webpack-plugin "^5.3.10" 2063 | watchpack "^2.4.1" 2064 | webpack-sources "^3.2.3" 2065 | 2066 | which@^2.0.1: 2067 | version "2.0.2" 2068 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2069 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2070 | dependencies: 2071 | isexe "^2.0.0" 2072 | 2073 | wildcard@^2.0.0: 2074 | version "2.0.1" 2075 | resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" 2076 | integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== 2077 | 2078 | yallist@^3.0.2: 2079 | version "3.1.1" 2080 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 2081 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 2082 | 2083 | yocto-queue@^1.0.0: 2084 | version "1.0.0" 2085 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" 2086 | integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== 2087 | -------------------------------------------------------------------------------- /test/javascripts/acceptance/composer-test.js: -------------------------------------------------------------------------------- 1 | import { click, visit } from "@ember/test-helpers"; 2 | import { test } from "qunit"; 3 | import { acceptance } from "discourse/tests/helpers/qunit-helpers"; 4 | 5 | ["enabled", "disabled"].forEach((postStreamMode) => { 6 | acceptance( 7 | `Discourse Shared Edits | Composer (glimmer_post_stream_mode = ${postStreamMode})`, 8 | function (needs) { 9 | needs.settings({ 10 | glimmer_post_stream_mode: postStreamMode, 11 | }); 12 | needs.user(); 13 | 14 | needs.pretender((server, helper) => { 15 | server.put("/shared_edits/p/398/enable.json", () => 16 | helper.response({ success: "OK" }) 17 | ); 18 | 19 | server.get("/shared_edits/p/398", () => 20 | helper.response({ 21 | raw: "the latest iteration of the post", 22 | version: 2, 23 | }) 24 | ); 25 | 26 | server.put("/shared_edits/p/398/commit", () => 27 | helper.response({ success: "OK" }) 28 | ); 29 | }); 30 | 31 | test("edit the first post", async function (assert) { 32 | await visit("/t/internationalization-localization/280"); 33 | 34 | await click(".show-more-actions"); 35 | await click(".show-post-admin-menu"); 36 | await click(".admin-toggle-shared-edits"); 37 | 38 | await click(".shared-edit"); 39 | 40 | assert 41 | .dom(".d-editor-input") 42 | .hasValue( 43 | "the latest iteration of the post", 44 | "populates the input with the post text" 45 | ); 46 | 47 | await click(".leave-shared-edit .btn-primary"); 48 | }); 49 | } 50 | ); 51 | }); 52 | -------------------------------------------------------------------------------- /translator.yml: -------------------------------------------------------------------------------- 1 | # Configuration file for discourse-translator-bot 2 | 3 | files: 4 | - source_path: config/locales/client.en.yml 5 | destination_path: client.yml 6 | - source_path: config/locales/server.en.yml 7 | destination_path: server.yml 8 | --------------------------------------------------------------------------------