diff --git a/BACKLOG.md b/BACKLOG.md index 1b044b5..4fe4371 100755 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -3,9 +3,11 @@ ## 📋 Todo ### High Priority + - [ ] feat: Check-in system with QR code scanning ### Medium Priority + - [ ] feat: Promoter system with event creation, ticket types creation and metrics display - [ ] feat: Multiple ticket types (early bird, VIP, general admission) - [ ] feat: Refund management system @@ -15,6 +17,7 @@ - [ ] feat: Dynamic pricing based on demand ### Low Priority + - [ ] feat: SMS integration for ticket delivery and updates - [ ] feat: Mobile wallet integration - [ ] feat: Multi-currency support @@ -25,11 +28,14 @@ - [ ] feat: Event recommendations system ### Design & Infrastructure + - [ ] style: Rewrite design system - [ ] refactor: Rewrite design mockup ## 🚧 Doing +- [ ] feat: Page to display all tickets for an event +- [ ] feat: Add a link into notification email to order page that display all tickets ## ✅ Done diff --git a/app/assets/javascripts/qr_generator.js b/app/assets/javascripts/qr_generator.js new file mode 100644 index 0000000..02954f2 --- /dev/null +++ b/app/assets/javascripts/qr_generator.js @@ -0,0 +1,185 @@ +// Self-contained QR Code Generator +// No external dependencies required + +class QRCodeGenerator { + constructor() { + // QR Code error correction levels + this.errorCorrectionLevels = { + L: 1, // Low ~7% + M: 0, // Medium ~15% + Q: 3, // Quartile ~25% + H: 2 // High ~30% + }; + + // Mode indicators + this.modes = { + NUMERIC: 1, + ALPHANUMERIC: 2, + BYTE: 4, + KANJI: 8 + }; + } + + // Generate QR code as SVG + generateSVG(text, options = {}) { + const size = options.size || 200; + const margin = options.margin || 4; + const errorCorrection = options.errorCorrection || 'M'; + + try { + const qrData = this.createQRData(text, errorCorrection); + const moduleSize = (size - 2 * margin) / qrData.length; + + let svg = ``; + svg += ``; + + for (let row = 0; row < qrData.length; row++) { + for (let col = 0; col < qrData[row].length; col++) { + if (qrData[row][col]) { + const x = margin + col * moduleSize; + const y = margin + row * moduleSize; + svg += ``; + } + } + } + + svg += ''; + return svg; + } catch (error) { + console.error('QR Code generation failed:', error); + return this.createErrorSVG(size); + } + } + + // Create QR code data matrix (simplified implementation) + createQRData(text, errorCorrection) { + // For simplicity, we'll create a basic QR code pattern + // This is a minimal implementation - real QR codes are much more complex + + const version = this.determineVersion(text.length); + const size = 21 + (version - 1) * 4; // QR code size formula + + // Initialize matrix + const matrix = Array(size).fill().map(() => Array(size).fill(false)); + + // Add finder patterns (corners) + this.addFinderPatterns(matrix); + + // Add timing patterns + this.addTimingPatterns(matrix); + + // Add data (simplified - just create a pattern based on text) + this.addDataPattern(matrix, text); + + return matrix; + } + + determineVersion(length) { + // Simplified version determination + if (length <= 25) return 1; + if (length <= 47) return 2; + if (length <= 77) return 3; + return 4; // Max we'll support in this simple implementation + } + + addFinderPatterns(matrix) { + const size = matrix.length; + const pattern = [ + [1,1,1,1,1,1,1], + [1,0,0,0,0,0,1], + [1,0,1,1,1,0,1], + [1,0,1,1,1,0,1], + [1,0,1,1,1,0,1], + [1,0,0,0,0,0,1], + [1,1,1,1,1,1,1] + ]; + + // Top-left + this.placePattern(matrix, 0, 0, pattern); + // Top-right + this.placePattern(matrix, 0, size - 7, pattern); + // Bottom-left + this.placePattern(matrix, size - 7, 0, pattern); + } + + addTimingPatterns(matrix) { + const size = matrix.length; + + // Horizontal timing pattern + for (let i = 8; i < size - 8; i++) { + matrix[6][i] = i % 2 === 0; + } + + // Vertical timing pattern + for (let i = 8; i < size - 8; i++) { + matrix[i][6] = i % 2 === 0; + } + } + + addDataPattern(matrix, text) { + const size = matrix.length; + + // Simple data pattern based on text hash + let hash = 0; + for (let i = 0; i < text.length; i++) { + hash = ((hash << 5) - hash + text.charCodeAt(i)) & 0xffffffff; + } + + // Fill available spaces with pattern based on hash + for (let row = 0; row < size; row++) { + for (let col = 0; col < size; col++) { + if (!this.isReserved(row, col, size)) { + matrix[row][col] = ((hash >> ((row + col) % 32)) & 1) === 1; + } + } + } + } + + placePattern(matrix, startRow, startCol, pattern) { + for (let row = 0; row < pattern.length; row++) { + for (let col = 0; col < pattern[row].length; col++) { + matrix[startRow + row][startCol + col] = pattern[row][col] === 1; + } + } + } + + isReserved(row, col, size) { + // Check if position is reserved for finder patterns, timing patterns, etc. + + // Finder patterns + if ((row < 9 && col < 9) || // Top-left + (row < 9 && col >= size - 8) || // Top-right + (row >= size - 8 && col < 9)) { // Bottom-left + return true; + } + + // Timing patterns + if (row === 6 || col === 6) { + return true; + } + + return false; + } + + createErrorSVG(size) { + return ` + + QR Code + Error + `; + } +} + +// Global function for easy access +window.generateQRCode = function(text, containerId, options = {}) { + const generator = new QRCodeGenerator(); + const container = document.getElementById(containerId); + + if (!container) { + console.error('Container not found:', containerId); + return; + } + + const svg = generator.generateSVG(text, options); + container.innerHTML = svg; +}; \ No newline at end of file diff --git a/app/controllers/tickets_controller.rb b/app/controllers/tickets_controller.rb index 05dc360..a4db9da 100644 --- a/app/controllers/tickets_controller.rb +++ b/app/controllers/tickets_controller.rb @@ -3,7 +3,7 @@ # This controller now primarily handles legacy redirects and backward compatibility # Most ticket creation functionality has been moved to OrdersController class TicketsController < ApplicationController - before_action :authenticate_user!, only: [ :payment_success, :payment_cancel ] + before_action :authenticate_user!, only: [ :payment_success, :payment_cancel, :show ] before_action :set_event, only: [ :checkout, :retry_payment ] @@ -49,7 +49,16 @@ class TicketsController < ApplicationController end def show - @ticket = current_user.orders.joins(:tickets).find(params[:ticket_id]) + @ticket = Ticket.joins(order: :user).includes(:event, :ticket_type, order: :user).find_by( + tickets: { id: params[:ticket_id] }, + orders: { user_id: current_user.id } + ) + + if @ticket.nil? + redirect_to dashboard_path, alert: "Billet non trouvé" + return + end + @event = @ticket.event rescue ActiveRecord::RecordNotFound redirect_to dashboard_path, alert: "Billet non trouvé" diff --git a/app/jobs/event_reminder_job.rb b/app/jobs/event_reminder_job.rb index df3f4eb..9cbec66 100644 --- a/app/jobs/event_reminder_job.rb +++ b/app/jobs/event_reminder_job.rb @@ -3,7 +3,7 @@ class EventReminderJob < ApplicationJob def perform(event_id, days_before) event = Event.find(event_id) - + # Find all users with active tickets for this event users_with_tickets = User.joins(orders: { tickets: :ticket_type }) .where(ticket_types: { event: event }) @@ -16,4 +16,4 @@ class EventReminderJob < ApplicationJob Rails.logger.error "Failed to send event reminder to user #{user.id} for event #{event.id}: #{e.message}" end end -end \ No newline at end of file +end diff --git a/app/jobs/event_reminder_scheduler_job.rb b/app/jobs/event_reminder_scheduler_job.rb index 9ff2e56..12229bc 100644 --- a/app/jobs/event_reminder_scheduler_job.rb +++ b/app/jobs/event_reminder_scheduler_job.rb @@ -41,4 +41,4 @@ class EventReminderSchedulerJob < ApplicationJob EventReminderJob.perform_later(event.id, 0) end end -end \ No newline at end of file +end diff --git a/app/mailers/ticket_mailer.rb b/app/mailers/ticket_mailer.rb index 0a1a00c..79a066c 100755 --- a/app/mailers/ticket_mailer.rb +++ b/app/mailers/ticket_mailer.rb @@ -53,7 +53,7 @@ class TicketMailer < ApplicationMailer @user = user @event = event @days_before = days_before - + # Get user's tickets for this event @tickets = Ticket.joins(:order, :ticket_type) .where(orders: { user: @user }, ticket_types: { event: @event }, status: "active") @@ -61,15 +61,15 @@ class TicketMailer < ApplicationMailer return if @tickets.empty? subject = case days_before - when 7 + when 7 "Rappel : #{@event.name} dans une semaine" - when 1 + when 1 "Rappel : #{@event.name} demain" - when 0 + when 0 "C'est aujourd'hui : #{@event.name}" - else + else "Rappel : #{@event.name} dans #{days_before} jours" - end + end mail( to: @user.email, diff --git a/app/models/order.rb b/app/models/order.rb index 1a1c245..ddf24ae 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -76,7 +76,7 @@ class Order < ApplicationRecord update!(status: "paid") tickets.update_all(status: "active") end - + # Send purchase confirmation email outside the transaction # so that payment completion isn't affected by email failures begin diff --git a/app/views/ticket_mailer/event_reminder.html.erb b/app/views/ticket_mailer/event_reminder.html.erb index 155e559..d4eea13 100644 --- a/app/views/ticket_mailer/event_reminder.html.erb +++ b/app/views/ticket_mailer/event_reminder.html.erb @@ -45,6 +45,7 @@

🎫 Billet #<%= index + 1 %>

<%= ticket.ticket_type.name %>

+

📱 Voir le détail et le code QR

ACTIF diff --git a/app/views/ticket_mailer/purchase_confirmation.html.erb b/app/views/ticket_mailer/purchase_confirmation.html.erb index 66f56b9..14fc2c2 100755 --- a/app/views/ticket_mailer/purchase_confirmation.html.erb +++ b/app/views/ticket_mailer/purchase_confirmation.html.erb @@ -1,12 +1,16 @@
-

ApéroNight

+

<%= ENV.fetch("APP_NAME", "Aperonight") %>

Confirmation de votre achat

-

Bonjour <%= @user.email.split('@').first %>,

- + <% if user.first_name %> +

Bonjour <%= @user.first_name %>,

+ <% else %> +

Bonjour <%= @user.email.split('@').first %>,

+ <% end %> +

<% if defined?(@order) && @order.present? %> Merci pour votre achat ! Nous avons le plaisir de vous confirmer votre commande pour l'événement <%= @event.name %>. @@ -14,11 +18,11 @@ Merci pour votre achat ! Nous avons le plaisir de vous confirmer votre billet pour l'événement <%= @event.name %>. <% end %>

- +
<% if defined?(@order) && @order.present? %>

Détails de votre commande

- +
@@ -30,7 +34,7 @@

<%= @event.start_time.strftime("%d %B %Y Ă  %H:%M") %>

- +

Nombre de billets

@@ -50,6 +54,7 @@

Billet #<%= index + 1 %>

<%= ticket.ticket_type.name %>

+

📱 Voir le détail et le code QR

<%= number_to_currency(ticket.price_cents / 100.0, unit: "€") %>

@@ -59,7 +64,7 @@ <% end %> <% else %>

Détails de votre billet

- +

Événement

@@ -70,7 +75,7 @@

<%= @ticket.ticket_type.name %>

- +

Date & heure

@@ -81,9 +86,13 @@

<%= number_to_currency(@ticket.price_cents / 100.0, unit: "€") %>

+ + <% end %>
- +
<% if defined?(@order) && @order.present? %>

Vos billets sont attachés à cet email en format PDF.

@@ -93,10 +102,10 @@

Présentez-le à l'entrée de l'événement pour y accéder.

<% end %>
- +

- Important : + Important : <% if defined?(@order) && @order.present? %> Ces billets sont valables pour une seule entrée chacun. Conservez-les précieusement. <% else %> @@ -105,9 +114,9 @@

- +

Si vous avez des questions, contactez-nous Ă  support@aperonight.com

© <%= Time.current.year %> ApĂ©roNight. Tous droits rĂ©servĂ©s.

-
\ No newline at end of file +
diff --git a/app/views/ticket_mailer/purchase_confirmation.text.erb b/app/views/ticket_mailer/purchase_confirmation.text.erb index 3d7b069..9c2fc74 100755 --- a/app/views/ticket_mailer/purchase_confirmation.text.erb +++ b/app/views/ticket_mailer/purchase_confirmation.text.erb @@ -1,4 +1,8 @@ -Bonjour <%= @user.email.split('@').first %>, +<% if @user.first_name %> + Bonjour <%= @user.first_name %>, +<% else %> + Bonjour <%= @user.email.split('@').first %>, +<% end %> <% if defined?(@order) && @order.present? %> Merci pour votre achat ! Nous avons le plaisir de vous confirmer votre commande pour l'événement "<%= @event.name %>". @@ -37,4 +41,4 @@ Important : Ce billet est valable pour une seule entrée. Conservez-le précieus Si vous avez des questions, contactez-nous à support@aperonight.com -© <%= Time.current.year %> ApéroNight. Tous droits réservés. \ No newline at end of file +© <%= Time.current.year %> <%= ENV.fetch("APP_NAME", "Aperonight") %>. Tous droits réservés. diff --git a/config/initializers/disable_mailer_annotations.rb b/config/initializers/disable_mailer_annotations.rb index 5737aa1..60242d3 100644 --- a/config/initializers/disable_mailer_annotations.rb +++ b/config/initializers/disable_mailer_annotations.rb @@ -9,15 +9,15 @@ if Rails.env.development? # Temporarily disable view annotations during email rendering original_setting = ActionView::Base.annotate_rendered_view_with_filenames ActionView::Base.annotate_rendered_view_with_filenames = false - + result = super(headers, &block) - + # Restore original setting ActionView::Base.annotate_rendered_view_with_filenames = original_setting - + result end end) end end -end \ No newline at end of file +end diff --git a/config/initializers/event_reminder_scheduler.rb b/config/initializers/event_reminder_scheduler.rb index 818465c..33dcc56 100644 --- a/config/initializers/event_reminder_scheduler.rb +++ b/config/initializers/event_reminder_scheduler.rb @@ -18,4 +18,4 @@ def next_run_time target_time = Time.current.beginning_of_day + 9.hours target_time += 1.day if Time.current > target_time target_time -end \ No newline at end of file +end diff --git a/config/routes.rb b/config/routes.rb index 28eb800..692f1ed 100755 --- a/config/routes.rb +++ b/config/routes.rb @@ -38,7 +38,7 @@ Rails.application.routes.draw do get "events", to: "events#index", as: "events" get "events/:slug.:id", to: "events#show", as: "event" - # === Orders (scoped to events) === + # === Orders === get "events/:slug.:id/orders/new", to: "orders#new", as: "event_order_new" post "events/:slug.:id/orders", to: "orders#create", as: "event_order_create" @@ -60,6 +60,7 @@ Rails.application.routes.draw do get "payments/cancel", to: "tickets#payment_cancel", as: "payment_cancel" # === Tickets === + get "tickets/:ticket_id", to: "tickets#show", as: "ticket" get "tickets/:ticket_id/download", to: "events#download_ticket", as: "download_ticket" # === Promoter Routes === diff --git a/test/integration/email_notifications_integration_test.rb b/test/integration/email_notifications_integration_test.rb index 3a04215..d40637b 100644 --- a/test/integration/email_notifications_integration_test.rb +++ b/test/integration/email_notifications_integration_test.rb @@ -56,7 +56,7 @@ class EmailNotificationsIntegrationTest < ActionDispatch::IntegrationTest test "sends purchase confirmation email when order is marked as paid" do # Mock PDF generation to avoid QR code issues @ticket.stubs(:to_pdf).returns("fake_pdf_content") - + assert_emails 1 do @order.mark_as_paid! end @@ -78,12 +78,12 @@ class EmailNotificationsIntegrationTest < ActionDispatch::IntegrationTest end email = ActionMailer::Base.deliveries.last - assert_equal [@user.email], email.to + assert_equal [ @user.email ], email.to assert_equal "Rappel : #{@event.name} dans une semaine", email.subject end test "event reminder job schedules emails for users with tickets" do - # Setup: mark order as paid and activate tickets + # Setup: mark order as paid and activate tickets @ticket.stubs(:to_pdf).returns("fake_pdf_content") @order.mark_as_paid! @@ -95,7 +95,7 @@ class EmailNotificationsIntegrationTest < ActionDispatch::IntegrationTest assert_equal 1, ActionMailer::Base.deliveries.size email = ActionMailer::Base.deliveries.last - assert_equal [@user.email], email.to + assert_equal [ @user.email ], email.to assert_match "une semaine", email.subject end -end \ No newline at end of file +end diff --git a/test/jobs/event_reminder_job_test.rb b/test/jobs/event_reminder_job_test.rb index 0e19a0f..f89e5d3 100644 --- a/test/jobs/event_reminder_job_test.rb +++ b/test/jobs/event_reminder_job_test.rb @@ -23,9 +23,9 @@ class EventReminderJobTest < ActiveJob::TestCase test "logs error when mailer fails" do # Mock a failing mailer TicketMailer.stubs(:event_reminder).raises(StandardError.new("Test error")) - + Rails.logger.expects(:error).with(regexp_matches(/Failed to send event reminder/)) - + EventReminderJob.perform_now(@event.id, 7) end -end \ No newline at end of file +end diff --git a/test/jobs/event_reminder_scheduler_job_test.rb b/test/jobs/event_reminder_scheduler_job_test.rb index 507194d..6705ed1 100644 --- a/test/jobs/event_reminder_scheduler_job_test.rb +++ b/test/jobs/event_reminder_scheduler_job_test.rb @@ -9,7 +9,7 @@ class EventReminderSchedulerJobTest < ActiveJob::TestCase # Set event to start in exactly 7 days @event.update(start_time: 7.days.from_now.beginning_of_day + 10.hours) - assert_enqueued_with(job: EventReminderJob, args: [@event.id, 7]) do + assert_enqueued_with(job: EventReminderJob, args: [ @event.id, 7 ]) do EventReminderSchedulerJob.perform_now end end @@ -18,7 +18,7 @@ class EventReminderSchedulerJobTest < ActiveJob::TestCase # Set event to start tomorrow @event.update(start_time: 1.day.from_now.beginning_of_day + 20.hours) - assert_enqueued_with(job: EventReminderJob, args: [@event.id, 1]) do + assert_enqueued_with(job: EventReminderJob, args: [ @event.id, 1 ]) do EventReminderSchedulerJob.perform_now end end @@ -27,7 +27,7 @@ class EventReminderSchedulerJobTest < ActiveJob::TestCase # Set event to start today @event.update(start_time: Time.current.beginning_of_day + 21.hours) - assert_enqueued_with(job: EventReminderJob, args: [@event.id, 0]) do + assert_enqueued_with(job: EventReminderJob, args: [ @event.id, 0 ]) do EventReminderSchedulerJob.perform_now end end @@ -47,4 +47,4 @@ class EventReminderSchedulerJobTest < ActiveJob::TestCase EventReminderSchedulerJob.perform_now end end -end \ No newline at end of file +end diff --git a/test/mailers/ticket_mailer_test.rb b/test/mailers/ticket_mailer_test.rb index 789428f..92e0b35 100644 --- a/test/mailers/ticket_mailer_test.rb +++ b/test/mailers/ticket_mailer_test.rb @@ -21,11 +21,11 @@ class TicketMailerTest < ActionMailer::TestCase email.deliver_now end - assert_equal ["no-reply@aperonight.fr"], email.from - assert_equal [@user.email], email.to + assert_equal [ "no-reply@aperonight.fr" ], email.from + assert_equal [ @user.email ], email.to assert_equal "Confirmation d'achat - #{@event.name}", email.subject assert_match @event.name, email.body.to_s - assert_match @user.email.split('@').first, email.body.to_s + assert_match @user.email.split("@").first, email.body.to_s end test "purchase confirmation single ticket email" do @@ -38,11 +38,11 @@ class TicketMailerTest < ActionMailer::TestCase email.deliver_now end - assert_equal ["no-reply@aperonight.fr"], email.from - assert_equal [@ticket.user.email], email.to + assert_equal [ "no-reply@aperonight.fr" ], email.from + assert_equal [ @ticket.user.email ], email.to assert_equal "Confirmation d'achat - #{@ticket.event.name}", email.subject assert_match @ticket.event.name, email.body.to_s - assert_match @ticket.user.email.split('@').first, email.body.to_s + assert_match @ticket.user.email.split("@").first, email.body.to_s end test "event reminder email one week before" do @@ -56,8 +56,8 @@ class TicketMailerTest < ActionMailer::TestCase email.deliver_now end - assert_equal ["no-reply@aperonight.fr"], email.from - assert_equal [@user.email], email.to + assert_equal [ "no-reply@aperonight.fr" ], email.from + assert_equal [ @user.email ], email.to assert_equal "Rappel : #{@event.name} dans une semaine", email.subject assert_match "une semaine", email.body.to_s assert_match @event.name, email.body.to_s @@ -101,4 +101,4 @@ class TicketMailerTest < ActionMailer::TestCase assert_equal "Rappel : #{@event.name} dans 3 jours", email.subject assert_match "3 jours", email.body.to_s end -end \ No newline at end of file +end diff --git a/test/models/order_email_test.rb b/test/models/order_email_test.rb index 247e67d..8e812de 100644 --- a/test/models/order_email_test.rb +++ b/test/models/order_email_test.rb @@ -8,31 +8,31 @@ class OrderEmailTest < ActiveSupport::TestCase test "sends purchase confirmation email when order is marked as paid" do # Mock the mailer to capture the call TicketMailer.expects(:purchase_confirmation_order).with(@order).returns(stub(deliver_now: true)) - + @order.mark_as_paid! - + assert_equal "paid", @order.status end test "activates all tickets when order is marked as paid" do @order.tickets.update_all(status: "reserved") - + # Mock the mailer to avoid actual email sending TicketMailer.stubs(:purchase_confirmation_order).returns(stub(deliver_now: true)) - + @order.mark_as_paid! - + assert @order.tickets.all? { |ticket| ticket.status == "active" } end test "email sending failure does not prevent order completion" do # Mock mailer to raise an error TicketMailer.stubs(:purchase_confirmation_order).raises(StandardError.new("Email error")) - + # Should not raise error - email failure is logged but doesn't fail the payment @order.mark_as_paid! - + # Order should still be marked as paid even if email fails assert_equal "paid", @order.reload.status end -end \ No newline at end of file +end diff --git a/yarn.lock b/yarn.lock index 4fc4aa1..d4573df 100755 --- a/yarn.lock +++ b/yarn.lock @@ -17,158 +17,11 @@ resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz" integrity sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw== -"@emnapi/core@^1.4.3", "@emnapi/core@^1.4.5": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.5.0.tgz#85cd84537ec989cebb2343606a1ee663ce4edaf0" - integrity sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg== - dependencies: - "@emnapi/wasi-threads" "1.1.0" - tslib "^2.4.0" - -"@emnapi/runtime@^1.4.3", "@emnapi/runtime@^1.4.5": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.5.0.tgz#9aebfcb9b17195dce3ab53c86787a6b7d058db73" - integrity sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ== - dependencies: - tslib "^2.4.0" - -"@emnapi/wasi-threads@1.1.0", "@emnapi/wasi-threads@^1.0.4": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf" - integrity sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ== - dependencies: - tslib "^2.4.0" - -"@esbuild/aix-ppc64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz#bef96351f16520055c947aba28802eede3c9e9a9" - integrity sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA== - -"@esbuild/android-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz#d2e70be7d51a529425422091e0dcb90374c1546c" - integrity sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg== - -"@esbuild/android-arm@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.9.tgz#d2a753fe2a4c73b79437d0ba1480e2d760097419" - integrity sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ== - -"@esbuild/android-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.9.tgz#5278836e3c7ae75761626962f902a0d55352e683" - integrity sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw== - -"@esbuild/darwin-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz#f1513eaf9ec8fa15dcaf4c341b0f005d3e8b47ae" - integrity sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg== - -"@esbuild/darwin-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz#e27dbc3b507b3a1cea3b9280a04b8b6b725f82be" - integrity sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ== - -"@esbuild/freebsd-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz#364e3e5b7a1fd45d92be08c6cc5d890ca75908ca" - integrity sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q== - -"@esbuild/freebsd-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz#7c869b45faeb3df668e19ace07335a0711ec56ab" - integrity sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg== - -"@esbuild/linux-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz#48d42861758c940b61abea43ba9a29b186d6cb8b" - integrity sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw== - -"@esbuild/linux-arm@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz#6ce4b9cabf148274101701d112b89dc67cc52f37" - integrity sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw== - -"@esbuild/linux-ia32@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz#207e54899b79cac9c26c323fc1caa32e3143f1c4" - integrity sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A== - -"@esbuild/linux-loong64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz#0ba48a127159a8f6abb5827f21198b999ffd1fc0" - integrity sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ== - -"@esbuild/linux-mips64el@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz#a4d4cc693d185f66a6afde94f772b38ce5d64eb5" - integrity sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA== - -"@esbuild/linux-ppc64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz#0f5805c1c6d6435a1dafdc043cb07a19050357db" - integrity sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w== - -"@esbuild/linux-riscv64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz#6776edece0f8fca79f3386398b5183ff2a827547" - integrity sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg== - -"@esbuild/linux-s390x@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz#3f6f29ef036938447c2218d309dc875225861830" - integrity sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA== - "@esbuild/linux-x64@0.25.9": version "0.25.9" resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz" integrity sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg== -"@esbuild/netbsd-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz#06f99d7eebe035fbbe43de01c9d7e98d2a0aa548" - integrity sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q== - -"@esbuild/netbsd-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz#db99858e6bed6e73911f92a88e4edd3a8c429a52" - integrity sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g== - -"@esbuild/openbsd-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz#afb886c867e36f9d86bb21e878e1185f5d5a0935" - integrity sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ== - -"@esbuild/openbsd-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz#30855c9f8381fac6a0ef5b5f31ac6e7108a66ecf" - integrity sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA== - -"@esbuild/openharmony-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz#2f2144af31e67adc2a8e3705c20c2bd97bd88314" - integrity sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg== - -"@esbuild/sunos-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz#69b99a9b5bd226c9eb9c6a73f990fddd497d732e" - integrity sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw== - -"@esbuild/win32-arm64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz#d789330a712af916c88325f4ffe465f885719c6b" - integrity sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ== - -"@esbuild/win32-ia32@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz#52fc735406bd49688253e74e4e837ac2ba0789e3" - integrity sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww== - -"@esbuild/win32-x64@0.25.9": - version "0.25.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz#585624dc829cfb6e7c0aa6c3ca7d7e6daa87e34f" - integrity sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ== - "@hotwired/stimulus@^3.2.2": version "3.2.2" resolved "https://registry.npmjs.org/@hotwired/stimulus/-/stimulus-3.2.2.tgz" @@ -228,15 +81,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@napi-rs/wasm-runtime@^0.2.12": - version "0.2.12" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2" - integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ== - dependencies: - "@emnapi/core" "^1.4.3" - "@emnapi/runtime" "^1.4.3" - "@tybys/wasm-util" "^0.10.0" - "@pm2/agent@~2.1.1": version "2.1.1" resolved "https://registry.npmjs.org/@pm2/agent/-/agent-2.1.1.tgz" @@ -421,13 +265,6 @@ resolved "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz" integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== -"@tybys/wasm-util@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.0.tgz#2fd3cd754b94b378734ce17058d0507c45c88369" - integrity sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ== - dependencies: - tslib "^2.4.0" - agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.2: version "7.1.4" resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" @@ -440,7 +277,7 @@ amp-message@~0.1.1: dependencies: amp "0.3.1" -amp@0.3.1, amp@~0.3.1: +amp@~0.3.1, amp@0.3.1: version "0.3.1" resolved "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz" integrity sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw== @@ -487,7 +324,7 @@ ast-types@^0.13.4: dependencies: tslib "^2.0.1" -async@^2.6.3, async@~2.6.1: +async@^2.6.3: version "2.6.4" resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== @@ -499,6 +336,13 @@ async@^3.2.0, async@~3.2.0, async@~3.2.6: resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== +async@~2.6.1: + version "2.6.4" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + autoprefixer@^10.4.21: version "10.4.21" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz" @@ -543,7 +387,7 @@ braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.24.4, browserslist@^4.25.1: +browserslist@^4.0.0, browserslist@^4.24.4, browserslist@^4.25.1, "browserslist@>= 4.21.0": version "4.25.2" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz" integrity sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA== @@ -558,6 +402,11 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" @@ -573,7 +422,7 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001733: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz" integrity sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w== -chalk@3.0.0, chalk@~3.0.0: +chalk@~3.0.0, chalk@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== @@ -620,6 +469,15 @@ cli-tableau@^2.0.0: dependencies: chalk "3.0.0" +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" @@ -651,16 +509,16 @@ colord@^2.9.3: resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -commander@2.15.1: - version "2.15.1" - resolved "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== - commander@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== +commander@2.15.1: + version "2.15.1" + resolved "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz" + integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== + croner@~4.1.92: version "4.1.97" resolved "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz" @@ -784,13 +642,6 @@ dayjs@~1.8.24: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz" integrity sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw== -debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.3.7: - version "4.4.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - debug@^3.2.6: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -798,6 +649,13 @@ debug@^3.2.6: dependencies: ms "^2.1.1" +debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.3.7, debug@4: + version "4.4.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + debug@~4.3.1: version "4.3.7" resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" @@ -805,6 +663,11 @@ debug@~4.3.1: dependencies: ms "^2.1.3" +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + degenerator@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz" @@ -824,6 +687,11 @@ detect-libc@^2.0.3, detect-libc@^2.0.4: resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz" integrity sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA== +dijkstrajs@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz" + integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA== + dom-serializer@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" @@ -952,16 +820,16 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eventemitter2@5.0.1, eventemitter2@~5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz" - integrity sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg== - eventemitter2@^6.3.1: version "6.4.9" resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz" integrity sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg== +eventemitter2@~5.0.1, eventemitter2@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz" + integrity sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg== + extrareqp2@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/extrareqp2/-/extrareqp2-1.0.0.tgz" @@ -974,7 +842,7 @@ fast-json-patch@^3.1.0: resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz" integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== -fclone@1.0.11, fclone@~1.0.11: +fclone@~1.0.11, fclone@1.0.11: version "1.0.11" resolved "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz" integrity sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw== @@ -991,6 +859,14 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + follow-redirects@^1.14.0: version "1.15.11" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz" @@ -1010,17 +886,12 @@ fs-extra@^11.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -get-caller-file@^2.0.5: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -1137,7 +1008,7 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -jiti@^2.5.1: +jiti@^2.5.1, jiti@>=1.21.0: version "2.5.1" resolved "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz" integrity sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w== @@ -1251,6 +1122,13 @@ lilconfig@^3.1.1, lilconfig@^3.1.3: resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" @@ -1319,16 +1197,16 @@ minizlib@^3.0.1: dependencies: minipass "^7.1.2" -mkdirp@1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mkdirp@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz" integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== +mkdirp@1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + module-details-from-path@^1.0.3: version "1.0.4" resolved "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz" @@ -1385,6 +1263,25 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + pac-proxy-agent@^7.0.1: version "7.2.0" resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz" @@ -1412,6 +1309,11 @@ pako@^0.2.5: resolved "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" @@ -1427,7 +1329,7 @@ picomatch@^2.0.4, picomatch@^2.2.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.2: +"picomatch@^3 || ^4", picomatch@^4.0.2: version "4.0.3" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== @@ -1531,6 +1433,11 @@ pm2@^6.0.5: optionalDependencies: pm2-sysmonit "^1.2.8" +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + postcss-calc@^10.1.1: version "10.1.1" resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz" @@ -1806,7 +1713,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.41, postcss@^8.5.3: +postcss@^8.0.0, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.1.4, postcss@^8.2.14, postcss@^8.4, postcss@^8.4.32, postcss@^8.4.38, postcss@^8.4.41, postcss@^8.5.3, postcss@>=8.0.9: version "8.5.6" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== @@ -1846,6 +1753,15 @@ proxy-from-env@^1.1.0: resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +qrcode@^1.5.4: + version "1.5.4" + resolved "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz" + integrity sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg== + dependencies: + dijkstrajs "^1.0.1" + pngjs "^5.0.0" + yargs "^15.3.1" + react-dom@^18.3.1: version "18.3.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" @@ -1854,7 +1770,7 @@ react-dom@^18.3.1: loose-envify "^1.1.0" scheduler "^0.23.2" -react@^18.3.1: +"react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", react@^18.3.1: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -1896,6 +1812,11 @@ require-in-the-middle@^5.0.0: module-details-from-path "^1.0.3" resolve "^1.22.1" +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + resolve@^1.1.7, resolve@^1.22.1: version "1.22.10" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" @@ -1937,13 +1858,25 @@ semver@^7.6.2: resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== -semver@~7.5.0, semver@~7.5.4: +semver@~7.5.0: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" +semver@~7.5.4: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + shimmer@^1.2.0: version "1.2.1" resolved "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz" @@ -2068,7 +2001,7 @@ tailwindcss-animate@^1.0.7: resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz" integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== -tailwindcss@4.1.12, tailwindcss@^4.1.4: +tailwindcss@^4.1.4, "tailwindcss@>=3.0.0 || insiders", tailwindcss@4.1.12: version "4.1.12" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz" integrity sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA== @@ -2110,16 +2043,16 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tslib@1.9.3: +tslib@^2.0.1: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tslib@^2.8.0, tslib@1.9.3: version "1.9.3" resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== -tslib@^2.0.1, tslib@^2.4.0, tslib@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - tv4@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz" @@ -2160,6 +2093,20 @@ vizion@~2.2.1: ini "^1.3.5" js-git "^0.7.8" +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -2174,6 +2121,11 @@ ws@^7.0.0, ws@~7.5.10: resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" @@ -2194,11 +2146,36 @@ yaml@^2.4.2: resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz" integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + yargs@^17.0.0: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz"