├── .discourse-compatibility ├── .eslintrc ├── .github └── workflows │ └── discourse-plugin.yml ├── .gitignore ├── .prettierrc ├── .rubocop.yml ├── .streerc ├── .template-lintrc.js ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── app ├── controllers │ ├── admin │ │ └── chat_matrix_controller.rb │ └── chat_matrix_controller.rb └── models │ ├── chat_matrix_channel.rb │ ├── chat_matrix_entity.rb │ └── chat_matrix_user.rb ├── assets ├── javascripts │ └── discourse │ │ ├── admin-chat-route-map.js │ │ ├── controllers │ │ └── admin-plugins-matrix.js │ │ ├── routes │ │ └── admin-plugins-matrix.js │ │ └── templates │ │ └── admin-plugins-matrix.hbs └── stylesheets │ └── common │ └── chat-matrix.scss ├── config ├── locales │ ├── client.en.yml │ └── server.en.yml └── settings.yml ├── db └── migrate │ ├── 20221008205346_create_chat_matrix_channels.rb │ ├── 20221008205347_create_chat_matrix_users.rb │ └── 20230122144120_create_chat_matrix_entities.rb ├── lib ├── chat_membership_handler.rb ├── chat_message_handler.rb ├── matrix_events.rb ├── matrix_membership_handler.rb ├── matrix_message_handler.rb ├── matrix_reaction_handler.rb ├── message.rb └── validators │ └── chat_matrix_enabled_validator.rb ├── package.json ├── plugin.rb ├── spec ├── .gitkeep ├── fabricators │ ├── chat_matrix_channel_fabricator.rb │ ├── chat_matrix_entity_fabricator.rb │ └── chat_matrix_user_fabricator.rb ├── lib │ ├── chat_message_handler_spec.rb │ ├── matrix_events_spec.rb │ ├── matrix_message_handler_spec.rb │ ├── matrix_reaction_handler_spec.rb │ ├── message_spec.rb │ └── validators │ │ └── chat_matrix_enabled_validator_spec.rb ├── models │ ├── chat_matrix_channel_spec.rb │ └── chat_matrix_user_spec.rb ├── plugin_helper.rb └── requests │ └── chat_matrix_controller_spec.rb └── yarn.lock /.discourse-compatibility: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/udan11/discourse-chat-matrix/81ffb761af09fef6d98acb1e713db7b9f9396f0a/.discourse-compatibility -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "eslint-config-discourse" 3 | } 4 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | inherit_gem: 2 | rubocop-discourse: stree-compat.yml 3 | -------------------------------------------------------------------------------- /.streerc: -------------------------------------------------------------------------------- 1 | --print-width=100 2 | --plugins=plugin/trailing_comma,disable_ternary 3 | -------------------------------------------------------------------------------- /.template-lintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: ["ember-template-lint-plugin-discourse"], 3 | extends: "discourse:recommended", 4 | }; 5 | -------------------------------------------------------------------------------- /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 | gem "syntax_tree-disable_ternary" 9 | end 10 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | ast (2.4.2) 5 | json (2.6.2) 6 | parallel (1.22.1) 7 | parser (3.1.2.1) 8 | ast (~> 2.4.1) 9 | prettier_print (1.2.0) 10 | rainbow (3.1.1) 11 | regexp_parser (2.6.0) 12 | rexml (3.2.5) 13 | rubocop (1.36.0) 14 | json (~> 2.3) 15 | parallel (~> 1.10) 16 | parser (>= 3.1.2.1) 17 | rainbow (>= 2.2.2, < 4.0) 18 | regexp_parser (>= 1.8, < 3.0) 19 | rexml (>= 3.2.5, < 4.0) 20 | rubocop-ast (>= 1.20.1, < 2.0) 21 | ruby-progressbar (~> 1.7) 22 | unicode-display_width (>= 1.4.0, < 3.0) 23 | rubocop-ast (1.21.0) 24 | parser (>= 3.1.1.0) 25 | rubocop-discourse (3.0) 26 | rubocop (>= 1.1.0) 27 | rubocop-rspec (>= 2.0.0) 28 | rubocop-rspec (2.13.2) 29 | rubocop (~> 1.33) 30 | ruby-progressbar (1.11.0) 31 | syntax_tree (5.1.0) 32 | prettier_print (>= 1.2.0) 33 | syntax_tree-disable_ternary (1.0.0) 34 | unicode-display_width (2.3.0) 35 | 36 | PLATFORMS 37 | arm64-darwin-20 38 | ruby 39 | x86_64-darwin-18 40 | x86_64-darwin-19 41 | x86_64-darwin-20 42 | x86_64-linux 43 | 44 | DEPENDENCIES 45 | rubocop-discourse 46 | syntax_tree 47 | syntax_tree-disable_ternary 48 | 49 | BUNDLED WITH 50 | 2.3.10 51 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021 Civilized Discourse Construction Kit 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 13 | all 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 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Discourse Chat - Matrix Integration 2 | 3 | This plugin integrates Discourse and Discourse Chat with [Matrix](https://matrix.org/), 4 | the open network for secure, decentralized communication standard. 5 | 6 | More information about this plugin and how to install it on 7 | [Meta](https://meta.discourse.org/t/TODO). 8 | -------------------------------------------------------------------------------- /app/controllers/admin/chat_matrix_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class DiscourseChatMatrix::AdminChatMatrixController < Admin::AdminController 4 | requires_plugin DiscourseChatMatrix::PLUGIN_NAME 5 | 6 | def index 7 | render json: { synapse_config: synapse_config } 8 | end 9 | 10 | def regenerate_tokens 11 | SiteSetting.matrix_as_token = SecureRandom.hex(32) 12 | SiteSetting.matrix_hs_token = SecureRandom.hex(32) 13 | 14 | render json: { synapse_config: synapse_config } 15 | end 16 | 17 | private 18 | 19 | def synapse_config 20 | user_regex = 21 | SiteSetting 22 | .matrix_user_id 23 | .gsub("{user}", ".*") 24 | .gsub("{server_name}", DiscourseChatMatrix.server_name) 25 | 26 | alias_regex = 27 | SiteSetting 28 | .matrix_room_alias 29 | .gsub("{room}", ".*") 30 | .gsub("{server_name}", DiscourseChatMatrix.server_name) 31 | 32 | <<~CONFIG 33 | id: "Discourse Chat Bridge" 34 | url: "#{Discourse.base_url}/matrix" 35 | as_token: "#{SiteSetting.matrix_as_token}" 36 | hs_token: "#{SiteSetting.matrix_hs_token}" 37 | sender_localpart: "_discourse" 38 | namespaces: 39 | users: 40 | - exclusive: true 41 | regex: "#{user_regex}" 42 | aliases: 43 | - exclusive: false 44 | regex: "#{alias_regex}" 45 | rooms: [] 46 | CONFIG 47 | end 48 | end 49 | -------------------------------------------------------------------------------- /app/controllers/chat_matrix_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class DiscourseChatMatrix::ChatMatrixController < ApplicationController 4 | requires_plugin DiscourseChatMatrix::PLUGIN_NAME 5 | 6 | layout false 7 | 8 | skip_before_action :verify_authenticity_token, 9 | :redirect_to_login_if_required, 10 | :preload_json, 11 | :check_xhr 12 | 13 | before_action :ensure_chat_matrix_enabled 14 | 15 | LAST_TRANSACTION_REDIS_KEY = "matrix:last-transaction-id" 16 | LAST_TRANSACTION_EXPIRY = 1.day 17 | 18 | def well_known 19 | response.set_header("Access-Control-Allow-Origin", "*") 20 | response.set_header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") 21 | response.set_header( 22 | "Access-Control-Allow-Headers", 23 | "X-Requested-With, Content-Type, Authorization", 24 | ) 25 | 26 | render json: { "m.homeserver" => { "base_url" => SiteSetting.matrix_homeserver } } 27 | end 28 | 29 | def on_get_users 30 | puts "[on_get_users] user id = #{params[:id]}, body = #{request.body.read}" 31 | if user = User.from_matrix_id(params[:id]) 32 | render json: {} 33 | else 34 | render status: 404, json: {} 35 | end 36 | end 37 | 38 | def on_get_room_alias 39 | puts "[on_get_room_alias] alias = #{params[:alias]}, body = #{request.body.read}" 40 | render json: {} 41 | end 42 | 43 | def on_transaction 44 | if !ActiveSupport::SecurityUtils.secure_compare( 45 | SiteSetting.matrix_hs_token, 46 | params[:access_token], 47 | ) 48 | raise Discourse::InvalidAccess 49 | end 50 | 51 | return render body: nil, status: 400 if params[:id].blank? 52 | 53 | body = 54 | begin 55 | JSON.parse(request.body.read, symbolize_names: true) 56 | rescue StandardError 57 | nil 58 | end 59 | return render body: nil, status: 400 if body.blank? 60 | 61 | # Ensure transaction was not handled before 62 | puts "[on_transaction] transaction id = #{params[:id]}, body = #{body.to_json}" 63 | return render json: {} if Discourse.redis.get(LAST_TRANSACTION_REDIS_KEY) == params[:id] 64 | 65 | body[:events].each do |event| 66 | begin 67 | if event_id = event.dig(:event_id) 68 | # Skip this message if it was generated by an action from Discourse 69 | # to avoid echo 70 | next if DiscourseChatMatrix::MatrixEvents.ignored?(event_id) 71 | end 72 | 73 | DiscourseChatMatrix::MatrixEvents.call(event) 74 | rescue => e 75 | Rails.logger.error("Error handling Matrix error: #{e.message}, event: #{event}") 76 | puts "Error handling Matrix error: #{e.message}" 77 | puts " event: #{event.to_json}" 78 | puts " backtrace: #{e.backtrace.join(" \n")}" 79 | raise 80 | end 81 | end 82 | 83 | Discourse.redis.setex(LAST_TRANSACTION_REDIS_KEY, LAST_TRANSACTION_EXPIRY, params[:id]) 84 | 85 | render json: {} 86 | end 87 | 88 | def on_health_check 89 | render json: {} 90 | end 91 | 92 | private 93 | 94 | def ensure_chat_matrix_enabled 95 | raise Discourse::NotFound if !SiteSetting.discourse_chat_matrix_enabled? 96 | end 97 | end 98 | -------------------------------------------------------------------------------- /app/models/chat_matrix_channel.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ChatMatrixChannel < ActiveRecord::Base 4 | belongs_to :chat_channel 5 | 6 | def self.ensure_exists_in_matrix!(chat_channel, api) 7 | chat_matrix_channel = find_by(chat_channel: chat_channel) 8 | return chat_matrix_channel if chat_matrix_channel 9 | 10 | matrix_room_name = 11 | if chat_channel.name.present? 12 | chat_channel.name 13 | elsif chat_channel.direct_message_channel? 14 | User.where(id: chat_channel.allowed_user_ids).pluck(:username).join(", ") 15 | else 16 | "Chat #{chat_channel.id}" 17 | end 18 | 19 | matrix_room_alias = 20 | begin 21 | room = 22 | if chat_channel.name.present? 23 | chat_channel.name.strip.downcase.gsub(/(\s|_)+/, "-") 24 | else 25 | "chat-#{chat_channel.id}" 26 | end 27 | 28 | SiteSetting 29 | .matrix_room_alias 30 | .gsub("{room}", room) 31 | .gsub("{server_name}", DiscourseChatMatrix.server_name) 32 | end 33 | 34 | room_visibility = 35 | if chat_channel.direct_message_channel? 36 | "private" 37 | elsif Category === chat_channel.chatable && chat_channel.chatable.read_restricted? 38 | "private" 39 | else 40 | "public" 41 | end 42 | 43 | begin 44 | response = 45 | api.create_room( 46 | name: matrix_room_name, 47 | room_alias: DiscourseChatMatrix.localpart(matrix_room_alias), 48 | is_direct: chat_channel.direct_message_channel?, 49 | visibility: room_visibility, 50 | ) 51 | matrix_room_id = response[:room_id] 52 | # TODO: The event for room creation and join room may be received before 53 | # the response from create_room is returned. It is difficult to handle 54 | # this case because there is no information that can be used to reference 55 | # the room. At this moment, it is not a problem because the event will be 56 | # resent by Matrix server and processed again after the room is created. 57 | rescue MatrixSdk::MatrixRequestError => e 58 | # TODO: If M_ROOM_IN_USE, create a different room or try to find room_id 59 | puts "Failed to create room #{matrix_room_name}: #{e.message} (#{e.code})" 60 | raise 61 | end 62 | 63 | # Invite users to private room 64 | if chat_channel.direct_message_channel? 65 | User 66 | .where(id: chat_channel.allowed_user_ids) 67 | .find_each do |user| 68 | begin 69 | invited_user = ChatMatrixUser.ensure_exists_in_matrix!(user, api) 70 | api.invite_user(matrix_room_id, invited_user.matrix_user_id) 71 | rescue MatrixSdk::MatrixRequestError => e 72 | raise if e.code != "M_FORBIDDEN" 73 | end 74 | end 75 | end 76 | 77 | create!( 78 | chat_channel: chat_channel, 79 | matrix_room_id: matrix_room_id, 80 | matrix_room_alias: matrix_room_alias, 81 | ) 82 | end 83 | 84 | def self.ensure_exists_in_chat!(matrix_room_id, event = nil) 85 | chat_matrix_channel = find_by(matrix_room_id: matrix_room_id) 86 | return chat_matrix_channel if chat_matrix_channel 87 | 88 | if event.dig(:content, :is_direct) 89 | creator = ChatMatrixUser.find_by(matrix_user_id: event[:user_id])&.user 90 | user = ChatMatrixUser.find_by(matrix_user_id: event[:state_key])&.user 91 | 92 | chat_channel = 93 | Chat::DirectMessageChannelCreator.create!( 94 | acting_user: creator, 95 | target_users: [creator, user].compact, 96 | ) 97 | 98 | # There are no aliases for private rooms 99 | matrix_room_alias = nil 100 | else 101 | category = nil 102 | room_alias = nil 103 | room_name = nil 104 | room_description = nil 105 | users = [] 106 | 107 | event[:invite_room_state].each do |state| 108 | case state[:type] 109 | when "m.room.join_rules" 110 | category = 111 | if state.dig(:content, :join_rule) == "private" 112 | Category.find_by(id: SiteSetting.staff_category_id) 113 | else 114 | Category.find_by(id: SiteSetting.uncategorized_category_id) 115 | end 116 | when "m.room.canonical_alias" 117 | room_alias = state.dig(:content, :alias) 118 | when "m.room.name" 119 | room_name = state.dig(:content, :name) 120 | when "m.room.topic" 121 | room_description = state.dig(:content, :topic) 122 | when "m.room.member" 123 | users << ChatMatrixUser.find_by(matrix_user_id: state[:state_key])&.user 124 | end 125 | end 126 | 127 | chat_channel = category.create_chat_channel!(name: room_name, description: room_description) 128 | 129 | users.each { |u| chat_channel.add(u) } 130 | end 131 | 132 | create!( 133 | chat_channel: chat_channel, 134 | matrix_room_id: matrix_room_id, 135 | matrix_room_alias: room_alias, 136 | ) 137 | end 138 | end 139 | 140 | # == Schema Information 141 | # 142 | # Table name: chat_matrix_channels 143 | # 144 | # id :bigint not null, primary key 145 | # chat_channel_id :bigint 146 | # matrix_room_id :string 147 | # matrix_room_alias :string 148 | # created_at :datetime not null 149 | # updated_at :datetime not null 150 | # 151 | -------------------------------------------------------------------------------- /app/models/chat_matrix_entity.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ChatMatrixEntity < ActiveRecord::Base 4 | belongs_to :entity, polymorphic: true 5 | end 6 | -------------------------------------------------------------------------------- /app/models/chat_matrix_user.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ChatMatrixUser < ActiveRecord::Base 4 | belongs_to :user 5 | 6 | def self.ensure_exists_in_matrix!(user, api) 7 | chat_matrix_user = find_by(user: user) 8 | return chat_matrix_user if chat_matrix_user 9 | 10 | matrix_user_id = 11 | SiteSetting 12 | .matrix_user_id 13 | .gsub("{user}", user.username) 14 | .gsub("{server_name}", DiscourseChatMatrix.server_name) 15 | 16 | begin 17 | api.register( 18 | type: "m.login.application_service", 19 | username: ::DiscourseChatMatrix.localpart(matrix_user_id), 20 | ) 21 | rescue MatrixSdk::MatrixRequestError => e 22 | raise if e.code != "M_USER_IN_USE" 23 | end 24 | 25 | # Sync user display name and avatar 26 | api.set_display_name(matrix_user_id, user.username, user_id: matrix_user_id) 27 | 28 | create!(user: user, matrix_user_id: matrix_user_id) 29 | end 30 | 31 | def self.ensure_exists_in_chat!(matrix_user_id) 32 | chat_matrix_user = find_by(matrix_user_id: matrix_user_id) 33 | return chat_matrix_user if chat_matrix_user 34 | 35 | username = 36 | SiteSetting.chat_username.gsub("{user}", DiscourseChatMatrix.localpart(matrix_user_id)) 37 | username = UserNameSuggester.suggest(username) 38 | 39 | user = User.create!(username: username, email: "#{username}@matrix", staged: true) 40 | 41 | create!(user: user, matrix_user_id: matrix_user_id) 42 | end 43 | 44 | def self.ensure_in_chat_matrix_channel!(chat_matrix_user, chat_matrix_channel, api) 45 | # if client /join: 46 | # SUCCESS 47 | # else if bot /invite client: 48 | # if client /join: 49 | # SUCCESS 50 | # else: 51 | # FAIL (client couldn't join) 52 | # else if bot /join: 53 | # if bot /invite client and client /join: 54 | # SUCCESS 55 | # else: 56 | # FAIL (bot couldn't invite) 57 | # else: 58 | # FAIL (bot can't get into the room) 59 | 60 | begin 61 | api.join_room(chat_matrix_channel.matrix_room_id, user_id: chat_matrix_user.matrix_user_id) 62 | rescue MatrixSdk::MatrixRequestError => e 63 | raise if e.code != "M_FORBIDDEN" 64 | 65 | begin 66 | api.invite_user(chat_matrix_channel.matrix_room_id, chat_matrix_user.matrix_user_id) 67 | api.join_room(chat_matrix_channel.matrix_room_id) 68 | rescue MatrixSdk::MatrixRequestError => e 69 | api.join_room(chat_matrix_channel.matrix_room_id) 70 | api.invite_user(chat_matrix_channel.matrix_room_id, chat_matrix_user.matrix_user_id) 71 | api.join_room(chat_matrix_channel.matrix_room_id, user_id: chat_matrix_user.matrix_user_id) 72 | end 73 | end 74 | end 75 | end 76 | 77 | # == Schema Information 78 | # 79 | # Table name: chat_matrix_users 80 | # 81 | # id :bigint not null, primary key 82 | # user_id :bigint 83 | # matrix_user_id :string 84 | # created_at :datetime not null 85 | # updated_at :datetime not null 86 | # 87 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/admin-chat-route-map.js: -------------------------------------------------------------------------------- 1 | export default { 2 | resource: "admin.adminPlugins", 3 | path: "/plugins", 4 | 5 | map() { 6 | this.route("matrix"); 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/controllers/admin-plugins-matrix.js: -------------------------------------------------------------------------------- 1 | import Controller from "@ember/controller"; 2 | import { action } from "@ember/object"; 3 | import { ajax } from "discourse/lib/ajax"; 4 | import { later } from "@ember/runloop"; 5 | import { clipboardCopy } from "discourse/lib/utilities"; 6 | 7 | export default class AdminPluginsMatrix extends Controller { 8 | copied = false; 9 | 10 | @action 11 | regenerateTokens() { 12 | ajax("/admin/plugins/matrix/tokens", { 13 | type: "POST", 14 | }).then((model) => { 15 | this.setProperties({ model }); 16 | }); 17 | } 18 | 19 | @action 20 | copyToClipboard(content) { 21 | if (clipboardCopy(content)) { 22 | this.set("copied", true); 23 | later(() => this.set("copied", false), 3000); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/routes/admin-plugins-matrix.js: -------------------------------------------------------------------------------- 1 | import { ajax } from "discourse/lib/ajax"; 2 | import DiscourseRoute from "discourse/routes/discourse"; 3 | 4 | export default class AdminPluginsChatRoute extends DiscourseRoute { 5 | model() { 6 | return ajax("/admin/plugins/matrix"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/admin-plugins-matrix.hbs: -------------------------------------------------------------------------------- 1 |

{{i18n "chat_matrix.synapse_config.title"}}

2 | 3 |

{{i18n "chat_matrix.synapse_config.description"}}

4 | 5 | 8 | 9 | 15 | 16 | -------------------------------------------------------------------------------- /assets/stylesheets/common/chat-matrix.scss: -------------------------------------------------------------------------------- 1 | .matrix-config { 2 | font-family: monospace; 3 | font-size: $font-up-1; 4 | height: 350px; 5 | width: 100%; 6 | } 7 | -------------------------------------------------------------------------------- /config/locales/client.en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | admin_js: 3 | chat_matrix: 4 | title: "Matrix Integration" 5 | 6 | synapse_config: 7 | title: "Synapse Config" 8 | description: "This is a sample Synapse Application Service configuration that can be used to register the Discourse service implemented by the plugin. This is secret information, keep the tokens hidden!" 9 | 10 | regenerate_tokens: "Regenerate Tokens" 11 | copy_to_clipboard: "Copy to Clipboard" 12 | copied_to_clipboard: "Copied!" 13 | -------------------------------------------------------------------------------- /config/locales/server.en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | site_settings: 3 | discourse_chat_matrix_enabled: 'Enable discourse-chat-matrix plugin' 4 | matrix_homeserver: 'URL to the Matrix home server this instance is bridging with' 5 | matrix_server_name: 'Server name used to build user IDs and room aliases' 6 | matrix_hs_token: 'Token homeserver is going to user to authenticate requests to application service' 7 | matrix_as_token: 'Token application service is going to user to authenticate requests to homeserver' 8 | matrix_user_id: 'Format for Matrix user IDs mapped from Discourse' 9 | matrix_room_alias: 'Format for Matrix room aliases mapped from Discourse' 10 | 11 | errors: 12 | requires_chat: 'Chat plugin must be enabled' 13 | blank_matrix_homeserver: 'Matrix homeserver URL must be configured' 14 | -------------------------------------------------------------------------------- /config/settings.yml: -------------------------------------------------------------------------------- 1 | plugins: 2 | discourse_chat_matrix_enabled: 3 | default: false 4 | validator: ChatMatrixEnabledValidator 5 | matrix_homeserver: 6 | default: '' 7 | matrix_server_name: 8 | default: '' 9 | matrix_hs_token: 10 | default: '' 11 | matrix_as_token: 12 | default: '' 13 | chat_username: 14 | default: '{user}-m' 15 | chat_channel_name: 16 | default: '{room}' 17 | matrix_user_id: 18 | default: '@{user}-d:{server_name}' 19 | matrix_room_alias: 20 | default: '#{room}-d:{server_name}' 21 | -------------------------------------------------------------------------------- /db/migrate/20221008205346_create_chat_matrix_channels.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class CreateChatMatrixChannels < ActiveRecord::Migration[7.0] 4 | def change 5 | create_table :chat_matrix_channels do |t| 6 | t.bigint :chat_channel_id 7 | t.string :matrix_room_id 8 | t.string :matrix_room_alias 9 | t.timestamps 10 | end 11 | 12 | add_index :chat_matrix_channels, :chat_channel_id, unique: true 13 | add_index :chat_matrix_channels, :matrix_room_id, unique: true 14 | add_index :chat_matrix_channels, :matrix_room_alias, unique: true 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /db/migrate/20221008205347_create_chat_matrix_users.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class CreateChatMatrixUsers < ActiveRecord::Migration[7.0] 4 | def change 5 | create_table :chat_matrix_users do |t| 6 | t.bigint :user_id 7 | t.string :matrix_user_id 8 | t.timestamps 9 | end 10 | 11 | add_index :chat_matrix_users, :user_id, unique: true 12 | add_index :chat_matrix_users, :matrix_user_id, unique: true 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /db/migrate/20230122144120_create_chat_matrix_entities.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class CreateChatMatrixEntities < ActiveRecord::Migration[7.0] 4 | def change 5 | create_table :chat_matrix_entities do |t| 6 | t.string :entity_type 7 | t.bigint :entity_id 8 | t.string :matrix_event_id 9 | t.timestamps 10 | end 11 | 12 | add_index :chat_matrix_entities, %i[entity_type entity_id], unique: true 13 | add_index :chat_matrix_entities, :matrix_event_id, unique: true 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /lib/chat_membership_handler.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module DiscourseChatMatrix::ChatMembershipHandler 4 | def self.on_change(user, chat_channel, membership) 5 | api = DiscourseChatMatrix.api 6 | 7 | if membership 8 | chat_matrix_channel = ChatMatrixChannel.ensure_exists_in_matrix!(chat_channel, api) 9 | chat_matrix_user = ChatMatrixUser.ensure_exists_in_matrix!(user, api) 10 | 11 | begin 12 | api.join_room(chat_matrix_channel.matrix_room_id, user_id: chat_matrix_user.matrix_user_id) 13 | rescue StandardError 14 | nil 15 | end 16 | else 17 | chat_matrix_channel = ChatMatrixChannel.find_by(chat_channel: chat_channel) 18 | chat_matrix_user = ChatMatrixUser.find_by(user: user) 19 | 20 | if chat_matrix_channel && chat_matrix_user 21 | begin 22 | api.leave_room( 23 | chat_matrix_channel.matrix_room_id, 24 | user_id: chat_matrix_user.matrix_user_id, 25 | ) 26 | rescue StandardError 27 | nil 28 | end 29 | end 30 | end 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /lib/chat_message_handler.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module DiscourseChatMatrix::ChatMessageHandler 4 | def self.on_create(chat_message) 5 | # Skip this message if it was first posted in Matrix to avoid echo 6 | return if chat_message.instance_variable_get(:@from_matrix) 7 | 8 | api = DiscourseChatMatrix.api 9 | 10 | chat_matrix_user = ChatMatrixUser.ensure_exists_in_matrix!(chat_message.user, api) 11 | chat_matrix_channel = ChatMatrixChannel.ensure_exists_in_matrix!(chat_message.chat_channel, api) 12 | 13 | ChatMatrixUser.ensure_in_chat_matrix_channel!(chat_matrix_user, chat_matrix_channel, api) 14 | 15 | cooked = ChatMessage.cook(chat_message.message, user_id: chat_message.last_editor_id) 16 | 17 | content = { 18 | msgtype: "m.text", 19 | body: chat_message.message, 20 | format: "org.matrix.custom.html", 21 | formatted_body: DiscourseChatMatrix::Message.process_cooked(cooked), 22 | } 23 | 24 | if chat_message.in_reply_to_id 25 | matrix_event_id = 26 | ChatMatrixEntity.where( 27 | entity_type: "ChatMessage", 28 | entity_id: chat_message.in_reply_to_id, 29 | ).pluck_first(:matrix_event_id) 30 | 31 | content[:"m.relates_to"] = { 32 | rel_type: "m.thread", 33 | event_id: matrix_event_id, 34 | } if matrix_event_id 35 | end 36 | 37 | response = 38 | api.send_message_event( 39 | chat_matrix_channel.matrix_room_id, 40 | "m.room.message", 41 | content, 42 | user_id: chat_matrix_user.matrix_user_id, 43 | ) 44 | 45 | ChatMatrixEntity.create!(entity: chat_message, matrix_event_id: response[:event_id]) 46 | 47 | # Ignore future events for this message to avoid echo 48 | DiscourseChatMatrix::MatrixEvents.ignore(response[:event_id]) 49 | end 50 | 51 | def self.on_edit(chat_message) 52 | # Skip this message if it was first posted in Matrix to avoid echo 53 | return if chat_message.instance_variable_get(:@from_matrix) 54 | 55 | api = DiscourseChatMatrix.api 56 | 57 | chat_matrix_channel = ChatMatrixChannel.ensure_exists_in_matrix!(chat_message.chat_channel, api) 58 | chat_matrix_user = ChatMatrixUser.ensure_exists_in_matrix!(chat_message.user, api) 59 | chat_matrix_entity = ChatMatrixEntity.find_by(entity: chat_message) 60 | 61 | cooked = ChatMessage.cook(chat_message.message, user_id: chat_message.last_editor_id) 62 | 63 | content = { 64 | msgtype: "m.text", 65 | body: chat_message.message, 66 | format: "org.matrix.custom.html", 67 | formatted_body: DiscourseChatMatrix::Message.process_cooked(cooked), 68 | } 69 | 70 | content = { 71 | **content, 72 | "m.new_content": content, 73 | "m.relates_to": { 74 | rel_type: "m.replace", 75 | event_id: chat_matrix_entity.matrix_event_id, 76 | }, 77 | } 78 | 79 | response = 80 | api.send_message_event( 81 | chat_matrix_channel.matrix_room_id, 82 | "m.room.message", 83 | content, 84 | user_id: chat_matrix_user.matrix_user_id, 85 | ) 86 | 87 | # Ignore future events for this message to avoid echo 88 | DiscourseChatMatrix::MatrixEvents.ignore(response[:event_id]) 89 | end 90 | 91 | def self.on_delete(chat_message) 92 | api = DiscourseChatMatrix.api 93 | 94 | chat_matrix_channel = ChatMatrixChannel.ensure_exists_in_matrix!(chat_message.chat_channel, api) 95 | chat_matrix_user = ChatMatrixUser.ensure_exists_in_matrix!(chat_message.user, api) 96 | chat_matrix_entity = ChatMatrixEntity.find_by(entity: chat_message) 97 | 98 | response = 99 | api.redact_event( 100 | chat_matrix_channel.matrix_room_id, 101 | chat_matrix_entity.matrix_event_id, 102 | user_id: chat_matrix_user.matrix_user_id, 103 | ) 104 | 105 | # Ignore future events for this message to avoid echo 106 | DiscourseChatMatrix::MatrixEvents.ignore(response[:event_id]) 107 | end 108 | end 109 | -------------------------------------------------------------------------------- /lib/matrix_events.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module DiscourseChatMatrix::MatrixEvents 4 | MATRIX_EVENT_REDIS_KEY_PREFIX = "matrix:ignore:matrix-event-" 5 | MATRIX_EVENT_REDIS_EXPIRY = 10.minutes 6 | 7 | def self.handlers(type) 8 | @handlers ||= {} 9 | @handlers[type] ||= [] 10 | end 11 | 12 | def self.reset_handlers! 13 | # Used in testing environments 14 | @handlers = {} 15 | end 16 | 17 | def self.on(type, &block) 18 | handlers(type) << block 19 | end 20 | 21 | def self.call(event) 22 | handlers(event[:type]).each { |handler| handler.call(event) } 23 | end 24 | 25 | def self.ignore(event_id) 26 | Discourse.redis.setex( 27 | "#{MATRIX_EVENT_REDIS_KEY_PREFIX}-#{event_id}", 28 | MATRIX_EVENT_REDIS_EXPIRY, 29 | true, 30 | ) 31 | end 32 | 33 | def self.ignored?(event_id) 34 | Discourse.redis.exists?("#{MATRIX_EVENT_REDIS_KEY_PREFIX}-#{event_id}") 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /lib/matrix_membership_handler.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module DiscourseChatMatrix::MatrixMembershipHandler 4 | def self.on_change(event) 5 | # We are aware what the bot does, so we can ignore it 6 | return if event[:sender] == DiscourseChatMatrix.bot_user_id 7 | 8 | case event[:content][:membership] 9 | when "invite", "join" 10 | chat_matrix_channel = ChatMatrixChannel.ensure_exists_in_chat!(event[:room_id], event) 11 | chat_matrix_user = ChatMatrixUser.ensure_exists_in_chat!(event[:user_id]) 12 | 13 | if event[:content][:membership] == "invite" 14 | # TODO: Check if 'invite' must be replied with 'join' 15 | DiscourseChatMatrix.api.join_room(event[:room_id], user_id: event[:state_key]) 16 | end 17 | 18 | chat_matrix_channel.chat_channel.add(chat_matrix_user.user) 19 | when "leave" 20 | chat_matrix_channel = ChatMatrixChannel.find_by(matrix_room_id: event[:room_id]) 21 | chat_matrix_user = ChatMatrixUser.find_by(matrix_user_id: event[:user_id]) 22 | 23 | if chat_matrix_channel && chat_matrix_user 24 | chat_matrix_channel.chat_channel.remove(chat_matrix_user.user) 25 | end 26 | end 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /lib/matrix_message_handler.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module DiscourseChatMatrix::MatrixMessageHandler 4 | def self.on_create(event) 5 | chat_matrix_user = ChatMatrixUser.ensure_exists_in_chat!(event[:user_id]) 6 | chat_matrix_channel = ChatMatrixChannel.ensure_exists_in_chat!(event[:room_id]) 7 | in_reply_to_id = 8 | if event[:content][:"m.relates_to"].present? 9 | ChatMatrixEntity.where( 10 | matrix_event_id: event[:content][:"m.relates_to"][:event_id], 11 | ).pluck_first(:chat_message_id) 12 | end 13 | 14 | creator = 15 | Chat::ChatMessageCreator.new( 16 | chat_channel: chat_matrix_channel.chat_channel, 17 | in_reply_to_id: in_reply_to_id, 18 | user: chat_matrix_user.user, 19 | content: event[:content][:body], 20 | ) 21 | creator.chat_message.instance_variable_set(:@from_matrix, true) # TODO 22 | creator.create 23 | 24 | ChatMatrixEntity.create!(entity: creator.chat_message, matrix_event_id: event[:event_id]) 25 | 26 | # TODO: This should be a part of `Chat::ChatMessageCreator`. 27 | if chat_matrix_channel.chat_channel.direct_message_channel? 28 | user_ids_allowing_communication = 29 | UserCommScreener.new( 30 | acting_user: chat_matrix_user.user, 31 | target_user_ids: 32 | chat_matrix_channel.chat_channel.user_chat_channel_memberships.pluck(:user_id), 33 | ).allowing_actor_communication 34 | 35 | if user_ids_allowing_communication.any? 36 | chat_matrix_channel 37 | .chat_channel 38 | .user_chat_channel_memberships 39 | .where(user_id: user_ids_allowing_communication) 40 | .update_all(following: true) 41 | end 42 | end 43 | end 44 | 45 | def self.on_edit(event) 46 | chat_matrix_user = ChatMatrixUser.ensure_exists_in_chat!(event[:user_id]) 47 | chat_matrix_channel = ChatMatrixChannel.ensure_exists_in_chat!(event[:room_id]) 48 | 49 | chat_message = 50 | ChatMessage.find_by( 51 | id: 52 | ChatMatrixEntity.select(:entity_id).where( 53 | entity_type: "ChatMessage", 54 | matrix_event_id: event[:content][:"m.relates_to"][:event_id], 55 | ), 56 | ) 57 | 58 | chat_message.instance_variable_set(:@from_matrix, true) # TODO 59 | chat_message_updater = 60 | Chat::ChatMessageUpdater.update( 61 | guardian: chat_matrix_user.user.guardian, 62 | chat_message: chat_message, 63 | new_content: event[:content][:"m.new_content"][:body], 64 | upload_ids: [], 65 | ) 66 | 67 | if chat_message_updater.failed? 68 | Rails.logger.error( 69 | "Failed to update #{chat_message.id}: #{chat_message_updater.error}. event = #{event.to_json}", 70 | ) 71 | end 72 | end 73 | 74 | def self.on_delete(event) 75 | chat_matrix_user = ChatMatrixUser.ensure_exists_in_chat!(event[:user_id]) 76 | user = chat_matrix_user.user 77 | guardian = user.guardian 78 | 79 | chat_message = 80 | ChatMessage.find_by( 81 | id: 82 | ChatMatrixEntity.select(:entity_id).where( 83 | entity_type: "ChatMessage", 84 | matrix_event_id: event[:redacts], 85 | ), 86 | ) 87 | chat_channel = chat_message.chat_channel 88 | chatable = chat_channel.chatable 89 | 90 | if guardian.can_delete_chat?(chat_message, chatable) 91 | ChatPublisher.publish_delete!(chat_channel, chat_message) if chat_message.trash!(user) 92 | end 93 | end 94 | end 95 | -------------------------------------------------------------------------------- /lib/matrix_reaction_handler.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module DiscourseChatMatrix::MatrixReactionHandler 4 | def self.on_create(event) 5 | chat_matrix_user = ChatMatrixUser.ensure_exists_in_chat!(event[:user_id]) 6 | chat_message = 7 | ChatMessage.find_by( 8 | id: 9 | ChatMatrixEntity.select(:entity_id).where( 10 | entity_type: "ChatMessage", 11 | matrix_event_id: event[:content][:"m.relates_to"][:event_id], 12 | ), 13 | ) 14 | 15 | emoji = event[:content][:"m.relates_to"][:key] 16 | 17 | Chat::ChatMessageReactor.new(chat_matrix_user.user, chat_message.chat_channel).react!( 18 | message_id: chat_message.id, 19 | react_action: Chat::ChatMessageReactor::ADD_REACTION, 20 | emoji: Emoji.unicode_replacements[emoji] || emoji, 21 | ) 22 | end 23 | 24 | def self.on_delete(event) 25 | chat_matrix_user = ChatMatrixUser.ensure_exists_in_chat!(event[:user_id]) 26 | chat_message_reaction = 27 | ChatMessageReaction.find_by( 28 | id: 29 | ChatMatrixEntity.select(:entity_id).where( 30 | entity_type: "ChatMessageReaction", 31 | matrix_event_id: event[:redacts], 32 | ), 33 | ) 34 | chat_message = chat_message_reaction.chat_message 35 | 36 | Chat::ChatMessageReactor.new(chat_matrix_user.user, chat_message.chat_channel).react!( 37 | message_id: chat_message.id, 38 | react_action: Chat::ChatMessageReactor::REMOVE_REACTION, 39 | emoji: chat_message_reaction.emoji, 40 | ) 41 | end 42 | end 43 | -------------------------------------------------------------------------------- /lib/message.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module DiscourseChatMatrix::Message 4 | def self.process_cooked(html) 5 | fragment = Nokogiri::HTML5.fragment(html) 6 | 7 | # Replace emojis with their Unicode versions 8 | fragment 9 | .css("img.emoji") 10 | .each do |node| 11 | if replacement = emoji_map[node["title"][1...-1]] 12 | node.replace(replacement) 13 | end 14 | end 15 | 16 | fragment.to_html 17 | end 18 | 19 | private 20 | 21 | def self.emoji_map 22 | Emoji.unicode_replacements.invert 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /lib/validators/chat_matrix_enabled_validator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ChatMatrixEnabledValidator 4 | def initialize(opts = {}) 5 | @opts = opts 6 | end 7 | 8 | def valid_value?(val) 9 | return true if val == "f" 10 | 11 | return false if !SiteSetting.respond_to?(:chat_enabled) || !SiteSetting.chat_enabled 12 | return false if SiteSetting.matrix_homeserver.blank? 13 | 14 | true 15 | end 16 | 17 | def error_message 18 | if !SiteSetting.respond_to?(:chat_enabled) || !SiteSetting.chat_enabled 19 | I18n.t("site_settings.errors.requires_chat") 20 | elsif SiteSetting.matrix_homeserver.blank? 21 | I18n.t("site_settings.errors.blank_matrix_homeserver") 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "discourse-plugin-name", 3 | "version": "0.0.1", 4 | "repository": "TODO", 5 | "author": "Discourse", 6 | "license": "MIT", 7 | "devDependencies": { 8 | "eslint-config-discourse": "^3.1.0" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /plugin.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # name: discourse-chat-matrix 4 | # about: Integrate Discourse Chat with Matrix 5 | # version: 0.0.1 6 | # authors: Dan Ungureanu 7 | # url: https://meta.discourse.org/t/TODO 8 | 9 | require "net/http" 10 | require "uri" 11 | 12 | gem "little-plugger", "1.1.4" 13 | gem "logging", "2.3.1" 14 | gem "matrix_sdk", "2.8.0" 15 | 16 | enabled_site_setting :discourse_chat_matrix_enabled 17 | 18 | require_relative "lib/validators/chat_matrix_enabled_validator.rb" 19 | 20 | register_asset "stylesheets/common/chat-matrix.scss" 21 | 22 | after_initialize do 23 | module ::DiscourseChatMatrix 24 | PLUGIN_NAME = "discourse-chat-matrix" 25 | 26 | def self.server_name 27 | SiteSetting.matrix_server_name.presence || URI(SiteSetting.matrix_homeserver).hostname 28 | end 29 | 30 | def self.localpart(full_name) 31 | full_name.split(":").first[1..] 32 | end 33 | 34 | def self.bot_user_id 35 | "@_discourse:#{DiscourseChatMatrix.server_name}" 36 | end 37 | 38 | def self.api 39 | @api ||= 40 | MatrixSdk::Api.new( 41 | SiteSetting.matrix_homeserver, 42 | protocols: %i[AS CS], 43 | access_token: SiteSetting.matrix_as_token, 44 | autoretry: false, 45 | ) 46 | end 47 | 48 | class Engine < ::Rails::Engine 49 | engine_name PLUGIN_NAME 50 | isolate_namespace DiscourseChatMatrix 51 | end 52 | 53 | DiscourseChatMatrix::Engine.routes.draw do 54 | get "/_matrix/app/v1/users/:id" => "chat_matrix#on_get_users" 55 | get "/_matrix/app/v1/rooms/:alias" => "chat_matrix#on_get_room_alias" 56 | put "/_matrix/app/v1/transactions/:id" => "chat_matrix#on_transaction" 57 | 58 | get "/users/:id" => "chat_matrix#on_get_users" 59 | get "/rooms/:alias" => "chat_matrix#on_get_room_alias" 60 | put "/transactions/:id" => "chat_matrix#on_transaction" 61 | 62 | get "/health" => "chat_matrix#on_health_check" 63 | end 64 | 65 | Discourse::Application.routes.prepend do 66 | get "/.well-known/matrix/client" => "discourse_chat_matrix/chat_matrix#well_known" 67 | get "/admin/plugins/matrix" => "discourse_chat_matrix/admin_chat_matrix#index" 68 | post "/admin/plugins/matrix/tokens" => 69 | "discourse_chat_matrix/admin_chat_matrix#regenerate_tokens" 70 | 71 | mount DiscourseChatMatrix::Engine, at: "/matrix" 72 | end 73 | end 74 | 75 | require_relative "app/controllers/admin/chat_matrix_controller.rb" 76 | require_relative "app/controllers/chat_matrix_controller.rb" 77 | require_relative "app/models/chat_matrix_channel.rb" 78 | require_relative "app/models/chat_matrix_entity.rb" 79 | require_relative "app/models/chat_matrix_user.rb" 80 | require_relative "lib/chat_membership_handler.rb" 81 | require_relative "lib/chat_message_handler.rb" 82 | require_relative "lib/matrix_events.rb" 83 | require_relative "lib/matrix_membership_handler.rb" 84 | require_relative "lib/matrix_message_handler.rb" 85 | require_relative "lib/matrix_reaction_handler.rb" 86 | require_relative "lib/message.rb" 87 | 88 | add_admin_route "chat_matrix.title", "matrix" 89 | 90 | # ------------------- 91 | # Discourse -> Matrix 92 | # ------------------- 93 | 94 | # Handle messages 95 | on(:chat_message_created) do |chat_message, chat_channel, user| 96 | DiscourseChatMatrix::ChatMessageHandler.on_create(chat_message) 97 | end 98 | 99 | on(:chat_message_edited) do |chat_message, chat_channel, user| 100 | DiscourseChatMatrix::ChatMessageHandler.on_edit(chat_message) 101 | end 102 | 103 | on(:chat_message_deleted) do |chat_message, chat_channel, user| 104 | DiscourseChatMatrix::ChatMessageHandler.on_delete(chat_message) 105 | end 106 | 107 | # Handle chat channel membership changes 108 | on(:chat_membership) do |user, chat_channel, membership| 109 | DiscourseChatMatrix::ChatMembershipHandler.on_change(user, chat_channel, membership) 110 | end 111 | 112 | # ------------------- 113 | # Matrix -> Discourse 114 | # ------------------- 115 | 116 | # Handle new / edited messages 117 | DiscourseChatMatrix::MatrixEvents.on("m.room.message") do |event| 118 | if event.dig(:content, :msgtype) == "m.text" 119 | if event.dig(:content, :"m.new_content").present? 120 | if event.dig(:content, :"m.relates_to", :rel_type) == "m.replace" 121 | DiscourseChatMatrix::MatrixMessageHandler.on_edit(event) 122 | else 123 | Rails.logger.warn("Unknown relationship type: #{event}") 124 | end 125 | else 126 | DiscourseChatMatrix::MatrixMessageHandler.on_create(event) 127 | end 128 | end 129 | end 130 | 131 | # Handle deleted messages 132 | DiscourseChatMatrix::MatrixEvents.on("m.room.redaction") do |event| 133 | chat_matrix_entity = ChatMatrixEntity.find_by(matrix_event_id: event[:redacts]) 134 | 135 | case chat_matrix_entity.entity_type 136 | when "ChatMessage" 137 | DiscourseChatMatrix::MatrixMessageHandler.on_delete(event) 138 | when "ChatMessageReaction" 139 | DiscourseChatMatrix::MatrixReactionHandler.on_delete(event) 140 | end 141 | end 142 | 143 | # Handle room membership changes 144 | DiscourseChatMatrix::MatrixEvents.on("m.room.member") do |event| 145 | DiscourseChatMatrix::MatrixMembershipHandler.on_change(event) 146 | end 147 | 148 | # Handle new reactions 149 | DiscourseChatMatrix::MatrixEvents.on("m.reaction") do |event| 150 | DiscourseChatMatrix::MatrixReactionHandler.on_create(event) 151 | end 152 | end 153 | -------------------------------------------------------------------------------- /spec/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/udan11/discourse-chat-matrix/81ffb761af09fef6d98acb1e713db7b9f9396f0a/spec/.gitkeep -------------------------------------------------------------------------------- /spec/fabricators/chat_matrix_channel_fabricator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | Fabricator(:chat_matrix_channel) do 4 | chat_channel { Fabricate(:chat_channel) } 5 | matrix_room_id { sequence(:matrix_id) { |i| "!room-#{i}:matrix.discourse.org" } } 6 | matrix_room_alias { sequence(:matrix_id) { |i| "#chat-#{i}:matrix.discourse.org" } } 7 | end 8 | -------------------------------------------------------------------------------- /spec/fabricators/chat_matrix_entity_fabricator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | Fabricator(:chat_matrix_entity) do 4 | matrix_event_id { sequence(:matrix_id) { |i| "$event-#{i}:matrix.discourse.org" } } 5 | end 6 | -------------------------------------------------------------------------------- /spec/fabricators/chat_matrix_user_fabricator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | Fabricator(:chat_matrix_user) do 4 | user { Fabricate(:user) } 5 | matrix_user_id { sequence(:matrix_id) { |i| "@user-#{i}:matrix.discourse.org" } } 6 | end 7 | -------------------------------------------------------------------------------- /spec/lib/chat_message_handler_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | describe DiscourseChatMatrix::ChatMessageHandler do 4 | fab!(:chat_channel) { Fabricate(:chat_channel) } 5 | fab!(:user) { Fabricate(:user, username: "foo") } 6 | 7 | before { DiscourseChatMatrixHelpers.enable! } 8 | 9 | describe "#on_create" do 10 | before do 11 | # Initial server discovery 12 | stub_request(:get, "https://homeserver.discourse.org/_matrix/client/versions").to_return( 13 | status: 200, 14 | body: { 15 | versions: %w[r0.0.1 r0.1.0 r0.2.0 r0.3.0 r0.4.0 r0.5.0 r0.6.0 r0.6.1 v1.1 v1.2], 16 | unstable_features: { 17 | "org.matrix.label_based_filtering": true, 18 | "org.matrix.e2e_cross_signing": true, 19 | "org.matrix.msc2432": true, 20 | "uk.half-shot.msc2666.mutual_rooms": true, 21 | "io.element.e2ee_forced.public": false, 22 | "io.element.e2ee_forced.private": false, 23 | "io.element.e2ee_forced.trusted_private": false, 24 | "org.matrix.msc3026.busy_presence": false, 25 | "org.matrix.msc2285.stable": true, 26 | "org.matrix.msc3827.stable": true, 27 | "org.matrix.msc2716": false, 28 | "org.matrix.msc3030": false, 29 | "org.matrix.msc3440.stable": true, 30 | "fi.mau.msc2815": false, 31 | }, 32 | }.to_json, 33 | ) 34 | 35 | # Register user 36 | stub_request(:post, "https://homeserver.discourse.org/_matrix/client/v3/register").with( 37 | query: { 38 | kind: "user", 39 | }, 40 | body: { 41 | type: "m.login.application_service", 42 | username: "foo-d", 43 | }, 44 | ).to_return( 45 | status: 200, 46 | body: { 47 | user_id: "@foo-d:matrix.discourse.org", 48 | home_server: "matrix.discourse.org", 49 | access_token: "syt_YnJ1Y2UxLWQ_VEFTTyeNZfwBNfPizkvc_1phJBH", 50 | device_id: "WZHKQHTCPG", 51 | }.to_json, 52 | ) 53 | 54 | # Update user's display name 55 | stub_request( 56 | :put, 57 | "https://homeserver.discourse.org/_matrix/client/v3/profile/@foo-d:matrix.discourse.org/displayname", 58 | ).with( 59 | query: { 60 | user_id: "@foo-d:matrix.discourse.org", 61 | }, 62 | body: { 63 | displayname: "foo", 64 | }, 65 | ).to_return(status: 200, body: {}.to_json) 66 | 67 | # Create room 68 | stub_request(:post, "https://homeserver.discourse.org/_matrix/client/v3/createRoom").with( 69 | body: { 70 | visibility: "public", 71 | room_alias_name: "#{chat_channel.name.strip.downcase.gsub(/(\s|_)+/, "-")}-d", 72 | name: chat_channel.name, 73 | is_direct: false, 74 | }, 75 | ).to_return( 76 | status: 200, 77 | body: { 78 | room_id: "!TfCluAdYtDPKHONeLP:matrix.discourse.org", 79 | room_alias: "#politics-0-d:matrix.discourse.org", 80 | }.to_json, 81 | ) 82 | 83 | # Join room 84 | stub_request( 85 | :post, 86 | "https://homeserver.discourse.org/_matrix/client/v3/join/!TfCluAdYtDPKHONeLP:matrix.discourse.org", 87 | ).with(query: { user_id: "@foo-d:matrix.discourse.org" }).to_return( 88 | status: 200, 89 | body: { room_id: "!TfCluAdYtDPKHONeLP:matrix.discourse.org" }.to_json, 90 | ) 91 | end 92 | 93 | it "creates a new message in Matrix" do 94 | # Given 95 | send_message_stub = 96 | stub_request( 97 | :put, 98 | Addressable::Template.new( 99 | "https://homeserver.discourse.org/_matrix/client/v3/rooms/!TfCluAdYtDPKHONeLP:matrix.discourse.org/send/m.room.message/{txnId}?user_id=@foo-d:matrix.discourse.org", 100 | ), 101 | ).with( 102 | body: { 103 | msgtype: "m.text", 104 | body: "Hello world!", 105 | format: "org.matrix.custom.html", 106 | formatted_body: "

Hello world!

", 107 | }, 108 | ).to_return( 109 | status: 200, 110 | body: { event_id: "$vh5JvjJ59UTo5FUKc3_AlFeq7Nkisi3gQxZJokb9GXk" }.to_json, 111 | ) 112 | 113 | # When 114 | chat_message_creator = 115 | Chat::ChatMessageCreator.create( 116 | chat_channel: chat_channel, 117 | user: user, 118 | content: "Hello world!", 119 | ) 120 | 121 | # Then 122 | expect(send_message_stub).to have_been_requested 123 | end 124 | end 125 | end 126 | -------------------------------------------------------------------------------- /spec/lib/matrix_events_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | describe DiscourseChatMatrix::MatrixEvents do 4 | before do 5 | @old_handlers = described_class.instance_variable_get(:@handlers) 6 | described_class.reset_handlers! 7 | end 8 | 9 | after { described_class.instance_variable_set(:@handlers, @old_handlers) } 10 | 11 | describe "#handlers" do 12 | it "returns an empty array when no event was set" do 13 | # Then 14 | expect(described_class.handlers("m.room.message")).to eq([]) 15 | end 16 | 17 | it "returns an array of handlers when an event was set" do 18 | # Given 19 | described_class.on("m.room.message") { |event| nil } 20 | 21 | # Then 22 | expect(described_class.handlers("m.room.message").size).to eq(1) 23 | end 24 | end 25 | 26 | describe "#on" do 27 | it "registers an event handler" do 28 | # When 29 | described_class.on("m.room.message") { |event| nil } 30 | 31 | # Then 32 | expect(described_class.handlers("m.room.message").size).to eq(1) 33 | end 34 | end 35 | 36 | describe "#call" do 37 | it "registers an event handler" do 38 | # Given 39 | called = 0 40 | described_class.on("m.room.message") { |event| called += 1 } 41 | 42 | # When 43 | described_class.call({ type: "m.room.message" }) 44 | 45 | # Then 46 | expect(called).to eq(1) 47 | end 48 | end 49 | 50 | describe "#ignore and #ignored?" do 51 | before { Discourse.redis.flushdb } 52 | after { Discourse.redis.flushdb } 53 | 54 | it "sets and returns ignored flag" do 55 | # When 56 | described_class.ignore("foo") 57 | 58 | # Then 59 | expect(described_class.ignored?("foo")).to eq(true) 60 | end 61 | 62 | it "does not return if not set" do 63 | expect(described_class.ignored?("foo")).to eq(false) 64 | end 65 | end 66 | end 67 | -------------------------------------------------------------------------------- /spec/lib/matrix_message_handler_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | describe DiscourseChatMatrix::MatrixMessageHandler do 4 | fab!(:chat_matrix_user) { Fabricate(:chat_matrix_user) } 5 | fab!(:chat_matrix_channel) { Fabricate(:chat_matrix_channel) } 6 | 7 | before { DiscourseChatMatrixHelpers.enable! } 8 | 9 | describe "#on_create" do 10 | it "creates a new message" do 11 | # When 12 | DiscourseChatMatrix::MatrixEvents.call( 13 | age: 42, 14 | content: { 15 | body: "Hello world!", 16 | msgtype: "m.text", 17 | }, 18 | event_id: "$xvFPyeUJDhurrCxemPRG5RBOiMra9z3OFr7ITopsVCg", 19 | origin_server_ts: 1_000_000_000_000, 20 | room_id: chat_matrix_channel.matrix_room_id, 21 | sender: chat_matrix_user.matrix_user_id, 22 | type: "m.room.message", 23 | unsigned: { 24 | age: 42, 25 | }, 26 | user_id: chat_matrix_user.matrix_user_id, 27 | ) 28 | 29 | # Then 30 | chat_message = ChatMessage.last 31 | expect(chat_message.user).to eq(chat_matrix_user.user) 32 | expect(chat_message.message).to eq("Hello world!") 33 | end 34 | end 35 | 36 | describe "#on_edit" do 37 | fab!(:chat_message) do 38 | Fabricate(:chat_message, user: chat_matrix_user.user, message: "Hello world!") 39 | end 40 | 41 | fab!(:chat_matrix_entity) do 42 | Fabricate( 43 | :chat_matrix_entity, 44 | entity: chat_message, 45 | matrix_event_id: "$C8BHglcsRUqbhnaoTW2cAgyzGu4Yy4jOHPNAaqOEaW", 46 | ) 47 | end 48 | 49 | it "edits an existing message" do 50 | # When 51 | DiscourseChatMatrix::MatrixEvents.call( 52 | age: 42, 53 | content: { 54 | body: "Good bye!", 55 | "m.new_content": { 56 | body: "Good bye!", 57 | msgtype: "m.text", 58 | }, 59 | "m.relates_to": { 60 | event_id: "$C8BHglcsRUqbhnaoTW2cAgyzGu4Yy4jOHPNAaqOEaW", 61 | rel_type: "m.replace", 62 | }, 63 | msgtype: "m.text", 64 | }, 65 | event_id: "$rFV2QtYzsyR2wB8Oh_M5LESrHl4K_3_z-SeMhfj5hTI", 66 | origin_server_ts: 1_000_000_000_000, 67 | room_id: chat_matrix_channel.matrix_room_id, 68 | sender: chat_matrix_user.matrix_user_id, 69 | type: "m.room.message", 70 | unsigned: { 71 | age: 42, 72 | }, 73 | user_id: chat_matrix_user.matrix_user_id, 74 | ) 75 | 76 | # Then 77 | expect(chat_message.reload.message).to eq("Good bye!") 78 | end 79 | end 80 | 81 | describe "#on_destroy" do 82 | fab!(:chat_message) do 83 | Fabricate(:chat_message, user: chat_matrix_user.user, message: "Hello world!") 84 | end 85 | 86 | fab!(:chat_matrix_entity) do 87 | Fabricate( 88 | :chat_matrix_entity, 89 | entity: chat_message, 90 | matrix_event_id: "$WCChmBD9g7DzHXavd0DuAFrYU3MHYC61waem832ZsA", 91 | ) 92 | end 93 | 94 | it "destroys an existing message" do 95 | # When 96 | DiscourseChatMatrix::MatrixEvents.call( 97 | age: 42, 98 | content: { 99 | reason: "Spam", 100 | }, 101 | event_id: "$EqhkBTXGJtPPJ1-QfSl0l5TToDG4TkIeylrCzodr2pY", 102 | origin_server_ts: 1_000_000_000_000, 103 | redacts: "$WCChmBD9g7DzHXavd0DuAFrYU3MHYC61waem832ZsA", 104 | room_id: chat_matrix_channel.matrix_room_id, 105 | sender: chat_matrix_user.matrix_user_id, 106 | type: "m.room.redaction", 107 | unsigned: { 108 | age: 42, 109 | }, 110 | user_id: chat_matrix_user.matrix_user_id, 111 | ) 112 | 113 | # Then 114 | expect { chat_message.reload }.to raise_error(ActiveRecord::RecordNotFound) 115 | end 116 | end 117 | end 118 | -------------------------------------------------------------------------------- /spec/lib/matrix_reaction_handler_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | describe DiscourseChatMatrix::MatrixMessageHandler do 4 | fab!(:chat_matrix_user) { Fabricate(:chat_matrix_user) } 5 | fab!(:chat_matrix_channel) { Fabricate(:chat_matrix_channel) } 6 | 7 | fab!(:chat_message) do 8 | Fabricate(:chat_message, user: chat_matrix_user.user, message: "Hello world!") 9 | end 10 | 11 | fab!(:chat_matrix_entity) do 12 | Fabricate( 13 | :chat_matrix_entity, 14 | entity: chat_message, 15 | matrix_event_id: "$sABHP9oZsHj-meykww5JYaSBr0PZ5v0nVgXvCKz8wMA", 16 | ) 17 | end 18 | 19 | before { DiscourseChatMatrixHelpers.enable! } 20 | 21 | describe "#on_create" do 22 | it "creates a new reaction" do 23 | # When 24 | DiscourseChatMatrix::MatrixEvents.call( 25 | age: 42, 26 | content: { 27 | "m.relates_to": { 28 | event_id: "$sABHP9oZsHj-meykww5JYaSBr0PZ5v0nVgXvCKz8wMA", 29 | key: "😀", 30 | rel_type: "m.annotation", 31 | }, 32 | }, 33 | event_id: "$NC3dGdL5GPhwvDKlkQ0tW_NhX9d9pf23ff4JM_qYwls", 34 | origin_server_ts: 1_000_000_000_000, 35 | room_id: chat_matrix_channel.matrix_room_id, 36 | sender: chat_matrix_user.matrix_user_id, 37 | type: "m.reaction", 38 | unsigned: { 39 | age: 42, 40 | }, 41 | user_id: chat_matrix_user.matrix_user_id, 42 | ) 43 | 44 | # Then 45 | chat_message_reaction = ChatMessageReaction.last 46 | expect(chat_message_reaction.chat_message).to eq(chat_message) 47 | expect(chat_message_reaction.user).to eq(chat_matrix_user.user) 48 | expect(chat_message_reaction.emoji).to eq("grinning") 49 | end 50 | end 51 | 52 | describe "#on_destroy" do 53 | fab!(:chat_message_reaction) do 54 | Fabricate( 55 | :chat_message_reaction, 56 | chat_message: chat_message, 57 | user: chat_matrix_user.user, 58 | emoji: "grinning", 59 | ) 60 | end 61 | 62 | fab!(:chat_message_reaction_matrix_entity) do 63 | Fabricate( 64 | :chat_matrix_entity, 65 | entity: chat_message_reaction, 66 | matrix_event_id: "$wSUdMgmcPLVNcLS27BTNYxk7aJ3JjeudOmuAPNpl4f0", 67 | ) 68 | end 69 | 70 | it "destroys a reaction" do 71 | # When 72 | DiscourseChatMatrix::MatrixEvents.call( 73 | age: 42, 74 | content: { 75 | }, 76 | event_id: "$DNNYK8mfJwe4wydBj29nZn1sfe17CKsvORWPNXYIOvI", 77 | origin_server_ts: 1_000_000_000_000, 78 | redacts: "$wSUdMgmcPLVNcLS27BTNYxk7aJ3JjeudOmuAPNpl4f0", 79 | room_id: chat_matrix_channel.matrix_room_id, 80 | sender: chat_matrix_user.matrix_user_id, 81 | type: "m.room.redaction", 82 | unsigned: { 83 | age: 42, 84 | }, 85 | user_id: chat_matrix_user.matrix_user_id, 86 | ) 87 | 88 | # Then 89 | expect { chat_message_reaction.reload }.to raise_error(ActiveRecord::RecordNotFound) 90 | end 91 | end 92 | end 93 | -------------------------------------------------------------------------------- /spec/lib/message_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | describe DiscourseChatMatrix::Message do 4 | let(:cooked) { PrettyText.cook("Hello! :wave:") } 5 | 6 | describe "#process_cooked" do 7 | it "converts emojis from Unicode to Discourse text" do 8 | expect(described_class.process_cooked(cooked)).to eq("

Hello! 👋

") 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /spec/lib/validators/chat_matrix_enabled_validator_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | describe ChatMatrixEnabledValidator do 4 | describe "#valid_value?" do 5 | it "returns false if chat plugin is not installed or disabled" do 6 | # Given 7 | SiteSetting.chat_enabled = false 8 | SiteSetting.matrix_homeserver = "https://homeserver.discourse.org" 9 | 10 | # Then 11 | expect(subject.valid_value?("f")).to eq(true) 12 | expect(subject.valid_value?("t")).to eq(false) 13 | end 14 | 15 | it "returns true if chat plugin is installed and enabled" do 16 | # Given 17 | SiteSetting.chat_enabled = true 18 | SiteSetting.matrix_homeserver = "https://homeserver.discourse.org" 19 | 20 | # Then 21 | expect(subject.valid_value?("f")).to eq(true) 22 | expect(subject.valid_value?("t")).to eq(true) 23 | end 24 | 25 | it "returns false if matrix homeserver is unset" do 26 | # Given 27 | SiteSetting.chat_enabled = true 28 | SiteSetting.matrix_homeserver = "" 29 | 30 | # Then 31 | expect(subject.valid_value?("f")).to eq(true) 32 | expect(subject.valid_value?("t")).to eq(false) 33 | end 34 | 35 | it "returns true if matrix homeserver is set" do 36 | # Given 37 | SiteSetting.chat_enabled = true 38 | SiteSetting.matrix_homeserver = "https://homeserver.discourse.org" 39 | 40 | # Then 41 | expect(subject.valid_value?("f")).to eq(true) 42 | expect(subject.valid_value?("t")).to eq(true) 43 | end 44 | end 45 | end 46 | -------------------------------------------------------------------------------- /spec/models/chat_matrix_channel_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | describe ChatMatrixChannel do 4 | describe "#ensure_exists_in_matrix!" do 5 | fab!(:chat_channel) { Fabricate(:chat_channel, name: "General") } 6 | 7 | let(:api) { DiscourseChatMatrix.api } 8 | 9 | before do 10 | SiteSetting.matrix_homeserver = "https://homeserver.discourse.org" 11 | SiteSetting.matrix_server_name = "matrix.discourse.org" 12 | end 13 | 14 | it "calls create_room and saves association" do 15 | # Given 16 | api 17 | .expects(:create_room) 18 | .with(name: "General", room_alias: "general-d", is_direct: false, visibility: "public") 19 | .returns(room_id: "!foobar:matrix.discourse.org") 20 | .once 21 | 22 | # When 23 | described_class.ensure_exists_in_matrix!(chat_channel, api) 24 | 25 | # Then 26 | chat_matrix_channel = described_class.last 27 | expect(chat_matrix_channel.chat_channel).to eq(chat_channel) 28 | expect(chat_matrix_channel.matrix_room_id).to eq("!foobar:matrix.discourse.org") 29 | expect(chat_matrix_channel.matrix_room_alias).to eq("#general-d:matrix.discourse.org") 30 | end 31 | end 32 | 33 | describe "#ensure_exists_in_chat!" do 34 | it "creates a new room" do 35 | # TODO 36 | end 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /spec/models/chat_matrix_user_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | describe ChatMatrixUser do 4 | describe "#ensure_exists_in_matrix!" do 5 | fab!(:user) { Fabricate(:user, username: "foobar") } 6 | let(:api) { DiscourseChatMatrix.api } 7 | 8 | before do 9 | SiteSetting.matrix_homeserver = "https://homeserver.discourse.org" 10 | SiteSetting.matrix_server_name = "matrix.discourse.org" 11 | end 12 | 13 | it "calls register and saves association" do 14 | # Given 15 | api.expects(:register).with(type: "m.login.application_service", username: "foobar-d").once 16 | 17 | api.expects(:set_display_name).with( 18 | "@foobar-d:matrix.discourse.org", 19 | "foobar", 20 | user_id: "@foobar-d:matrix.discourse.org", 21 | ) 22 | 23 | # When 24 | described_class.ensure_exists_in_matrix!(user, api) 25 | 26 | # Then 27 | chat_matrix_user = described_class.last 28 | expect(chat_matrix_user.user).to eq(user) 29 | expect(chat_matrix_user.matrix_user_id).to eq("@foobar-d:matrix.discourse.org") 30 | end 31 | end 32 | 33 | describe "#ensure_exists_in_chat!" do 34 | it "creates a new staged user and saves association" do 35 | # When 36 | described_class.ensure_exists_in_chat!("@foobar:matrix.discourse.org") 37 | 38 | # Then 39 | chat_matrix_user = described_class.last 40 | expect(chat_matrix_user.user.username).to eq("foobar-m") 41 | expect(chat_matrix_user.user.staged).to eq(true) 42 | expect(chat_matrix_user.matrix_user_id).to eq("@foobar:matrix.discourse.org") 43 | end 44 | end 45 | end 46 | -------------------------------------------------------------------------------- /spec/plugin_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module DiscourseChatMatrixHelpers 4 | def self.enable! 5 | Discourse.redis.flushdb 6 | 7 | SiteSetting.chat_enabled = true 8 | SiteSetting.matrix_homeserver = "https://homeserver.discourse.org" 9 | SiteSetting.matrix_server_name = "matrix.discourse.org" 10 | SiteSetting.discourse_chat_matrix_enabled = true 11 | end 12 | end 13 | 14 | RSpec.configure { |config| config.include DiscourseChatMatrixHelpers } 15 | -------------------------------------------------------------------------------- /spec/requests/chat_matrix_controller_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | describe DiscourseChatMatrix::ChatMatrixController do 4 | before { DiscourseChatMatrixHelpers.enable! } 5 | 6 | describe "#well_known" do 7 | it "returns the homeserver URL" do 8 | # When 9 | get "/.well-known/matrix/client" 10 | 11 | # Then 12 | expect(response.status).to eq(200) 13 | expect(response.headers["Access-Control-Allow-Origin"]).to eq("*") 14 | expect(response.headers["Access-Control-Allow-Methods"]).to eq( 15 | "GET, POST, PUT, DELETE, OPTIONS", 16 | ) 17 | expect(response.headers["Access-Control-Allow-Headers"]).to eq( 18 | "X-Requested-With, Content-Type, Authorization", 19 | ) 20 | expect(response.parsed_body["m.homeserver"]["base_url"]).to eq(SiteSetting.matrix_homeserver) 21 | end 22 | end 23 | 24 | describe "#health" do 25 | it "returns 200" do 26 | # When 27 | get "/matrix/health" 28 | 29 | # Then 30 | expect(response.status).to eq(200) 31 | expect(response.parsed_body).to eq({}) 32 | end 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ampproject/remapping@^2.1.0": 6 | version "2.2.0" 7 | resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" 8 | integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== 9 | dependencies: 10 | "@jridgewell/gen-mapping" "^0.1.0" 11 | "@jridgewell/trace-mapping" "^0.3.9" 12 | 13 | "@babel/code-frame@^7.18.6": 14 | version "7.18.6" 15 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" 16 | integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== 17 | dependencies: 18 | "@babel/highlight" "^7.18.6" 19 | 20 | "@babel/compat-data@^7.20.5": 21 | version "7.20.10" 22 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" 23 | integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== 24 | 25 | "@babel/core@^7.18.5": 26 | version "7.20.7" 27 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.7.tgz#37072f951bd4d28315445f66e0ec9f6ae0c8c35f" 28 | integrity sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw== 29 | dependencies: 30 | "@ampproject/remapping" "^2.1.0" 31 | "@babel/code-frame" "^7.18.6" 32 | "@babel/generator" "^7.20.7" 33 | "@babel/helper-compilation-targets" "^7.20.7" 34 | "@babel/helper-module-transforms" "^7.20.7" 35 | "@babel/helpers" "^7.20.7" 36 | "@babel/parser" "^7.20.7" 37 | "@babel/template" "^7.20.7" 38 | "@babel/traverse" "^7.20.7" 39 | "@babel/types" "^7.20.7" 40 | convert-source-map "^1.7.0" 41 | debug "^4.1.0" 42 | gensync "^1.0.0-beta.2" 43 | json5 "^2.2.1" 44 | semver "^6.3.0" 45 | 46 | "@babel/eslint-parser@^7.18.2": 47 | version "7.19.1" 48 | resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" 49 | integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== 50 | dependencies: 51 | "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" 52 | eslint-visitor-keys "^2.1.0" 53 | semver "^6.3.0" 54 | 55 | "@babel/generator@^7.20.7": 56 | version "7.20.7" 57 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" 58 | integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== 59 | dependencies: 60 | "@babel/types" "^7.20.7" 61 | "@jridgewell/gen-mapping" "^0.3.2" 62 | jsesc "^2.5.1" 63 | 64 | "@babel/helper-annotate-as-pure@^7.18.6": 65 | version "7.18.6" 66 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" 67 | integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== 68 | dependencies: 69 | "@babel/types" "^7.18.6" 70 | 71 | "@babel/helper-compilation-targets@^7.20.7": 72 | version "7.20.7" 73 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" 74 | integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== 75 | dependencies: 76 | "@babel/compat-data" "^7.20.5" 77 | "@babel/helper-validator-option" "^7.18.6" 78 | browserslist "^4.21.3" 79 | lru-cache "^5.1.1" 80 | semver "^6.3.0" 81 | 82 | "@babel/helper-create-class-features-plugin@^7.20.7": 83 | version "7.20.7" 84 | resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz#d0e1f8d7e4ed5dac0389364d9c0c191d948ade6f" 85 | integrity sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w== 86 | dependencies: 87 | "@babel/helper-annotate-as-pure" "^7.18.6" 88 | "@babel/helper-environment-visitor" "^7.18.9" 89 | "@babel/helper-function-name" "^7.19.0" 90 | "@babel/helper-member-expression-to-functions" "^7.20.7" 91 | "@babel/helper-optimise-call-expression" "^7.18.6" 92 | "@babel/helper-replace-supers" "^7.20.7" 93 | "@babel/helper-split-export-declaration" "^7.18.6" 94 | 95 | "@babel/helper-environment-visitor@^7.18.9": 96 | version "7.18.9" 97 | resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" 98 | integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== 99 | 100 | "@babel/helper-function-name@^7.19.0": 101 | version "7.19.0" 102 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" 103 | integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== 104 | dependencies: 105 | "@babel/template" "^7.18.10" 106 | "@babel/types" "^7.19.0" 107 | 108 | "@babel/helper-hoist-variables@^7.18.6": 109 | version "7.18.6" 110 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" 111 | integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== 112 | dependencies: 113 | "@babel/types" "^7.18.6" 114 | 115 | "@babel/helper-member-expression-to-functions@^7.20.7": 116 | version "7.20.7" 117 | resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" 118 | integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== 119 | dependencies: 120 | "@babel/types" "^7.20.7" 121 | 122 | "@babel/helper-module-imports@^7.18.6": 123 | version "7.18.6" 124 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" 125 | integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== 126 | dependencies: 127 | "@babel/types" "^7.18.6" 128 | 129 | "@babel/helper-module-transforms@^7.20.7": 130 | version "7.20.11" 131 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" 132 | integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== 133 | dependencies: 134 | "@babel/helper-environment-visitor" "^7.18.9" 135 | "@babel/helper-module-imports" "^7.18.6" 136 | "@babel/helper-simple-access" "^7.20.2" 137 | "@babel/helper-split-export-declaration" "^7.18.6" 138 | "@babel/helper-validator-identifier" "^7.19.1" 139 | "@babel/template" "^7.20.7" 140 | "@babel/traverse" "^7.20.10" 141 | "@babel/types" "^7.20.7" 142 | 143 | "@babel/helper-optimise-call-expression@^7.18.6": 144 | version "7.18.6" 145 | resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" 146 | integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== 147 | dependencies: 148 | "@babel/types" "^7.18.6" 149 | 150 | "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2": 151 | version "7.20.2" 152 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" 153 | integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== 154 | 155 | "@babel/helper-replace-supers@^7.20.7": 156 | version "7.20.7" 157 | resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" 158 | integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== 159 | dependencies: 160 | "@babel/helper-environment-visitor" "^7.18.9" 161 | "@babel/helper-member-expression-to-functions" "^7.20.7" 162 | "@babel/helper-optimise-call-expression" "^7.18.6" 163 | "@babel/template" "^7.20.7" 164 | "@babel/traverse" "^7.20.7" 165 | "@babel/types" "^7.20.7" 166 | 167 | "@babel/helper-simple-access@^7.20.2": 168 | version "7.20.2" 169 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" 170 | integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== 171 | dependencies: 172 | "@babel/types" "^7.20.2" 173 | 174 | "@babel/helper-split-export-declaration@^7.18.6": 175 | version "7.18.6" 176 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" 177 | integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== 178 | dependencies: 179 | "@babel/types" "^7.18.6" 180 | 181 | "@babel/helper-string-parser@^7.19.4": 182 | version "7.19.4" 183 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" 184 | integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== 185 | 186 | "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": 187 | version "7.19.1" 188 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" 189 | integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== 190 | 191 | "@babel/helper-validator-option@^7.18.6": 192 | version "7.18.6" 193 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" 194 | integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== 195 | 196 | "@babel/helpers@^7.20.7": 197 | version "7.20.7" 198 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" 199 | integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== 200 | dependencies: 201 | "@babel/template" "^7.20.7" 202 | "@babel/traverse" "^7.20.7" 203 | "@babel/types" "^7.20.7" 204 | 205 | "@babel/highlight@^7.18.6": 206 | version "7.18.6" 207 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" 208 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 209 | dependencies: 210 | "@babel/helper-validator-identifier" "^7.18.6" 211 | chalk "^2.0.0" 212 | js-tokens "^4.0.0" 213 | 214 | "@babel/parser@^7.20.7": 215 | version "7.20.7" 216 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" 217 | integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== 218 | 219 | "@babel/plugin-proposal-decorators@^7.18.2": 220 | version "7.20.7" 221 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.7.tgz#05d37453c2ce818f3e47bbeda9468c8de947eecc" 222 | integrity sha512-JB45hbUweYpwAGjkiM7uCyXMENH2lG+9r3G2E+ttc2PRXAoEkpfd/KW5jDg4j8RS6tLtTG1jZi9LbHZVSfs1/A== 223 | dependencies: 224 | "@babel/helper-create-class-features-plugin" "^7.20.7" 225 | "@babel/helper-plugin-utils" "^7.20.2" 226 | "@babel/helper-replace-supers" "^7.20.7" 227 | "@babel/helper-split-export-declaration" "^7.18.6" 228 | "@babel/plugin-syntax-decorators" "^7.19.0" 229 | 230 | "@babel/plugin-syntax-decorators@^7.19.0": 231 | version "7.19.0" 232 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz#5f13d1d8fce96951bea01a10424463c9a5b3a599" 233 | integrity sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ== 234 | dependencies: 235 | "@babel/helper-plugin-utils" "^7.19.0" 236 | 237 | "@babel/template@^7.18.10", "@babel/template@^7.20.7": 238 | version "7.20.7" 239 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" 240 | integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== 241 | dependencies: 242 | "@babel/code-frame" "^7.18.6" 243 | "@babel/parser" "^7.20.7" 244 | "@babel/types" "^7.20.7" 245 | 246 | "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.7": 247 | version "7.20.10" 248 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.10.tgz#2bf98239597fcec12f842756f186a9dde6d09230" 249 | integrity sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg== 250 | dependencies: 251 | "@babel/code-frame" "^7.18.6" 252 | "@babel/generator" "^7.20.7" 253 | "@babel/helper-environment-visitor" "^7.18.9" 254 | "@babel/helper-function-name" "^7.19.0" 255 | "@babel/helper-hoist-variables" "^7.18.6" 256 | "@babel/helper-split-export-declaration" "^7.18.6" 257 | "@babel/parser" "^7.20.7" 258 | "@babel/types" "^7.20.7" 259 | debug "^4.1.0" 260 | globals "^11.1.0" 261 | 262 | "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7": 263 | version "7.20.7" 264 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" 265 | integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== 266 | dependencies: 267 | "@babel/helper-string-parser" "^7.19.4" 268 | "@babel/helper-validator-identifier" "^7.19.1" 269 | to-fast-properties "^2.0.0" 270 | 271 | "@ember-data/rfc395-data@^0.0.4": 272 | version "0.0.4" 273 | resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" 274 | integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ== 275 | 276 | "@eslint/eslintrc@^1.4.1": 277 | version "1.4.1" 278 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" 279 | integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== 280 | dependencies: 281 | ajv "^6.12.4" 282 | debug "^4.3.2" 283 | espree "^9.4.0" 284 | globals "^13.19.0" 285 | ignore "^5.2.0" 286 | import-fresh "^3.2.1" 287 | js-yaml "^4.1.0" 288 | minimatch "^3.1.2" 289 | strip-json-comments "^3.1.1" 290 | 291 | "@glimmer/env@0.1.7", "@glimmer/env@^0.1.7": 292 | version "0.1.7" 293 | resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" 294 | integrity sha512-JKF/a9I9jw6fGoz8kA7LEQslrwJ5jms5CXhu/aqkBWk+PmZ6pTl8mlb/eJ/5ujBGTiQzBhy5AIWF712iA+4/mw== 295 | 296 | "@glimmer/global-context@0.83.1": 297 | version "0.83.1" 298 | resolved "https://registry.yarnpkg.com/@glimmer/global-context/-/global-context-0.83.1.tgz#3e2d97f10ff623bcfb5b7dc29a858d546a6c6d66" 299 | integrity sha512-OwlgqpbOJU73EjZOZdftab0fKbtdJ4x/QQeJseL9cvaAUiK3+w52M5ONFxD1T/yPBp2Mf7NCYqA/uL8tRbzY2A== 300 | dependencies: 301 | "@glimmer/env" "^0.1.7" 302 | 303 | "@glimmer/interfaces@0.83.1": 304 | version "0.83.1" 305 | resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.83.1.tgz#fb16f5f683ddc55f130887b6141f58c0751350fe" 306 | integrity sha512-rjAztghzX97v8I4rk3+NguM3XGYcFjc/GbJ8qrEj19KF2lUDoDBW1sB7f0tov3BD5HlrGXei/vOh4+DHfjeB5w== 307 | dependencies: 308 | "@simple-dom/interface" "^1.4.0" 309 | 310 | "@glimmer/reference@^0.83.1": 311 | version "0.83.1" 312 | resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.83.1.tgz#0345b95431b5bb19843b308e6311d1ef81e36192" 313 | integrity sha512-BThEwDlMkJB1WBPWDrww+VxgGyDbwxh5FFPvGhkovvCZnCb7fAMUCt9pi6CUZtviugkWOBFtE9P4eZZbOLkXeg== 314 | dependencies: 315 | "@glimmer/env" "^0.1.7" 316 | "@glimmer/global-context" "0.83.1" 317 | "@glimmer/interfaces" "0.83.1" 318 | "@glimmer/util" "0.83.1" 319 | "@glimmer/validator" "0.83.1" 320 | 321 | "@glimmer/syntax@^0.83.1": 322 | version "0.83.1" 323 | resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.83.1.tgz#7e18dd445871c157ba0281f12a4fbf316fa49b41" 324 | integrity sha512-n3vEd0GtjtgkOsd2gqkSimp8ecqq5KrHyana/s1XJZvVAPD5rMWT9WvAVWG8XAktns8BxjwLIUoj/vkOfA+eHg== 325 | dependencies: 326 | "@glimmer/interfaces" "0.83.1" 327 | "@glimmer/util" "0.83.1" 328 | "@handlebars/parser" "~2.0.0" 329 | simple-html-tokenizer "^0.5.11" 330 | 331 | "@glimmer/util@0.83.1": 332 | version "0.83.1" 333 | resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.83.1.tgz#cc7511b03164d658cf6e3262fce5a0fcb82edceb" 334 | integrity sha512-amvjtl9dvrkxsoitXAly9W5NUaLIE3A2J2tWhBWIL1Z6DOFotfX7ytIosOIcPhJLZCtiXPHzMutQRv0G/MSMsA== 335 | dependencies: 336 | "@glimmer/env" "0.1.7" 337 | "@glimmer/interfaces" "0.83.1" 338 | "@simple-dom/interface" "^1.4.0" 339 | 340 | "@glimmer/validator@0.83.1", "@glimmer/validator@^0.83.0": 341 | version "0.83.1" 342 | resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.83.1.tgz#7578cb2284f728c8e9302c51fc6e7660b570ac54" 343 | integrity sha512-LaILSNnQgDHZpaUsfjVndbS1JfVn0xdTlJdFJblPbhoVklOBSReZVekens3EQ6xOr3BC612sRm1hBnEPixOY6A== 344 | dependencies: 345 | "@glimmer/env" "^0.1.7" 346 | "@glimmer/global-context" "0.83.1" 347 | 348 | "@handlebars/parser@~2.0.0": 349 | version "2.0.0" 350 | resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-2.0.0.tgz#5e8b7298f31ff8f7b260e6b7363c7e9ceed7d9c5" 351 | integrity sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA== 352 | 353 | "@humanwhocodes/config-array@^0.11.8": 354 | version "0.11.8" 355 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" 356 | integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== 357 | dependencies: 358 | "@humanwhocodes/object-schema" "^1.2.1" 359 | debug "^4.1.1" 360 | minimatch "^3.0.5" 361 | 362 | "@humanwhocodes/module-importer@^1.0.1": 363 | version "1.0.1" 364 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 365 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 366 | 367 | "@humanwhocodes/object-schema@^1.2.1": 368 | version "1.2.1" 369 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 370 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 371 | 372 | "@jridgewell/gen-mapping@^0.1.0": 373 | version "0.1.1" 374 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" 375 | integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== 376 | dependencies: 377 | "@jridgewell/set-array" "^1.0.0" 378 | "@jridgewell/sourcemap-codec" "^1.4.10" 379 | 380 | "@jridgewell/gen-mapping@^0.3.2": 381 | version "0.3.2" 382 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" 383 | integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== 384 | dependencies: 385 | "@jridgewell/set-array" "^1.0.1" 386 | "@jridgewell/sourcemap-codec" "^1.4.10" 387 | "@jridgewell/trace-mapping" "^0.3.9" 388 | 389 | "@jridgewell/resolve-uri@3.1.0": 390 | version "3.1.0" 391 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 392 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 393 | 394 | "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": 395 | version "1.1.2" 396 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" 397 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 398 | 399 | "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": 400 | version "1.4.14" 401 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 402 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 403 | 404 | "@jridgewell/trace-mapping@^0.3.9": 405 | version "0.3.17" 406 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" 407 | integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== 408 | dependencies: 409 | "@jridgewell/resolve-uri" "3.1.0" 410 | "@jridgewell/sourcemap-codec" "1.4.14" 411 | 412 | "@lint-todo/utils@^13.0.3": 413 | version "13.1.0" 414 | resolved "https://registry.yarnpkg.com/@lint-todo/utils/-/utils-13.1.0.tgz#bb99b479e357f20fbf5fa200c59cafda2a02f849" 415 | integrity sha512-uzcZPIPH7hcs+hKMiHfp58MosJpI9sTTgl1pGYau4zq34q1ppswJ6nLeohv/cDhqEBrHjtvldt8zDnVJXRvBlA== 416 | dependencies: 417 | "@types/eslint" "^7.2.13" 418 | find-up "^5.0.0" 419 | fs-extra "^9.1.0" 420 | proper-lockfile "^4.1.2" 421 | slash "^3.0.0" 422 | tslib "^2.4.0" 423 | upath "^2.0.1" 424 | 425 | "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": 426 | version "5.1.1-v1" 427 | resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" 428 | integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== 429 | dependencies: 430 | eslint-scope "5.1.1" 431 | 432 | "@nodelib/fs.scandir@2.1.5": 433 | version "2.1.5" 434 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 435 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 436 | dependencies: 437 | "@nodelib/fs.stat" "2.0.5" 438 | run-parallel "^1.1.9" 439 | 440 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 441 | version "2.0.5" 442 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 443 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 444 | 445 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 446 | version "1.2.8" 447 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 448 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 449 | dependencies: 450 | "@nodelib/fs.scandir" "2.1.5" 451 | fastq "^1.6.0" 452 | 453 | "@simple-dom/interface@^1.4.0": 454 | version "1.4.0" 455 | resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" 456 | integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA== 457 | 458 | "@types/eslint@^7.2.13": 459 | version "7.29.0" 460 | resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" 461 | integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng== 462 | dependencies: 463 | "@types/estree" "*" 464 | "@types/json-schema" "*" 465 | 466 | "@types/estree@*": 467 | version "1.0.0" 468 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" 469 | integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== 470 | 471 | "@types/json-schema@*": 472 | version "7.0.11" 473 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" 474 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== 475 | 476 | "@types/minimatch@^3.0.3": 477 | version "3.0.5" 478 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" 479 | integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== 480 | 481 | "@types/symlink-or-copy@^1.2.0": 482 | version "1.2.0" 483 | resolved "https://registry.yarnpkg.com/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#4151a81b4052c80bc2becbae09f3a9ec010a9c7a" 484 | integrity sha512-Lja2xYuuf2B3knEsga8ShbOdsfNOtzT73GyJmZyY7eGl2+ajOqrs8yM5ze0fsSoYwvA6bw7/Qr7OZ7PEEmYwWg== 485 | 486 | acorn-jsx@^5.3.2: 487 | version "5.3.2" 488 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 489 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 490 | 491 | acorn@^8.8.0: 492 | version "8.8.1" 493 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" 494 | integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== 495 | 496 | ajv@^6.10.0, ajv@^6.12.4: 497 | version "6.12.6" 498 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 499 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 500 | dependencies: 501 | fast-deep-equal "^3.1.1" 502 | fast-json-stable-stringify "^2.0.0" 503 | json-schema-traverse "^0.4.1" 504 | uri-js "^4.2.2" 505 | 506 | ansi-regex@^5.0.1: 507 | version "5.0.1" 508 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 509 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 510 | 511 | ansi-styles@^3.2.1: 512 | version "3.2.1" 513 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 514 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 515 | dependencies: 516 | color-convert "^1.9.0" 517 | 518 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 519 | version "4.3.0" 520 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 521 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 522 | dependencies: 523 | color-convert "^2.0.1" 524 | 525 | argparse@^2.0.1: 526 | version "2.0.1" 527 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 528 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 529 | 530 | aria-query@^5.0.2: 531 | version "5.1.3" 532 | resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" 533 | integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== 534 | dependencies: 535 | deep-equal "^2.0.5" 536 | 537 | array-equal@^1.0.0: 538 | version "1.0.0" 539 | resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" 540 | integrity sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA== 541 | 542 | array-union@^2.1.0: 543 | version "2.1.0" 544 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 545 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 546 | 547 | async-disk-cache@^1.2.1: 548 | version "1.3.5" 549 | resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.5.tgz#cc6206ed79bb6982b878fc52e0505e4f52b62a02" 550 | integrity sha512-VZpqfR0R7CEOJZ/0FOTgWq70lCrZyS1rkI8PXugDUkTKyyAUgZ2zQ09gLhMkEn+wN8LYeUTPxZdXtlX/kmbXKQ== 551 | dependencies: 552 | debug "^2.1.3" 553 | heimdalljs "^0.2.3" 554 | istextorbinary "2.1.0" 555 | mkdirp "^0.5.0" 556 | rimraf "^2.5.3" 557 | rsvp "^3.0.18" 558 | username-sync "^1.0.2" 559 | 560 | async-promise-queue@^1.0.3, async-promise-queue@^1.0.5: 561 | version "1.0.5" 562 | resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.5.tgz#cb23bce9fce903a133946a700cc85f27f09ea49d" 563 | integrity sha512-xi0aQ1rrjPWYmqbwr18rrSKbSaXIeIwSd1J4KAgVfkq8utNbdZoht7GfvfY6swFUAMJ9obkc4WPJmtGwl+B8dw== 564 | dependencies: 565 | async "^2.4.1" 566 | debug "^2.6.8" 567 | 568 | async@^2.4.1: 569 | version "2.6.4" 570 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" 571 | integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== 572 | dependencies: 573 | lodash "^4.17.14" 574 | 575 | at-least-node@^1.0.0: 576 | version "1.0.0" 577 | resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" 578 | integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== 579 | 580 | available-typed-arrays@^1.0.5: 581 | version "1.0.5" 582 | resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" 583 | integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== 584 | 585 | babel-import-util@^0.2.0: 586 | version "0.2.0" 587 | resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-0.2.0.tgz#b468bb679919601a3570f9e317536c54f2862e23" 588 | integrity sha512-CtWYYHU/MgK88rxMrLfkD356dApswtR/kWZ/c6JifG1m10e7tBBrs/366dFzWMAoqYmG5/JSh+94tUSpIwh+ag== 589 | 590 | balanced-match@^1.0.0: 591 | version "1.0.2" 592 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 593 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 594 | 595 | base64-js@^1.3.1: 596 | version "1.5.1" 597 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 598 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 599 | 600 | "binaryextensions@1 || 2": 601 | version "2.3.0" 602 | resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.3.0.tgz#1d269cbf7e6243ea886aa41453c3651ccbe13c22" 603 | integrity sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg== 604 | 605 | bl@^4.1.0: 606 | version "4.1.0" 607 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" 608 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== 609 | dependencies: 610 | buffer "^5.5.0" 611 | inherits "^2.0.4" 612 | readable-stream "^3.4.0" 613 | 614 | blank-object@^1.0.1: 615 | version "1.0.2" 616 | resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" 617 | integrity sha512-kXQ19Xhoghiyw66CUiGypnuRpWlbHAzY/+NyvqTEdTfhfQGH1/dbEMYiXju7fYKIFePpzp/y9dsu5Cu/PkmawQ== 618 | 619 | brace-expansion@^1.1.7: 620 | version "1.1.11" 621 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 622 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 623 | dependencies: 624 | balanced-match "^1.0.0" 625 | concat-map "0.0.1" 626 | 627 | braces@^3.0.2: 628 | version "3.0.2" 629 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 630 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 631 | dependencies: 632 | fill-range "^7.0.1" 633 | 634 | broccoli-debug@^0.6.5: 635 | version "0.6.5" 636 | resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.5.tgz#164a5cdafd8936e525e702bf8f91f39d758e2e78" 637 | integrity sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg== 638 | dependencies: 639 | broccoli-plugin "^1.2.1" 640 | fs-tree-diff "^0.5.2" 641 | heimdalljs "^0.2.1" 642 | heimdalljs-logger "^0.1.7" 643 | symlink-or-copy "^1.1.8" 644 | tree-sync "^1.2.2" 645 | 646 | broccoli-funnel@^2.0.0: 647 | version "2.0.2" 648 | resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz#0edf629569bc10bd02cc525f74b9a38e71366a75" 649 | integrity sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ== 650 | dependencies: 651 | array-equal "^1.0.0" 652 | blank-object "^1.0.1" 653 | broccoli-plugin "^1.3.0" 654 | debug "^2.2.0" 655 | fast-ordered-set "^1.0.0" 656 | fs-tree-diff "^0.5.3" 657 | heimdalljs "^0.2.0" 658 | minimatch "^3.0.0" 659 | mkdirp "^0.5.0" 660 | path-posix "^1.0.0" 661 | rimraf "^2.4.3" 662 | symlink-or-copy "^1.0.0" 663 | walk-sync "^0.3.1" 664 | 665 | broccoli-kitchen-sink-helpers@^0.3.1: 666 | version "0.3.1" 667 | resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" 668 | integrity sha512-gqYnKSJxBSjj/uJqeuRAzYVbmjWhG0mOZ8jrp6+fnUIOgLN6MvI7XxBECDHkYMIFPJ8Smf4xaI066Q2FqQDnXg== 669 | dependencies: 670 | glob "^5.0.10" 671 | mkdirp "^0.5.1" 672 | 673 | broccoli-merge-trees@^3.0.1: 674 | version "3.0.2" 675 | resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d" 676 | integrity sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A== 677 | dependencies: 678 | broccoli-plugin "^1.3.0" 679 | merge-trees "^2.0.0" 680 | 681 | broccoli-persistent-filter@^2.3.0: 682 | version "2.3.1" 683 | resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" 684 | integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== 685 | dependencies: 686 | async-disk-cache "^1.2.1" 687 | async-promise-queue "^1.0.3" 688 | broccoli-plugin "^1.0.0" 689 | fs-tree-diff "^2.0.0" 690 | hash-for-dep "^1.5.0" 691 | heimdalljs "^0.2.1" 692 | heimdalljs-logger "^0.1.7" 693 | mkdirp "^0.5.1" 694 | promise-map-series "^0.2.1" 695 | rimraf "^2.6.1" 696 | rsvp "^4.7.0" 697 | symlink-or-copy "^1.0.1" 698 | sync-disk-cache "^1.3.3" 699 | walk-sync "^1.0.0" 700 | 701 | broccoli-plugin@^1.0.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0: 702 | version "1.3.1" 703 | resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" 704 | integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== 705 | dependencies: 706 | promise-map-series "^0.2.1" 707 | quick-temp "^0.1.3" 708 | rimraf "^2.3.4" 709 | symlink-or-copy "^1.1.8" 710 | 711 | broccoli-plugin@^2.1.0: 712 | version "2.1.0" 713 | resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-2.1.0.tgz#2fab6c578219cfcc64f773e9616073313fc8b334" 714 | integrity sha512-ElE4caljW4slapyEhSD9jU9Uayc8SoSABWdmY9SqbV8DHNxU6xg1jJsPcMm+cXOvggR3+G+OXAYQeFjWVnznaw== 715 | dependencies: 716 | promise-map-series "^0.2.1" 717 | quick-temp "^0.1.3" 718 | rimraf "^2.3.4" 719 | symlink-or-copy "^1.1.8" 720 | 721 | broccoli-stew@^3.0.0: 722 | version "3.0.0" 723 | resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-3.0.0.tgz#fd1d19d162ad9490b42e5c563b78c26eb1e80b95" 724 | integrity sha512-NXfi+Vas24n3Ivo21GvENTI55qxKu7OwKRnCLWXld8MiLiQKQlWIq28eoARaFj0lTUFwUa4jKZeA7fW9PiWQeg== 725 | dependencies: 726 | broccoli-debug "^0.6.5" 727 | broccoli-funnel "^2.0.0" 728 | broccoli-merge-trees "^3.0.1" 729 | broccoli-persistent-filter "^2.3.0" 730 | broccoli-plugin "^2.1.0" 731 | chalk "^2.4.1" 732 | debug "^4.1.1" 733 | ensure-posix-path "^1.0.1" 734 | fs-extra "^8.0.1" 735 | minimatch "^3.0.4" 736 | resolve "^1.11.1" 737 | rsvp "^4.8.5" 738 | symlink-or-copy "^1.2.0" 739 | walk-sync "^1.1.3" 740 | 741 | browserslist@^4.21.3: 742 | version "4.21.4" 743 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" 744 | integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== 745 | dependencies: 746 | caniuse-lite "^1.0.30001400" 747 | electron-to-chromium "^1.4.251" 748 | node-releases "^2.0.6" 749 | update-browserslist-db "^1.0.9" 750 | 751 | buffer@^5.5.0: 752 | version "5.7.1" 753 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 754 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 755 | dependencies: 756 | base64-js "^1.3.1" 757 | ieee754 "^1.1.13" 758 | 759 | call-bind@^1.0.0, call-bind@^1.0.2: 760 | version "1.0.2" 761 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 762 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 763 | dependencies: 764 | function-bind "^1.1.1" 765 | get-intrinsic "^1.0.2" 766 | 767 | callsites@^3.0.0: 768 | version "3.1.0" 769 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 770 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 771 | 772 | can-symlink@^1.0.0: 773 | version "1.0.0" 774 | resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" 775 | integrity sha512-RbsNrFyhwkx+6psk/0fK/Q9orOUr9VMxohGd8vTa4djf4TGLfblBgUfqZChrZuW0Q+mz2eBPFLusw9Jfukzmhg== 776 | dependencies: 777 | tmp "0.0.28" 778 | 779 | caniuse-lite@^1.0.30001400: 780 | version "1.0.30001441" 781 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz#987437b266260b640a23cd18fbddb509d7f69f3e" 782 | integrity sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg== 783 | 784 | chalk@^2.0.0, chalk@^2.4.1: 785 | version "2.4.2" 786 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 787 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 788 | dependencies: 789 | ansi-styles "^3.2.1" 790 | escape-string-regexp "^1.0.5" 791 | supports-color "^5.3.0" 792 | 793 | chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: 794 | version "4.1.2" 795 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 796 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 797 | dependencies: 798 | ansi-styles "^4.1.0" 799 | supports-color "^7.1.0" 800 | 801 | ci-info@^3.4.0: 802 | version "3.7.1" 803 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.1.tgz#708a6cdae38915d597afdf3b145f2f8e1ff55f3f" 804 | integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== 805 | 806 | clean-up-path@^1.0.0: 807 | version "1.0.0" 808 | resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5" 809 | integrity sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw== 810 | 811 | cli-cursor@^3.1.0: 812 | version "3.1.0" 813 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 814 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 815 | dependencies: 816 | restore-cursor "^3.1.0" 817 | 818 | cli-spinners@^2.5.0: 819 | version "2.7.0" 820 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" 821 | integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== 822 | 823 | cliui@^8.0.1: 824 | version "8.0.1" 825 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" 826 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 827 | dependencies: 828 | string-width "^4.2.0" 829 | strip-ansi "^6.0.1" 830 | wrap-ansi "^7.0.0" 831 | 832 | clone@^1.0.2: 833 | version "1.0.4" 834 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" 835 | integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== 836 | 837 | color-convert@^1.9.0: 838 | version "1.9.3" 839 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 840 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 841 | dependencies: 842 | color-name "1.1.3" 843 | 844 | color-convert@^2.0.1: 845 | version "2.0.1" 846 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 847 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 848 | dependencies: 849 | color-name "~1.1.4" 850 | 851 | color-name@1.1.3: 852 | version "1.1.3" 853 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 854 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 855 | 856 | color-name@~1.1.4: 857 | version "1.1.4" 858 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 859 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 860 | 861 | colors@^1.4.0: 862 | version "1.4.0" 863 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" 864 | integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== 865 | 866 | commander@^8.3.0: 867 | version "8.3.0" 868 | resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" 869 | integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== 870 | 871 | concat-map@0.0.1: 872 | version "0.0.1" 873 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 874 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 875 | 876 | convert-source-map@^1.7.0: 877 | version "1.9.0" 878 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" 879 | integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== 880 | 881 | cross-spawn@^7.0.2: 882 | version "7.0.3" 883 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 884 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 885 | dependencies: 886 | path-key "^3.1.0" 887 | shebang-command "^2.0.0" 888 | which "^2.0.1" 889 | 890 | css-tree@^2.0.4: 891 | version "2.3.1" 892 | resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" 893 | integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== 894 | dependencies: 895 | mdn-data "2.0.30" 896 | source-map-js "^1.0.1" 897 | 898 | date-fns@^2.29.2: 899 | version "2.29.3" 900 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" 901 | integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== 902 | 903 | debug@^2.1.3, debug@^2.2.0, debug@^2.6.8: 904 | version "2.6.9" 905 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 906 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 907 | dependencies: 908 | ms "2.0.0" 909 | 910 | debug@^4.1.0, debug@^4.1.1, debug@^4.3.2: 911 | version "4.3.4" 912 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 913 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 914 | dependencies: 915 | ms "2.1.2" 916 | 917 | deep-equal@^2.0.5: 918 | version "2.1.0" 919 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.1.0.tgz#5ba60402cf44ab92c2c07f3f3312c3d857a0e1dd" 920 | integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA== 921 | dependencies: 922 | call-bind "^1.0.2" 923 | es-get-iterator "^1.1.2" 924 | get-intrinsic "^1.1.3" 925 | is-arguments "^1.1.1" 926 | is-date-object "^1.0.5" 927 | is-regex "^1.1.4" 928 | isarray "^2.0.5" 929 | object-is "^1.1.5" 930 | object-keys "^1.1.1" 931 | object.assign "^4.1.4" 932 | regexp.prototype.flags "^1.4.3" 933 | side-channel "^1.0.4" 934 | which-boxed-primitive "^1.0.2" 935 | which-collection "^1.0.1" 936 | which-typed-array "^1.1.8" 937 | 938 | deep-is@^0.1.3: 939 | version "0.1.4" 940 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 941 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 942 | 943 | defaults@^1.0.3: 944 | version "1.0.4" 945 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" 946 | integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== 947 | dependencies: 948 | clone "^1.0.2" 949 | 950 | define-properties@^1.1.3, define-properties@^1.1.4: 951 | version "1.1.4" 952 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" 953 | integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== 954 | dependencies: 955 | has-property-descriptors "^1.0.0" 956 | object-keys "^1.1.1" 957 | 958 | dir-glob@^3.0.1: 959 | version "3.0.1" 960 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 961 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 962 | dependencies: 963 | path-type "^4.0.0" 964 | 965 | doctrine@^3.0.0: 966 | version "3.0.0" 967 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 968 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 969 | dependencies: 970 | esutils "^2.0.2" 971 | 972 | dot-case@^3.0.4: 973 | version "3.0.4" 974 | resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" 975 | integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== 976 | dependencies: 977 | no-case "^3.0.4" 978 | tslib "^2.0.3" 979 | 980 | editions@^1.1.1: 981 | version "1.3.4" 982 | resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" 983 | integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== 984 | 985 | electron-to-chromium@^1.4.251: 986 | version "1.4.284" 987 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" 988 | integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== 989 | 990 | ember-cli-babel-plugin-helpers@^1.1.1: 991 | version "1.1.1" 992 | resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" 993 | integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== 994 | 995 | ember-cli-version-checker@^5.1.2: 996 | version "5.1.2" 997 | resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-5.1.2.tgz#649c7b6404902e3b3d69c396e054cea964911ab0" 998 | integrity sha512-rk7GY+FmLn/2e22HsZs0Ycrz8HQ1W3Fv+2TFOuEFW9optnDXDgkntPBIl6gact/LHsfBM5RKbM3dHsIIeLgl0Q== 999 | dependencies: 1000 | resolve-package-path "^3.1.0" 1001 | semver "^7.3.4" 1002 | silent-error "^1.1.1" 1003 | 1004 | ember-rfc176-data@^0.3.15: 1005 | version "0.3.17" 1006 | resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.17.tgz#d4fc6c33abd6ef7b3440c107a28e04417b49860a" 1007 | integrity sha512-EVzTTKqxv9FZbEh6Ktw56YyWRAA0MijKvl7H8C06wVF+8f/cRRz3dXxa4nkwjzyVwx4rzKGuIGq77hxJAQhWWw== 1008 | 1009 | ember-template-imports@^3.4.0: 1010 | version "3.4.0" 1011 | resolved "https://registry.yarnpkg.com/ember-template-imports/-/ember-template-imports-3.4.0.tgz#c40757e2d41e289ce08c0fe80671000bf216e0ef" 1012 | integrity sha512-3Cwcj3NXA129g3ZhmrQ/nYOxksFonTmB/qxyaSNTHrLBSoc93UZys47hBz13DlcfoeSCCrNt2Qpq1j890I04PQ== 1013 | dependencies: 1014 | babel-import-util "^0.2.0" 1015 | broccoli-stew "^3.0.0" 1016 | ember-cli-babel-plugin-helpers "^1.1.1" 1017 | ember-cli-version-checker "^5.1.2" 1018 | line-column "^1.0.2" 1019 | magic-string "^0.25.7" 1020 | parse-static-imports "^1.1.0" 1021 | string.prototype.matchall "^4.0.6" 1022 | validate-peer-dependencies "^1.1.0" 1023 | 1024 | ember-template-lint-plugin-discourse@^3.0.0: 1025 | version "3.0.0" 1026 | resolved "https://registry.yarnpkg.com/ember-template-lint-plugin-discourse/-/ember-template-lint-plugin-discourse-3.0.0.tgz#9212226e4d2f6dce2e35b480aaf240067d736246" 1027 | integrity sha512-4zi/qN+vXs0ZpJZrwdMfZ5hMThJbeVCFdof6iek4PmgIJhnlA0lzqIa1BrKpSKhr3ckd5K0rUMNcCAm0uKNOtg== 1028 | 1029 | ember-template-lint@^4.10.0: 1030 | version "4.18.2" 1031 | resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-4.18.2.tgz#18e5e5fc6ea7301e7a075e024008271d2a781e1e" 1032 | integrity sha512-yI8kQ8IQ2x5HVq0tQAISXABOHr0Is5sAg6rwceO6M8CYozq7HMxUPEj0VbdcbyIE70SWw/8d24M1rBI4km544Q== 1033 | dependencies: 1034 | "@lint-todo/utils" "^13.0.3" 1035 | aria-query "^5.0.2" 1036 | chalk "^4.1.2" 1037 | ci-info "^3.4.0" 1038 | date-fns "^2.29.2" 1039 | ember-template-imports "^3.4.0" 1040 | ember-template-recast "^6.1.3" 1041 | find-up "^6.3.0" 1042 | fuse.js "^6.5.3" 1043 | get-stdin "^9.0.0" 1044 | globby "^13.1.2" 1045 | is-glob "^4.0.3" 1046 | language-tags "^1.0.5" 1047 | micromatch "^4.0.5" 1048 | resolve "^1.22.1" 1049 | v8-compile-cache "^2.3.0" 1050 | yargs "^17.5.1" 1051 | 1052 | ember-template-recast@^6.1.3: 1053 | version "6.1.3" 1054 | resolved "https://registry.yarnpkg.com/ember-template-recast/-/ember-template-recast-6.1.3.tgz#1e9b256ee9da24bcaa7c213088d01f32afc88001" 1055 | integrity sha512-45lkfjrWlrMPlOd5rLFeQeePZwAvcS//x1x15kaiQTlqQdYWiYNXwbpWHqV+p9fXY6bEjl6EbyPhG/zBkgh8MA== 1056 | dependencies: 1057 | "@glimmer/reference" "^0.83.1" 1058 | "@glimmer/syntax" "^0.83.1" 1059 | "@glimmer/validator" "^0.83.0" 1060 | async-promise-queue "^1.0.5" 1061 | colors "^1.4.0" 1062 | commander "^8.3.0" 1063 | globby "^11.0.3" 1064 | ora "^5.4.0" 1065 | slash "^3.0.0" 1066 | tmp "^0.2.1" 1067 | workerpool "^6.1.5" 1068 | 1069 | emoji-regex@^8.0.0: 1070 | version "8.0.0" 1071 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 1072 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 1073 | 1074 | ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.1.0: 1075 | version "1.1.1" 1076 | resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" 1077 | integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== 1078 | 1079 | es-abstract@^1.19.0, es-abstract@^1.20.4: 1080 | version "1.20.5" 1081 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.5.tgz#e6dc99177be37cacda5988e692c3fa8b218e95d2" 1082 | integrity sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ== 1083 | dependencies: 1084 | call-bind "^1.0.2" 1085 | es-to-primitive "^1.2.1" 1086 | function-bind "^1.1.1" 1087 | function.prototype.name "^1.1.5" 1088 | get-intrinsic "^1.1.3" 1089 | get-symbol-description "^1.0.0" 1090 | gopd "^1.0.1" 1091 | has "^1.0.3" 1092 | has-property-descriptors "^1.0.0" 1093 | has-symbols "^1.0.3" 1094 | internal-slot "^1.0.3" 1095 | is-callable "^1.2.7" 1096 | is-negative-zero "^2.0.2" 1097 | is-regex "^1.1.4" 1098 | is-shared-array-buffer "^1.0.2" 1099 | is-string "^1.0.7" 1100 | is-weakref "^1.0.2" 1101 | object-inspect "^1.12.2" 1102 | object-keys "^1.1.1" 1103 | object.assign "^4.1.4" 1104 | regexp.prototype.flags "^1.4.3" 1105 | safe-regex-test "^1.0.0" 1106 | string.prototype.trimend "^1.0.6" 1107 | string.prototype.trimstart "^1.0.6" 1108 | unbox-primitive "^1.0.2" 1109 | 1110 | es-get-iterator@^1.1.2: 1111 | version "1.1.2" 1112 | resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" 1113 | integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== 1114 | dependencies: 1115 | call-bind "^1.0.2" 1116 | get-intrinsic "^1.1.0" 1117 | has-symbols "^1.0.1" 1118 | is-arguments "^1.1.0" 1119 | is-map "^2.0.2" 1120 | is-set "^2.0.2" 1121 | is-string "^1.0.5" 1122 | isarray "^2.0.5" 1123 | 1124 | es-to-primitive@^1.2.1: 1125 | version "1.2.1" 1126 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 1127 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 1128 | dependencies: 1129 | is-callable "^1.1.4" 1130 | is-date-object "^1.0.1" 1131 | is-symbol "^1.0.2" 1132 | 1133 | escalade@^3.1.1: 1134 | version "3.1.1" 1135 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 1136 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 1137 | 1138 | escape-string-regexp@^1.0.5: 1139 | version "1.0.5" 1140 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1141 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 1142 | 1143 | escape-string-regexp@^4.0.0: 1144 | version "4.0.0" 1145 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 1146 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 1147 | 1148 | eslint-config-discourse@^3.1.0: 1149 | version "3.4.0" 1150 | resolved "https://registry.yarnpkg.com/eslint-config-discourse/-/eslint-config-discourse-3.4.0.tgz#636a1824bca48c90aeac5bee2f8d7b993609191f" 1151 | integrity sha512-9jwu8GQPDOxAO0ByV6RbInu5r39HrFvbAHQRJ8YoGg2fuvHcX+p7fYcxEWj64LhmF4qD55cAGhN0Gmj10RVjoQ== 1152 | dependencies: 1153 | "@babel/core" "^7.18.5" 1154 | "@babel/eslint-parser" "^7.18.2" 1155 | "@babel/plugin-proposal-decorators" "^7.18.2" 1156 | ember-template-lint "^4.10.0" 1157 | ember-template-lint-plugin-discourse "^3.0.0" 1158 | eslint "^8.17.0" 1159 | eslint-plugin-discourse-ember latest 1160 | eslint-plugin-ember "^10.6.1" 1161 | eslint-plugin-lodash "^7.1.0" 1162 | eslint-plugin-node "^11.1.0" 1163 | eslint-plugin-sort-class-members "^1.14.1" 1164 | prettier "2.8.1" 1165 | 1166 | eslint-plugin-discourse-ember@latest: 1167 | version "0.0.3" 1168 | resolved "https://registry.yarnpkg.com/eslint-plugin-discourse-ember/-/eslint-plugin-discourse-ember-0.0.3.tgz#69e5876c2ece38ab3d6c4a05f0a20a7dc4c21e37" 1169 | integrity sha512-EFwWU4FlOSLBa4RolKZL8QD1eGOnvSkACLt4Big+o1ZUIpW7gGvfnJPtxkbaQ4XmhtZ5HetYt6862vVqhUMv9A== 1170 | dependencies: 1171 | requireindex "~1.1.0" 1172 | 1173 | eslint-plugin-ember@^10.6.1: 1174 | version "10.6.1" 1175 | resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-10.6.1.tgz#04ea84cc82307f64a2faa4f2855b30e5ebf9f722" 1176 | integrity sha512-R+TN3jwhYQ2ytZCA1VkfJDZSGgHFOHjsHU1DrBlRXYRepThe56PpuGxywAyDvQ7inhoAz3e6G6M60PzpvjzmNg== 1177 | dependencies: 1178 | "@ember-data/rfc395-data" "^0.0.4" 1179 | css-tree "^2.0.4" 1180 | ember-rfc176-data "^0.3.15" 1181 | eslint-utils "^3.0.0" 1182 | estraverse "^5.2.0" 1183 | lodash.kebabcase "^4.1.1" 1184 | requireindex "^1.2.0" 1185 | snake-case "^3.0.3" 1186 | 1187 | eslint-plugin-es@^3.0.0: 1188 | version "3.0.1" 1189 | resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" 1190 | integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== 1191 | dependencies: 1192 | eslint-utils "^2.0.0" 1193 | regexpp "^3.0.0" 1194 | 1195 | eslint-plugin-lodash@^7.1.0: 1196 | version "7.4.0" 1197 | resolved "https://registry.yarnpkg.com/eslint-plugin-lodash/-/eslint-plugin-lodash-7.4.0.tgz#14a761547f126c92ff56789662a20a44f8bb6290" 1198 | integrity sha512-Tl83UwVXqe1OVeBRKUeWcfg6/pCW1GTRObbdnbEJgYwjxp5Q92MEWQaH9+dmzbRt6kvYU1Mp893E79nJiCSM8A== 1199 | dependencies: 1200 | lodash "^4.17.21" 1201 | 1202 | eslint-plugin-node@^11.1.0: 1203 | version "11.1.0" 1204 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" 1205 | integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== 1206 | dependencies: 1207 | eslint-plugin-es "^3.0.0" 1208 | eslint-utils "^2.0.0" 1209 | ignore "^5.1.1" 1210 | minimatch "^3.0.4" 1211 | resolve "^1.10.1" 1212 | semver "^6.1.0" 1213 | 1214 | eslint-plugin-sort-class-members@^1.14.1: 1215 | version "1.16.0" 1216 | resolved "https://registry.yarnpkg.com/eslint-plugin-sort-class-members/-/eslint-plugin-sort-class-members-1.16.0.tgz#e47596d867a57713571f040024c03fe674dec3fc" 1217 | integrity sha512-8l0IqUmoupk9PvO5D4I5zJqirVe9sax5Hpfv9xQmnrSpLYkc8BSYGnUjuHGMSSe4jKuC73NIr38kQv1tPbO+Xg== 1218 | 1219 | eslint-scope@5.1.1: 1220 | version "5.1.1" 1221 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 1222 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 1223 | dependencies: 1224 | esrecurse "^4.3.0" 1225 | estraverse "^4.1.1" 1226 | 1227 | eslint-scope@^7.1.1: 1228 | version "7.1.1" 1229 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" 1230 | integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== 1231 | dependencies: 1232 | esrecurse "^4.3.0" 1233 | estraverse "^5.2.0" 1234 | 1235 | eslint-utils@^2.0.0: 1236 | version "2.1.0" 1237 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" 1238 | integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== 1239 | dependencies: 1240 | eslint-visitor-keys "^1.1.0" 1241 | 1242 | eslint-utils@^3.0.0: 1243 | version "3.0.0" 1244 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 1245 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 1246 | dependencies: 1247 | eslint-visitor-keys "^2.0.0" 1248 | 1249 | eslint-visitor-keys@^1.1.0: 1250 | version "1.3.0" 1251 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 1252 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 1253 | 1254 | eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: 1255 | version "2.1.0" 1256 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 1257 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 1258 | 1259 | eslint-visitor-keys@^3.3.0: 1260 | version "3.3.0" 1261 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" 1262 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 1263 | 1264 | eslint@^8.17.0: 1265 | version "8.31.0" 1266 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.31.0.tgz#75028e77cbcff102a9feae1d718135931532d524" 1267 | integrity sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA== 1268 | dependencies: 1269 | "@eslint/eslintrc" "^1.4.1" 1270 | "@humanwhocodes/config-array" "^0.11.8" 1271 | "@humanwhocodes/module-importer" "^1.0.1" 1272 | "@nodelib/fs.walk" "^1.2.8" 1273 | ajv "^6.10.0" 1274 | chalk "^4.0.0" 1275 | cross-spawn "^7.0.2" 1276 | debug "^4.3.2" 1277 | doctrine "^3.0.0" 1278 | escape-string-regexp "^4.0.0" 1279 | eslint-scope "^7.1.1" 1280 | eslint-utils "^3.0.0" 1281 | eslint-visitor-keys "^3.3.0" 1282 | espree "^9.4.0" 1283 | esquery "^1.4.0" 1284 | esutils "^2.0.2" 1285 | fast-deep-equal "^3.1.3" 1286 | file-entry-cache "^6.0.1" 1287 | find-up "^5.0.0" 1288 | glob-parent "^6.0.2" 1289 | globals "^13.19.0" 1290 | grapheme-splitter "^1.0.4" 1291 | ignore "^5.2.0" 1292 | import-fresh "^3.0.0" 1293 | imurmurhash "^0.1.4" 1294 | is-glob "^4.0.0" 1295 | is-path-inside "^3.0.3" 1296 | js-sdsl "^4.1.4" 1297 | js-yaml "^4.1.0" 1298 | json-stable-stringify-without-jsonify "^1.0.1" 1299 | levn "^0.4.1" 1300 | lodash.merge "^4.6.2" 1301 | minimatch "^3.1.2" 1302 | natural-compare "^1.4.0" 1303 | optionator "^0.9.1" 1304 | regexpp "^3.2.0" 1305 | strip-ansi "^6.0.1" 1306 | strip-json-comments "^3.1.0" 1307 | text-table "^0.2.0" 1308 | 1309 | espree@^9.4.0: 1310 | version "9.4.1" 1311 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" 1312 | integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== 1313 | dependencies: 1314 | acorn "^8.8.0" 1315 | acorn-jsx "^5.3.2" 1316 | eslint-visitor-keys "^3.3.0" 1317 | 1318 | esquery@^1.4.0: 1319 | version "1.4.0" 1320 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" 1321 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 1322 | dependencies: 1323 | estraverse "^5.1.0" 1324 | 1325 | esrecurse@^4.3.0: 1326 | version "4.3.0" 1327 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 1328 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 1329 | dependencies: 1330 | estraverse "^5.2.0" 1331 | 1332 | estraverse@^4.1.1: 1333 | version "4.3.0" 1334 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 1335 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 1336 | 1337 | estraverse@^5.1.0, estraverse@^5.2.0: 1338 | version "5.3.0" 1339 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 1340 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 1341 | 1342 | esutils@^2.0.2: 1343 | version "2.0.3" 1344 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 1345 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 1346 | 1347 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 1348 | version "3.1.3" 1349 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1350 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1351 | 1352 | fast-glob@^3.2.11, fast-glob@^3.2.9: 1353 | version "3.2.12" 1354 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" 1355 | integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== 1356 | dependencies: 1357 | "@nodelib/fs.stat" "^2.0.2" 1358 | "@nodelib/fs.walk" "^1.2.3" 1359 | glob-parent "^5.1.2" 1360 | merge2 "^1.3.0" 1361 | micromatch "^4.0.4" 1362 | 1363 | fast-json-stable-stringify@^2.0.0: 1364 | version "2.1.0" 1365 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1366 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1367 | 1368 | fast-levenshtein@^2.0.6: 1369 | version "2.0.6" 1370 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1371 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 1372 | 1373 | fast-ordered-set@^1.0.0: 1374 | version "1.0.3" 1375 | resolved "https://registry.yarnpkg.com/fast-ordered-set/-/fast-ordered-set-1.0.3.tgz#3fbb36634f7be79e4f7edbdb4a357dee25d184eb" 1376 | integrity sha512-MxBW4URybFszOx1YlACEoK52P6lE3xiFcPaGCUZ7QQOZ6uJXKo++Se8wa31SjcZ+NC/fdAWX7UtKEfaGgHS2Vg== 1377 | dependencies: 1378 | blank-object "^1.0.1" 1379 | 1380 | fastq@^1.6.0: 1381 | version "1.15.0" 1382 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" 1383 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== 1384 | dependencies: 1385 | reusify "^1.0.4" 1386 | 1387 | file-entry-cache@^6.0.1: 1388 | version "6.0.1" 1389 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 1390 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 1391 | dependencies: 1392 | flat-cache "^3.0.4" 1393 | 1394 | fill-range@^7.0.1: 1395 | version "7.0.1" 1396 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1397 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1398 | dependencies: 1399 | to-regex-range "^5.0.1" 1400 | 1401 | find-up@^5.0.0: 1402 | version "5.0.0" 1403 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 1404 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 1405 | dependencies: 1406 | locate-path "^6.0.0" 1407 | path-exists "^4.0.0" 1408 | 1409 | find-up@^6.3.0: 1410 | version "6.3.0" 1411 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" 1412 | integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== 1413 | dependencies: 1414 | locate-path "^7.1.0" 1415 | path-exists "^5.0.0" 1416 | 1417 | flat-cache@^3.0.4: 1418 | version "3.0.4" 1419 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 1420 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 1421 | dependencies: 1422 | flatted "^3.1.0" 1423 | rimraf "^3.0.2" 1424 | 1425 | flatted@^3.1.0: 1426 | version "3.2.7" 1427 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" 1428 | integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== 1429 | 1430 | for-each@^0.3.3: 1431 | version "0.3.3" 1432 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" 1433 | integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== 1434 | dependencies: 1435 | is-callable "^1.1.3" 1436 | 1437 | fs-extra@^8.0.1: 1438 | version "8.1.0" 1439 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 1440 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 1441 | dependencies: 1442 | graceful-fs "^4.2.0" 1443 | jsonfile "^4.0.0" 1444 | universalify "^0.1.0" 1445 | 1446 | fs-extra@^9.1.0: 1447 | version "9.1.0" 1448 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" 1449 | integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== 1450 | dependencies: 1451 | at-least-node "^1.0.0" 1452 | graceful-fs "^4.2.0" 1453 | jsonfile "^6.0.1" 1454 | universalify "^2.0.0" 1455 | 1456 | fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.6: 1457 | version "0.5.9" 1458 | resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" 1459 | integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw== 1460 | dependencies: 1461 | heimdalljs-logger "^0.1.7" 1462 | object-assign "^4.1.0" 1463 | path-posix "^1.0.0" 1464 | symlink-or-copy "^1.1.8" 1465 | 1466 | fs-tree-diff@^2.0.0: 1467 | version "2.0.1" 1468 | resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-2.0.1.tgz#343e4745ab435ec39ebac5f9059ad919cd034afa" 1469 | integrity sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A== 1470 | dependencies: 1471 | "@types/symlink-or-copy" "^1.2.0" 1472 | heimdalljs-logger "^0.1.7" 1473 | object-assign "^4.1.0" 1474 | path-posix "^1.0.0" 1475 | symlink-or-copy "^1.1.8" 1476 | 1477 | fs-updater@^1.0.4: 1478 | version "1.0.4" 1479 | resolved "https://registry.yarnpkg.com/fs-updater/-/fs-updater-1.0.4.tgz#2329980f99ae9176e9a0e84f7637538a182ce63b" 1480 | integrity sha512-0pJX4mJF/qLsNEwTct8CdnnRdagfb+LmjRPJ8sO+nCnAZLW0cTmz4rTgU25n+RvTuWSITiLKrGVJceJPBIPlKg== 1481 | dependencies: 1482 | can-symlink "^1.0.0" 1483 | clean-up-path "^1.0.0" 1484 | heimdalljs "^0.2.5" 1485 | heimdalljs-logger "^0.1.9" 1486 | rimraf "^2.6.2" 1487 | 1488 | fs.realpath@^1.0.0: 1489 | version "1.0.0" 1490 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1491 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 1492 | 1493 | function-bind@^1.1.1: 1494 | version "1.1.1" 1495 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1496 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1497 | 1498 | function.prototype.name@^1.1.5: 1499 | version "1.1.5" 1500 | resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" 1501 | integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== 1502 | dependencies: 1503 | call-bind "^1.0.2" 1504 | define-properties "^1.1.3" 1505 | es-abstract "^1.19.0" 1506 | functions-have-names "^1.2.2" 1507 | 1508 | functions-have-names@^1.2.2: 1509 | version "1.2.3" 1510 | resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" 1511 | integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== 1512 | 1513 | fuse.js@^6.5.3: 1514 | version "6.6.2" 1515 | resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.2.tgz#fe463fed4b98c0226ac3da2856a415576dc9a111" 1516 | integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA== 1517 | 1518 | gensync@^1.0.0-beta.2: 1519 | version "1.0.0-beta.2" 1520 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 1521 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 1522 | 1523 | get-caller-file@^2.0.5: 1524 | version "2.0.5" 1525 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1526 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1527 | 1528 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: 1529 | version "1.1.3" 1530 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" 1531 | integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== 1532 | dependencies: 1533 | function-bind "^1.1.1" 1534 | has "^1.0.3" 1535 | has-symbols "^1.0.3" 1536 | 1537 | get-stdin@^9.0.0: 1538 | version "9.0.0" 1539 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" 1540 | integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== 1541 | 1542 | get-symbol-description@^1.0.0: 1543 | version "1.0.0" 1544 | resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" 1545 | integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== 1546 | dependencies: 1547 | call-bind "^1.0.2" 1548 | get-intrinsic "^1.1.1" 1549 | 1550 | glob-parent@^5.1.2: 1551 | version "5.1.2" 1552 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1553 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1554 | dependencies: 1555 | is-glob "^4.0.1" 1556 | 1557 | glob-parent@^6.0.2: 1558 | version "6.0.2" 1559 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 1560 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1561 | dependencies: 1562 | is-glob "^4.0.3" 1563 | 1564 | glob@^5.0.10: 1565 | version "5.0.15" 1566 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 1567 | integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== 1568 | dependencies: 1569 | inflight "^1.0.4" 1570 | inherits "2" 1571 | minimatch "2 || 3" 1572 | once "^1.3.0" 1573 | path-is-absolute "^1.0.0" 1574 | 1575 | glob@^7.1.3: 1576 | version "7.2.3" 1577 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 1578 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 1579 | dependencies: 1580 | fs.realpath "^1.0.0" 1581 | inflight "^1.0.4" 1582 | inherits "2" 1583 | minimatch "^3.1.1" 1584 | once "^1.3.0" 1585 | path-is-absolute "^1.0.0" 1586 | 1587 | globals@^11.1.0: 1588 | version "11.12.0" 1589 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 1590 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1591 | 1592 | globals@^13.19.0: 1593 | version "13.19.0" 1594 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" 1595 | integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== 1596 | dependencies: 1597 | type-fest "^0.20.2" 1598 | 1599 | globby@^11.0.3: 1600 | version "11.1.0" 1601 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 1602 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1603 | dependencies: 1604 | array-union "^2.1.0" 1605 | dir-glob "^3.0.1" 1606 | fast-glob "^3.2.9" 1607 | ignore "^5.2.0" 1608 | merge2 "^1.4.1" 1609 | slash "^3.0.0" 1610 | 1611 | globby@^13.1.2: 1612 | version "13.1.3" 1613 | resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" 1614 | integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== 1615 | dependencies: 1616 | dir-glob "^3.0.1" 1617 | fast-glob "^3.2.11" 1618 | ignore "^5.2.0" 1619 | merge2 "^1.4.1" 1620 | slash "^4.0.0" 1621 | 1622 | gopd@^1.0.1: 1623 | version "1.0.1" 1624 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" 1625 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== 1626 | dependencies: 1627 | get-intrinsic "^1.1.3" 1628 | 1629 | graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: 1630 | version "4.2.10" 1631 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" 1632 | integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== 1633 | 1634 | grapheme-splitter@^1.0.4: 1635 | version "1.0.4" 1636 | resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" 1637 | integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== 1638 | 1639 | has-bigints@^1.0.1, has-bigints@^1.0.2: 1640 | version "1.0.2" 1641 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" 1642 | integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== 1643 | 1644 | has-flag@^3.0.0: 1645 | version "3.0.0" 1646 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1647 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 1648 | 1649 | has-flag@^4.0.0: 1650 | version "4.0.0" 1651 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1652 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1653 | 1654 | has-property-descriptors@^1.0.0: 1655 | version "1.0.0" 1656 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" 1657 | integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== 1658 | dependencies: 1659 | get-intrinsic "^1.1.1" 1660 | 1661 | has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: 1662 | version "1.0.3" 1663 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 1664 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1665 | 1666 | has-tostringtag@^1.0.0: 1667 | version "1.0.0" 1668 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 1669 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 1670 | dependencies: 1671 | has-symbols "^1.0.2" 1672 | 1673 | has@^1.0.3: 1674 | version "1.0.3" 1675 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1676 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1677 | dependencies: 1678 | function-bind "^1.1.1" 1679 | 1680 | hash-for-dep@^1.5.0: 1681 | version "1.5.1" 1682 | resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.1.tgz#497754b39bee2f1c4ade4521bfd2af0a7c1196e3" 1683 | integrity sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw== 1684 | dependencies: 1685 | broccoli-kitchen-sink-helpers "^0.3.1" 1686 | heimdalljs "^0.2.3" 1687 | heimdalljs-logger "^0.1.7" 1688 | path-root "^0.1.1" 1689 | resolve "^1.10.0" 1690 | resolve-package-path "^1.0.11" 1691 | 1692 | heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: 1693 | version "0.1.10" 1694 | resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7" 1695 | integrity sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g== 1696 | dependencies: 1697 | debug "^2.2.0" 1698 | heimdalljs "^0.2.6" 1699 | 1700 | heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5, heimdalljs@^0.2.6: 1701 | version "0.2.6" 1702 | resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe" 1703 | integrity sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA== 1704 | dependencies: 1705 | rsvp "~3.2.1" 1706 | 1707 | ieee754@^1.1.13: 1708 | version "1.2.1" 1709 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 1710 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 1711 | 1712 | ignore@^5.1.1, ignore@^5.2.0: 1713 | version "5.2.4" 1714 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" 1715 | integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== 1716 | 1717 | import-fresh@^3.0.0, import-fresh@^3.2.1: 1718 | version "3.3.0" 1719 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1720 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1721 | dependencies: 1722 | parent-module "^1.0.0" 1723 | resolve-from "^4.0.0" 1724 | 1725 | imurmurhash@^0.1.4: 1726 | version "0.1.4" 1727 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1728 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1729 | 1730 | inflight@^1.0.4: 1731 | version "1.0.6" 1732 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1733 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1734 | dependencies: 1735 | once "^1.3.0" 1736 | wrappy "1" 1737 | 1738 | inherits@2, inherits@^2.0.3, inherits@^2.0.4: 1739 | version "2.0.4" 1740 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1741 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1742 | 1743 | internal-slot@^1.0.3: 1744 | version "1.0.4" 1745 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" 1746 | integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== 1747 | dependencies: 1748 | get-intrinsic "^1.1.3" 1749 | has "^1.0.3" 1750 | side-channel "^1.0.4" 1751 | 1752 | is-arguments@^1.1.0, is-arguments@^1.1.1: 1753 | version "1.1.1" 1754 | resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" 1755 | integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== 1756 | dependencies: 1757 | call-bind "^1.0.2" 1758 | has-tostringtag "^1.0.0" 1759 | 1760 | is-bigint@^1.0.1: 1761 | version "1.0.4" 1762 | resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" 1763 | integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== 1764 | dependencies: 1765 | has-bigints "^1.0.1" 1766 | 1767 | is-boolean-object@^1.1.0: 1768 | version "1.1.2" 1769 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" 1770 | integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== 1771 | dependencies: 1772 | call-bind "^1.0.2" 1773 | has-tostringtag "^1.0.0" 1774 | 1775 | is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: 1776 | version "1.2.7" 1777 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" 1778 | integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== 1779 | 1780 | is-core-module@^2.9.0: 1781 | version "2.11.0" 1782 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" 1783 | integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== 1784 | dependencies: 1785 | has "^1.0.3" 1786 | 1787 | is-date-object@^1.0.1, is-date-object@^1.0.5: 1788 | version "1.0.5" 1789 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" 1790 | integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== 1791 | dependencies: 1792 | has-tostringtag "^1.0.0" 1793 | 1794 | is-extglob@^2.1.1: 1795 | version "2.1.1" 1796 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1797 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1798 | 1799 | is-fullwidth-code-point@^3.0.0: 1800 | version "3.0.0" 1801 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1802 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1803 | 1804 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 1805 | version "4.0.3" 1806 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1807 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1808 | dependencies: 1809 | is-extglob "^2.1.1" 1810 | 1811 | is-interactive@^1.0.0: 1812 | version "1.0.0" 1813 | resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" 1814 | integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== 1815 | 1816 | is-map@^2.0.1, is-map@^2.0.2: 1817 | version "2.0.2" 1818 | resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" 1819 | integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== 1820 | 1821 | is-negative-zero@^2.0.2: 1822 | version "2.0.2" 1823 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" 1824 | integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== 1825 | 1826 | is-number-object@^1.0.4: 1827 | version "1.0.7" 1828 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" 1829 | integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== 1830 | dependencies: 1831 | has-tostringtag "^1.0.0" 1832 | 1833 | is-number@^7.0.0: 1834 | version "7.0.0" 1835 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1836 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1837 | 1838 | is-path-inside@^3.0.3: 1839 | version "3.0.3" 1840 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1841 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1842 | 1843 | is-regex@^1.1.4: 1844 | version "1.1.4" 1845 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" 1846 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== 1847 | dependencies: 1848 | call-bind "^1.0.2" 1849 | has-tostringtag "^1.0.0" 1850 | 1851 | is-set@^2.0.1, is-set@^2.0.2: 1852 | version "2.0.2" 1853 | resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" 1854 | integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== 1855 | 1856 | is-shared-array-buffer@^1.0.2: 1857 | version "1.0.2" 1858 | resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" 1859 | integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== 1860 | dependencies: 1861 | call-bind "^1.0.2" 1862 | 1863 | is-string@^1.0.5, is-string@^1.0.7: 1864 | version "1.0.7" 1865 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" 1866 | integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== 1867 | dependencies: 1868 | has-tostringtag "^1.0.0" 1869 | 1870 | is-symbol@^1.0.2, is-symbol@^1.0.3: 1871 | version "1.0.4" 1872 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" 1873 | integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== 1874 | dependencies: 1875 | has-symbols "^1.0.2" 1876 | 1877 | is-typed-array@^1.1.10: 1878 | version "1.1.10" 1879 | resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" 1880 | integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== 1881 | dependencies: 1882 | available-typed-arrays "^1.0.5" 1883 | call-bind "^1.0.2" 1884 | for-each "^0.3.3" 1885 | gopd "^1.0.1" 1886 | has-tostringtag "^1.0.0" 1887 | 1888 | is-unicode-supported@^0.1.0: 1889 | version "0.1.0" 1890 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 1891 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 1892 | 1893 | is-weakmap@^2.0.1: 1894 | version "2.0.1" 1895 | resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" 1896 | integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== 1897 | 1898 | is-weakref@^1.0.2: 1899 | version "1.0.2" 1900 | resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" 1901 | integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== 1902 | dependencies: 1903 | call-bind "^1.0.2" 1904 | 1905 | is-weakset@^2.0.1: 1906 | version "2.0.2" 1907 | resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" 1908 | integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== 1909 | dependencies: 1910 | call-bind "^1.0.2" 1911 | get-intrinsic "^1.1.1" 1912 | 1913 | isarray@1.0.0, isarray@^1.0.0: 1914 | version "1.0.0" 1915 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1916 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 1917 | 1918 | isarray@^2.0.5: 1919 | version "2.0.5" 1920 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" 1921 | integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== 1922 | 1923 | isexe@^2.0.0: 1924 | version "2.0.0" 1925 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1926 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1927 | 1928 | isobject@^2.0.0: 1929 | version "2.1.0" 1930 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1931 | integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== 1932 | dependencies: 1933 | isarray "1.0.0" 1934 | 1935 | istextorbinary@2.1.0: 1936 | version "2.1.0" 1937 | resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874" 1938 | integrity sha512-kT1g2zxZ5Tdabtpp9VSdOzW9lb6LXImyWbzbQeTxoRtHhurC9Ej9Wckngr2+uepPL09ky/mJHmN9jeJPML5t6A== 1939 | dependencies: 1940 | binaryextensions "1 || 2" 1941 | editions "^1.1.1" 1942 | textextensions "1 || 2" 1943 | 1944 | js-sdsl@^4.1.4: 1945 | version "4.2.0" 1946 | resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" 1947 | integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== 1948 | 1949 | js-tokens@^4.0.0: 1950 | version "4.0.0" 1951 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1952 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1953 | 1954 | js-yaml@^4.1.0: 1955 | version "4.1.0" 1956 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1957 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1958 | dependencies: 1959 | argparse "^2.0.1" 1960 | 1961 | jsesc@^2.5.1: 1962 | version "2.5.2" 1963 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 1964 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 1965 | 1966 | json-schema-traverse@^0.4.1: 1967 | version "0.4.1" 1968 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1969 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1970 | 1971 | json-stable-stringify-without-jsonify@^1.0.1: 1972 | version "1.0.1" 1973 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1974 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1975 | 1976 | json5@^2.2.1: 1977 | version "2.2.3" 1978 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" 1979 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 1980 | 1981 | jsonfile@^4.0.0: 1982 | version "4.0.0" 1983 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1984 | integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== 1985 | optionalDependencies: 1986 | graceful-fs "^4.1.6" 1987 | 1988 | jsonfile@^6.0.1: 1989 | version "6.1.0" 1990 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 1991 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 1992 | dependencies: 1993 | universalify "^2.0.0" 1994 | optionalDependencies: 1995 | graceful-fs "^4.1.6" 1996 | 1997 | language-subtag-registry@^0.3.20: 1998 | version "0.3.22" 1999 | resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" 2000 | integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== 2001 | 2002 | language-tags@^1.0.5: 2003 | version "1.0.7" 2004 | resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.7.tgz#41cc248730f3f12a452c2e2efe32bc0bbce67967" 2005 | integrity sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw== 2006 | dependencies: 2007 | language-subtag-registry "^0.3.20" 2008 | 2009 | levn@^0.4.1: 2010 | version "0.4.1" 2011 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 2012 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 2013 | dependencies: 2014 | prelude-ls "^1.2.1" 2015 | type-check "~0.4.0" 2016 | 2017 | line-column@^1.0.2: 2018 | version "1.0.2" 2019 | resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" 2020 | integrity sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww== 2021 | dependencies: 2022 | isarray "^1.0.0" 2023 | isobject "^2.0.0" 2024 | 2025 | locate-path@^6.0.0: 2026 | version "6.0.0" 2027 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 2028 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 2029 | dependencies: 2030 | p-locate "^5.0.0" 2031 | 2032 | locate-path@^7.1.0: 2033 | version "7.1.1" 2034 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.1.1.tgz#8e1e5a75c7343770cef02ff93c4bf1f0aa666374" 2035 | integrity sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg== 2036 | dependencies: 2037 | p-locate "^6.0.0" 2038 | 2039 | lodash.kebabcase@^4.1.1: 2040 | version "4.1.1" 2041 | resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" 2042 | integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== 2043 | 2044 | lodash.merge@^4.6.2: 2045 | version "4.6.2" 2046 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 2047 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 2048 | 2049 | lodash@^4.17.14, lodash@^4.17.21: 2050 | version "4.17.21" 2051 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 2052 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 2053 | 2054 | log-symbols@^4.1.0: 2055 | version "4.1.0" 2056 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 2057 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 2058 | dependencies: 2059 | chalk "^4.1.0" 2060 | is-unicode-supported "^0.1.0" 2061 | 2062 | lower-case@^2.0.2: 2063 | version "2.0.2" 2064 | resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" 2065 | integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== 2066 | dependencies: 2067 | tslib "^2.0.3" 2068 | 2069 | lru-cache@^5.1.1: 2070 | version "5.1.1" 2071 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 2072 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 2073 | dependencies: 2074 | yallist "^3.0.2" 2075 | 2076 | lru-cache@^6.0.0: 2077 | version "6.0.0" 2078 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 2079 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 2080 | dependencies: 2081 | yallist "^4.0.0" 2082 | 2083 | magic-string@^0.25.7: 2084 | version "0.25.9" 2085 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" 2086 | integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== 2087 | dependencies: 2088 | sourcemap-codec "^1.4.8" 2089 | 2090 | matcher-collection@^1.0.0, matcher-collection@^1.1.1: 2091 | version "1.1.2" 2092 | resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838" 2093 | integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g== 2094 | dependencies: 2095 | minimatch "^3.0.2" 2096 | 2097 | mdn-data@2.0.30: 2098 | version "2.0.30" 2099 | resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" 2100 | integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== 2101 | 2102 | merge-trees@^2.0.0: 2103 | version "2.0.0" 2104 | resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-2.0.0.tgz#a560d796e566c5d9b2c40472a2967cca48d85161" 2105 | integrity sha512-5xBbmqYBalWqmhYm51XlohhkmVOua3VAUrrWh8t9iOkaLpS6ifqm/UVuUjQCeDVJ9Vx3g2l6ihfkbLSTeKsHbw== 2106 | dependencies: 2107 | fs-updater "^1.0.4" 2108 | heimdalljs "^0.2.5" 2109 | 2110 | merge2@^1.3.0, merge2@^1.4.1: 2111 | version "1.4.1" 2112 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 2113 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 2114 | 2115 | micromatch@^4.0.4, micromatch@^4.0.5: 2116 | version "4.0.5" 2117 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 2118 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 2119 | dependencies: 2120 | braces "^3.0.2" 2121 | picomatch "^2.3.1" 2122 | 2123 | mimic-fn@^2.1.0: 2124 | version "2.1.0" 2125 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 2126 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 2127 | 2128 | "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 2129 | version "3.1.2" 2130 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 2131 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 2132 | dependencies: 2133 | brace-expansion "^1.1.7" 2134 | 2135 | minimist@^1.2.6: 2136 | version "1.2.7" 2137 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" 2138 | integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== 2139 | 2140 | mkdirp@^0.5.0, mkdirp@^0.5.1: 2141 | version "0.5.6" 2142 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" 2143 | integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== 2144 | dependencies: 2145 | minimist "^1.2.6" 2146 | 2147 | mktemp@~0.4.0: 2148 | version "0.4.0" 2149 | resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" 2150 | integrity sha512-IXnMcJ6ZyTuhRmJSjzvHSRhlVPiN9Jwc6e59V0bEJ0ba6OBeX2L0E+mRN1QseeOF4mM+F1Rit6Nh7o+rl2Yn/A== 2151 | 2152 | ms@2.0.0: 2153 | version "2.0.0" 2154 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 2155 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 2156 | 2157 | ms@2.1.2: 2158 | version "2.1.2" 2159 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 2160 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 2161 | 2162 | natural-compare@^1.4.0: 2163 | version "1.4.0" 2164 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 2165 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 2166 | 2167 | no-case@^3.0.4: 2168 | version "3.0.4" 2169 | resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" 2170 | integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== 2171 | dependencies: 2172 | lower-case "^2.0.2" 2173 | tslib "^2.0.3" 2174 | 2175 | node-releases@^2.0.6: 2176 | version "2.0.8" 2177 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" 2178 | integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== 2179 | 2180 | object-assign@^4.1.0: 2181 | version "4.1.1" 2182 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 2183 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 2184 | 2185 | object-inspect@^1.12.2, object-inspect@^1.9.0: 2186 | version "1.12.2" 2187 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" 2188 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 2189 | 2190 | object-is@^1.1.5: 2191 | version "1.1.5" 2192 | resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" 2193 | integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== 2194 | dependencies: 2195 | call-bind "^1.0.2" 2196 | define-properties "^1.1.3" 2197 | 2198 | object-keys@^1.1.1: 2199 | version "1.1.1" 2200 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 2201 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 2202 | 2203 | object.assign@^4.1.4: 2204 | version "4.1.4" 2205 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" 2206 | integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== 2207 | dependencies: 2208 | call-bind "^1.0.2" 2209 | define-properties "^1.1.4" 2210 | has-symbols "^1.0.3" 2211 | object-keys "^1.1.1" 2212 | 2213 | once@^1.3.0: 2214 | version "1.4.0" 2215 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 2216 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 2217 | dependencies: 2218 | wrappy "1" 2219 | 2220 | onetime@^5.1.0: 2221 | version "5.1.2" 2222 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 2223 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 2224 | dependencies: 2225 | mimic-fn "^2.1.0" 2226 | 2227 | optionator@^0.9.1: 2228 | version "0.9.1" 2229 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 2230 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 2231 | dependencies: 2232 | deep-is "^0.1.3" 2233 | fast-levenshtein "^2.0.6" 2234 | levn "^0.4.1" 2235 | prelude-ls "^1.2.1" 2236 | type-check "^0.4.0" 2237 | word-wrap "^1.2.3" 2238 | 2239 | ora@^5.4.0: 2240 | version "5.4.1" 2241 | resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" 2242 | integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== 2243 | dependencies: 2244 | bl "^4.1.0" 2245 | chalk "^4.1.0" 2246 | cli-cursor "^3.1.0" 2247 | cli-spinners "^2.5.0" 2248 | is-interactive "^1.0.0" 2249 | is-unicode-supported "^0.1.0" 2250 | log-symbols "^4.1.0" 2251 | strip-ansi "^6.0.0" 2252 | wcwidth "^1.0.1" 2253 | 2254 | os-tmpdir@~1.0.1: 2255 | version "1.0.2" 2256 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 2257 | integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== 2258 | 2259 | p-limit@^3.0.2: 2260 | version "3.1.0" 2261 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 2262 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 2263 | dependencies: 2264 | yocto-queue "^0.1.0" 2265 | 2266 | p-limit@^4.0.0: 2267 | version "4.0.0" 2268 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" 2269 | integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== 2270 | dependencies: 2271 | yocto-queue "^1.0.0" 2272 | 2273 | p-locate@^5.0.0: 2274 | version "5.0.0" 2275 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 2276 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 2277 | dependencies: 2278 | p-limit "^3.0.2" 2279 | 2280 | p-locate@^6.0.0: 2281 | version "6.0.0" 2282 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" 2283 | integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== 2284 | dependencies: 2285 | p-limit "^4.0.0" 2286 | 2287 | parent-module@^1.0.0: 2288 | version "1.0.1" 2289 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 2290 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 2291 | dependencies: 2292 | callsites "^3.0.0" 2293 | 2294 | parse-static-imports@^1.1.0: 2295 | version "1.1.0" 2296 | resolved "https://registry.yarnpkg.com/parse-static-imports/-/parse-static-imports-1.1.0.tgz#ae2f18f18da1a993080ae406a5219455c0bbad5d" 2297 | integrity sha512-HlxrZcISCblEV0lzXmAHheH/8qEkKgmqkdxyHTPbSqsTUV8GzqmN1L+SSti+VbNPfbBO3bYLPHDiUs2avbAdbA== 2298 | 2299 | path-exists@^4.0.0: 2300 | version "4.0.0" 2301 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 2302 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 2303 | 2304 | path-exists@^5.0.0: 2305 | version "5.0.0" 2306 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" 2307 | integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== 2308 | 2309 | path-is-absolute@^1.0.0: 2310 | version "1.0.1" 2311 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2312 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 2313 | 2314 | path-key@^3.1.0: 2315 | version "3.1.1" 2316 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 2317 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 2318 | 2319 | path-parse@^1.0.7: 2320 | version "1.0.7" 2321 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 2322 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 2323 | 2324 | path-posix@^1.0.0: 2325 | version "1.0.0" 2326 | resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" 2327 | integrity sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA== 2328 | 2329 | path-root-regex@^0.1.0: 2330 | version "0.1.2" 2331 | resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" 2332 | integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== 2333 | 2334 | path-root@^0.1.1: 2335 | version "0.1.1" 2336 | resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" 2337 | integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== 2338 | dependencies: 2339 | path-root-regex "^0.1.0" 2340 | 2341 | path-type@^4.0.0: 2342 | version "4.0.0" 2343 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 2344 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 2345 | 2346 | picocolors@^1.0.0: 2347 | version "1.0.0" 2348 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 2349 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 2350 | 2351 | picomatch@^2.3.1: 2352 | version "2.3.1" 2353 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 2354 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 2355 | 2356 | prelude-ls@^1.2.1: 2357 | version "1.2.1" 2358 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 2359 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 2360 | 2361 | prettier@2.8.1: 2362 | version "2.8.1" 2363 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" 2364 | integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== 2365 | 2366 | promise-map-series@^0.2.1: 2367 | version "0.2.3" 2368 | resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" 2369 | integrity sha512-wx9Chrutvqu1N/NHzTayZjE1BgIwt6SJykQoCOic4IZ9yUDjKyVYrpLa/4YCNsV61eRENfs29hrEquVuB13Zlw== 2370 | dependencies: 2371 | rsvp "^3.0.14" 2372 | 2373 | proper-lockfile@^4.1.2: 2374 | version "4.1.2" 2375 | resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" 2376 | integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== 2377 | dependencies: 2378 | graceful-fs "^4.2.4" 2379 | retry "^0.12.0" 2380 | signal-exit "^3.0.2" 2381 | 2382 | punycode@^2.1.0: 2383 | version "2.1.1" 2384 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 2385 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 2386 | 2387 | queue-microtask@^1.2.2: 2388 | version "1.2.3" 2389 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 2390 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 2391 | 2392 | quick-temp@^0.1.3, quick-temp@^0.1.5: 2393 | version "0.1.8" 2394 | resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" 2395 | integrity sha512-YsmIFfD9j2zaFwJkzI6eMG7y0lQP7YeWzgtFgNl38pGWZBSXJooZbOWwkcRot7Vt0Fg9L23pX0tqWU3VvLDsiA== 2396 | dependencies: 2397 | mktemp "~0.4.0" 2398 | rimraf "^2.5.4" 2399 | underscore.string "~3.3.4" 2400 | 2401 | readable-stream@^3.4.0: 2402 | version "3.6.0" 2403 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 2404 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 2405 | dependencies: 2406 | inherits "^2.0.3" 2407 | string_decoder "^1.1.1" 2408 | util-deprecate "^1.0.1" 2409 | 2410 | regexp.prototype.flags@^1.4.3: 2411 | version "1.4.3" 2412 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" 2413 | integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== 2414 | dependencies: 2415 | call-bind "^1.0.2" 2416 | define-properties "^1.1.3" 2417 | functions-have-names "^1.2.2" 2418 | 2419 | regexpp@^3.0.0, regexpp@^3.2.0: 2420 | version "3.2.0" 2421 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 2422 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 2423 | 2424 | require-directory@^2.1.1: 2425 | version "2.1.1" 2426 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2427 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 2428 | 2429 | requireindex@^1.2.0: 2430 | version "1.2.0" 2431 | resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" 2432 | integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== 2433 | 2434 | requireindex@~1.1.0: 2435 | version "1.1.0" 2436 | resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" 2437 | integrity sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg== 2438 | 2439 | resolve-from@^4.0.0: 2440 | version "4.0.0" 2441 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 2442 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 2443 | 2444 | resolve-package-path@^1.0.11: 2445 | version "1.2.7" 2446 | resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e" 2447 | integrity sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q== 2448 | dependencies: 2449 | path-root "^0.1.1" 2450 | resolve "^1.10.0" 2451 | 2452 | resolve-package-path@^3.1.0: 2453 | version "3.1.0" 2454 | resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-3.1.0.tgz#35faaa5d54a9c7dd481eb7c4b2a44410c9c763d8" 2455 | integrity sha512-2oC2EjWbMJwvSN6Z7DbDfJMnD8MYEouaLn5eIX0j8XwPsYCVIyY9bbnX88YHVkbr8XHqvZrYbxaLPibfTYKZMA== 2456 | dependencies: 2457 | path-root "^0.1.1" 2458 | resolve "^1.17.0" 2459 | 2460 | resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.17.0, resolve@^1.22.1: 2461 | version "1.22.1" 2462 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 2463 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 2464 | dependencies: 2465 | is-core-module "^2.9.0" 2466 | path-parse "^1.0.7" 2467 | supports-preserve-symlinks-flag "^1.0.0" 2468 | 2469 | restore-cursor@^3.1.0: 2470 | version "3.1.0" 2471 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 2472 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 2473 | dependencies: 2474 | onetime "^5.1.0" 2475 | signal-exit "^3.0.2" 2476 | 2477 | retry@^0.12.0: 2478 | version "0.12.0" 2479 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" 2480 | integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== 2481 | 2482 | reusify@^1.0.4: 2483 | version "1.0.4" 2484 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 2485 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 2486 | 2487 | rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: 2488 | version "2.7.1" 2489 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 2490 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 2491 | dependencies: 2492 | glob "^7.1.3" 2493 | 2494 | rimraf@^3.0.0, rimraf@^3.0.2: 2495 | version "3.0.2" 2496 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 2497 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 2498 | dependencies: 2499 | glob "^7.1.3" 2500 | 2501 | rsvp@^3.0.14, rsvp@^3.0.18: 2502 | version "3.6.2" 2503 | resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" 2504 | integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== 2505 | 2506 | rsvp@^4.7.0, rsvp@^4.8.5: 2507 | version "4.8.5" 2508 | resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" 2509 | integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== 2510 | 2511 | rsvp@~3.2.1: 2512 | version "3.2.1" 2513 | resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" 2514 | integrity sha512-Rf4YVNYpKjZ6ASAmibcwTNciQ5Co5Ztq6iZPEykHpkoflnD/K5ryE/rHehFsTm4NJj8nKDhbi3eKBWGogmNnkg== 2515 | 2516 | run-parallel@^1.1.9: 2517 | version "1.2.0" 2518 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 2519 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 2520 | dependencies: 2521 | queue-microtask "^1.2.2" 2522 | 2523 | safe-buffer@~5.2.0: 2524 | version "5.2.1" 2525 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 2526 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 2527 | 2528 | safe-regex-test@^1.0.0: 2529 | version "1.0.0" 2530 | resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" 2531 | integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== 2532 | dependencies: 2533 | call-bind "^1.0.2" 2534 | get-intrinsic "^1.1.3" 2535 | is-regex "^1.1.4" 2536 | 2537 | semver@^6.1.0, semver@^6.3.0: 2538 | version "6.3.0" 2539 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 2540 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 2541 | 2542 | semver@^7.3.2, semver@^7.3.4: 2543 | version "7.3.8" 2544 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" 2545 | integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== 2546 | dependencies: 2547 | lru-cache "^6.0.0" 2548 | 2549 | shebang-command@^2.0.0: 2550 | version "2.0.0" 2551 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 2552 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 2553 | dependencies: 2554 | shebang-regex "^3.0.0" 2555 | 2556 | shebang-regex@^3.0.0: 2557 | version "3.0.0" 2558 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 2559 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 2560 | 2561 | side-channel@^1.0.4: 2562 | version "1.0.4" 2563 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 2564 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 2565 | dependencies: 2566 | call-bind "^1.0.0" 2567 | get-intrinsic "^1.0.2" 2568 | object-inspect "^1.9.0" 2569 | 2570 | signal-exit@^3.0.2: 2571 | version "3.0.7" 2572 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 2573 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 2574 | 2575 | silent-error@^1.1.1: 2576 | version "1.1.1" 2577 | resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662" 2578 | integrity sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw== 2579 | dependencies: 2580 | debug "^2.2.0" 2581 | 2582 | simple-html-tokenizer@^0.5.11: 2583 | version "0.5.11" 2584 | resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz#4c5186083c164ba22a7b477b7687ac056ad6b1d9" 2585 | integrity sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og== 2586 | 2587 | slash@^3.0.0: 2588 | version "3.0.0" 2589 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 2590 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 2591 | 2592 | slash@^4.0.0: 2593 | version "4.0.0" 2594 | resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" 2595 | integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== 2596 | 2597 | snake-case@^3.0.3: 2598 | version "3.0.4" 2599 | resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" 2600 | integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== 2601 | dependencies: 2602 | dot-case "^3.0.4" 2603 | tslib "^2.0.3" 2604 | 2605 | source-map-js@^1.0.1: 2606 | version "1.0.2" 2607 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 2608 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 2609 | 2610 | sourcemap-codec@^1.4.8: 2611 | version "1.4.8" 2612 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 2613 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 2614 | 2615 | sprintf-js@^1.1.1: 2616 | version "1.1.2" 2617 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" 2618 | integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== 2619 | 2620 | string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 2621 | version "4.2.3" 2622 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 2623 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2624 | dependencies: 2625 | emoji-regex "^8.0.0" 2626 | is-fullwidth-code-point "^3.0.0" 2627 | strip-ansi "^6.0.1" 2628 | 2629 | string.prototype.matchall@^4.0.6: 2630 | version "4.0.8" 2631 | resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" 2632 | integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== 2633 | dependencies: 2634 | call-bind "^1.0.2" 2635 | define-properties "^1.1.4" 2636 | es-abstract "^1.20.4" 2637 | get-intrinsic "^1.1.3" 2638 | has-symbols "^1.0.3" 2639 | internal-slot "^1.0.3" 2640 | regexp.prototype.flags "^1.4.3" 2641 | side-channel "^1.0.4" 2642 | 2643 | string.prototype.trimend@^1.0.6: 2644 | version "1.0.6" 2645 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" 2646 | integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== 2647 | dependencies: 2648 | call-bind "^1.0.2" 2649 | define-properties "^1.1.4" 2650 | es-abstract "^1.20.4" 2651 | 2652 | string.prototype.trimstart@^1.0.6: 2653 | version "1.0.6" 2654 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" 2655 | integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== 2656 | dependencies: 2657 | call-bind "^1.0.2" 2658 | define-properties "^1.1.4" 2659 | es-abstract "^1.20.4" 2660 | 2661 | string_decoder@^1.1.1: 2662 | version "1.3.0" 2663 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2664 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 2665 | dependencies: 2666 | safe-buffer "~5.2.0" 2667 | 2668 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 2669 | version "6.0.1" 2670 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2671 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2672 | dependencies: 2673 | ansi-regex "^5.0.1" 2674 | 2675 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 2676 | version "3.1.1" 2677 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 2678 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 2679 | 2680 | supports-color@^5.3.0: 2681 | version "5.5.0" 2682 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2683 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2684 | dependencies: 2685 | has-flag "^3.0.0" 2686 | 2687 | supports-color@^7.1.0: 2688 | version "7.2.0" 2689 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2690 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2691 | dependencies: 2692 | has-flag "^4.0.0" 2693 | 2694 | supports-preserve-symlinks-flag@^1.0.0: 2695 | version "1.0.0" 2696 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 2697 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2698 | 2699 | symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0: 2700 | version "1.3.1" 2701 | resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz#9506dd64d8e98fa21dcbf4018d1eab23e77f71fe" 2702 | integrity sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA== 2703 | 2704 | sync-disk-cache@^1.3.3: 2705 | version "1.3.4" 2706 | resolved "https://registry.yarnpkg.com/sync-disk-cache/-/sync-disk-cache-1.3.4.tgz#53a2c5a09d8f4bb53160bce182a456ad71574024" 2707 | integrity sha512-GlkGeM81GPPEKz/lH7QUTbvqLq7K/IUTuaKDSMulP9XQ42glqNJIN/RKgSOw4y8vxL1gOVvj+W7ruEO4s36eCw== 2708 | dependencies: 2709 | debug "^2.1.3" 2710 | heimdalljs "^0.2.3" 2711 | mkdirp "^0.5.0" 2712 | rimraf "^2.2.8" 2713 | username-sync "^1.0.2" 2714 | 2715 | text-table@^0.2.0: 2716 | version "0.2.0" 2717 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2718 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 2719 | 2720 | "textextensions@1 || 2": 2721 | version "2.6.0" 2722 | resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" 2723 | integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== 2724 | 2725 | tmp@0.0.28: 2726 | version "0.0.28" 2727 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" 2728 | integrity sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg== 2729 | dependencies: 2730 | os-tmpdir "~1.0.1" 2731 | 2732 | tmp@^0.2.1: 2733 | version "0.2.1" 2734 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" 2735 | integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== 2736 | dependencies: 2737 | rimraf "^3.0.0" 2738 | 2739 | to-fast-properties@^2.0.0: 2740 | version "2.0.0" 2741 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 2742 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 2743 | 2744 | to-regex-range@^5.0.1: 2745 | version "5.0.1" 2746 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2747 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2748 | dependencies: 2749 | is-number "^7.0.0" 2750 | 2751 | tree-sync@^1.2.2: 2752 | version "1.4.0" 2753 | resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.4.0.tgz#314598d13abaf752547d9335b8f95d9a137100d6" 2754 | integrity sha512-YvYllqh3qrR5TAYZZTXdspnIhlKAYezPYw11ntmweoceu4VK+keN356phHRIIo1d+RDmLpHZrUlmxga2gc9kSQ== 2755 | dependencies: 2756 | debug "^2.2.0" 2757 | fs-tree-diff "^0.5.6" 2758 | mkdirp "^0.5.1" 2759 | quick-temp "^0.1.5" 2760 | walk-sync "^0.3.3" 2761 | 2762 | tslib@^2.0.3, tslib@^2.4.0: 2763 | version "2.4.1" 2764 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" 2765 | integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== 2766 | 2767 | type-check@^0.4.0, type-check@~0.4.0: 2768 | version "0.4.0" 2769 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 2770 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 2771 | dependencies: 2772 | prelude-ls "^1.2.1" 2773 | 2774 | type-fest@^0.20.2: 2775 | version "0.20.2" 2776 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 2777 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 2778 | 2779 | unbox-primitive@^1.0.2: 2780 | version "1.0.2" 2781 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" 2782 | integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== 2783 | dependencies: 2784 | call-bind "^1.0.2" 2785 | has-bigints "^1.0.2" 2786 | has-symbols "^1.0.3" 2787 | which-boxed-primitive "^1.0.2" 2788 | 2789 | underscore.string@~3.3.4: 2790 | version "3.3.6" 2791 | resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.6.tgz#ad8cf23d7423cb3b53b898476117588f4e2f9159" 2792 | integrity sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ== 2793 | dependencies: 2794 | sprintf-js "^1.1.1" 2795 | util-deprecate "^1.0.2" 2796 | 2797 | universalify@^0.1.0: 2798 | version "0.1.2" 2799 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 2800 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 2801 | 2802 | universalify@^2.0.0: 2803 | version "2.0.0" 2804 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" 2805 | integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== 2806 | 2807 | upath@^2.0.1: 2808 | version "2.0.1" 2809 | resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" 2810 | integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== 2811 | 2812 | update-browserslist-db@^1.0.9: 2813 | version "1.0.10" 2814 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" 2815 | integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== 2816 | dependencies: 2817 | escalade "^3.1.1" 2818 | picocolors "^1.0.0" 2819 | 2820 | uri-js@^4.2.2: 2821 | version "4.4.1" 2822 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2823 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2824 | dependencies: 2825 | punycode "^2.1.0" 2826 | 2827 | username-sync@^1.0.2: 2828 | version "1.0.3" 2829 | resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.3.tgz#ae41c5c8a4c8c2ecc1443a7d0742742bd7e36732" 2830 | integrity sha512-m/7/FSqjJNAzF2La448c/aEom0gJy7HY7Y509h6l0ePvEkFictAGptwWaj1msWJ38JbfEDOUoE8kqFee9EHKdA== 2831 | 2832 | util-deprecate@^1.0.1, util-deprecate@^1.0.2: 2833 | version "1.0.2" 2834 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2835 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 2836 | 2837 | v8-compile-cache@^2.3.0: 2838 | version "2.3.0" 2839 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" 2840 | integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== 2841 | 2842 | validate-peer-dependencies@^1.1.0: 2843 | version "1.2.0" 2844 | resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-1.2.0.tgz#22aab93c514f4fda457d36c80685e8b1160d2036" 2845 | integrity sha512-nd2HUpKc6RWblPZQ2GDuI65sxJ2n/UqZwSBVtj64xlWjMx0m7ZB2m9b2JS3v1f+n9VWH/dd1CMhkHfP6pIdckA== 2846 | dependencies: 2847 | resolve-package-path "^3.1.0" 2848 | semver "^7.3.2" 2849 | 2850 | walk-sync@^0.3.1, walk-sync@^0.3.3: 2851 | version "0.3.4" 2852 | resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.4.tgz#cf78486cc567d3a96b5b2237c6108017a5ffb9a4" 2853 | integrity sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig== 2854 | dependencies: 2855 | ensure-posix-path "^1.0.0" 2856 | matcher-collection "^1.0.0" 2857 | 2858 | walk-sync@^1.0.0, walk-sync@^1.1.3: 2859 | version "1.1.4" 2860 | resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.4.tgz#81049f3d8095479b49574cfa5f558d7a252b127d" 2861 | integrity sha512-nowc9thB/Jg0KW4TgxoRjLLYRPvl3DB/98S89r4ZcJqq2B0alNcKDh6pzLkBSkPMzRSMsJghJHQi79qw0YWEkA== 2862 | dependencies: 2863 | "@types/minimatch" "^3.0.3" 2864 | ensure-posix-path "^1.1.0" 2865 | matcher-collection "^1.1.1" 2866 | 2867 | wcwidth@^1.0.1: 2868 | version "1.0.1" 2869 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 2870 | integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== 2871 | dependencies: 2872 | defaults "^1.0.3" 2873 | 2874 | which-boxed-primitive@^1.0.2: 2875 | version "1.0.2" 2876 | resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" 2877 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== 2878 | dependencies: 2879 | is-bigint "^1.0.1" 2880 | is-boolean-object "^1.1.0" 2881 | is-number-object "^1.0.4" 2882 | is-string "^1.0.5" 2883 | is-symbol "^1.0.3" 2884 | 2885 | which-collection@^1.0.1: 2886 | version "1.0.1" 2887 | resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" 2888 | integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== 2889 | dependencies: 2890 | is-map "^2.0.1" 2891 | is-set "^2.0.1" 2892 | is-weakmap "^2.0.1" 2893 | is-weakset "^2.0.1" 2894 | 2895 | which-typed-array@^1.1.8: 2896 | version "1.1.9" 2897 | resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" 2898 | integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== 2899 | dependencies: 2900 | available-typed-arrays "^1.0.5" 2901 | call-bind "^1.0.2" 2902 | for-each "^0.3.3" 2903 | gopd "^1.0.1" 2904 | has-tostringtag "^1.0.0" 2905 | is-typed-array "^1.1.10" 2906 | 2907 | which@^2.0.1: 2908 | version "2.0.2" 2909 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2910 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2911 | dependencies: 2912 | isexe "^2.0.0" 2913 | 2914 | word-wrap@^1.2.3: 2915 | version "1.2.3" 2916 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 2917 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 2918 | 2919 | workerpool@^6.1.5: 2920 | version "6.3.1" 2921 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.3.1.tgz#80a9b76e70556acfb1457a3984f8637717f7cdee" 2922 | integrity sha512-0x7gJm1rhpn5SPG9NENOxPtbfUZZtK/qOg6gEdSqeDBA3dTeR91RJqSPjccPRCkhNfrnnl/dWxSSj5w9CtdzNA== 2923 | 2924 | wrap-ansi@^7.0.0: 2925 | version "7.0.0" 2926 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2927 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2928 | dependencies: 2929 | ansi-styles "^4.0.0" 2930 | string-width "^4.1.0" 2931 | strip-ansi "^6.0.0" 2932 | 2933 | wrappy@1: 2934 | version "1.0.2" 2935 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2936 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 2937 | 2938 | y18n@^5.0.5: 2939 | version "5.0.8" 2940 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 2941 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 2942 | 2943 | yallist@^3.0.2: 2944 | version "3.1.1" 2945 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 2946 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 2947 | 2948 | yallist@^4.0.0: 2949 | version "4.0.0" 2950 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2951 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2952 | 2953 | yargs-parser@^21.1.1: 2954 | version "21.1.1" 2955 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" 2956 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 2957 | 2958 | yargs@^17.5.1: 2959 | version "17.6.2" 2960 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" 2961 | integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== 2962 | dependencies: 2963 | cliui "^8.0.1" 2964 | escalade "^3.1.1" 2965 | get-caller-file "^2.0.5" 2966 | require-directory "^2.1.1" 2967 | string-width "^4.2.3" 2968 | y18n "^5.0.5" 2969 | yargs-parser "^21.1.1" 2970 | 2971 | yocto-queue@^0.1.0: 2972 | version "0.1.0" 2973 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2974 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2975 | 2976 | yocto-queue@^1.0.0: 2977 | version "1.0.0" 2978 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" 2979 | integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== 2980 | --------------------------------------------------------------------------------