From b183ecf70f1a0b4a8ed8250a23cac282dd566060 Mon Sep 17 00:00:00 2001 From: cub8 Date: Thu, 8 Oct 2026 16:14:34 +0200 Subject: [PATCH 1/3] Refactor + fix bug with qrcodes --- app/controllers/application_controller.rb | 33 ++--------------- .../auth/passwordless_controller.rb | 35 ++++++------------- app/controllers/auth/usos_controller.rb | 8 ++--- app/controllers/concerns/auth/sign_in.rb | 25 +++++++++++++ app/controllers/concerns/authentication.rb | 33 +++++++++++++++++ app/controllers/concerns/sidebar.rb | 13 +++++++ app/controllers/concerns/status_redirects.rb | 11 ++++++ 7 files changed, 98 insertions(+), 60 deletions(-) create mode 100644 app/controllers/concerns/auth/sign_in.rb create mode 100644 app/controllers/concerns/authentication.rb create mode 100644 app/controllers/concerns/sidebar.rb create mode 100644 app/controllers/concerns/status_redirects.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index b181aa9f..0e24dbc7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,21 +2,14 @@ class ApplicationController < ActionController::Base include Pundit::Authorization + include Authentication + include Sidebar + include StatusRedirects - attr_reader :current_user - - # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has. allow_browser versions: :modern - # The whole app renders through one layout. `@in_modal` is set by each - # controller's own before_action (the turbo-frame id it dialogs answer into - # differs per screen), so this only decides page-or-frame. layout -> { @in_modal ? false : 'application' } - before_action :set_current_user - before_action :authenticate! - before_action :set_sidebar_state - rescue_from ActiveRecord::RecordNotFound, with: :record_not_found rescue_from Pundit::NotAuthorizedError, with: :not_authorized @@ -28,24 +21,4 @@ def redirect_outside_turbo_frame(path, notice: nil, alert: nil) render turbo_stream: turbo_stream.action(:redirect, path) end - - def set_sidebar_state - @sidebar_collapsed = cookies[:sidebar_collapsed] == 'true' - end - - def set_current_user - @current_user = User.find_by(id: session[:user_id]) - end - - def authenticate! - redirect_to login_path, alert: 'Zaloguj się, aby kontynuować.' unless @current_user - end - - def record_not_found - redirect_to root_path, alert: 'Nie znaleziono.' - end - - def not_authorized - redirect_to root_path, alert: 'Nie znaleziono.' - end end diff --git a/app/controllers/auth/passwordless_controller.rb b/app/controllers/auth/passwordless_controller.rb index 8c47f317..60433724 100644 --- a/app/controllers/auth/passwordless_controller.rb +++ b/app/controllers/auth/passwordless_controller.rb @@ -1,11 +1,9 @@ # frozen_string_literal: true class Auth::PasswordlessController < ApplicationController - include LoggedUserRedirector + include Authentication + include Auth::SignIn - # How long the "Wyślij ponownie" button stays disabled on the inbox screen. - # Presentational only — the real limit is the Rack::Attack throttle on - # POST /auth/passwordless (config/initializers/rack_attack.rb). RESEND_COOLDOWN = 60 skip_before_action :authenticate! @@ -18,12 +16,14 @@ def new; end def inbox @email = session[:pending_login_email] sent_at = session[:pending_login_sent_at].to_i + current_time = Time.current.to_i - # No pending send, or one old enough that its link has already expired. return redirect_to new_auth_passwordless_path if @email.blank? || sent_at.zero? - return redirect_to new_auth_passwordless_path if Time.current.to_i - sent_at > LoginToken::EXPIRES_IN + return redirect_to new_auth_passwordless_path if current_time - sent_at > LoginToken::EXPIRES_IN - @cooldown = [RESEND_COOLDOWN - (Time.current.to_i - sent_at), 0].max + delta = current_time - sent_at + + @cooldown = [RESEND_COOLDOWN - delta, 0].max end def verify @@ -35,10 +35,7 @@ def verify user = login_token.user user.consume_login_token! - reset_session - session[:user_id] = user.id - - redirect_to home_path, notice: 'Zalogowano pomyślnie.' + sign_in_and_redirect(user) end def create @@ -46,12 +43,10 @@ def create user = User.find_by(email: email) service = BypassLoginService.new(email: email) - # Whether this is a resend depends only on prior session state, never on - # whether the address exists — so it cannot be used to enumerate accounts. resend = session[:pending_login_email].present? if user - return bypass_login(user) if service.can_bypass_login? + return sign_in_and_redirect(user) if service.can_bypass_login? token = user.create_login_token! token_link = auth_passwordless_verify_url(token: token.raw_token) @@ -63,14 +58,10 @@ def create ).token_email.deliver_later end - # Everything below MUST stay outside the `if user` block: a known and an - # unknown address have to produce byte-identical responses. Do not move - # these next to the mailer call. session[:pending_login_email] = email session[:pending_login_sent_at] = Time.current.to_i - # No notice on a first send — the inbox screen is itself the confirmation. - notice = resend ? 'Wysłaliśmy nowy link. Poprzedni już nie działa.' : nil + notice = 'Wysłaliśmy nowy link. Poprzedni już nie działa.' if resend redirect_to auth_passwordless_inbox_path, notice: notice end @@ -80,10 +71,4 @@ def clear_pending_login session.delete(:pending_login_email) session.delete(:pending_login_sent_at) end - - def bypass_login(user) - reset_session - session[:user_id] = user.id - redirect_to home_path, notice: 'Zalogowano pomyślnie.' - end end diff --git a/app/controllers/auth/usos_controller.rb b/app/controllers/auth/usos_controller.rb index 3feec412..878d31cf 100644 --- a/app/controllers/auth/usos_controller.rb +++ b/app/controllers/auth/usos_controller.rb @@ -3,7 +3,8 @@ class Auth::UsosController < ApplicationController class InvalidProviderError < StandardError; end - include LoggedUserRedirector + include Authentication + include Auth::SignIn skip_before_action :authenticate! before_action :redirect_logged_user @@ -13,10 +14,7 @@ def create builder = SessionUserBuilder.new(provider) user = builder.build - reset_session - session[:user_id] = user.id - - redirect_to home_path + sign_in_and_redirect(user) rescue InvalidProviderError redirect_to root_path, alert: 'Nieprawidłowy dostawca logowania.' rescue Providers::InvalidAuthError diff --git a/app/controllers/concerns/auth/sign_in.rb b/app/controllers/concerns/auth/sign_in.rb new file mode 100644 index 00000000..907f2b0e --- /dev/null +++ b/app/controllers/concerns/auth/sign_in.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Auth::SignIn + extend ActiveSupport::Concern + + private + + def sign_in_and_redirect(user) + return_to = session[:return_to] + reset_session + session[:user_id] = user.id + + redirect_to after_login_path(return_to), notice: 'Zalogowano pomyślnie.' + end + + def after_login_path(path) + return path if local_path?(path) + + home_path + end + + def local_path?(path) + path&.start_with?('/') && !path.start_with?('//') + end +end diff --git a/app/controllers/concerns/authentication.rb b/app/controllers/concerns/authentication.rb new file mode 100644 index 00000000..8be0391e --- /dev/null +++ b/app/controllers/concerns/authentication.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module ::Authentication + extend ::ActiveSupport::Concern + + included do + before_action :set_current_user + before_action :authenticate! + end + + protected + + attr_reader :current_user + + def set_current_user + @current_user = User.find_by(id: session[:user_id]) + end + + def authenticate! + return if @current_user + + store_return_path + redirect_to login_path, alert: 'Zaloguj się, aby kontynuować.' + end + + def store_return_path + session[:return_to] = request.fullpath if full_page_navigation? + end + + def full_page_navigation? + request.get? && !request.xhr? && !turbo_frame_request? + end +end diff --git a/app/controllers/concerns/sidebar.rb b/app/controllers/concerns/sidebar.rb new file mode 100644 index 00000000..ba78a096 --- /dev/null +++ b/app/controllers/concerns/sidebar.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Sidebar + included do + before_action :set_sidebar_state + end + + protected + + def set_sidebar_state + @sidebar_collapsed = cookies[:sidebar_collapsed] == 'true' + end +end diff --git a/app/controllers/concerns/status_redirects.rb b/app/controllers/concerns/status_redirects.rb new file mode 100644 index 00000000..1edb3569 --- /dev/null +++ b/app/controllers/concerns/status_redirects.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module StatusRedirects + def record_not_found + redirect_to root_path, alert: 'Nie znaleziono.' + end + + def not_authorized + redirect_to root_path, alert: 'Nie znaleziono.' + end +end From b555d1a2ade33402dd6993f6abc17aaa33a9efbf Mon Sep 17 00:00:00 2001 From: cub8 Date: Thu, 8 Oct 2026 16:22:25 +0200 Subject: [PATCH 2/3] Fix errors --- .../auth/passwordless_controller.rb | 2 +- app/controllers/auth/usos_controller.rb | 2 +- app/controllers/concerns/sidebar.rb | 2 + app/controllers/concerns/status_redirects.rb | 2 + app/controllers/ranking_controller.rb | 1 - package-lock.json | 128 +- yarn.lock | 1422 ----------------- 7 files changed, 70 insertions(+), 1489 deletions(-) delete mode 100644 yarn.lock diff --git a/app/controllers/auth/passwordless_controller.rb b/app/controllers/auth/passwordless_controller.rb index 60433724..e29ed773 100644 --- a/app/controllers/auth/passwordless_controller.rb +++ b/app/controllers/auth/passwordless_controller.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true class Auth::PasswordlessController < ApplicationController - include Authentication include Auth::SignIn + include LoggedUserRedirector RESEND_COOLDOWN = 60 diff --git a/app/controllers/auth/usos_controller.rb b/app/controllers/auth/usos_controller.rb index 878d31cf..474d8ac9 100644 --- a/app/controllers/auth/usos_controller.rb +++ b/app/controllers/auth/usos_controller.rb @@ -3,8 +3,8 @@ class Auth::UsosController < ApplicationController class InvalidProviderError < StandardError; end - include Authentication include Auth::SignIn + include LoggedUserRedirector skip_before_action :authenticate! before_action :redirect_logged_user diff --git a/app/controllers/concerns/sidebar.rb b/app/controllers/concerns/sidebar.rb index ba78a096..2d68c73b 100644 --- a/app/controllers/concerns/sidebar.rb +++ b/app/controllers/concerns/sidebar.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true module Sidebar + extend ActiveSupport::Concern + included do before_action :set_sidebar_state end diff --git a/app/controllers/concerns/status_redirects.rb b/app/controllers/concerns/status_redirects.rb index 1edb3569..69180f2c 100644 --- a/app/controllers/concerns/status_redirects.rb +++ b/app/controllers/concerns/status_redirects.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true module StatusRedirects + protected + def record_not_found redirect_to root_path, alert: 'Nie znaleziono.' end diff --git a/app/controllers/ranking_controller.rb b/app/controllers/ranking_controller.rb index 99b84eea..cc43c075 100644 --- a/app/controllers/ranking_controller.rb +++ b/app/controllers/ranking_controller.rb @@ -3,7 +3,6 @@ class RankingController < ApplicationController include StoryGroupAuthorization - before_action :set_story_group before_action :set_presentation, only: %i[confirm_visibility confirm_mode] before_action :authorize_story_group_manage!, except: :show diff --git a/package-lock.json b/package-lock.json index edfd0009..4f2f2331 100644 --- a/package-lock.json +++ b/package-lock.json @@ -866,53 +866,7 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@rails/actioncable": { - "version": "8.1.200", - "resolved": "https://registry.npmjs.org/@rails/actioncable/-/actioncable-8.1.200.tgz", - "integrity": "sha512-on0DSb7AFUkq1ocxivDNQhhGW/RQpY91zvRVyyaEWP4gOOZWy33P/UyxjQk74IENWNrTqs8+zOGHwTjiiFruRw==", - "license": "MIT" - }, - "node_modules/@stylistic/eslint-plugin": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", - "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/types": "^8.56.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": "^9.0.0 || ^10.0.0" - } - }, - "node_modules/@tailwindcss/cli": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.3.3.tgz", - "integrity": "sha512-ZvS/n1ZHOBKcVlhkt8l5NNr1EDXk1NboYO5CYDOs6NUmvT9z6bzkwsosaJftY57T/3gWNzWMJzIXLodZC8ssdw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/watcher": "2.5.1", - "@tailwindcss/node": "4.3.3", - "@tailwindcss/oxide": "4.3.3", - "enhanced-resolve": "^5.24.1", - "mri": "^1.2.0", - "picocolors": "^1.1.1", - "tailwindcss": "4.3.3" - }, - "bin": { - "tailwindcss": "dist/index.mjs" - } - }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher": { + "node_modules/@parcel/watcher": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", @@ -948,7 +902,7 @@ "@parcel/watcher-win32-x64": "2.5.1" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-android-arm64": { + "node_modules/@parcel/watcher-android-arm64": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", @@ -969,7 +923,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-darwin-arm64": { + "node_modules/@parcel/watcher-darwin-arm64": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", @@ -990,7 +944,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-darwin-x64": { + "node_modules/@parcel/watcher-darwin-x64": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", @@ -1011,7 +965,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-freebsd-x64": { + "node_modules/@parcel/watcher-freebsd-x64": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", @@ -1032,7 +986,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-linux-arm-glibc": { + "node_modules/@parcel/watcher-linux-arm-glibc": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", @@ -1053,7 +1007,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-linux-arm-musl": { + "node_modules/@parcel/watcher-linux-arm-musl": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", @@ -1074,7 +1028,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-linux-arm64-glibc": { + "node_modules/@parcel/watcher-linux-arm64-glibc": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", @@ -1095,7 +1049,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-linux-arm64-musl": { + "node_modules/@parcel/watcher-linux-arm64-musl": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", @@ -1116,7 +1070,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-linux-x64-glibc": { + "node_modules/@parcel/watcher-linux-x64-glibc": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", @@ -1137,7 +1091,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-linux-x64-musl": { + "node_modules/@parcel/watcher-linux-x64-musl": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", @@ -1158,7 +1112,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-win32-arm64": { + "node_modules/@parcel/watcher-win32-arm64": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", @@ -1179,7 +1133,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-win32-ia32": { + "node_modules/@parcel/watcher-win32-ia32": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", @@ -1200,7 +1154,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/@parcel/watcher-win32-x64": { + "node_modules/@parcel/watcher-win32-x64": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", @@ -1221,7 +1175,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/cli/node_modules/detect-libc": { + "node_modules/@parcel/watcher/node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", @@ -1234,6 +1188,52 @@ "node": ">=0.10" } }, + "node_modules/@rails/actioncable": { + "version": "8.1.200", + "resolved": "https://registry.npmjs.org/@rails/actioncable/-/actioncable-8.1.200.tgz", + "integrity": "sha512-on0DSb7AFUkq1ocxivDNQhhGW/RQpY91zvRVyyaEWP4gOOZWy33P/UyxjQk74IENWNrTqs8+zOGHwTjiiFruRw==", + "license": "MIT" + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.56.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.0.0 || ^10.0.0" + } + }, + "node_modules/@tailwindcss/cli": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.3.3.tgz", + "integrity": "sha512-ZvS/n1ZHOBKcVlhkt8l5NNr1EDXk1NboYO5CYDOs6NUmvT9z6bzkwsosaJftY57T/3gWNzWMJzIXLodZC8ssdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/watcher": "2.5.1", + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "enhanced-resolve": "^5.24.1", + "mri": "^1.2.0", + "picocolors": "^1.1.1", + "tailwindcss": "4.3.3" + }, + "bin": { + "tailwindcss": "dist/index.mjs" + } + }, "node_modules/@tailwindcss/node": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", @@ -2939,9 +2939,9 @@ "license": "MIT" }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "dev": true, "license": "BSD-3-Clause", "engines": { diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 0c4458f5..00000000 --- a/yarn.lock +++ /dev/null @@ -1,1422 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@cropper/element-canvas@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@cropper/element-canvas/-/element-canvas-2.2.0.tgz" - integrity sha512-H0Ay2ZSZrxWLP/8fSudH9hghsgIJh9fCgEmpfzD7MnQbE8HdQKljnoRxbrjuFT7Y0rmf405Sp9PmNA6T4twegw== - dependencies: - "@cropper/element" "^2.2.0" - "@cropper/utils" "^2.2.0" - -"@cropper/element-crosshair@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@cropper/element-crosshair/-/element-crosshair-2.2.0.tgz" - integrity sha512-RXNhlsCd7lPTTjR2rfUEYghaL5bkqiU70qojJCUz1EIKfLriToDztjlsw3TZKJUBHYA+JOnmTBDFTnizoMUN1w== - dependencies: - "@cropper/element" "^2.2.0" - "@cropper/utils" "^2.2.0" - -"@cropper/element-grid@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@cropper/element-grid/-/element-grid-2.2.0.tgz" - integrity sha512-1hxHLi7Jrek/xxeG12a9+TO18Ot4pCG4V9Zh+A0GMLsfFjrd2k/kl0wOq0x1isNNrP3kkIw47FdID2iWR8A48A== - dependencies: - "@cropper/element" "^2.2.0" - "@cropper/utils" "^2.2.0" - -"@cropper/element-handle@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@cropper/element-handle/-/element-handle-2.2.0.tgz" - integrity sha512-+WPzHWF96RtLTAtotIcQQ6Sx3zVLQdK+qbaM2yKa841Iz60gQ3qKk7Jl5ndy2OgkEfxZaJI/3lWyf1RMGs/TEw== - dependencies: - "@cropper/element" "^2.2.0" - "@cropper/utils" "^2.2.0" - -"@cropper/element-image@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@cropper/element-image/-/element-image-2.2.0.tgz" - integrity sha512-J0zBFMEfW6yuAmXoP6S+ZdNJy5J2duVsUS0N2o3D/HxHiVo4Vm3jrSexasu/Vfvwe4Lv0nmZ/10KW3RxhrvDCQ== - dependencies: - "@cropper/element" "^2.2.0" - "@cropper/element-canvas" "^2.2.0" - "@cropper/utils" "^2.2.0" - -"@cropper/element-selection@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@cropper/element-selection/-/element-selection-2.2.0.tgz" - integrity sha512-ATtWeEb1J/scQ98ins2jy4YbVOqz13F54jDk4Mm7OCpG0fzDseOujSLoIP8y26gtY7XGQXvn8WiFBbIZbeSgxQ== - dependencies: - "@cropper/element" "^2.2.0" - "@cropper/element-canvas" "^2.2.0" - "@cropper/element-image" "^2.2.0" - "@cropper/utils" "^2.2.0" - -"@cropper/element-shade@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@cropper/element-shade/-/element-shade-2.2.0.tgz" - integrity sha512-fiurnjecablA8+17GoOjiNrzKWe85Q6h9JLbPJkxKCQxcxqpjEsOdGu3YlRxaBYcYvr6wH9tghufOlUfYJS9nw== - dependencies: - "@cropper/element" "^2.2.0" - "@cropper/element-canvas" "^2.2.0" - "@cropper/element-selection" "^2.2.0" - "@cropper/utils" "^2.2.0" - -"@cropper/element-viewer@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@cropper/element-viewer/-/element-viewer-2.2.0.tgz" - integrity sha512-w6uO7m7PwBWKynMwj8DYkJHFXrHC6Xxvcp5Y+tSxhfcNtOvw92FDncqRLYv+xHQoCDXEvfCqJyrTx9nIiZgiLQ== - dependencies: - "@cropper/element" "^2.2.0" - "@cropper/element-canvas" "^2.2.0" - "@cropper/element-image" "^2.2.0" - "@cropper/element-selection" "^2.2.0" - "@cropper/utils" "^2.2.0" - -"@cropper/element@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@cropper/element/-/element-2.2.0.tgz" - integrity sha512-Kckk7TiWt3Cf9MvSfmMx7ZOIuN1rzIUIwIPQSqSj0Sl6gj6opo+CPax+fREvyvVKEzAug7L0sQFZ0TL4H5LsNw== - dependencies: - "@cropper/utils" "^2.2.0" - -"@cropper/elements@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@cropper/elements/-/elements-2.2.0.tgz" - integrity sha512-OQiVvEjIQUbMAUGpFrI/L95elHNIXjdlSxxzeywbU6C93PdPypXeGQfOSLQ43zUYmFutWNb7jTrHvgb3JaE+VQ== - dependencies: - "@cropper/element" "^2.2.0" - "@cropper/element-canvas" "^2.2.0" - "@cropper/element-crosshair" "^2.2.0" - "@cropper/element-grid" "^2.2.0" - "@cropper/element-handle" "^2.2.0" - "@cropper/element-image" "^2.2.0" - "@cropper/element-selection" "^2.2.0" - "@cropper/element-shade" "^2.2.0" - "@cropper/element-viewer" "^2.2.0" - -"@cropper/utils@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@cropper/utils/-/utils-2.2.0.tgz" - integrity sha512-wTrpZl+F4Kr2hzovqjztSexWUU+EVK1CxPymbYgFYoAS/NZXwCDsrvikJQn+HYZVxjqyo/ClnFxA0fG+tFy6Hw== - -"@emnapi/core@^1.11.1": - version "1.11.3" - resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.3.tgz#5e95348a42cd1e06f0b9aa380cd74091daa4d520" - integrity sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg== - dependencies: - "@emnapi/wasi-threads" "1.2.3" - tslib "^2.4.0" - -"@emnapi/runtime@^1.11.1": - version "1.11.3" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.3.tgz#84257ae3b0531eb2aec1ffa23d70700da007ba95" - integrity sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA== - dependencies: - tslib "^2.4.0" - -"@emnapi/wasi-threads@1.2.3", "@emnapi/wasi-threads@^1.2.2": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz#c9bf72fd4be5b928aee894820e8d814ed73916e9" - integrity sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g== - dependencies: - tslib "^2.4.0" - -"@esbuild/aix-ppc64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz#82b74f92aa78d720b714162939fb248c90addf53" - integrity sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg== - -"@esbuild/android-arm64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz#f78cb8a3121fc205a53285adb24972db385d185d" - integrity sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ== - -"@esbuild/android-arm@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.7.tgz#593e10a1450bbfcac6cb321f61f468453bac209d" - integrity sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ== - -"@esbuild/android-x64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.7.tgz#453143d073326033d2d22caf9e48de4bae274b07" - integrity sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg== - -"@esbuild/darwin-arm64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz#6f23000fb9b40b7e04b7d0606c0693bd0632f322" - integrity sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw== - -"@esbuild/darwin-x64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz#27393dd18bb1263c663979c5f1576e00c2d024be" - integrity sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ== - -"@esbuild/freebsd-arm64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz#22e4638fa502d1c0027077324c97640e3adf3a62" - integrity sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w== - -"@esbuild/freebsd-x64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz#9224b8e4fea924ce2194e3efc3e9aebf822192d6" - integrity sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ== - -"@esbuild/linux-arm64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz#4f5d1c27527d817b35684ae21419e57c2bda0966" - integrity sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A== - -"@esbuild/linux-arm@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz#b9e9d070c8c1c0449cf12b20eac37d70a4595921" - integrity sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA== - -"@esbuild/linux-ia32@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz#3f80fb696aa96051a94047f35c85b08b21c36f9e" - integrity sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg== - -"@esbuild/linux-loong64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz#9be1f2c28210b13ebb4156221bba356fe1675205" - integrity sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q== - -"@esbuild/linux-mips64el@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz#4ab5ee67a3dfcbcb5e8fd7883dae6e735b1163b8" - integrity sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw== - -"@esbuild/linux-ppc64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz#dac78c689f6499459c4321e5c15032c12307e7ea" - integrity sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ== - -"@esbuild/linux-riscv64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz#050f7d3b355c3a98308e935bc4d6325da91b0027" - integrity sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ== - -"@esbuild/linux-s390x@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz#d61f715ce61d43fe5844ad0d8f463f88cbe4fef6" - integrity sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw== - -"@esbuild/linux-x64@0.27.7": - version "0.27.7" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz" - integrity sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA== - -"@esbuild/netbsd-arm64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz#1650f2c1b948deeb3ef948f2fc30614723c09690" - integrity sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w== - -"@esbuild/netbsd-x64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz#65772ab342c4b3319bf0705a211050aac1b6e320" - integrity sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw== - -"@esbuild/openbsd-arm64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz#37ed7cfa66549d7955852fce37d0c3de4e715ea1" - integrity sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A== - -"@esbuild/openbsd-x64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz#01bf3d385855ef50cb33db7c4b52f957c34cd179" - integrity sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg== - -"@esbuild/openharmony-arm64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz#6c1f94b34086599aabda4eac8f638294b9877410" - integrity sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw== - -"@esbuild/sunos-x64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz#4b0dd17ae0a6941d2d0fd35a906392517071a90d" - integrity sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA== - -"@esbuild/win32-arm64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz#34193ab5565d6ff68ca928ac04be75102ccb2e77" - integrity sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA== - -"@esbuild/win32-ia32@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz#eb67f0e4482515d8c1894ede631c327a4da9fc4d" - integrity sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw== - -"@esbuild/win32-x64@0.27.7": - version "0.27.7" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz#8fe30b3088b89b4873c3a6cc87597ae3920c0a8b" - integrity sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg== - -"@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": - version "4.9.1" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz" - integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.12.2": - version "4.12.2" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz" - integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== - -"@eslint/config-array@^0.23.3": - version "0.23.3" - resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz" - integrity sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw== - dependencies: - "@eslint/object-schema" "^3.0.3" - debug "^4.3.1" - minimatch "^10.2.4" - -"@eslint/config-helpers@^0.5.2": - version "0.5.3" - resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz" - integrity sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw== - dependencies: - "@eslint/core" "^1.1.1" - -"@eslint/core@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz" - integrity sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/js@^10.0.1": - version "10.0.1" - resolved "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz" - integrity sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA== - -"@eslint/object-schema@^3.0.3": - version "3.0.3" - resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz" - integrity sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ== - -"@eslint/plugin-kit@^0.6.1": - version "0.6.1" - resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz" - integrity sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ== - dependencies: - "@eslint/core" "^1.1.1" - levn "^0.4.1" - -"@fortawesome/fontawesome-free@^7.2.0": - version "7.2.0" - resolved "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz" - integrity sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg== - -"@hotwired/stimulus@^3.2.2": - version "3.2.2" - resolved "https://registry.npmjs.org/@hotwired/stimulus/-/stimulus-3.2.2.tgz" - integrity sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A== - -"@hotwired/turbo-rails@^8.0.23": - version "8.0.23" - resolved "https://registry.npmjs.org/@hotwired/turbo-rails/-/turbo-rails-8.0.23.tgz" - integrity sha512-iBILwda3qmQC7FYM70+4s6kEQ7Fx9dJ6+yGxjPyrz9a5JDx1+y7OAA5TA7GGVOZJoicMLrKGdFDNorl40X35lw== - dependencies: - "@hotwired/turbo" "^8.0.23" - "@rails/actioncable" ">=7.0" - -"@hotwired/turbo@^8.0.23": - version "8.0.23" - resolved "https://registry.npmjs.org/@hotwired/turbo/-/turbo-8.0.23.tgz" - integrity sha512-GZ7cijxEZ6Ig71u7rD6LHaRv/wcE/hNsc+nEfiWOkLNqUgLOwo5MNGWOy5ZV9ZUDSiQx1no7YxjTNnT4O6//cQ== - -"@humanfs/core@^0.19.2": - version "0.19.2" - resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz" - integrity sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA== - dependencies: - "@humanfs/types" "^0.15.0" - -"@humanfs/node@^0.16.6": - version "0.16.8" - resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz" - integrity sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ== - dependencies: - "@humanfs/core" "^0.19.2" - "@humanfs/types" "^0.15.0" - "@humanwhocodes/retry" "^0.4.0" - -"@humanfs/types@^0.15.0": - version "0.15.0" - resolved "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz" - integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": - version "0.4.3" - resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" - integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.13" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" - integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/remapping@^2.3.5": - version "2.3.5" - resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" - integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": - version "1.6.0" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz" - integrity sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw== - -"@jridgewell/trace-mapping@^0.3.24": - version "0.3.31" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" - integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@napi-rs/wasm-runtime@^1.1.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz#ae38d9ea8483942054c5d82f00c0163374cd1e5f" - integrity sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g== - dependencies: - "@tybys/wasm-util" "^0.10.3" - -"@parcel/watcher-android-arm64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" - integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== - -"@parcel/watcher-darwin-arm64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67" - integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== - -"@parcel/watcher-darwin-x64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" - integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== - -"@parcel/watcher-freebsd-x64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" - integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== - -"@parcel/watcher-linux-arm-glibc@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" - integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== - -"@parcel/watcher-linux-arm-musl@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" - integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== - -"@parcel/watcher-linux-arm64-glibc@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" - integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== - -"@parcel/watcher-linux-arm64-musl@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" - integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== - -"@parcel/watcher-linux-x64-glibc@2.5.1": - version "2.5.1" - resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz" - integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== - -"@parcel/watcher-linux-x64-musl@2.5.1": - version "2.5.1" - resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz" - integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== - -"@parcel/watcher-win32-arm64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" - integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== - -"@parcel/watcher-win32-ia32@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" - integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== - -"@parcel/watcher-win32-x64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" - integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== - -"@parcel/watcher@2.5.1": - version "2.5.1" - resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz" - integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== - dependencies: - detect-libc "^1.0.3" - is-glob "^4.0.3" - micromatch "^4.0.5" - node-addon-api "^7.0.0" - optionalDependencies: - "@parcel/watcher-android-arm64" "2.5.1" - "@parcel/watcher-darwin-arm64" "2.5.1" - "@parcel/watcher-darwin-x64" "2.5.1" - "@parcel/watcher-freebsd-x64" "2.5.1" - "@parcel/watcher-linux-arm-glibc" "2.5.1" - "@parcel/watcher-linux-arm-musl" "2.5.1" - "@parcel/watcher-linux-arm64-glibc" "2.5.1" - "@parcel/watcher-linux-arm64-musl" "2.5.1" - "@parcel/watcher-linux-x64-glibc" "2.5.1" - "@parcel/watcher-linux-x64-musl" "2.5.1" - "@parcel/watcher-win32-arm64" "2.5.1" - "@parcel/watcher-win32-ia32" "2.5.1" - "@parcel/watcher-win32-x64" "2.5.1" - -"@rails/actioncable@>=7.0": - version "8.1.200" - resolved "https://registry.npmjs.org/@rails/actioncable/-/actioncable-8.1.200.tgz" - integrity sha512-on0DSb7AFUkq1ocxivDNQhhGW/RQpY91zvRVyyaEWP4gOOZWy33P/UyxjQk74IENWNrTqs8+zOGHwTjiiFruRw== - -"@stylistic/eslint-plugin@^5.10.0": - version "5.10.0" - resolved "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz" - integrity sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ== - dependencies: - "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/types" "^8.56.0" - eslint-visitor-keys "^4.2.1" - espree "^10.4.0" - estraverse "^5.3.0" - picomatch "^4.0.3" - -"@tailwindcss/cli@^4": - version "4.3.3" - resolved "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.3.3.tgz" - integrity sha512-ZvS/n1ZHOBKcVlhkt8l5NNr1EDXk1NboYO5CYDOs6NUmvT9z6bzkwsosaJftY57T/3gWNzWMJzIXLodZC8ssdw== - dependencies: - "@parcel/watcher" "2.5.1" - "@tailwindcss/node" "4.3.3" - "@tailwindcss/oxide" "4.3.3" - enhanced-resolve "^5.24.1" - mri "^1.2.0" - picocolors "^1.1.1" - tailwindcss "4.3.3" - -"@tailwindcss/node@4.3.3": - version "4.3.3" - resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz" - integrity sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg== - dependencies: - "@jridgewell/remapping" "^2.3.5" - enhanced-resolve "^5.24.1" - jiti "^2.7.0" - lightningcss "1.32.0" - magic-string "^0.30.21" - source-map-js "^1.2.1" - tailwindcss "4.3.3" - -"@tailwindcss/oxide-android-arm64@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz#848f93034155daf7892185028dfb18143bfc7d07" - integrity sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw== - -"@tailwindcss/oxide-darwin-arm64@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz#5c779e32c1c361beb75136fd8e2c627fcb9a5b28" - integrity sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw== - -"@tailwindcss/oxide-darwin-x64@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz#ba292ff52fa3264139f7fe7874719ce0a4666875" - integrity sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw== - -"@tailwindcss/oxide-freebsd-x64@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz#07e589487b9a636235a4ade48cefc1f9eeeec57f" - integrity sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw== - -"@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz#0c8abc228d9e19e0065ddb707eba52e21855b3ff" - integrity sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ== - -"@tailwindcss/oxide-linux-arm64-gnu@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz#5067dc7afd15d2b97adc77a91177dc4bec8d1b8b" - integrity sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w== - -"@tailwindcss/oxide-linux-arm64-musl@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz#29ae5f279be2ce64db368711985b6ad8e4562e57" - integrity sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA== - -"@tailwindcss/oxide-linux-x64-gnu@4.3.3": - version "4.3.3" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz" - integrity sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w== - -"@tailwindcss/oxide-linux-x64-musl@4.3.3": - version "4.3.3" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz" - integrity sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img== - -"@tailwindcss/oxide-wasm32-wasi@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz#408a9bc620e68f1aaf0dfea33da7bd3b65f9e2ef" - integrity sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ== - dependencies: - "@emnapi/core" "^1.11.1" - "@emnapi/runtime" "^1.11.1" - "@emnapi/wasi-threads" "^1.2.2" - "@napi-rs/wasm-runtime" "^1.1.4" - "@tybys/wasm-util" "^0.10.2" - tslib "^2.8.1" - -"@tailwindcss/oxide-win32-arm64-msvc@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz#3d582b00180fa4680e0b6c90be69fa5f4a209092" - integrity sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ== - -"@tailwindcss/oxide-win32-x64-msvc@4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz#ce4c663fef3b4fde67611a4c1391866f8c0aa79b" - integrity sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw== - -"@tailwindcss/oxide@4.3.3": - version "4.3.3" - resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz" - integrity sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA== - optionalDependencies: - "@tailwindcss/oxide-android-arm64" "4.3.3" - "@tailwindcss/oxide-darwin-arm64" "4.3.3" - "@tailwindcss/oxide-darwin-x64" "4.3.3" - "@tailwindcss/oxide-freebsd-x64" "4.3.3" - "@tailwindcss/oxide-linux-arm-gnueabihf" "4.3.3" - "@tailwindcss/oxide-linux-arm64-gnu" "4.3.3" - "@tailwindcss/oxide-linux-arm64-musl" "4.3.3" - "@tailwindcss/oxide-linux-x64-gnu" "4.3.3" - "@tailwindcss/oxide-linux-x64-musl" "4.3.3" - "@tailwindcss/oxide-wasm32-wasi" "4.3.3" - "@tailwindcss/oxide-win32-arm64-msvc" "4.3.3" - "@tailwindcss/oxide-win32-x64-msvc" "4.3.3" - -"@tybys/wasm-util@^0.10.2", "@tybys/wasm-util@^0.10.3": - version "0.10.4" - resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.4.tgz#3e85ecb266f9d1722250e89bc69528615720b154" - integrity sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A== - dependencies: - tslib "^2.4.0" - -"@types/esrecurse@^4.3.1": - version "4.3.1" - resolved "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz" - integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== - -"@types/estree@^1.0.6", "@types/estree@^1.0.8": - version "1.0.8" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/hotwired__turbo-rails@^8.0.0": - version "8.0.0" - resolved "https://registry.npmjs.org/@types/hotwired__turbo-rails/-/hotwired__turbo-rails-8.0.0.tgz" - integrity sha512-PaIVBat0aRF+KRWWq1ELBUc4olTLXzyfsUVpnk1hENoGoPQtbPSKbvHJcD6KjXwtomHCDcZDPwIiGYOGeeMD1g== - dependencies: - "@types/hotwired__turbo" "*" - "@types/rails__actioncable" "*" - -"@types/hotwired__turbo@*": - version "8.0.10" - resolved "https://registry.npmjs.org/@types/hotwired__turbo/-/hotwired__turbo-8.0.10.tgz" - integrity sha512-ZnNDmfE2mwvbpmq55ntbTwP82Y4U+g3lcGMTWvS+Vo5LEuO6YQrWVhCmrTae3IH19/nNcHvzbNuroNWEwRylFg== - -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/rails__actioncable@*": - version "8.0.3" - resolved "https://registry.npmjs.org/@types/rails__actioncable/-/rails__actioncable-8.0.3.tgz" - integrity sha512-y46MOTYorVQVwlHUyaZYbrh3nIkXsRYNuPna32lb3RngLVBlndNbIPvAUywFfhivftNhYg+vW5sZKWYCVIX2lA== - -"@types/sortablejs@^1.15.9": - version "1.15.9" - resolved "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.9.tgz" - integrity sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ== - -"@typescript-eslint/eslint-plugin@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz" - integrity sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ== - dependencies: - "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.57.0" - "@typescript-eslint/type-utils" "8.57.0" - "@typescript-eslint/utils" "8.57.0" - "@typescript-eslint/visitor-keys" "8.57.0" - ignore "^7.0.5" - natural-compare "^1.4.0" - ts-api-utils "^2.4.0" - -"@typescript-eslint/parser@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz" - integrity sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g== - dependencies: - "@typescript-eslint/scope-manager" "8.57.0" - "@typescript-eslint/types" "8.57.0" - "@typescript-eslint/typescript-estree" "8.57.0" - "@typescript-eslint/visitor-keys" "8.57.0" - debug "^4.4.3" - -"@typescript-eslint/project-service@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz" - integrity sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.57.0" - "@typescript-eslint/types" "^8.57.0" - debug "^4.4.3" - -"@typescript-eslint/scope-manager@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz" - integrity sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw== - dependencies: - "@typescript-eslint/types" "8.57.0" - "@typescript-eslint/visitor-keys" "8.57.0" - -"@typescript-eslint/tsconfig-utils@8.57.0", "@typescript-eslint/tsconfig-utils@^8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz" - integrity sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA== - -"@typescript-eslint/type-utils@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz" - integrity sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ== - dependencies: - "@typescript-eslint/types" "8.57.0" - "@typescript-eslint/typescript-estree" "8.57.0" - "@typescript-eslint/utils" "8.57.0" - debug "^4.4.3" - ts-api-utils "^2.4.0" - -"@typescript-eslint/types@8.57.0", "@typescript-eslint/types@^8.56.0", "@typescript-eslint/types@^8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz" - integrity sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg== - -"@typescript-eslint/typescript-estree@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz" - integrity sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q== - dependencies: - "@typescript-eslint/project-service" "8.57.0" - "@typescript-eslint/tsconfig-utils" "8.57.0" - "@typescript-eslint/types" "8.57.0" - "@typescript-eslint/visitor-keys" "8.57.0" - debug "^4.4.3" - minimatch "^10.2.2" - semver "^7.7.3" - tinyglobby "^0.2.15" - ts-api-utils "^2.4.0" - -"@typescript-eslint/utils@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz" - integrity sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ== - dependencies: - "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.57.0" - "@typescript-eslint/types" "8.57.0" - "@typescript-eslint/typescript-estree" "8.57.0" - -"@typescript-eslint/visitor-keys@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz" - integrity sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg== - dependencies: - "@typescript-eslint/types" "8.57.0" - eslint-visitor-keys "^5.0.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.15.0, acorn@^8.16.0: - version "8.16.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz" - integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== - -ajv@^6.14.0: - version "6.14.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz" - integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -balanced-match@^4.0.2: - version "4.0.4" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz" - integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== - -brace-expansion@^5.0.2: - version "5.0.12" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz" - integrity sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ== - dependencies: - balanced-match "^4.0.2" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -cropperjs@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/cropperjs/-/cropperjs-2.2.0.tgz" - integrity sha512-7egO+tXxt3jGHQcO6x4k1CVoMIlEu+4Klixc6ejspKOAns7onlC/lEi5tRi3qbuHVcATK7rqaZyp8LzynPz6Cg== - dependencies: - "@cropper/elements" "^2.2.0" - "@cropper/utils" "^2.2.0" - -cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4.3.1, debug@^4.3.2, debug@^4.4.3: - version "4.4.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== - -detect-libc@^2.0.3: - version "2.1.2" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz" - integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== - -enhanced-resolve@^5.24.1: - version "5.25.1" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz" - integrity sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.3.3" - -esbuild@^0.27.4: - version "0.27.7" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz" - integrity sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w== - optionalDependencies: - "@esbuild/aix-ppc64" "0.27.7" - "@esbuild/android-arm" "0.27.7" - "@esbuild/android-arm64" "0.27.7" - "@esbuild/android-x64" "0.27.7" - "@esbuild/darwin-arm64" "0.27.7" - "@esbuild/darwin-x64" "0.27.7" - "@esbuild/freebsd-arm64" "0.27.7" - "@esbuild/freebsd-x64" "0.27.7" - "@esbuild/linux-arm" "0.27.7" - "@esbuild/linux-arm64" "0.27.7" - "@esbuild/linux-ia32" "0.27.7" - "@esbuild/linux-loong64" "0.27.7" - "@esbuild/linux-mips64el" "0.27.7" - "@esbuild/linux-ppc64" "0.27.7" - "@esbuild/linux-riscv64" "0.27.7" - "@esbuild/linux-s390x" "0.27.7" - "@esbuild/linux-x64" "0.27.7" - "@esbuild/netbsd-arm64" "0.27.7" - "@esbuild/netbsd-x64" "0.27.7" - "@esbuild/openbsd-arm64" "0.27.7" - "@esbuild/openbsd-x64" "0.27.7" - "@esbuild/openharmony-arm64" "0.27.7" - "@esbuild/sunos-x64" "0.27.7" - "@esbuild/win32-arm64" "0.27.7" - "@esbuild/win32-ia32" "0.27.7" - "@esbuild/win32-x64" "0.27.7" - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@^9.1.2: - version "9.1.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz" - integrity sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ== - dependencies: - "@types/esrecurse" "^4.3.1" - "@types/estree" "^1.0.8" - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" - integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== - -eslint-visitor-keys@^5.0.0, eslint-visitor-keys@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz" - integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== - -eslint@^10.0.3: - version "10.0.3" - resolved "https://registry.npmjs.org/eslint/-/eslint-10.0.3.tgz" - integrity sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ== - dependencies: - "@eslint-community/eslint-utils" "^4.8.0" - "@eslint-community/regexpp" "^4.12.2" - "@eslint/config-array" "^0.23.3" - "@eslint/config-helpers" "^0.5.2" - "@eslint/core" "^1.1.1" - "@eslint/plugin-kit" "^0.6.1" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.2" - "@types/estree" "^1.0.6" - ajv "^6.14.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^9.1.2" - eslint-visitor-keys "^5.0.1" - espree "^11.1.1" - esquery "^1.7.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - minimatch "^10.2.4" - natural-compare "^1.4.0" - optionator "^0.9.3" - -espree@^10.4.0: - version "10.4.0" - resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz" - integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== - dependencies: - acorn "^8.15.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.1" - -espree@^11.1.1: - version "11.2.0" - resolved "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz" - integrity sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw== - dependencies: - acorn "^8.16.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^5.0.1" - -esquery@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz" - integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fdir@^6.5.0: - version "6.5.0" - resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" - integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flatted@^3.2.9: - version "3.4.2" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz" - integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -globals@^17.5.0: - version "17.5.0" - resolved "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz" - integrity sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g== - -graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -ignore@^7.0.5: - version "7.0.5" - resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" - integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-glob@^4.0.0, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -jiti@^2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz" - integrity sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lightningcss-android-arm64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968" - integrity sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg== - -lightningcss-darwin-arm64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz#50b71871b01c8199584b649e292547faea7af9b5" - integrity sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ== - -lightningcss-darwin-x64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz#35f3e97332d130b9ca181e11b568ded6aebc6d5e" - integrity sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w== - -lightningcss-freebsd-x64@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz#9777a76472b64ed6ff94342ad64c7bafd794a575" - integrity sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig== - -lightningcss-linux-arm-gnueabihf@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz#13ae652e1ab73b9135d7b7da172f666c410ad53d" - integrity sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw== - -lightningcss-linux-arm64-gnu@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz#417858795a94592f680123a1b1f9da8a0e1ef335" - integrity sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ== - -lightningcss-linux-arm64-musl@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz#6be36692e810b718040802fd809623cffe732133" - integrity sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg== - -lightningcss-linux-x64-gnu@1.32.0: - version "1.32.0" - resolved "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz" - integrity sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA== - -lightningcss-linux-x64-musl@1.32.0: - version "1.32.0" - resolved "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz" - integrity sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg== - -lightningcss-win32-arm64-msvc@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz#4f30ba3fa5e925f5b79f945e8cc0d176c3b1ab38" - integrity sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw== - -lightningcss-win32-x64-msvc@1.32.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz#141aa5605645064928902bb4af045fa7d9f4220a" - integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q== - -lightningcss@1.32.0: - version "1.32.0" - resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz" - integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ== - dependencies: - detect-libc "^2.0.3" - optionalDependencies: - lightningcss-android-arm64 "1.32.0" - lightningcss-darwin-arm64 "1.32.0" - lightningcss-darwin-x64 "1.32.0" - lightningcss-freebsd-x64 "1.32.0" - lightningcss-linux-arm-gnueabihf "1.32.0" - lightningcss-linux-arm64-gnu "1.32.0" - lightningcss-linux-arm64-musl "1.32.0" - lightningcss-linux-x64-gnu "1.32.0" - lightningcss-linux-x64-musl "1.32.0" - lightningcss-win32-arm64-msvc "1.32.0" - lightningcss-win32-x64-msvc "1.32.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -magic-string@^0.30.21: - version "0.30.21" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz" - integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.5" - -micromatch@^4.0.5: - version "4.0.8" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -minimatch@^10.2.2, minimatch@^10.2.4: - version "10.2.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz" - integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg== - dependencies: - brace-expansion "^5.0.2" - -mri@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-addon-api@^7.0.0: - version "7.1.1" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz" - integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -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-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.3.1: - version "2.3.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz" - integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== - -picomatch@^4.0.3: - version "4.0.4" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz" - integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -semver@^7.7.3: - version "7.7.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" - integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -sortablejs@^1.15.7: - version "1.15.7" - resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.7.tgz" - integrity sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A== - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -tailwindcss@4.3.3, tailwindcss@^4: - version "4.3.3" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz" - integrity sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ== - -tapable@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz" - integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A== - -tinyglobby@^0.2.15: - version "0.2.15" - resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" - integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== - dependencies: - fdir "^6.5.0" - picomatch "^4.0.3" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-api-utils@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz" - integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== - -tslib@^2.4.0, tslib@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -typescript-eslint@^8.57.0: - version "8.57.0" - resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.0.tgz" - integrity sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA== - dependencies: - "@typescript-eslint/eslint-plugin" "8.57.0" - "@typescript-eslint/parser" "8.57.0" - "@typescript-eslint/typescript-estree" "8.57.0" - "@typescript-eslint/utils" "8.57.0" - -typescript@^5.9.3: - version "5.9.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" - integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From b6edaf17b1c0172db66d592cde55584cae1eb35a Mon Sep 17 00:00:00 2001 From: cub8 Date: Mon, 12 Oct 2026 13:01:01 +0200 Subject: [PATCH 3/3] Fix bugs --- app/assets/stylesheets/components/form.css | 4 +- app/assets/stylesheets/components/join.css | 11 ++- app/controllers/join_controller.rb | 26 +++--- app/views/join/_step_code.html.haml | 45 ++++++---- app/views/join/_step_nickname.html.haml | 23 ++--- config/routes.rb | 1 + test/controllers/auth/sign_in_test.rb | 23 +++++ test/controllers/join_controller_test.rb | 4 +- test/controllers/return_to_redirect_test.rb | 98 +++++++++++++++++++++ 9 files changed, 184 insertions(+), 51 deletions(-) create mode 100644 test/controllers/auth/sign_in_test.rb create mode 100644 test/controllers/return_to_redirect_test.rb diff --git a/app/assets/stylesheets/components/form.css b/app/assets/stylesheets/components/form.css index aec9ef03..cb8e2932 100644 --- a/app/assets/stylesheets/components/form.css +++ b/app/assets/stylesheets/components/form.css @@ -742,7 +742,7 @@ outline-offset: 2px; } - @media (width <= theme(--breakpoint-tablet)) { + @media (width <=theme(--breakpoint-tablet)) { .gh-form-shell { grid-template-columns: minmax(0, 1fr); } @@ -771,7 +771,7 @@ } } - @media (width <= theme(--breakpoint-mobile)) { + @media (width <=theme(--breakpoint-mobile)) { .gh-search-input--wide { width: 100%; } diff --git a/app/assets/stylesheets/components/join.css b/app/assets/stylesheets/components/join.css index 1c638b2c..08a8520a 100644 --- a/app/assets/stylesheets/components/join.css +++ b/app/assets/stylesheets/components/join.css @@ -62,8 +62,13 @@ .gh-join-hint { display: flex; align-items: center; - justify-content: center; - gap: 8px; + justify-content: flex-start; + gap: 6px; + } + + .gh-join-icon { + flex: none; + width: 16px; text-align: center; } @@ -76,7 +81,7 @@ letter-spacing: 0.04em; } - @media (width <= theme(--breakpoint-mobile)) { + @media (width <=theme(--breakpoint-mobile)) { .gh-join-code-inputs { gap: 7px; } diff --git a/app/controllers/join_controller.rb b/app/controllers/join_controller.rb index 29d3aa09..f37171c1 100644 --- a/app/controllers/join_controller.rb +++ b/app/controllers/join_controller.rb @@ -1,16 +1,10 @@ # frozen_string_literal: true class JoinController < ApplicationController - # Inside the dialog only the frame is used, and the layout already carries a - # of its own. Rendering it too would put two frames - # with the same id in one response and let Turbo pick whichever came first. - before_action :set_presentation - # Step 1. def new; end - # Step 1 submitted. A bad code falls back to step 1 carrying its reason. def lookup @code = params[:code] @lookup = InviteLookup.new(user: current_user, code: @code).call @@ -21,8 +15,6 @@ def lookup render :show end - # The QR landing page. Same step, same failure handling — only the wrapper - # differs, and `set_presentation` has already chosen it. def show @code = params[:code] @lookup = InviteLookup.new(user: current_user, code: @code).call @@ -32,19 +24,25 @@ def show @story_group = @lookup.story_group end - # Step 2 submitted. def create @code = params[:code] @lookup = InviteLookup.new(user: current_user, code: @code).call return render :new, status: :unprocessable_content unless @lookup.ok? - accept + accept! + end + + def done + @story_group = current_user.student_story_groups.find(params[:story_group_id]) + @membership = current_user.student_memberships.find_by!(story_group: @story_group) + + render :create end private - def accept + def accept! service = AcceptInviteService.new( user: current_user, invite: @lookup.invite, @@ -56,13 +54,9 @@ def accept return render :show, status: :unprocessable_content unless @result.success? - @membership = @result.membership + redirect_to done_join_index_path(story_group_id: @story_group.id) end - # A step renders inside the layout's `modal` dialog when it was requested - # from one, and as a focused, navigation-less page otherwise — which is how - # the QR link lands. The branch mirrors NotificationsController's `panel` - # check. def set_presentation @in_modal = turbo_frame_request_id == 'modal' @chrome = false unless @in_modal diff --git a/app/views/join/_step_code.html.haml b/app/views/join/_step_code.html.haml index 491ba0da..66147941 100644 --- a/app/views/join/_step_code.html.haml +++ b/app/views/join/_step_code.html.haml @@ -2,38 +2,45 @@ - member_of = local_assigns[:lookup]&.member_of %p.gh-small.mb-1 Krok 1 z 2 -%h2#gh-join-title.gh-h2 Dołącz do grupy +%h2.gh-h2#gh-join-title Dołącz do grupy %p Wpisz 6-znakowy kod, który podał prowadzący. -= form_with url: lookup_join_index_path, method: :get, - data: { controller: 'join-code', turbo_frame: (@in_modal ? 'modal' : nil) } do += form_with url: lookup_join_index_path, + method: :get, + data: { controller: 'join-code', + turbo_frame: (@in_modal ? 'modal' : nil), } do = hidden_field_tag :code, code, data: { join_code_target: 'code' } .gh-join-code-inputs{ role: 'group', 'aria-label': 'Kod zaproszenia' } - StoryGroupInvite::CODE_LENGTH.times do |index| %span.gh-join-code-slot - %input{ type: 'text', - maxlength: 2, - autocomplete: 'off', - autocapitalize: 'characters', - spellcheck: 'false', - value: code.to_s[index], - autofocus: index.zero?, - 'aria-label': "Znak #{index + 1} z #{StoryGroupInvite::CODE_LENGTH}", - data: { join_code_target: 'slot', action: 'input->join-code#type keydown->join-code#key paste->join-code#paste' } } + %input{type: 'text', + maxlength: 2, + autocomplete: 'off', + autocapitalize: 'characters', + spellcheck: 'false', + value: code.to_s[index], + autofocus: index.zero?, + 'aria-label': "Znak #{index + 1} z #{StoryGroupInvite::CODE_LENGTH}", + data: { join_code_target: 'slot', + action: 'input->join-code#type keydown->join-code#key paste->join-code#paste', },} - if member_of - %p.gh-field-hint - Już należysz do tej grupy. - = link_to 'Otwórz grupę', story_group_path(member_of), class: 'gh-link-button', - data: { turbo_frame: '_top' } + %p.gh-field-error.pb-2{ role: 'alert' } + %i.fa-solid.fa-triangle-exclamation.fa-fw.gh-join-icon{ 'aria-hidden': 'true' } + %span + Już należysz do tej grupy. + = link_to 'Otwórz grupę', + story_group_path(member_of), + class: 'gh-link-button', + data: { turbo_frame: '_top' } - elsif error - %p.gh-field-error{ role: 'alert' } - %i.fa-solid.fa-triangle-exclamation{ 'aria-hidden': 'true' } + %p.gh-field-error.pb-2{ role: 'alert' } + %i.fa-solid.fa-triangle-exclamation.fa-fw.gh-join-icon{ 'aria-hidden': 'true' } %span= error %p.gh-small.gh-join-hint - %i.fa-solid.fa-camera{ 'aria-hidden': 'true' } + %i.fa-solid.fa-camera.fa-fw.gh-join-icon{ 'aria-hidden': 'true' } Masz kod QR? Zeskanuj go aparatem telefonu, a kod wpisze się sam. .gh-dialog-button-row diff --git a/app/views/join/_step_nickname.html.haml b/app/views/join/_step_nickname.html.haml index 17326697..1e7c12df 100644 --- a/app/views/join/_step_nickname.html.haml +++ b/app/views/join/_step_nickname.html.haml @@ -1,33 +1,36 @@ - nickname_error = local_assigns[:result]&.nickname_error %p.gh-small.mb-1 Krok 2 z 2 -%h2#gh-join-title.gh-h2= "Dołączasz do grupy #{story_group.name}" +%h2.gh-h2#gh-join-title= "Dołączasz do grupy #{story_group.name}" %p W tej grupie inni zobaczą Cię pod pseudonimem — także w rankingu. Możesz go później zmienić w ustawieniach w grupie. -= form_with url: join_index_path, method: :post, - data: { turbo_frame: (@in_modal ? 'modal' : nil) } do += form_with url: join_index_path, + method: :post, + data: { turbo_frame: (@in_modal ? 'modal' : nil) } do = hidden_field_tag :code, code .gh-form-field = label_tag :nickname, 'Pseudonim w tej grupie' .gh-text-input{ class: ('gh-text-input--invalid' if nickname_error) } = text_field_tag :nickname, params[:nickname], - maxlength: 24, - autocomplete: 'off', - autofocus: true, - 'aria-invalid': nickname_error ? 'true' : nil, - 'aria-describedby': 'gh-nick-note' + maxlength: 24, + autocomplete: 'off', + autofocus: true, + 'aria-invalid': nickname_error ? 'true' : nil, + 'aria-describedby': 'gh-nick-note' + -# haml-lint:disable RepeatedId - if nickname_error - %p#gh-nick-note.gh-field-error{ role: 'alert' } + %p.gh-field-error#gh-nick-note{ role: 'alert' } %i.fa-solid.fa-triangle-exclamation{ 'aria-hidden': 'true' } %span= nickname_error - else - %span#gh-nick-note.gh-field-hint + %span.gh-field-hint#gh-nick-note Zostaw puste, jeśli chcesz używać imienia i nazwiska. Pseudonim możesz ustawić później. + -# haml-lint:enable RepeatedId .gh-dialog-button-row = render 'join/cancel' diff --git a/config/routes.rb b/config/routes.rb index 86eaa8e2..a5272fee 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,6 +7,7 @@ collection do post :create get :lookup + get :done end end resources :story_groups do diff --git a/test/controllers/auth/sign_in_test.rb b/test/controllers/auth/sign_in_test.rb new file mode 100644 index 00000000..c6e1072e --- /dev/null +++ b/test/controllers/auth/sign_in_test.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'test_helper' + +class Auth::SignInTest < ActiveSupport::TestCase + class Host + include Auth::SignIn + + def home_path = '/home' + + def resolve(path) = after_login_path(path) + end + + test 'accepts local paths' do + assert_equal '/join/abc?x=1', Host.new.resolve('/join/abc?x=1') + end + + test 'rejects external and malformed targets' do + ['//evil.com', 'https://evil.com', 'javascript:alert(1)', '', nil].each do |path| + assert_equal '/home', Host.new.resolve(path), "expected #{path.inspect} to fall back to home" + end + end +end diff --git a/test/controllers/join_controller_test.rb b/test/controllers/join_controller_test.rb index 76640ea9..3be1b6c5 100644 --- a/test/controllers/join_controller_test.rb +++ b/test/controllers/join_controller_test.rb @@ -17,7 +17,9 @@ class JoinControllerTest < ActionDispatch::IntegrationTest post join_index_url, params: { code: @invite.code } end - assert_response :success + assert_redirected_to done_join_index_path(story_group_id: @story_group.id) + follow_redirect! + assert_select '.gh-dialog-button-row a[href=?]', story_group_path(@story_group), 'Gotowe' end diff --git a/test/controllers/return_to_redirect_test.rb b/test/controllers/return_to_redirect_test.rb new file mode 100644 index 00000000..8cdc88dd --- /dev/null +++ b/test/controllers/return_to_redirect_test.rb @@ -0,0 +1,98 @@ +# frozen_string_literal: true + +require 'test_helper' + +class ReturnToRedirectTest < ActionDispatch::IntegrationTest + setup do + @teacher = FactoryBot.create(:user, role: :teacher) + @story_group = FactoryBot.create(:story_group, owner: @teacher) + @invite = FactoryBot.create(:story_group_invite, story_group: @story_group) + @student = FactoryBot.create(:user, role: :student) + end + + test 'QR link brings the user back to the join page after passwordless login' do + get join_path(code: @invite.code) + assert_redirected_to login_path + + verify_login(@student) + + assert_redirected_to join_path(code: @invite.code) + assert_equal 'Zalogowano pomyślnie.', flash[:notice] + end + + test 'query string is preserved' do + get lookup_join_index_path(code: @invite.code) + assert_redirected_to login_path + + verify_login(@student) + + assert_redirected_to lookup_join_index_path(code: @invite.code) + end + + test 'without a stored path login lands on home' do + verify_login(@student) + + assert_redirected_to home_path + end + + test 'stored path is used only once' do + get join_path(code: @invite.code) + verify_login(@student) + assert_redirected_to join_path(code: @invite.code) + + delete logout_path + verify_login(@student) + + assert_redirected_to home_path + end + + test 'non-GET requests are not stored' do + post join_index_url, params: { code: @invite.code } + assert_redirected_to login_path + + verify_login(@student) + + assert_redirected_to home_path + end + + test 'turbo frame requests are not stored' do + get join_path(code: @invite.code), headers: { 'Turbo-Frame' => 'modal' } + assert_redirected_to login_path + + verify_login(@student) + + assert_redirected_to home_path + end + + test 'bypass login honours the stored path' do + BypassLoginService.any_instance.stubs(:can_bypass_login?).returns(true) + + get join_path(code: @invite.code) + post auth_passwordless_path, params: { email: @student.email } + + assert_redirected_to join_path(code: @invite.code) + end + + test 'USOS callback honours the stored path' do + OmniAuth.config.test_mode = true + OmniAuth.config.mock_auth[:uam_usos] = OmniAuth::AuthHash.new(provider: 'uam_usos', uid: '1') + Providers::UsosAdapter.stubs(:new).returns(stub) + SessionUserBuilder.any_instance.stubs(:build).returns(@student) + + get join_path(code: @invite.code) + get auth_callback_path(provider: 'uam_usos') + + assert_redirected_to join_path(code: @invite.code) + end + + teardown do + OmniAuth.config.test_mode = false + OmniAuth.config.mock_auth.delete(:uam_usos) + end + + private + + def verify_login(user) + get auth_passwordless_verify_path(token: user.create_login_token!.raw_token) + end +end