diff --git a/.env b/.env
index cf2a364ce..ec9e43163 100644
--- a/.env
+++ b/.env
@@ -11,6 +11,7 @@ SITE_ADMIN_EMAILS=
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOD_JOB_EXECUTION_MODE=
+GROVER_NO_SANDBOX=true # must be true for running chromium as root in Docker container
ADMIN_IDS=
LOG_LEVEL=
DB_HOST=
@@ -24,3 +25,4 @@ UPVS_SSO_SUBJECT=
UPVS_SSO_SP_CERTIFICATE=
UPVS_SSO_SP_PRIVATE_KEY=
UPVS_ENV=
+PDF_DISPLAY_URL=
diff --git a/.env.test b/.env.test
index 4b26726a9..9b5f06bf3 100644
--- a/.env.test
+++ b/.env.test
@@ -11,3 +11,5 @@ ZwIDAQAB
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=1
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=2
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=3
+GROVER_NO_SANDBOX=true # must be true for running chromium as root in Docker container
+PDF_DISPLAY_URL=
diff --git a/Dockerfile b/Dockerfile
index 81798a612..f81a91736 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,8 @@
FROM ruby:3.3.0
# Install packages
-RUN apt-get update && apt-get install -y build-essential nodejs libpq-dev npm fop=1:2.* libsaxon-java libsaxonb-java
+RUN apt-get update && apt-get install -y build-essential nodejs libpq-dev npm fop=1:2.* libsaxon-java libsaxonb-java chromium \
+ && apt-get -y install libx11-xcb1 libxcomposite1 libasound2 libatk1.0-0 libatk-bridge2.0-0 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6
# Setup FOP to use saxon xslt parser
RUN sed -i '/find_jars/i \
diff --git a/Gemfile b/Gemfile
index 764404729..0101fe068 100644
--- a/Gemfile
+++ b/Gemfile
@@ -39,6 +39,7 @@ gem 'jwt'
gem 'stimulus-rails'
gem 'jsbundling-rails'
gem 'pdf-reader'
+gem 'grover'
# Monitoring
gem 'rollbar'
diff --git a/Gemfile.lock b/Gemfile.lock
index 8f47dfd21..4362ba58e 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -117,6 +117,9 @@ GEM
activesupport
tzinfo
coderay (1.1.3)
+ combine_pdf (1.0.26)
+ matrix
+ ruby-rc4 (>= 0.1.5)
concurrent-ruby (1.2.3)
connection_pool (2.4.1)
crack (1.0.0)
@@ -164,6 +167,9 @@ GEM
fugit (>= 1.1)
railties (>= 6.0.0)
thor (>= 0.14.1)
+ grover (1.1.11)
+ combine_pdf (~> 1.0)
+ nokogiri (~> 1.0)
hashdiff (1.1.0)
hashery (2.1.2)
hashie (5.0.0)
@@ -512,6 +518,7 @@ DEPENDENCIES
erb_lint
foreman
good_job
+ grover
htmlbeautifier
importmap-rails
jbuilder
diff --git a/app/components/message_draft_body_component.html.erb b/app/components/message_draft_body_component.html.erb
index 2193eae6e..61e56d216 100644
--- a/app/components/message_draft_body_component.html.erb
+++ b/app/components/message_draft_body_component.html.erb
@@ -93,7 +93,7 @@
<% if @message.html_visualization.present? %>
- <%= tag.iframe class: "relative border-none overflow-hidden h-full w-full", srcdoc: @message.format_html_visualization, onload: "(
+ <%= tag.iframe class: "relative border-none overflow-hidden h-full w-full", srcdoc: @message.html_visualization, onload: "(
function(iframe) {
iframe.contentWindow.document.body.style['height'] = 'unset';
iframe.contentWindow.document.body.style['min-height'] = 'unset';
diff --git a/app/components/settings/rules/rule_header_form_component.rb b/app/components/settings/rules/rule_header_form_component.rb
index 6a56cdf9a..1939b39e3 100644
--- a/app/components/settings/rules/rule_header_form_component.rb
+++ b/app/components/settings/rules/rule_header_form_component.rb
@@ -6,6 +6,7 @@ def before_render
@trigger_events_list = [
[t('message_created'), 'message_created'],
[t('message_draft_submitted'), 'message_draft_submitted'],
+ [t('message_object_downloaded'), 'message_object_downloaded'],
]
end
end
diff --git a/app/controllers/message_objects_controller.rb b/app/controllers/message_objects_controller.rb
index 8e5d56e79..89b0014e0 100644
--- a/app/controllers/message_objects_controller.rb
+++ b/app/controllers/message_objects_controller.rb
@@ -26,6 +26,9 @@ def show
def download
authorize @message_object
+
+ EventBus.publish(:message_object_downloaded, @message_object)
+
send_data @message_object.content, filename: MessageObjectHelper.displayable_name(@message_object), type: @message_object.mimetype, disposition: :download
end
@@ -34,6 +37,8 @@ def download_pdf
pdf_content = @message_object.prepare_pdf_visualization
if pdf_content
+ EventBus.publish(:message_object_downloaded, @message_object)
+
send_data pdf_content, filename: MessageObjectHelper.pdf_name(@message_object), type: 'application/pdf', disposition: :download
else
redirect_back fallback_location: message_thread_path(@message_object.message.thread), alert: "Obsah nie je možné stiahnuť."
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 34da4289f..b1d68ee62 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -9,10 +9,10 @@ def nice_datetime(datetime)
end
end
- def nice_datetime_with_time(datetime)
- if datetime.today?
+ def nice_datetime_with_time(datetime, full_date: false)
+ if datetime.today? && !full_date
l(datetime, format: '%H:%M')
- elsif datetime.year == Date.current.year
+ elsif datetime.year == Date.current.year && !full_date
l(datetime, format: '%e. %b %H:%M')
else
l(datetime, format: '%e. %b %Y %H:%M')
diff --git a/app/helpers/fs/message_helper.rb b/app/helpers/fs/message_helper.rb
new file mode 100644
index 000000000..6e0f1fa3d
--- /dev/null
+++ b/app/helpers/fs/message_helper.rb
@@ -0,0 +1,23 @@
+module Fs::MessageHelper
+ def self.build_html_visualization(message)
+ return [ActionController::Base.new.render_to_string('fs/messages/_submission', layout: false, locals: { message: message }), build_html_visualization_from_form(message)].compact.join('
') if message.outbox?
+
+ # TODO: Vieme aj lepsie identifikovat? Nejake dalsie typy v tejto kategorii neexistuju?
+ template = if message.title.in?(['Informácia o podaní', 'Informácia o odmietnutí podania'])
+ 'fs/messages/_delivery_report'
+ else
+ 'fs/messages/_generic_message'
+ end
+
+ ActionController::Base.new.render_to_string(template, layout: false, locals: { message: message })
+ end
+
+ def self.build_html_visualization_from_form(message)
+ raise 'Missing Fs::Form XSLT' unless message.form&.xslt_txt
+ return unless message.form_object&.unsigned_content
+
+ template = Nokogiri::XSLT(message.form.xslt_txt)
+
+ ActionController::Base.new.render_to_string('fs/messages/_style', layout: false, locals: { message: message }) + ActionController::Base.helpers.simple_format(template.transform(message.form_object.xml_unsigned_content).to_s)
+ end
+end
diff --git a/app/helpers/message_helper.rb b/app/helpers/message_helper.rb
index 22e028694..bbd54f3d3 100644
--- a/app/helpers/message_helper.rb
+++ b/app/helpers/message_helper.rb
@@ -2,10 +2,4 @@ module MessageHelper
def self.export_filename(message)
"#{message.delivered_at.to_date}-sprava-#{message.id}.zip"
end
-
- def format_html_visualization
- return ActionController::Base.helpers.simple_format(html_visualization) if is_a?(Fs::MessageDraft)
-
- html_visualization
- end
end
diff --git a/app/jobs/fs/download_received_message_job.rb b/app/jobs/fs/download_received_message_job.rb
new file mode 100644
index 000000000..4e860961d
--- /dev/null
+++ b/app/jobs/fs/download_received_message_job.rb
@@ -0,0 +1,18 @@
+module Fs
+ class DownloadReceivedMessageJob < ApplicationJob
+ def perform(fs_message_id, box:, fs_client: FsEnvironment.fs_client)
+ raise unless box.is_a?(Fs::Box)
+ return unless box.syncable?
+
+ return if box.messages.where("metadata ->> 'fs_message_id' = ?", fs_message_id).any?
+
+ ActiveRecord::Base.transaction do
+ fs_api = fs_client.api(api_connection: box.api_connection, box: box)
+
+ raw_message = fs_api.fetch_received_message(fs_message_id)
+
+ Fs::Message.create_inbox_message_with_thread!(raw_message, box: box)
+ end
+ end
+ end
+end
diff --git a/app/jobs/fs/download_sent_message_job.rb b/app/jobs/fs/download_sent_message_job.rb
new file mode 100644
index 000000000..0d12647c9
--- /dev/null
+++ b/app/jobs/fs/download_sent_message_job.rb
@@ -0,0 +1,20 @@
+module Fs
+ class DownloadSentMessageJob < ApplicationJob
+ def perform(fs_message_id, box:, fs_client: FsEnvironment.fs_client)
+ raise unless box.is_a?(Fs::Box)
+ return unless box.syncable?
+
+ return if box.messages.where(type: [nil, 'Message']).where("metadata ->> 'fs_message_id' = ?", fs_message_id).any?
+
+ ActiveRecord::Base.transaction do
+ fs_api = fs_client.api(api_connection: box.api_connection, box: box)
+
+ raw_message = fs_api.fetch_sent_message(fs_message_id)
+
+ message = Fs::Message.create_outbox_message_with_thread!(raw_message, box: box)
+
+ DownloadSentMessageRelatedMessagesJob.set(wait: 3.minutes).perform_later(message)
+ end
+ end
+ end
+end
diff --git a/app/jobs/fs/download_sent_message_related_messages_job.rb b/app/jobs/fs/download_sent_message_related_messages_job.rb
new file mode 100644
index 000000000..43f9fc69d
--- /dev/null
+++ b/app/jobs/fs/download_sent_message_related_messages_job.rb
@@ -0,0 +1,20 @@
+module Fs
+ class DownloadSentMessageRelatedMessagesJob < ApplicationJob
+ def perform(outbox_message, from: nil, to: nil, fs_client: FsEnvironment.fs_client, batch_size: 25)
+ raise unless outbox_message.box.is_a?(Fs::Box)
+ return unless outbox_message.box.syncable?
+
+ fs_api = fs_client.api(api_connection: outbox_message.box.api_connection, box: outbox_message.box)
+
+ 0.step do |k|
+ received_messages = fs_api.fetch_received_messages(sent_message_id: outbox_message.metadata['fs_message_id'], page: k + 1, count: batch_size, from: from, to: to)
+
+ received_messages['messages'].each do |received_message|
+ ::Fs::DownloadReceivedMessageJob.perform_later(received_message['message_id'], box: outbox_message.box)
+ end
+
+ break if received_messages['messages'].size < batch_size
+ end
+ end
+ end
+end
diff --git a/app/jobs/fs/fetch_forms_job.rb b/app/jobs/fs/fetch_forms_job.rb
index 3591c5fff..75e574d79 100644
--- a/app/jobs/fs/fetch_forms_job.rb
+++ b/app/jobs/fs/fetch_forms_job.rb
@@ -7,6 +7,7 @@ def perform(fs_client: FsEnvironment.fs_client, download_related_documents_job:
identifier: fs_form_data['identifier'],
).tap do |form|
form.update(
+ submission_type_identifier: fs_form_data['submission_type_identifier'],
name: fs_form_data['name'],
group_name: fs_form_data['form_group_name'],
subtype_name: fs_form_data['subtype_name'],
diff --git a/app/jobs/fs/submit_message_draft_job.rb b/app/jobs/fs/submit_message_draft_job.rb
index 150fa319e..f70e255bf 100644
--- a/app/jobs/fs/submit_message_draft_job.rb
+++ b/app/jobs/fs/submit_message_draft_job.rb
@@ -7,6 +7,8 @@ def perform(message_draft, bulk_submit: false, fs_client: FsEnvironment.fs_clien
response = fs_api.post_submission(
message_draft.form.identifier,
Base64.strict_encode64(message_draft.form_object.content),
+ message_uuid: message_draft.uuid,
+ form_object_uuid: message_draft.form_object.uuid,
allow_warn_status: true,
is_signed: message_draft.form_object.is_signed,
mime_type: message_draft.form_object.mimetype
diff --git a/app/jobs/fs/submit_message_draft_result_job.rb b/app/jobs/fs/submit_message_draft_result_job.rb
index 2bb1780c7..c148f012e 100644
--- a/app/jobs/fs/submit_message_draft_result_job.rb
+++ b/app/jobs/fs/submit_message_draft_result_job.rb
@@ -4,7 +4,10 @@ def perform(message_draft, location_header, fs_client: FsEnvironment.fs_client)
if 200 == response[:status]
message_draft.metadata[:status] = 'submitted'
+ message_draft.metadata[:fs_message_id] = response[:body]['sent_message_id']
message_draft.save
+
+ ::Fs::DownloadSentMessageJob.perform_later(response[:body]['sent_message_id'], box: message_draft.box)
elsif [400, 422].include?(response[:status])
message_draft.metadata[:status] = 'submit_fail'
message_draft.add_cascading_tag(message_draft.tenant.submission_error_tag)
diff --git a/app/jobs/fs/sync_all_boxes_job.rb b/app/jobs/fs/sync_all_boxes_job.rb
new file mode 100644
index 000000000..04f0e12db
--- /dev/null
+++ b/app/jobs/fs/sync_all_boxes_job.rb
@@ -0,0 +1,12 @@
+module Fs
+ class SyncAllBoxesJob < ApplicationJob
+ def perform
+ Fs::Box.where(syncable: true).find_each do |box|
+ SyncBoxJob.perform_later(box)
+ end
+
+ # TODO ponastavovat v BetterUptime
+ BetterUptimeApi.ping_heartbeat('FS_SYNC')
+ end
+ end
+end
diff --git a/app/jobs/fs/sync_box_job.rb b/app/jobs/fs/sync_box_job.rb
new file mode 100644
index 000000000..1bfa355f0
--- /dev/null
+++ b/app/jobs/fs/sync_box_job.rb
@@ -0,0 +1,12 @@
+module Fs
+ class SyncBoxJob < ApplicationJob
+ def perform(box, from: Date.today - 1.week, to: Date.tomorrow)
+ raise unless box.is_a?(Fs::Box)
+ return unless box.syncable?
+
+ box.messages.outbox.find_each do |outbox_message|
+ DownloadSentMessageRelatedMessagesJob.perform_later(outbox_message, from: from, to: to)
+ end
+ end
+ end
+end
diff --git a/app/lib/event_bus.rb b/app/lib/event_bus.rb
index 1d2bcecc7..367663ed4 100644
--- a/app/lib/event_bus.rb
+++ b/app/lib/event_bus.rb
@@ -28,7 +28,7 @@ def self.reset!
# wiring
# automation
-[:message_thread_created, :message_created, :message_draft_submitted].each do |event|
+[:message_thread_created, :message_created, :message_draft_submitted, :message_object_downloaded].each do |event|
EventBus.subscribe_job event, Automation::ApplyRulesForEventJob
end
diff --git a/app/lib/fs/api.rb b/app/lib/fs/api.rb
index b4216bf72..23c0d8c0a 100644
--- a/app/lib/fs/api.rb
+++ b/app/lib/fs/api.rb
@@ -29,19 +29,27 @@ def get_subjects
end
def fetch_sent_messages(page: 1, count: 100, obo: @obo)
- request(:get, "sent-messages", {}, jwt_header(obo).merge(fs_credentials_header))[:body]
+ request(:get, "sent-messages?page=#{page}&per_page=#{count}", {}, jwt_header(obo).merge(fs_credentials_header))[:body]
end
def fetch_sent_message(message_id, obo: @obo)
- request(:get, "sent-messages/#{message_id}", {}, jwt_header(obo).merge(fs_credentials_header))[:body]
+ request(:get, "sent-messages/#{CGI.escape(message_id)}", {}, jwt_header(obo).merge(fs_credentials_header))[:body]
end
- def fetch_received_messages(page: 1, count: 100, obo: @obo)
- request(:get, "received-messages", {}, jwt_header(obo).merge(fs_credentials_header))[:body]
+ def fetch_received_messages(sent_message_id: nil, page: 1, count: 100, from: nil, to: nil, obo: @obo)
+ query = {
+ sent_message_id: sent_message_id,
+ page: page,
+ per_page: count,
+ from: from,
+ to: to
+ }.compact.to_query
+
+ request(:get, "received-messages?#{query}", {}, jwt_header(obo).merge(fs_credentials_header))[:body]
end
def fetch_received_message(message_id, obo: @obo)
- request(:get, "received-messages/#{message_id}", {}, jwt_header(obo).merge(fs_credentials_header))[:body]
+ request(:get, "received-messages/#{CGI.escape(message_id)}", {}, jwt_header(obo).merge(fs_credentials_header))[:body]
end
def post_validation(form_identifier, content)
@@ -52,8 +60,10 @@ def delete_validation(validation_id)
request(:delete, "validations/#{validation_id}", {}, jwt_header, accept_negative: true)
end
- def post_submission(form_identifier, content, allow_warn_status: true, is_signed: true, mime_type: 'application/vnd.etsi.asic-e+zip', obo: @obo)
+ def post_submission(form_identifier, content, allow_warn_status: true, message_uuid:, form_object_uuid:, is_signed: true, mime_type: 'application/vnd.etsi.asic-e+zip', obo: @obo)
request(:post, "submissions", {
+ message_container_message_id: message_uuid,
+ message_container_form_object_id: form_object_uuid,
is_signed: is_signed,
mime_type: mime_type,
form_identifier: form_identifier,
diff --git a/app/lib/utils.rb b/app/lib/utils.rb
index ee882d21f..2665ff4e5 100644
--- a/app/lib/utils.rb
+++ b/app/lib/utils.rb
@@ -100,7 +100,6 @@ def file_extension_by_mimetype(mimetype)
# TODO use UPVS API to detect if document is signed
def is_signed?(entry_name:, content:)
-
case File.extname(entry_name).downcase
when '.asice', '.asics', '.xzep'
true
diff --git a/app/models/automation/condition.rb b/app/models/automation/condition.rb
index 31ad12df2..1d3a85ffa 100644
--- a/app/models/automation/condition.rb
+++ b/app/models/automation/condition.rb
@@ -21,7 +21,7 @@ class Condition < ApplicationRecord
attr_accessor :delete_record
# when adding items, check defaults in condition_form_component.rb
- ATTR_LIST = %i[box sender_name recipient_name title sender_uri recipient_uri attachment].freeze
+ ATTR_LIST = %i[box sender_name recipient_name title sender_uri recipient_uri attachment fs_submission_status fs_message_type object_type].freeze
def valid_condition_type_list_for_attr
Automation::Condition.subclasses.map do |subclass|
@@ -36,7 +36,7 @@ def box_list
class ContainsCondition < Automation::Condition
validates :value, presence: true
- VALID_ATTR_LIST = %w[sender_name recipient_name title].freeze
+ VALID_ATTR_LIST = %w[sender_name recipient_name title object_type].freeze
validates :attr, inclusion: { in: VALID_ATTR_LIST }
def satisfied?(thing)
@@ -50,7 +50,7 @@ def cleanup_record
class MetadataValueCondition < Automation::Condition
validates :value, presence: true
- VALID_ATTR_LIST = %w[sender_uri recipient_uri].freeze
+ VALID_ATTR_LIST = %w[sender_uri recipient_uri fs_submission_status fs_message_type].freeze
validates :attr, inclusion: { in: VALID_ATTR_LIST }
def satisfied?(thing)
@@ -81,6 +81,20 @@ def cleanup_record
end
end
+ class MessageMetadataValueCondition < Automation::Condition
+ validates :value, presence: true
+ VALID_ATTR_LIST = %w[fs_message_type].freeze
+ validates :attr, inclusion: { in: VALID_ATTR_LIST }
+
+ def satisfied?(thing)
+ thing.message.metadata && thing.message.metadata[attr]&.match?(value)
+ end
+
+ def cleanup_record
+ self.condition_object = nil
+ end
+ end
+
class AttachmentContentContainsCondition < Automation::Condition
validates :value, presence: true
VALID_ATTR_LIST = ['attachment'].freeze
diff --git a/app/models/concerns/pdf_visualization_operations.rb b/app/models/concerns/pdf_visualization_operations.rb
index 86cec6fda..5e1c74d99 100644
--- a/app/models/concerns/pdf_visualization_operations.rb
+++ b/app/models/concerns/pdf_visualization_operations.rb
@@ -7,6 +7,10 @@ module PdfVisualizationOperations
included do
def prepare_pdf_visualization
+ prepare_pdf_visualization_from_template || prepare_pdf_visualization_from_html
+ end
+
+ def prepare_pdf_visualization_from_template
return unless form&.xsl_fo
return unless unsigned_content
return unless xml?
@@ -39,6 +43,23 @@ def prepare_pdf_visualization
end
end
+ def prepare_pdf_visualization_from_html
+ return unless form?
+ return unless message.html_visualization.present?
+
+ Grover.new(
+ full_html_document_from_body_content(message.html_visualization),
+ format: 'A4',
+ margin: {
+ top: '15px',
+ bottom: '15px',
+ left: '15px',
+ right: '15px'
+ },
+ display_url: ENV['PDF_DISPLAY_URL']
+ ).to_pdf
+ end
+
def xml_unsigned_content
document = Nokogiri::XML(unsigned_content) do |config|
config.noblanks
@@ -75,7 +96,9 @@ def find_or_create_form
end
def downloadable_as_pdf?
- xml? && form&.xsl_fo&.present?
+ return true if xml? && form&.xsl_fo&.present?
+ return true if form? && message.html_visualization.present?
+ false
end
def xml?
@@ -85,5 +108,18 @@ def xml?
Utils::XML_MIMETYPES.any? { |xml_mimetype| xml_mimetype == Utils.mimetype_without_optional_params(mimetype) }
end
end
+
+ def full_html_document_from_body_content(body_content)
+ <<-HTML
+
+
+
+
+
+ #{body_content}
+
+
+ HTML
+ end
end
end
diff --git a/app/models/fs/form.rb b/app/models/fs/form.rb
index 3c5c94453..2d4874506 100644
--- a/app/models/fs/form.rb
+++ b/app/models/fs/form.rb
@@ -2,17 +2,18 @@
#
# Table name: fs_forms
#
-# id :bigint not null, primary key
-# ez_signature :boolean
-# group_name :string
-# identifier :string not null
-# name :string not null
-# number_identifier :integer
-# signature_required :boolean
-# slug :string
-# subtype_name :string
-# created_at :datetime not null
-# updated_at :datetime not null
+# id :bigint not null, primary key
+# ez_signature :boolean
+# group_name :string
+# identifier :string not null
+# name :string not null
+# number_identifier :integer
+# signature_required :boolean
+# slug :string
+# submission_type_identifier :string
+# subtype_name :string
+# created_at :datetime not null
+# updated_at :datetime not null
#
class Fs::Form < ApplicationRecord
has_many :related_documents, class_name: 'Fs::FormRelatedDocument', foreign_key: 'fs_form_id', dependent: :destroy
diff --git a/app/models/fs/message.rb b/app/models/fs/message.rb
new file mode 100644
index 000000000..86c7cab37
--- /dev/null
+++ b/app/models/fs/message.rb
@@ -0,0 +1,153 @@
+class Fs::Message
+ FS_SUBJECT_NAME = 'Finančná správa'
+
+ def self.create_inbox_message_with_thread!(raw_message, box:)
+ message = nil
+ associated_outbox_message = box.messages.where("metadata ->> 'fs_message_id' = ?", raw_message['sent_message_id']).take
+
+ MessageThread.with_advisory_lock!(associated_outbox_message.metadata['correlation_id'], transaction: true, timeout_seconds: 10) do
+ message = create_inbox_message(raw_message)
+
+ message.thread = associated_outbox_message.thread
+
+ message.save!
+
+ create_message_objects(message, raw_message)
+ update_html_visualization(message)
+
+ MessageObject.mark_message_objects_externally_signed(message.objects)
+ end
+
+ EventBus.publish(:message_thread_created, message.thread) if message.thread.previously_new_record?
+ EventBus.publish(:message_created, message)
+ end
+
+ def self.create_outbox_message_with_thread!(raw_message, box:)
+ message = nil
+ associated_message_draft = box.messages.where(type: 'Fs::MessageDraft').where("metadata ->> 'fs_message_id' = ?", raw_message['message_id']).take
+
+ merge_identifier = (associated_message_draft.metadata['correlation_id'] if associated_message_draft) || SecureRandom.uuid
+
+ MessageThread.with_advisory_lock!(merge_identifier, transaction: true, timeout_seconds: 10) do
+ message = create_outbox_message(raw_message, associated_message_draft: associated_message_draft)
+
+ message.thread = associated_message_draft&.thread
+ message.thread ||= box.message_threads.find_or_create_by_merge_uuid!(
+ box: box,
+ merge_uuid: merge_identifier,
+ title: message.title,
+ delivered_at: message.delivered_at
+ )
+
+ message.save!
+
+ create_message_objects(message, raw_message)
+ update_html_visualization(message)
+
+ if associated_message_draft
+ message.copy_tags_from_draft(associated_message_draft)
+ associated_message_draft.destroy
+ end
+
+ MessageObject.mark_message_objects_externally_signed(message.objects)
+ end
+
+ EventBus.publish(:message_thread_created, message.thread) if message.thread.previously_new_record?
+ EventBus.publish(:message_created, message)
+
+ message
+ end
+
+ private
+
+ def self.create_inbox_message(raw_message)
+ Message.create(
+ uuid: raw_message.dig('message_container', 'message_id'),
+ title: raw_message['message_type_name'],
+ sender_name: FS_SUBJECT_NAME,
+ recipient_name: raw_message['subject'],
+ delivered_at: Time.parse(raw_message['created_at']).getlocal,
+ replyable: false,
+ collapsed: collapsed?,
+ outbox: false,
+ metadata: {
+ "fs_message_id": raw_message['message_id'],
+ "fs_sent_message_id": raw_message['sent_message_id'],
+ "fs_status": raw_message['status'],
+ "fs_submitting_subject": raw_message['submitting_subject'],
+ "fs_submission_status": raw_message['submission_status'],
+ "fs_message_type": raw_message.dig('message_container', 'message_type'),
+ "fs_submission_type_id": raw_message['submission_type_id'], # TODO kde pouzit? asi napr. pri vytvarani nazvu suboru pri exporte
+ "fs_submission_created_at": Time.parse(raw_message['submission_created_at']).getlocal,
+ "fs_period": raw_message['period'],
+ "fs_dismissal_reason": raw_message['dismissal_reason'],
+ "fs_other_attributes": raw_message['other_attributes'],
+ "dic": raw_message['dic']
+ },
+ )
+ end
+
+ def self.create_outbox_message(raw_message, associated_message_draft: nil)
+ Message.create(
+ uuid: raw_message.dig('message_container', 'message_id'),
+ title: raw_message['submission_type_name'],
+ sender_name: raw_message['subject'],
+ recipient_name: FS_SUBJECT_NAME,
+ delivered_at: Time.parse(raw_message['created_at']).getlocal,
+ replyable: false,
+ collapsed: collapsed?,
+ outbox: true,
+ metadata: {
+ "fs_form_id": (associated_message_draft.metadata['fs_form_id'] if associated_message_draft) || Fs::Form.find_by(submission_type_identifier: raw_message['submission_type_id'])&.id,
+ "fs_message_id": raw_message['message_id'],
+ "fs_status": raw_message['status'],
+ "fs_submitting_subject": raw_message['submitting_subject'],
+ "fs_period": raw_message['period'],
+ "fs_dismissal_reason": raw_message['dismissal_reason'],
+ "fs_other_attributes": raw_message['other_attributes'],
+ "dic": raw_message['dic']
+ },
+ )
+ end
+
+ def self.create_message_objects(message, raw_message)
+ raw_message.dig('message_container', 'objects').each do |raw_object|
+ tags = raw_object["signed"] ? [message.thread.box.tenant.signed_externally_tag!] : []
+
+ message_object = message.objects.create!(
+ uuid: raw_object["id"],
+ is_signed: raw_object["signed"],
+ mimetype: raw_object["mime_type"],
+ name: raw_object["name"],
+ object_type: raw_object["class"],
+ tags: tags
+ )
+
+ if raw_object["encoding"] == "Base64"
+ message_object_content = Base64.decode64(raw_object["content"])
+ else
+ message_object_content = raw_object["content"]
+ end
+
+ MessageObjectDatum.create!(
+ blob: message_object_content,
+ message_object: message_object
+ )
+ end
+ end
+
+ def self.update_html_visualization(message)
+ message.update(
+ html_visualization: Fs::MessageHelper.build_html_visualization(message)
+ )
+
+ message.form_object&.update(
+ visualizable: message.html_visualization.present?
+ )
+ end
+
+ def self.collapsed?
+ # TODO urcit podmienky: odoslana sprava s potvrdenkou by mohla byt collapsed
+ false
+ end
+end
diff --git a/app/models/fs/message_draft.rb b/app/models/fs/message_draft.rb
index c23776006..b3a8d8ac6 100644
--- a/app/models/fs/message_draft.rb
+++ b/app/models/fs/message_draft.rb
@@ -53,7 +53,8 @@ def self.create_and_validate_with_fs_form(form_files: [], author:, fs_client: Fs
delivered_at: Time.now,
metadata: {
'status': 'being_loaded',
- 'fs_form_id': fs_form.id
+ 'fs_form_id': fs_form.id,
+ 'correlation_id': SecureRandom.uuid
},
author: author
)
@@ -102,13 +103,7 @@ def attachments_allowed?
end
def build_html_visualization
- return self.html_visualization if self.html_visualization.present?
-
- return unless form&.xslt_txt
- return unless form_object&.unsigned_content
-
- template = Nokogiri::XSLT(form.xslt_txt)
- template.transform(form_object.xml_unsigned_content)
+ Fs::MessageHelper.build_html_visualization_from_form(self)
end
def form
diff --git a/app/models/govbox/message.rb b/app/models/govbox/message.rb
index 1de014cbd..73cc9da8c 100644
--- a/app/models/govbox/message.rb
+++ b/app/models/govbox/message.rb
@@ -43,11 +43,10 @@ def self.create_message_with_thread!(govbox_message)
message.save!
create_message_objects(message, govbox_message.payload)
-
add_upvs_related_tags(message, govbox_message)
if message_draft
- copy_tags_from_draft(message, message_draft)
+ message.copy_tags_from_draft(message_draft)
message_draft.destroy
end
@@ -148,15 +147,6 @@ def self.add_upvs_related_tags(message, govbox_message)
add_delivery_notification_tag(message) if message.can_be_authorized?
end
- def self.copy_tags_from_draft(message, message_draft)
- message_draft.objects.map do |message_draft_object|
- message_object = message.objects.find_by(uuid: message_draft_object.uuid)
- message_draft_object.tags.signed.each { |tag| message_object.assign_tag(tag) }
- end
-
- (message_draft.tags.simple + message_draft.tags.signed).each { |tag| message.assign_tag(tag) }
- end
-
def self.add_delivery_notification_tag(message)
message.add_cascading_tag(delivery_notification_tag(message))
end
diff --git a/app/models/message.rb b/app/models/message.rb
index edd77d2ce..e2e1eaa11 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -100,8 +100,10 @@ def any_objects_with_requested_signature?
MessageObjectsTag.where(message_object: objects, tag: tenant.tags.signature_requesting).exists?
end
- # TODO remove UPVS stuff from core domain
+ # TODO remove UPVS, FS stuff from core domain
def form
+ return ::Fs::Form.find(metadata['fs_form_id']) if metadata['fs_form_id'].present?
+
::Upvs::Form.find_by(
identifier: all_metadata['posp_id'],
version: all_metadata['posp_version']
@@ -128,6 +130,19 @@ def build_html_visualization
template.transform(form_object.xml_unsigned_content)
end
+ def copy_tags_from_draft(message_draft)
+ message_draft.objects.map do |message_draft_object|
+ message_object = objects.find_by(uuid: message_draft_object.uuid)
+ message_draft_object.tags.signed.each { |tag| message_object.assign_tag(tag) }
+ end
+
+ (message_draft.tags.simple + message_draft.tags.signed).each { |tag| assign_tag(tag) }
+ end
+
+ def assign_tag(tag)
+ messages_tags.find_or_create_by!(tag: tag)
+ end
+
def all_metadata
metadata.merge(template&.metadata || {})
end
diff --git a/app/models/message_object.rb b/app/models/message_object.rb
index 30215df7a..1b0452600 100644
--- a/app/models/message_object.rb
+++ b/app/models/message_object.rb
@@ -23,6 +23,8 @@ class MessageObject < ApplicationRecord
has_many :tags, through: :message_objects_tags
has_one :archived_object, dependent: :destroy
+ delegate :tenant, to: :message
+
scope :unsigned, -> { where(is_signed: false) }
validates :name, presence: { message: "Name can't be blank" }, on: :validate_data
@@ -85,6 +87,10 @@ def remove_signature_requested_from_group(group)
thread.remove_signature_requested_from_group(group)
end
+ def automation_rules_for_event(event)
+ tenant.automation_rules.where(trigger_event: event)
+ end
+
def content
message_object_datum&.blob
end
@@ -136,6 +142,10 @@ def xml?
Utils::XML_MIMETYPES.any? { |xml_mimetype| xml_mimetype == Utils.mimetype_without_optional_params(mimetype) }
end
+ def thread
+ message.thread
+ end
+
private
def allowed_mimetype?
@@ -154,10 +164,6 @@ def unassign_tag(tag)
message_objects_tags.find_by(tag: tag)&.destroy
end
- def thread
- message.thread
- end
-
def remove_object_related_tags_from_thread
tags.each do |tag|
thread.unassign_tag(tag) unless other_thread_objects_include_tag?(tag)
diff --git a/app/models/nested_message_object.rb b/app/models/nested_message_object.rb
index b6278c08a..051b00fd5 100644
--- a/app/models/nested_message_object.rb
+++ b/app/models/nested_message_object.rb
@@ -16,7 +16,7 @@ class NestedMessageObject < ApplicationRecord
belongs_to :message_object, inverse_of: :nested_message_objects
- delegate :message, to: :message_object
+ delegate :message, :form?, to: :message_object
validates :name, presence: true, on: :validate_data
diff --git a/app/views/fs/messages/_delivery_report.html.erb b/app/views/fs/messages/_delivery_report.html.erb
new file mode 100644
index 000000000..a89b9b130
--- /dev/null
+++ b/app/views/fs/messages/_delivery_report.html.erb
@@ -0,0 +1,90 @@
+<%= render partial: "fs/messages/style" %>
+
+
+
+
+ Typ dokumentu: |
+
+ <%= message.title %>
+ |
+
+
+ Daňový subjekt: |
+
+ <%= message.recipient_name %>
+ |
+
+
+ Identifikátor subjektu: |
+
+ <%= message.metadata['dic'] %>
+ |
+
+
+ Odosielateľ podania: |
+
+ <%= message.metadata['fs_submitting_subject'] %>
+ |
+
+
+ Evidenčné číslo podania: |
+
+ <%= message.metadata['fs_sent_message_id'] %>
+ |
+
+
+ Evidenčné číslo potvrdenia: |
+
+ <%= message.metadata['fs_message_id'] %>
+ |
+
+
+ Dátum a čas prijatia EP: |
+
+
+
+
+ |
+
+
+ Dátum a čas vystavenia potvrdenky: |
+
+
+
+
+ |
+
+
+ Obdobie: |
+
+ <%= message.metadata['fs_period'] %>
+ |
+
+
+ Stav spracovania: |
+
+ <%= message.metadata['fs_submission_status'] %>
+ |
+
+
+ Dôvod zmeny stavu podania: |
+
+ <%= message.metadata['fs_dismissal_reason'] %>
+ |
+
+ <% if message.metadata['fs_other_attributes']&.present? %>
+ <%# message.metadata['fs_other_attributes'].each do |k, v| %>
+
+
+
+
+
+
+ <%# end %>
+ <% end %>
+
+
diff --git a/app/views/fs/messages/_generic_message.html.erb b/app/views/fs/messages/_generic_message.html.erb
new file mode 100644
index 000000000..bbfdb7064
--- /dev/null
+++ b/app/views/fs/messages/_generic_message.html.erb
@@ -0,0 +1,67 @@
+<%= render partial: "fs/messages/style" %>
+
+
+
+
+ Typ dokumentu: |
+
+ <%= message.title %>
+ |
+
+
+ Daňový subjekt: |
+
+ <%= message.recipient_name %>
+ |
+
+
+ DIČ: |
+
+ <%= message.metadata['dic'] %>
+ |
+
+
+ Odosielateľ podania: |
+
+ <%= message.metadata['fs_submitting_subject'] %>
+ |
+
+
+ Evidenčné číslo podania: |
+
+ <%= message.metadata['fs_sent_message_id'] %>
+ |
+
+
+ Evidenčné číslo zásielky: |
+
+ <%= message.metadata['fs_message_id'] %>
+ |
+
+
+ Dátum a čas prijatia EP: |
+
+
+
+
+ |
+
+ Stav spracovania: |
+
+ <%= message.metadata['fs_submission_status'] %>
+ |
+
+ <% if message.metadata['fs_other_attributes']&.present? %>
+ <%# message.metadata['fs_other_attributes'].each do |k, v| %>
+
+
+
+
+
+
+ <%# end %>
+ <% end %>
+
+
diff --git a/app/views/fs/messages/_style.html.erb b/app/views/fs/messages/_style.html.erb
new file mode 100644
index 000000000..01fa83fad
--- /dev/null
+++ b/app/views/fs/messages/_style.html.erb
@@ -0,0 +1,11 @@
+
diff --git a/app/views/fs/messages/_submission.html.erb b/app/views/fs/messages/_submission.html.erb
new file mode 100644
index 000000000..75e12086d
--- /dev/null
+++ b/app/views/fs/messages/_submission.html.erb
@@ -0,0 +1,62 @@
+<%= render partial: "fs/messages/style" %>
+
+
+
+
+ Identifikátor subjektu: |
+
+ <%= message.metadata['dic'] %>
+ |
+
+
+ Daňový subjekt: |
+
+ <%= message.recipient_name %>
+ |
+
+
+ Evidenčné číslo podania: |
+
+ <%= message.metadata['fs_message_id'] %>
+ |
+
+
+ Dátum podania: |
+
+
+
+
+ |
+
+
+ Typ podania: |
+
+ <%= message.title %>
+ |
+
+
+ Stav spracovania: |
+
+ <%= message.metadata['fs_status'] %>
+ |
+
+
+ Obdobie: |
+
+ <%= message.metadata['fs_period'] %>
+ |
+
+ <% if message.metadata['fs_other_attributes']&.present? %>
+ <%# message.metadata['fs_other_attributes'].each do |k, v| %>
+
+
+
+
+
+
+ <%# end %>
+ <% end %>
+
+
diff --git a/config/application.rb b/config/application.rb
index 7c8103a65..1a61347b4 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -39,11 +39,17 @@ class Application < Rails::Application
if ENV['AUTO_SYNC_BOXES'] == "ON"
config.good_job.cron = {
sync_boxes: {
- cron: "1 */2 * * *", # run every 2 hours, "00:01", "02:01", "04:01", ...
+ cron: "1 */2 * * *", # run every 2 hours (even), "00:01", "02:01", "04:01", ...
class: "Govbox::SyncAllBoxesJob",
description: "Regular job to synchronize all boxes"
}
}
+
+ config.good_job.cron['sync_fs_boxes'] = {
+ cron: "1 1-23/2 * * *", # run every 2 hours (odd), "01:01", "03:01", "05:01", ...
+ class: "Fs::SyncAllBoxesJob",
+ description: "Regular job to synchronize all boxes"
+ }
end
config.good_job.cron['check_messages_mapping'] = {
diff --git a/config/brakeman.ignore b/config/brakeman.ignore
index 670a84ea1..07899f2d2 100644
--- a/config/brakeman.ignore
+++ b/config/brakeman.ignore
@@ -34,78 +34,10 @@
],
"note": ""
},
- {
- "warning_type": "Dynamic Render Path",
- "warning_code": 15,
- "fingerprint": "206fab310dd6225cc18046a3fa3d8d2e15898077ebf7140753f6104ac8952297",
- "check_name": "Render",
- "message": "Render path contains parameter value",
- "file": "app/views/admin/boxes/show.html.erb",
- "line": 6,
- "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
- "code": "render(action => policy_scope([:admin, Box]).find(params[:id]), {})",
- "render_path": [
- {
- "type": "controller",
- "class": "Admin::BoxesController",
- "method": "show",
- "line": 12,
- "file": "app/controllers/admin/boxes_controller.rb",
- "rendered": {
- "name": "admin/boxes/show",
- "file": "app/views/admin/boxes/show.html.erb"
- }
- }
- ],
- "location": {
- "type": "template",
- "template": "admin/boxes/show"
- },
- "user_input": "params[:id]",
- "confidence": "Weak",
- "cwe_id": [
- 22
- ],
- "note": ""
- },
- {
- "warning_type": "Dynamic Render Path",
- "warning_code": 15,
- "fingerprint": "b8a2fb69d5ae58b1a2ef3054ed2a602436392f1db28b5ef31c0ec249e0fec16a",
- "check_name": "Render",
- "message": "Render path contains parameter value",
- "file": "app/views/admin/tenants/show.html.erb",
- "line": 14,
- "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
- "code": "render(action => policy_scope([:admin, Tenant]).find(params[:id]), {})",
- "render_path": [
- {
- "type": "controller",
- "class": "Admin::TenantsController",
- "method": "show",
- "line": 14,
- "file": "app/controllers/admin/tenants_controller.rb",
- "rendered": {
- "name": "admin/tenants/show",
- "file": "app/views/admin/tenants/show.html.erb"
- }
- }
- ],
- "location": {
- "type": "template",
- "template": "admin/tenants/show"
- },
- "user_input": "params[:id]",
- "confidence": "Weak",
- "cwe_id": [
- 22
- ],
- "note": ""
- },
{
"warning_type": "Command Injection",
"warning_code": 14,
- "fingerprint": "c1018a403b5a7f84904363f04760e551a83a6bca134e1db236f9d671e4e6ca91",
+ "fingerprint": "fe57f090ca3980a1ef5fd94f8a3634bb41c543d20c13d72dd32409eef5e433f4",
"check_name": "Execute",
"message": "Possible command injection",
"file": "app/models/concerns/pdf_visualization_operations.rb",
@@ -116,7 +48,7 @@
"location": {
"type": "method",
"class": "PdfVisualizationOperations",
- "method": "prepare_pdf_visualization"
+ "method": "prepare_pdf_visualization_from_template"
},
"user_input": "Tempfile.new(\"#{id}.xml\").path",
"confidence": "Medium",
@@ -126,6 +58,6 @@
"note": ""
}
],
- "updated": "2024-05-07 14:18:46 +0200",
- "brakeman_version": "6.1.2"
+ "updated": "2024-10-23 11:37:22 +0200",
+ "brakeman_version": "6.2.1"
}
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index c71fb833c..2a55fd232 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -262,6 +262,9 @@ sk:
recipient_name: "Prijímateľ"
sender_uri: "URI odosielateľa"
recipient_uri: "URI prijímateľa"
+ object_type: "Typ objektu"
+ fs_submission_status: "Stav podania"
+ fs_message_type: "Typ správy"
box: "Schránka správy"
attachment: "Príloha"
boxes:
@@ -271,9 +274,11 @@ sk:
message_updated: "Upravená správa"
message_thread_changed: "Zmena vo vlákne správ"
message_draft_submitted: "Odoslaná správa"
+ message_object_downloaded: "Stiahnutý objekt správy"
"Automation::ContainsCondition": "obsahuje"
"Automation::AttachmentContentContainsCondition": "obsahuje"
"Automation::MetadataValueCondition": "v metadátach obsahuje"
+ "Automation::MessageMetadataValueCondition": "správa v metadátach obsahuje"
"Automation::BoxCondition": "je"
"Automation::AddMessageThreadTagAction": "Pridaj štítok na vlákno"
"Automation::AddTagAction": "Pridaj štítok"
diff --git a/db/migrate/20241016143429_format_fs_messages_html_visualizations.rb b/db/migrate/20241016143429_format_fs_messages_html_visualizations.rb
new file mode 100644
index 000000000..fd71d86a7
--- /dev/null
+++ b/db/migrate/20241016143429_format_fs_messages_html_visualizations.rb
@@ -0,0 +1,9 @@
+class FormatFsMessagesHtmlVisualizations < ActiveRecord::Migration[7.1]
+ include ActionView::Helpers::TextHelper
+
+ def up
+ Fs::MessageDraft.find_each do |message_draft|
+ message_draft.update(html_visualization: simple_format(message_draft.html_visualization))
+ end
+ end
+end
diff --git a/db/migrate/20241022135615_add_submission_type_identifier_to_fs_forms.rb b/db/migrate/20241022135615_add_submission_type_identifier_to_fs_forms.rb
new file mode 100644
index 000000000..80e83b448
--- /dev/null
+++ b/db/migrate/20241022135615_add_submission_type_identifier_to_fs_forms.rb
@@ -0,0 +1,7 @@
+class AddSubmissionTypeIdentifierToFsForms < ActiveRecord::Migration[7.1]
+ def change
+ add_column :fs_forms, :submission_type_identifier, :string
+
+ Fs::FetchFormsJob.perform_later
+ end
+end
diff --git a/db/migrate/20241106152337_index_on_messages_fs_message_id_metadata.rb b/db/migrate/20241106152337_index_on_messages_fs_message_id_metadata.rb
new file mode 100644
index 000000000..5d8a1e1a8
--- /dev/null
+++ b/db/migrate/20241106152337_index_on_messages_fs_message_id_metadata.rb
@@ -0,0 +1,9 @@
+class IndexOnMessagesFsMessageIdMetadata < ActiveRecord::Migration[7.1]
+ def up
+ execute "CREATE INDEX index_messages_on_metadata_fs_message_id ON messages USING HASH (((metadata->>'fs_message_id')::text))"
+ end
+
+ def down
+ remove_index :messages, name: :index_messages_on_metadata_fs_message_id
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 1b82c0a91..60d636cfb 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.1].define(version: 2024_10_29_064753) do
+ActiveRecord::Schema[7.1].define(version: 2024_11_06_152337) do
# These are extensions that must be enabled in order to support this database
enable_extension "pgcrypto"
enable_extension "plpgsql"
@@ -233,6 +233,7 @@
t.integer "number_identifier"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.string "submission_type_identifier"
end
create_table "good_job_batches", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
@@ -483,6 +484,7 @@
t.bigint "author_id"
t.boolean "collapsed", default: false, null: false
t.boolean "outbox", default: false, null: false
+ t.index "((metadata ->> 'fs_message_id'::text))", name: "index_messages_on_metadata_fs_message_id", using: :hash
t.index ["author_id"], name: "index_messages_on_author_id"
t.index ["import_id"], name: "index_messages_on_import_id"
t.index ["message_thread_id"], name: "index_messages_on_message_thread_id"
diff --git a/package.json b/package.json
index e8894a76f..529308ac5 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
"@hotwired/turbo-rails": "^7.0.0",
"@rails/request.js": "^0.0.9",
"esbuild": "^0.19.8",
+ "puppeteer": "^23.6.0",
"tailwindcss-stimulus-components": "^4.0.4"
},
"scripts": {
diff --git a/test/fixtures/fs/form_related_documents.yml b/test/fixtures/fs/form_related_documents.yml
index db573050f..1af00d39a 100644
--- a/test/fixtures/fs/form_related_documents.yml
+++ b/test/fixtures/fs/form_related_documents.yml
@@ -1,5 +1,1308 @@
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
+V2Pv21_xsd:
+ document_type: CLS_F_XSD_EDOC
+ language: sk
+ form: V2Pv21
+ data: |
+
+
+
+
+
+ V2Pv21 vyhlasenie a potvrdenie
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+V2Pv21_txt_xslt:
+ document_type: CLS_F_XSLT_TXT_SGN
+ language: sk
+ form: V2Pv21
+ data: |
+
+
+
+
+
+ V2Pv21
+
+
+
+
+
+ VYHLÁSENIE
+
+
+
+
+
+
+ [01] - Rodné číslo
+
+
+
+
+
+
+
+
+ Pred lomítkom:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Za lomítkom:
+
+
+
+
+
+
+
+
+
+
+
+
+ [02] - Dátum narodenia:
+
+
+
+
+
+
+
+
+
+
+
+
+ Rok:
+
+
+
+
+
+
+
+
+
+
+
+ I. ODDIEL - ÚDAJE O DAŇOVNÍKOVI
+
+
+
+
+
+
+
+
+ [03] - Priezvisko:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [04] - Meno:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [05] - Titul pred menom:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [05] - Titul za priezviskom:
+
+
+
+
+
+
+
+
+
+
+
+
+ Adresa trvalého pobytu
+
+
+
+
+
+
+
+
+
+ [06] - Ulica:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [07] - Súpisné/orientačné číslo:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [08] - PSČ:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [09] - Obec:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [10] - Štát:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [11] - Telefónne číslo:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [12] - Zaplatená daň, z ktorej sa vypočíta suma do výšky 2 % resp. 3 % 1) zaplatenej dane:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [13] - Suma do výšky 2 % resp. 3 % 1) zo zaplatenej dane z r. 12 (min. 3 eurá):
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [14] - Dátum zaplatenia dane:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ spĺňam podmienky na poukázanie 3% z dane:
+
+
+
+
+
+
+
+
+
+
+
+ II. ODDIEL - ÚDAJE O PRIJÍMATEĽOVI
+
+
+
+
+
+
+
+
+ [15] - IČO:
+
+
+
+
+
+
+
+
+
+
+
+
+ [16] - Obchodné meno (názov)
+
+
+
+
+
+
+
+
+
+ riadok:
+
+
+
+
+
+
+
+
+
+
+
+
+ súhlasím so zaslaním údajov (meno, priezvisko a trvalý pobyt) mnou určenému príjmateľovi podielu
+ zaplatenej dane uvedenému v II. oddiele podľa § 50 ods. 8 zákona:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dátum:
+
+
+
+
+
+
+
+
+
+
+
+
+ Vyhlasujem, že uvedené údaje v tomto vyhlásení sú pravdivé:
+
+
+
+
+
+
+
+
+
+
+ POTVRDENIE
+
+
+
+
+
+
+ [01] - Rodné číslo
+
+
+
+
+
+
+
+
+ Pred lomítkom:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Za lomítkom:
+
+
+
+
+
+
+
+
+
+
+
+
+ [02] - Dátum narodenia:
+
+
+
+
+
+
+
+
+
+
+
+
+ Rok:
+
+
+
+
+
+
+
+
+
+
+
+ I. ÚDAJE O ZAMESTNANCOVI
+
+
+
+
+
+
+
+
+ [03] - Priezvisko:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [04] - Meno:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [05] - Titul pred menom:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [05] - Titul za priezviskom:
+
+
+
+
+
+
+
+
+
+
+
+
+ Adresa trvalého pobytu
+
+
+
+
+
+
+
+
+
+ [06] - Ulica:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [07] - Súpisné/orientačné číslo:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [08] - PSČ:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [09] - Obec:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [10] - Štát:
+
+
+
+
+
+
+
+
+
+
+
+ II. ÚDAJE O ZAMESTNÁVATEĽOVI
+
+
+
+
+
+
+
+
+ [11] - Daňové identifikačné číslo:
+
+
+
+
+
+
+
+
+
+
+
+
+ Fyzická osoba
+
+
+
+
+
+
+
+
+
+ [12] - Priezvisko:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [13] - Meno:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [14] - Titul pred menom:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [14] - Titul za priezviskom:
+
+
+
+
+
+
+
+
+
+
+
+
+ [15] - Obchodné meno alebo názov
+
+
+
+
+
+
+
+
+
+ riadok:
+
+
+
+
+
+
+
+
+
+
+
+
+ Trvalý pobyt (fyzická osoba) alebo sídlo (právnická osoba)
+
+
+
+
+
+
+
+
+
+ [16] - Ulica:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [17] - Súpisné/orientačné číslo:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [18] - PSČ:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [19] - Obec:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [20] - Štát:
+
+
+
+
+
+
+
+
+
+
+
+ III. ÚDAJE O ZAPLATENÍ DANE Z PRÍJMOV ZO ZÁVISLEJ ČINNOSTI - v eurách
+
+
+
+
+
+
+
+
+ [21] - Daň – podľa § 15 zákona (z r. 06 ročného zúčtovania preddavkov na daň):
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [22] - Nárok na daňový bonus podľa § 33 zákona (z r. 09 ročného zúčtovania preddavkov na daň):
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [23] - Nárok na daňový bonus na zaplatené úroky podľa § 33a zákona (z r. 15 ročného zúčtovania preddavkov na daň):
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [24] - Daň znížená o daňový bonus (§ 33 zákona) a daňový bonus na zaplatené úroky (§ 33a zákona) (r. 21 - r. 22 - r. 23 ) > 0:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [25] - Daň na úhradu (z r. 21 ročného zúčtovania preddavkov na daň):
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [26] - Daň na úhradu (z r. 25 tohto potvrdenia), zrazená zamestnancovi alebo zaplatená zamestnancom v lehote do podania vyhlásenia o poukázaní podielu zaplatenej dane z príjmov fyzickej osoby v úhrnnej sume:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dňa:
+
+
+
+
+
+
+
+
+
+
+
+ Vypracoval
+
+
+
+
+
+
+
+
+ Potvrdenie vypracoval(a):
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dátum:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Potvrdzujeme týmto, že údaje uvedené v potvrdení sú pravdivé:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Áno
+
+
+ Áno
+
+
+ Nie
+
+
+ Nie
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
VP_DANv24_xsd:
document_type: CLS_F_XSD_EDOC
language: sk
@@ -1060,3 +2363,1560 @@ VP_DANv24_txt_xslt:
+PREHLADv24_xsd:
+ document_type: CLS_F_XSD_EDOC
+ language: sk
+ form: PREHLADv24
+ data: |
+
+
+
+
+ PREHLAD_2024
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+PREHLADv24_txt_xslt:
+ document_type: CLS_F_XSLT_TXT_SGN
+ language: sk
+ form: PREHLADv24
+ data: |
+
+
+
+
+
+ PREHLADv24 - Prehľad o zrazených a odvedených preddavkoch na daň (platný od 1.1.2024)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Druh prehľadu
+
+
+
+
+
+
+
+ Zdaňovacie obdobie
+
+
+
+
+
+
+
+ Fyzická osoba
+
+
+
+
+
+
+
+
+
+ Právnická osoba
+
+
+
+
+
+
+
+ Sídlo (právnická osoba), trvalý pobyt (fyzická osoba)
+
+
+
+
+
+
+
+
+
+
+ Údaje o osobe, ktorá podáva prehľad za zamestnávateľa
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ I. časť - Preddavky na daň
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1. Zrazené preddavky na daň zo zúčtovaných a vyplatených zdaniteľných miezd (vrátane
+ príjmov zo sociálneho fondu) v peňažnej aj v nepeňažnej forme za za mesiac
+
+
+
+
+
+
+
+
+
+ 1a. Suma preddavkov na daň z príjmov podľa § 5 ods. 4 zákona
+
+
+
+
+
+
+
+ II. časť - Rekapitulácia - daňový bonus a zamestnanecká prémia
+
+
+
+
+
+
+
+
+
+
+
+ III. časť - ŽIADOSŤ O POUKÁZANIE SUMY ROZDIELU DAŇOVÉHO BONUSU ALEBO ZAMESTNANECKEJ PRÉMIE
+ - vyplňuje sa v treťom mesiaci príslušného kalendárneho štvrťroka za celý kalendárny
+ štvrťrok
+
+
+
+
+
+
+
+
+
+
+
+
+ Žiadame o poukázanie sumy rozdielu daňového bonusu (§ 35 ods. 7 zákona)
+
+
+
+
+
+
+
+
+ Žiadame o poukázanie sumy rozdielu zamestnaneckej prémie (§ 38 ods. 6 zákona)
+
+
+
+
+
+
+
+
+
+ Žiadame o poukázanie sumy rozdielu daňového bonusu na zaplatené úroky podľa § 33a
+ zákona (§ 38 ods. 6 zákona)
+
+
+
+
+
+
+
+
+
+ Spôsob platby
+
+
+
+
+
+
+
+
+
+ IBAN:
+
+
+
+
+
+
+
+
+
+
+
+
+ Bankový účet
+
+
+
+
+
+
+
+
+ Vyhlasujem, že všetky údaje uvedené v prehľade sú správne a úplné.
+
+
+
+
+
+
+
+
+
+
+ Daňové identifikačné číslo zamestnávateľa:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ riadny:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ opravný:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Mesiac (1 - 12):
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rok:
+
+
+
+
+
+
+
+
+
+
+
+
+ Dátum zistenia skutočnosti na podanie opravného prehľadu:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Priezvisko:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Meno:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Titul pred menom:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Titul za menom:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Názov:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Právna forma:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Ulica:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Súpisné / orientačné číslo:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PSČ:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Obec:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Štát:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Priezvisko:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Meno:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Titul pred menom:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Titul za menom:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rodné číslo:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dátum narodenia:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DIČ:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Názov:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Právna forma:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Ulica:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Súpisné / orientačné číslo:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PSČ:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Obec:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Štát:
+
+
+
+
+
+
+
+
+
+
+
+
+ Telefónne číslo:
+
+
+
+
+
+
+
+
+
+
+
+
+ Emailová adresa:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0. Zúčtované a vyplatené zdaniteľné príjmy zo závislej činnosti, vrátane
+ zdaniteľných príjmov zo sociálneho fondu v peňažnej aj v nepeňažnej forme za vykazovaný
+ kalendárny mesiac:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dátum:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Suma:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dátum:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Suma:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2. Zrazené daňové nedoplatky (+) a vrátené daňové preplatky (-) z RZ za predchádzajúce
+ zdaňovacie obdobie:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3. Daňové nedoplatky (+) a daňové preplatky (-) za predchádzajúce zdaňovacie
+ obdobia:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4. Úhrn riadkov 1 až 3(r. 1 ± r.2 ± r. 3):
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5. Priznaná a vyplatená suma (-) a vybratá suma (+) daňového bonusu, o ktorú sa
+ znižuje (zvyšuje) úhrnná suma preddavkov na daň a dane (vrátane vyplateného a vybratého
+ daňového bonusu zRZ alebo vykonaných opráv):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 6. Priznaná a vyplatená suma (-), a vybraná suma (+) zamestnaneckej prémie, o ktorú
+ sa znižuje (zvyšuje) úhrnná suma preddavkov na daň a dane (vrátane vykonaných opráv):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7. Priznaná a vyplatená suma (-), a vybraná suma (+) daňového bonusu na zaplatené
+ úroky podľa § 33a zákona, o ktorú sa znižuje (zvyšuje) úhrnná suma preddavkov na
+ daň a dane (vrátane vykonaných opráv):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8. Odvodová povinnosť - preddavky na daň (r. 4 ± r.5 ± r.6 ± r.7):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ uplatňujeme postup podľa § 40 ods. 8 zákona:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A Celková vyplatená suma daňového bonusu:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ B Suma daňového bonusu vyplatená z úhrnu zrazených preddavkov na daň a dane:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ C Suma daňového bonusu vyplatená z prostriedkov zamestnávateľa:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ D Celková vyplatená suma zamestnaneckej prémie:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ E Suma zamestnaneckej prémie vyplatená z úhrnu zrazených preddavkov na daň a dane:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ F Suma zamestnaneckej prémie vyplatená z prostriedkov zamestnávateľa:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Žiadame o poukázanie sumy rozdielu daňového bonusu (§ 35 ods. 7 zákona):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Suma:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Žiadame o poukázanie sumy rozdielu zamestnaneckej prémie (§ 38 ods. 6 zákona):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Suma:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Žiadame o poukázanie sumy rozdielu daňového bonusu na zaplatené úroky podľa §
+ 33a zákona (§ 38 ods. 6 zákona):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Suma:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Poštovou poukážkou:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Na účet:
+
+
+
+
+
+
+
+
+
+
+
+
+ Vypracoval:
+
+
+
+
+
+
+
+
+
+
+
+
+ Telefónne číslo:
+
+
+
+
+
+
+
+
+
+
+
+
+ Dátum:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Áno
+
+
+ Nie
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yarn.lock b/yarn.lock
index d2f0df489..4144e92d6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7,6 +7,29 @@
resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
+"@babel/code-frame@^7.0.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7"
+ integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==
+ dependencies:
+ "@babel/highlight" "^7.25.7"
+ picocolors "^1.0.0"
+
+"@babel/helper-validator-identifier@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5"
+ integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==
+
+"@babel/highlight@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5"
+ integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.25.7"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
"@esbuild/android-arm64@0.19.8":
version "0.19.8"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz#fb7130103835b6d43ea499c3f30cfb2b2ed58456"
@@ -188,6 +211,20 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
+"@puppeteer/browsers@2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.4.0.tgz#a0dd0f4e381e53f509109ae83b891db5972750f5"
+ integrity sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==
+ dependencies:
+ debug "^4.3.6"
+ extract-zip "^2.0.1"
+ progress "^2.0.3"
+ proxy-agent "^6.4.0"
+ semver "^7.6.3"
+ tar-fs "^3.0.6"
+ unbzip2-stream "^1.4.3"
+ yargs "^17.7.2"
+
"@rails/actioncable@^7.0":
version "7.1.2"
resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.1.2.tgz#d261ff4b72844f5af496671346ec478798f4ac2c"
@@ -220,6 +257,51 @@
lodash.merge "^4.6.2"
postcss-selector-parser "6.0.10"
+"@tootallnate/quickjs-emscripten@^0.23.0":
+ version "0.23.0"
+ resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c"
+ integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==
+
+"@types/node@*":
+ version "22.7.8"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.8.tgz#a1dbf0dc5f71bdd2642fc89caef65d58747ce825"
+ integrity sha512-a922jJy31vqR5sk+kAdIENJjHblqcZ4RmERviFsER4WJcEONqxKcjNOlk0q7OUfrF5sddT+vng070cdfMlrPLg==
+ dependencies:
+ undici-types "~6.19.2"
+
+"@types/yauzl@^2.9.1":
+ version "2.10.3"
+ resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999"
+ integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==
+ dependencies:
+ "@types/node" "*"
+
+agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317"
+ integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==
+ dependencies:
+ debug "^4.3.4"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
any-promise@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
@@ -238,11 +320,71 @@ arg@^5.0.2:
resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+ast-types@^0.13.4:
+ version "0.13.4"
+ resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782"
+ integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==
+ dependencies:
+ tslib "^2.0.1"
+
+b4a@^1.6.4:
+ version "1.6.7"
+ resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4"
+ integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==
+
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+bare-events@^2.0.0, bare-events@^2.2.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.0.tgz#305b511e262ffd8b9d5616b056464f8e1b3329cc"
+ integrity sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==
+
+bare-fs@^2.1.1:
+ version "2.3.5"
+ resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.5.tgz#05daa8e8206aeb46d13c2fe25a2cd3797b0d284a"
+ integrity sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==
+ dependencies:
+ bare-events "^2.0.0"
+ bare-path "^2.0.0"
+ bare-stream "^2.0.0"
+
+bare-os@^2.1.0:
+ version "2.4.4"
+ resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.4.4.tgz#01243392eb0a6e947177bb7c8a45123d45c9b1a9"
+ integrity sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==
+
+bare-path@^2.0.0, bare-path@^2.1.0:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.3.tgz#594104c829ef660e43b5589ec8daef7df6cedb3e"
+ integrity sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==
+ dependencies:
+ bare-os "^2.1.0"
+
+bare-stream@^2.0.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.3.1.tgz#812d48d5ddcbcbc44f8493d2dd00aa5e3604373b"
+ integrity sha512-Vm8kAeOcfzHPTH8sq0tHBnUqYrkXdroaBVVylqFT4cF5wnMfKEIxxy2jIGu2zKVNl9P8MAP9XBWwXJ9N2+jfEw==
+ dependencies:
+ streamx "^2.20.0"
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+basic-ftp@^5.0.2:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0"
+ integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==
+
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
@@ -263,11 +405,38 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
+buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
+buffer@^5.2.1:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
camelcase-css@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
chokidar@^3.5.3:
version "3.5.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
@@ -283,6 +452,48 @@ chokidar@^3.5.3:
optionalDependencies:
fsevents "~2.3.2"
+chromium-bidi@0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.8.0.tgz#ffd79dad7db1fcc874f1c55fcf46ded05a884269"
+ integrity sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==
+ dependencies:
+ mitt "3.0.1"
+ urlpattern-polyfill "10.0.0"
+ zod "3.23.8"
+
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
commander@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
@@ -293,11 +504,47 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+cosmiconfig@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d"
+ integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==
+ dependencies:
+ env-paths "^2.2.1"
+ import-fresh "^3.3.0"
+ js-yaml "^4.1.0"
+ parse-json "^5.2.0"
+
cssesc@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+data-uri-to-buffer@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b"
+ integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==
+
+debug@4, debug@^4.1.1, debug@^4.3.4, debug@^4.3.6, debug@^4.3.7:
+ version "4.3.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
+ integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
+ dependencies:
+ ms "^2.1.3"
+
+degenerator@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5"
+ integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==
+ dependencies:
+ ast-types "^0.13.4"
+ escodegen "^2.1.0"
+ esprima "^4.0.1"
+
+devtools-protocol@0.0.1354347:
+ version "0.0.1354347"
+ resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1354347.tgz#5cb509610b8f61fc69a31e5c810d5bed002d85ea"
+ integrity sha512-BlmkSqV0V84E2WnEnoPnwyix57rQxAM5SKJjf4TbYOCGLAWtz8CDH8RIaGOjPgPCXo2Mce3kxSY497OySidY3Q==
+
didyoumean@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
@@ -308,6 +555,30 @@ dlv@^1.1.3:
resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+env-paths@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
esbuild@^0.19.8:
version "0.19.8"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.8.tgz#ad05b72281d84483fa6b5345bd246c27a207b8f1"
@@ -336,6 +607,58 @@ esbuild@^0.19.8:
"@esbuild/win32-ia32" "0.19.8"
"@esbuild/win32-x64" "0.19.8"
+escalade@^3.1.1:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escodegen@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
+ integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^5.2.0"
+ esutils "^2.0.2"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+extract-zip@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
+ integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
+ dependencies:
+ debug "^4.1.1"
+ get-stream "^5.1.0"
+ yauzl "^2.10.0"
+ optionalDependencies:
+ "@types/yauzl" "^2.9.1"
+
+fast-fifo@^1.2.0, fast-fifo@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c"
+ integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==
+
fast-glob@^3.3.0:
version "3.3.2"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
@@ -354,6 +677,13 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
+fd-slicer@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+ integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==
+ dependencies:
+ pend "~1.2.0"
+
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
@@ -361,6 +691,15 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
+fs-extra@^11.2.0:
+ version "11.2.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b"
+ integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -376,6 +715,28 @@ function-bind@^1.1.2:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-uri@^6.0.1:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.3.tgz#0d26697bc13cf91092e519aa63aa60ee5b6f385a"
+ integrity sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==
+ dependencies:
+ basic-ftp "^5.0.2"
+ data-uri-to-buffer "^6.0.2"
+ debug "^4.3.4"
+ fs-extra "^11.2.0"
+
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@@ -402,6 +763,16 @@ glob@7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
+graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
hasown@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
@@ -409,6 +780,35 @@ hasown@^2.0.0:
dependencies:
function-bind "^1.1.2"
+http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e"
+ integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==
+ dependencies:
+ agent-base "^7.1.0"
+ debug "^4.3.4"
+
+https-proxy-agent@^7.0.3, https-proxy-agent@^7.0.5:
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2"
+ integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==
+ dependencies:
+ agent-base "^7.0.2"
+ debug "4"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+import-fresh@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@@ -422,6 +822,19 @@ inherits@2:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+ip-address@^9.0.5:
+ version "9.0.5"
+ resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a"
+ integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==
+ dependencies:
+ jsbn "1.1.0"
+ sprintf-js "^1.1.3"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
@@ -441,6 +854,11 @@ is-extglob@^2.1.1:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
@@ -458,6 +876,37 @@ jiti@^1.19.1:
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsbn@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040"
+ integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
lilconfig@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
@@ -488,6 +937,11 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+lru-cache@^7.14.1:
+ version "7.18.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89"
+ integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==
+
merge2@^1.3.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
@@ -513,6 +967,16 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
+mitt@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
+ integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
mz@^2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
@@ -527,6 +991,11 @@ nanoid@^3.3.7:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+netmask@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
+ integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==
+
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@@ -542,13 +1011,52 @@ object-hash@^3.0.0:
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
-once@^1.3.0:
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
+pac-proxy-agent@^7.0.1:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz#0fb02496bd9fb8ae7eb11cfd98386daaac442f58"
+ integrity sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==
+ dependencies:
+ "@tootallnate/quickjs-emscripten" "^0.23.0"
+ agent-base "^7.0.2"
+ debug "^4.3.4"
+ get-uri "^6.0.1"
+ http-proxy-agent "^7.0.0"
+ https-proxy-agent "^7.0.5"
+ pac-resolver "^7.0.1"
+ socks-proxy-agent "^8.0.4"
+
+pac-resolver@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6"
+ integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==
+ dependencies:
+ degenerator "^5.0.0"
+ netmask "^2.0.2"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-json@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
@@ -559,6 +1067,11 @@ path-parse@^1.0.7:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
+
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
@@ -640,11 +1153,72 @@ postcss@^8.4.23:
picocolors "^1.0.0"
source-map-js "^1.0.2"
+progress@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+proxy-agent@^6.4.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.4.0.tgz#b4e2dd51dee2b377748aef8d45604c2d7608652d"
+ integrity sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==
+ dependencies:
+ agent-base "^7.0.2"
+ debug "^4.3.4"
+ http-proxy-agent "^7.0.1"
+ https-proxy-agent "^7.0.3"
+ lru-cache "^7.14.1"
+ pac-proxy-agent "^7.0.1"
+ proxy-from-env "^1.1.0"
+ socks-proxy-agent "^8.0.2"
+
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+pump@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
+ integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+puppeteer-core@23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-23.6.0.tgz#a3e1e09c05f47fb8ca2bc9d4ca200d18e3704303"
+ integrity sha512-se1bhgUpR9C529SgHGr/eyT92mYyQPAhA2S9pGtGrVG2xob9qE6Pbp7TlqiSPlnnY1lINqhn6/67EwkdzOmKqQ==
+ dependencies:
+ "@puppeteer/browsers" "2.4.0"
+ chromium-bidi "0.8.0"
+ debug "^4.3.7"
+ devtools-protocol "0.0.1354347"
+ typed-query-selector "^2.12.0"
+ ws "^8.18.0"
+
+puppeteer@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-23.6.0.tgz#7a3c01e7b6a43a950f3e13eb48a335f78a358768"
+ integrity sha512-l+Fgo8SVFSd51STtq2crz8t1Y3VXowsuR4zfR64qDOn6oggz7YIZauWiNR4IJjczQ6nvFs3S4cgng55/nesxTQ==
+ dependencies:
+ "@puppeteer/browsers" "2.4.0"
+ chromium-bidi "0.8.0"
+ cosmiconfig "^9.0.0"
+ devtools-protocol "0.0.1354347"
+ puppeteer-core "23.6.0"
+ typed-query-selector "^2.12.0"
+
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+queue-tick@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142"
+ integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==
+
read-cache@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
@@ -659,6 +1233,16 @@ readdirp@~3.6.0:
dependencies:
picomatch "^2.2.1"
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
resolve@^1.1.7, resolve@^1.22.2:
version "1.22.8"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
@@ -680,11 +1264,75 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
+semver@^7.6.3:
+ version "7.6.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
+
+smart-buffer@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
+ integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
+
+socks-proxy-agent@^8.0.2, socks-proxy-agent@^8.0.4:
+ version "8.0.4"
+ resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c"
+ integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==
+ dependencies:
+ agent-base "^7.1.1"
+ debug "^4.3.4"
+ socks "^2.8.3"
+
+socks@^2.8.3:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5"
+ integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==
+ dependencies:
+ ip-address "^9.0.5"
+ smart-buffer "^4.2.0"
+
source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+sprintf-js@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
+ integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
+
+streamx@^2.15.0, streamx@^2.20.0:
+ version "2.20.1"
+ resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.20.1.tgz#471c4f8b860f7b696feb83d5b125caab2fdbb93c"
+ integrity sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==
+ dependencies:
+ fast-fifo "^1.3.2"
+ queue-tick "^1.0.1"
+ text-decoder "^1.1.0"
+ optionalDependencies:
+ bare-events "^2.2.0"
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
sucrase@^3.32.0:
version "3.34.0"
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f"
@@ -698,6 +1346,13 @@ sucrase@^3.32.0:
pirates "^4.0.1"
ts-interface-checker "^0.1.9"
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
@@ -736,6 +1391,31 @@ tailwindcss@^3.3.3:
resolve "^1.22.2"
sucrase "^3.32.0"
+tar-fs@^3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217"
+ integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==
+ dependencies:
+ pump "^3.0.0"
+ tar-stream "^3.1.5"
+ optionalDependencies:
+ bare-fs "^2.1.1"
+ bare-path "^2.1.0"
+
+tar-stream@^3.1.5:
+ version "3.1.7"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b"
+ integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==
+ dependencies:
+ b4a "^1.6.4"
+ fast-fifo "^1.2.0"
+ streamx "^2.15.0"
+
+text-decoder@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.1.tgz#e173f5121d97bfa3ff8723429ad5ba92e1ead67e"
+ integrity sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==
+
thenify-all@^1.0.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
@@ -750,6 +1430,11 @@ thenify-all@^1.0.0:
dependencies:
any-promise "^1.0.0"
+through@^2.3.8:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@@ -762,17 +1447,100 @@ ts-interface-checker@^0.1.9:
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
+tslib@^2.0.1:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b"
+ integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==
+
+typed-query-selector@^2.12.0:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/typed-query-selector/-/typed-query-selector-2.12.0.tgz#92b65dbc0a42655fccf4aeb1a08b1dddce8af5f2"
+ integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==
+
+unbzip2-stream@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
+ integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==
+ dependencies:
+ buffer "^5.2.1"
+ through "^2.3.8"
+
+undici-types@~6.19.2:
+ version "6.19.8"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
+ integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+
+universalify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
+
+urlpattern-polyfill@10.0.0:
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec"
+ integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==
+
util-deprecate@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+ws@^8.18.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc"
+ integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
yaml@^2.3.4:
version "2.3.4"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2"
integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^17.7.2:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
+yauzl@^2.10.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+ integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==
+ dependencies:
+ buffer-crc32 "~0.2.3"
+ fd-slicer "~1.1.0"
+
+zod@3.23.8:
+ version "3.23.8"
+ resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d"
+ integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==