diff --git a/alembic/env.py b/alembic/env.py index 10a0de6..8bc91bd 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -30,14 +30,13 @@ from media_manager.auth.db import OAuthAccount, User # noqa: E402 from media_manager.config import MediaManagerConfig # noqa: E402 from media_manager.database import Base # noqa: E402 from media_manager.indexer.models import IndexerQueryResult # noqa: E402 -from media_manager.movies.models import Movie, MovieFile, MovieRequest # noqa: E402 +from media_manager.movies.models import Movie, MovieFile # noqa: E402 from media_manager.notification.models import Notification # noqa: E402 from media_manager.torrent.models import Torrent # noqa: E402 from media_manager.tv.models import ( # noqa: E402 Episode, EpisodeFile, Season, - SeasonRequest, Show, ) @@ -51,11 +50,9 @@ __all__ = [ "IndexerQueryResult", "Movie", "MovieFile", - "MovieRequest", "Notification", "OAuthAccount", "Season", - "SeasonRequest", "Show", "Torrent", "User", diff --git a/alembic/versions/e60ae827ed98_remove_requests.py b/alembic/versions/e60ae827ed98_remove_requests.py new file mode 100644 index 0000000..d3e757f --- /dev/null +++ b/alembic/versions/e60ae827ed98_remove_requests.py @@ -0,0 +1,65 @@ +"""remove requests + +Revision ID: e60ae827ed98 +Revises: a6f714d3c8b9 +Create Date: 2026-02-22 18:07:12.866130 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = 'e60ae827ed98' +down_revision: Union[str, None] = 'a6f714d3c8b9' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('movie_request') + op.drop_table('season_request') + op.alter_column('episode', 'overview', + existing_type=sa.TEXT(), + type_=sa.String(), + existing_nullable=True) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + + op.create_table('season_request', + sa.Column('id', sa.UUID(), autoincrement=False, nullable=False), + sa.Column('season_id', sa.UUID(), autoincrement=False, nullable=False), + sa.Column('wanted_quality', postgresql.ENUM('uhd', 'fullhd', 'hd', 'sd', 'unknown', name='quality'), autoincrement=False, nullable=False), + sa.Column('min_quality', postgresql.ENUM('uhd', 'fullhd', 'hd', 'sd', 'unknown', name='quality'), autoincrement=False, nullable=False), + sa.Column('requested_by_id', sa.UUID(), autoincrement=False, nullable=True), + sa.Column('authorized', sa.BOOLEAN(), autoincrement=False, nullable=False), + sa.Column('authorized_by_id', sa.UUID(), autoincrement=False, nullable=True), + sa.ForeignKeyConstraint(['authorized_by_id'], ['user.id'], name=op.f('season_request_authorized_by_id_fkey'), ondelete='SET NULL'), + sa.ForeignKeyConstraint(['requested_by_id'], ['user.id'], name=op.f('season_request_requested_by_id_fkey'), ondelete='SET NULL'), + sa.ForeignKeyConstraint(['season_id'], ['season.id'], name=op.f('season_request_season_id_fkey'), ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id', name=op.f('season_request_pkey')), + sa.UniqueConstraint('season_id', 'wanted_quality', name=op.f('season_request_season_id_wanted_quality_key'), postgresql_include=[], postgresql_nulls_not_distinct=False) + ) + op.create_table('movie_request', + sa.Column('id', sa.UUID(), autoincrement=False, nullable=False), + sa.Column('movie_id', sa.UUID(), autoincrement=False, nullable=False), + sa.Column('wanted_quality', postgresql.ENUM('uhd', 'fullhd', 'hd', 'sd', 'unknown', name='quality'), autoincrement=False, nullable=False), + sa.Column('min_quality', postgresql.ENUM('uhd', 'fullhd', 'hd', 'sd', 'unknown', name='quality'), autoincrement=False, nullable=False), + sa.Column('authorized', sa.BOOLEAN(), autoincrement=False, nullable=False), + sa.Column('requested_by_id', sa.UUID(), autoincrement=False, nullable=True), + sa.Column('authorized_by_id', sa.UUID(), autoincrement=False, nullable=True), + sa.ForeignKeyConstraint(['authorized_by_id'], ['user.id'], name=op.f('movie_request_authorized_by_id_fkey'), ondelete='SET NULL'), + sa.ForeignKeyConstraint(['movie_id'], ['movie.id'], name=op.f('movie_request_movie_id_fkey'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['requested_by_id'], ['user.id'], name=op.f('movie_request_requested_by_id_fkey'), ondelete='SET NULL'), + sa.PrimaryKeyConstraint('id', name=op.f('movie_request_pkey')), + sa.UniqueConstraint('movie_id', 'wanted_quality', name=op.f('movie_request_movie_id_wanted_quality_key'), postgresql_include=[], postgresql_nulls_not_distinct=False) + ) + # ### end Alembic commands ### diff --git a/media_manager/movies/models.py b/media_manager/movies/models.py index 247b96f..e0258a7 100644 --- a/media_manager/movies/models.py +++ b/media_manager/movies/models.py @@ -3,7 +3,6 @@ from uuid import UUID from sqlalchemy import ForeignKey, PrimaryKeyConstraint, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship -from media_manager.auth.db import User from media_manager.database import Base from media_manager.torrent.models import Quality @@ -22,10 +21,6 @@ class Movie(Base): original_language: Mapped[str | None] = mapped_column(default=None) imdb_id: Mapped[str | None] = mapped_column(default=None) - movie_requests: Mapped[list["MovieRequest"]] = relationship( - "MovieRequest", back_populates="movie", cascade="all, delete-orphan" - ) - class MovieFile(Base): __tablename__ = "movie_file" @@ -42,31 +37,3 @@ class MovieFile(Base): ) torrent = relationship("Torrent", back_populates="movie_files", uselist=False) - - -class MovieRequest(Base): - __tablename__ = "movie_request" - __table_args__ = (UniqueConstraint("movie_id", "wanted_quality"),) - id: Mapped[UUID] = mapped_column(primary_key=True) - movie_id: Mapped[UUID] = mapped_column( - ForeignKey(column="movie.id", ondelete="CASCADE"), - ) - wanted_quality: Mapped[Quality] - min_quality: Mapped[Quality] - - authorized: Mapped[bool] = mapped_column(default=False) - - requested_by_id: Mapped[UUID | None] = mapped_column( - ForeignKey(column="user.id", ondelete="SET NULL"), - ) - authorized_by_id: Mapped[UUID | None] = mapped_column( - ForeignKey(column="user.id", ondelete="SET NULL"), - ) - - requested_by: Mapped["User|None"] = relationship( - foreign_keys=[requested_by_id], uselist=False - ) - authorized_by: Mapped["User|None"] = relationship( - foreign_keys=[authorized_by_id], uselist=False - ) - movie = relationship("Movie", back_populates="movie_requests", uselist=False) diff --git a/media_manager/movies/repository.py b/media_manager/movies/repository.py index 1e70af6..0c79c3f 100644 --- a/media_manager/movies/repository.py +++ b/media_manager/movies/repository.py @@ -5,10 +5,10 @@ from sqlalchemy.exc import ( IntegrityError, SQLAlchemyError, ) -from sqlalchemy.orm import Session, joinedload +from sqlalchemy.orm import Session from media_manager.exceptions import ConflictError, NotFoundError -from media_manager.movies.models import Movie, MovieFile, MovieRequest +from media_manager.movies.models import Movie, MovieFile from media_manager.movies.schemas import ( Movie as MovieSchema, ) @@ -17,17 +17,10 @@ from media_manager.movies.schemas import ( ) from media_manager.movies.schemas import ( MovieId, - MovieRequestId, -) -from media_manager.movies.schemas import ( - MovieRequest as MovieRequestSchema, ) from media_manager.movies.schemas import ( MovieTorrent as MovieTorrentSchema, ) -from media_manager.movies.schemas import ( - RichMovieRequest as RichMovieRequestSchema, -) from media_manager.torrent.models import Torrent from media_manager.torrent.schemas import TorrentId @@ -173,46 +166,6 @@ class MovieRepository: log.exception(f"Database error while deleting movie {movie_id}") raise - def add_movie_request( - self, movie_request: MovieRequestSchema - ) -> MovieRequestSchema: - """ - Adds a Movie to the MovieRequest table, which marks it as requested. - - :param movie_request: The MovieRequest object to add. - :return: The added MovieRequest object. - :raises IntegrityError: If a similar request already exists or violates constraints. - :raises SQLAlchemyError: If a database error occurs. - """ - log.debug(f"Adding movie request: {movie_request.model_dump_json()}") - db_model = MovieRequest( - id=movie_request.id, - movie_id=movie_request.movie_id, - requested_by_id=movie_request.requested_by.id - if movie_request.requested_by - else None, - authorized_by_id=movie_request.authorized_by.id - if movie_request.authorized_by - else None, - wanted_quality=movie_request.wanted_quality, - min_quality=movie_request.min_quality, - authorized=movie_request.authorized, - ) - try: - self.db.add(db_model) - self.db.commit() - self.db.refresh(db_model) - log.info(f"Successfully added movie request with id: {db_model.id}") - return MovieRequestSchema.model_validate(db_model) - except IntegrityError: - self.db.rollback() - log.exception("Integrity error while adding movie request") - raise - except SQLAlchemyError: - self.db.rollback() - log.exception("Database error while adding movie request") - raise - def set_movie_library(self, movie_id: MovieId, library: str) -> None: """ Sets the library for a movie. @@ -234,49 +187,6 @@ class MovieRepository: log.exception(f"Database error setting library for movie {movie_id}") raise - def delete_movie_request(self, movie_request_id: MovieRequestId) -> None: - """ - Removes a MovieRequest by its ID. - - :param movie_request_id: The ID of the movie request to delete. - :raises NotFoundError: If the movie request is not found. - :raises SQLAlchemyError: If a database error occurs. - """ - try: - stmt = delete(MovieRequest).where(MovieRequest.id == movie_request_id) - result = self.db.execute(stmt) - if result.rowcount == 0: - self.db.rollback() - msg = f"movie request with id {movie_request_id} not found." - raise NotFoundError(msg) - self.db.commit() - # Successfully deleted movie request with id: {movie_request_id} - except SQLAlchemyError: - self.db.rollback() - log.exception( - f"Database error while deleting movie request {movie_request_id}" - ) - raise - - def get_movie_requests(self) -> list[RichMovieRequestSchema]: - """ - Retrieve all movie requests. - - :return: A list of RichMovieRequest objects. - :raises SQLAlchemyError: If a database error occurs. - """ - try: - stmt = select(MovieRequest).options( - joinedload(MovieRequest.requested_by), - joinedload(MovieRequest.authorized_by), - joinedload(MovieRequest.movie), - ) - results = self.db.execute(stmt).scalars().unique().all() - return [RichMovieRequestSchema.model_validate(x) for x in results] - except SQLAlchemyError: - log.exception("Database error while retrieving movie requests") - raise - def add_movie_file(self, movie_file: MovieFileSchema) -> MovieFileSchema: """ Adds a movie file record to the database. @@ -396,25 +306,6 @@ class MovieRepository: log.exception("Database error retrieving all movies with torrents") raise - def get_movie_request(self, movie_request_id: MovieRequestId) -> MovieRequestSchema: - """ - Retrieve a movie request by its ID. - - :param movie_request_id: The ID of the movie request. - :return: A MovieRequest object. - :raises NotFoundError: If the movie request is not found. - :raises SQLAlchemyError: If a database error occurs. - """ - try: - request = self.db.get(MovieRequest, movie_request_id) - if not request: - msg = f"Movie request with id {movie_request_id} not found." - raise NotFoundError(msg) - return MovieRequestSchema.model_validate(request) - except SQLAlchemyError: - log.exception(f"Database error retrieving movie request {movie_request_id}") - raise - def get_movie_by_torrent_id(self, torrent_id: TorrentId) -> MovieSchema: """ Retrieve a movie by a torrent ID. diff --git a/media_manager/movies/router.py b/media_manager/movies/router.py index 99b34fd..09d3c53 100644 --- a/media_manager/movies/router.py +++ b/media_manager/movies/router.py @@ -1,9 +1,7 @@ from pathlib import Path -from typing import Annotated from fastapi import APIRouter, Depends, HTTPException, status -from media_manager.auth.schemas import UserRead from media_manager.auth.users import current_active_user, current_superuser from media_manager.config import LibraryItem, MediaManagerConfig from media_manager.exceptions import ConflictError, NotFoundError @@ -13,20 +11,14 @@ from media_manager.indexer.schemas import ( ) from media_manager.metadataProvider.dependencies import metadata_provider_dep from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult -from media_manager.movies import log from media_manager.movies.dependencies import ( movie_dep, movie_service_dep, ) from media_manager.movies.schemas import ( - CreateMovieRequest, Movie, - MovieRequest, - MovieRequestBase, - MovieRequestId, PublicMovie, PublicMovieFile, - RichMovieRequest, RichMovieTorrent, ) from media_manager.schemas import MediaImportSuggestion @@ -188,103 +180,6 @@ def get_available_libraries() -> list[LibraryItem]: return MediaManagerConfig().misc.movie_libraries -# ----------------------------------------------------------------------------- -# MOVIE REQUESTS -# ----------------------------------------------------------------------------- - - -@router.get( - "/requests", - dependencies=[Depends(current_active_user)], -) -def get_all_movie_requests(movie_service: movie_service_dep) -> list[RichMovieRequest]: - """ - Get all movie requests. - """ - return movie_service.get_all_movie_requests() - - -@router.post( - "/requests", - status_code=status.HTTP_201_CREATED, -) -def create_movie_request( - movie_service: movie_service_dep, - movie_request: CreateMovieRequest, - user: Annotated[UserRead, Depends(current_active_user)], -) -> MovieRequest: - """ - Create a new movie request. - """ - log.info( - f"User {user.email} is creating a movie request for {movie_request.movie_id}" - ) - movie_request: MovieRequest = MovieRequest.model_validate(movie_request) - movie_request.requested_by = user - if user.is_superuser: - movie_request.authorized = True - movie_request.authorized_by = user - - return movie_service.add_movie_request(movie_request=movie_request) - - -@router.put( - "/requests/{movie_request_id}", -) -def update_movie_request( - movie_service: movie_service_dep, - movie_request_id: MovieRequestId, - update_movie_request: MovieRequestBase, - user: Annotated[UserRead, Depends(current_active_user)], -) -> MovieRequest: - """ - Update an existing movie request. - """ - movie_request = movie_service.get_movie_request_by_id( - movie_request_id=movie_request_id - ) - if movie_request.requested_by.id != user.id or user.is_superuser: - movie_request.min_quality = update_movie_request.min_quality - movie_request.wanted_quality = update_movie_request.wanted_quality - - return movie_service.update_movie_request(movie_request=movie_request) - - -@router.patch("/requests/{movie_request_id}", status_code=status.HTTP_204_NO_CONTENT) -def authorize_request( - movie_service: movie_service_dep, - movie_request_id: MovieRequestId, - user: Annotated[UserRead, Depends(current_superuser)], - authorized_status: bool = False, -) -> None: - """ - Authorize or de-authorize a movie request. - """ - movie_request = movie_service.get_movie_request_by_id( - movie_request_id=movie_request_id - ) - movie_request.authorized = authorized_status - if authorized_status: - movie_request.authorized_by = user - else: - movie_request.authorized_by = None - movie_service.update_movie_request(movie_request=movie_request) - - -@router.delete( - "/requests/{movie_request_id}", - status_code=status.HTTP_204_NO_CONTENT, - dependencies=[Depends(current_superuser)], -) -def delete_movie_request( - movie_service: movie_service_dep, movie_request_id: MovieRequestId -) -> None: - """ - Delete a movie request. - """ - movie_service.delete_movie_request(movie_request_id=movie_request_id) - - # ----------------------------------------------------------------------------- # MOVIES - SINGLE RESOURCE # ----------------------------------------------------------------------------- diff --git a/media_manager/movies/schemas.py b/media_manager/movies/schemas.py index f63ee57..c3c0f14 100644 --- a/media_manager/movies/schemas.py +++ b/media_manager/movies/schemas.py @@ -2,14 +2,12 @@ import typing import uuid from uuid import UUID -from pydantic import BaseModel, ConfigDict, Field, model_validator +from pydantic import BaseModel, ConfigDict, Field -from media_manager.auth.schemas import UserRead from media_manager.torrent.models import Quality from media_manager.torrent.schemas import TorrentId, TorrentStatus MovieId = typing.NewType("MovieId", UUID) -MovieRequestId = typing.NewType("MovieRequestId", UUID) class Movie(BaseModel): @@ -40,38 +38,6 @@ class PublicMovieFile(MovieFile): imported: bool = False -class MovieRequestBase(BaseModel): - min_quality: Quality - wanted_quality: Quality - - @model_validator(mode="after") - def ensure_wanted_quality_is_eq_or_gt_min_quality(self) -> "MovieRequestBase": - if self.min_quality.value < self.wanted_quality.value: - msg = "wanted_quality must be equal to or lower than minimum_quality." - raise ValueError(msg) - return self - - -class CreateMovieRequest(MovieRequestBase): - movie_id: MovieId - - -class MovieRequest(MovieRequestBase): - model_config = ConfigDict(from_attributes=True) - - id: MovieRequestId = Field(default_factory=lambda: MovieRequestId(uuid.uuid4())) - - movie_id: MovieId - - requested_by: UserRead | None = None - authorized: bool = False - authorized_by: UserRead | None = None - - -class RichMovieRequest(MovieRequest): - movie: Movie - - class MovieTorrent(BaseModel): model_config = ConfigDict(from_attributes=True) diff --git a/media_manager/movies/service.py b/media_manager/movies/service.py index c6cd3b4..ba66f50 100644 --- a/media_manager/movies/service.py +++ b/media_manager/movies/service.py @@ -4,10 +4,9 @@ from pathlib import Path from typing import overload from sqlalchemy.exc import IntegrityError -from sqlalchemy.orm import Session from media_manager.config import MediaManagerConfig -from media_manager.database import SessionLocal, get_session +from media_manager.database import get_session from media_manager.exceptions import InvalidConfigError, NotFoundError, RenameError from media_manager.indexer.repository import IndexerRepository from media_manager.indexer.schemas import IndexerQueryResult, IndexerQueryResultId @@ -25,11 +24,8 @@ from media_manager.movies.schemas import ( Movie, MovieFile, MovieId, - MovieRequest, - MovieRequestId, PublicMovie, PublicMovieFile, - RichMovieRequest, RichMovieTorrent, ) from media_manager.notification.repository import NotificationRepository @@ -38,7 +34,6 @@ from media_manager.schemas import MediaImportSuggestion from media_manager.torrent.repository import TorrentRepository from media_manager.torrent.schemas import ( Quality, - QualityStrings, Torrent, TorrentStatus, ) @@ -89,44 +84,6 @@ class MovieService: metadata_provider.download_movie_poster_image(movie=saved_movie) return saved_movie - def add_movie_request(self, movie_request: MovieRequest) -> MovieRequest: - """ - Add a new movie request. - - :param movie_request: The movie request to add. - :return: The added movie request. - """ - return self.movie_repository.add_movie_request(movie_request=movie_request) - - def get_movie_request_by_id(self, movie_request_id: MovieRequestId) -> MovieRequest: - """ - Get a movie request by its ID. - - :param movie_request_id: The ID of the movie request. - :return: The movie request or None if not found. - """ - return self.movie_repository.get_movie_request( - movie_request_id=movie_request_id - ) - - def update_movie_request(self, movie_request: MovieRequest) -> MovieRequest: - """ - Update an existing movie request. - - :param movie_request: The movie request to update. - :return: The updated movie request. - """ - self.movie_repository.delete_movie_request(movie_request_id=movie_request.id) - return self.movie_repository.add_movie_request(movie_request=movie_request) - - def delete_movie_request(self, movie_request_id: MovieRequestId) -> None: - """ - Delete a movie request by its ID. - - :param movie_request_id: The ID of the movie request to delete. - """ - self.movie_repository.delete_movie_request(movie_request_id=movie_request_id) - def delete_movie( self, movie: Movie, @@ -391,14 +348,6 @@ class MovieService: external_id=external_id, metadata_provider=metadata_provider ) - def get_all_movie_requests(self) -> list[RichMovieRequest]: - """ - Get all movie requests. - - :return: A list of rich movie requests. - """ - return self.movie_repository.get_movie_requests() - def set_movie_library(self, movie: Movie, library: str) -> None: self.movie_repository.set_movie_library(movie_id=movie.id, library=library) @@ -471,65 +420,6 @@ class MovieService: self.torrent_service.resume_download(torrent=movie_torrent) return movie_torrent - def download_approved_movie_request( - self, movie_request: MovieRequest, movie: Movie - ) -> bool: - """ - Download an approved movie request. - - :param movie_request: The movie request to download. - :param movie: The Movie object. - :return: True if the download was successful, False otherwise. - :raises ValueError: If the movie request is not authorized. - """ - if not movie_request.authorized: - msg = "Movie request is not authorized" - raise ValueError(msg) - - log.info(f"Downloading approved movie request {movie_request.id}") - - torrents = self.get_all_available_torrents_for_movie(movie=movie) - available_torrents: list[IndexerQueryResult] = [] - - for torrent in torrents: - if ( - (torrent.quality.value < movie_request.wanted_quality.value) - or (torrent.quality.value > movie_request.min_quality.value) - or (torrent.seeders < 3) - ): - log.debug( - f"Skipping torrent {torrent.title} with quality {torrent.quality} for movie {movie.id}, because it does not match the requested quality {movie_request.wanted_quality}" - ) - else: - available_torrents.append(torrent) - log.debug( - f"Taking torrent {torrent.title} with quality {torrent.quality} for movie {movie.id} into consideration" - ) - - if len(available_torrents) == 0: - log.warning( - f"No torrents found for movie request {movie_request.id} with quality between {QualityStrings[movie_request.min_quality.name]} and {QualityStrings[movie_request.wanted_quality.name]}" - ) - return False - - available_torrents.sort() - - torrent = self.torrent_service.download(indexer_result=available_torrents[0]) - movie_file = MovieFile( - movie_id=movie.id, - quality=torrent.quality, - torrent_id=torrent.id, - file_path_suffix=QualityStrings[torrent.quality.name].value.upper(), - ) - try: - self.movie_repository.add_movie_file(movie_file=movie_file) - except IntegrityError: - log.warning( - f"Movie file for movie {movie.name} and torrent {torrent.title} already exists" - ) - self.delete_movie_request(movie_request.id) - return True - def get_movie_root_path(self, movie: Movie) -> Path: misc_config = MediaManagerConfig().misc movie_file_path = ( @@ -774,47 +664,6 @@ class MovieService: return importable_movies -def auto_download_all_approved_movie_requests() -> None: - """ - Auto download all approved movie requests. - This is a standalone function as it creates its own DB session. - """ - db: Session = SessionLocal() if SessionLocal else next(get_session()) - movie_repository = MovieRepository(db=db) - torrent_service = TorrentService(torrent_repository=TorrentRepository(db=db)) - indexer_service = IndexerService(indexer_repository=IndexerRepository(db=db)) - notification_service = NotificationService( - notification_repository=NotificationRepository(db=db) - ) - movie_service = MovieService( - movie_repository=movie_repository, - torrent_service=torrent_service, - indexer_service=indexer_service, - notification_service=notification_service, - ) - - log.info("Auto downloading all approved movie requests") - movie_requests = movie_repository.get_movie_requests() - log.info(f"Found {len(movie_requests)} movie requests to process") - count = 0 - - for movie_request in movie_requests: - if movie_request.authorized: - movie = movie_repository.get_movie_by_id(movie_id=movie_request.movie_id) - if movie_service.download_approved_movie_request( - movie_request=movie_request, movie=movie - ): - count += 1 - else: - log.info( - f"Could not download movie request {movie_request.id} for movie {movie.name}" - ) - - log.info(f"Auto downloaded {count} approved movie requests") - db.commit() - db.close() - - def import_all_movie_torrents() -> None: with next(get_session()) as db: movie_repository = MovieRepository(db=db) diff --git a/media_manager/scheduler.py b/media_manager/scheduler.py index 9c9618d..0d0f7cf 100644 --- a/media_manager/scheduler.py +++ b/media_manager/scheduler.py @@ -5,12 +5,10 @@ from apscheduler.triggers.cron import CronTrigger import media_manager.database from media_manager.config import MediaManagerConfig from media_manager.movies.service import ( - auto_download_all_approved_movie_requests, import_all_movie_torrents, update_all_movies_metadata, ) from media_manager.tv.service import ( - auto_download_all_approved_season_requests, import_all_show_torrents, update_all_non_ended_shows_metadata, ) @@ -23,7 +21,6 @@ def setup_scheduler(config: MediaManagerConfig) -> BackgroundScheduler: jobstores = {"default": SQLAlchemyJobStore(engine=media_manager.database.engine)} scheduler = BackgroundScheduler(jobstores=jobstores) every_15_minutes_trigger = CronTrigger(minute="*/15", hour="*") - daily_trigger = CronTrigger(hour=0, minute=0, jitter=60 * 60 * 24 * 2) weekly_trigger = CronTrigger( day_of_week="mon", hour=0, minute=0, jitter=60 * 60 * 24 * 2 ) @@ -39,18 +36,6 @@ def setup_scheduler(config: MediaManagerConfig) -> BackgroundScheduler: id="import_all_show_torrents", replace_existing=True, ) - scheduler.add_job( - auto_download_all_approved_season_requests, - daily_trigger, - id="auto_download_all_approved_season_requests", - replace_existing=True, - ) - scheduler.add_job( - auto_download_all_approved_movie_requests, - daily_trigger, - id="auto_download_all_approved_movie_requests", - replace_existing=True, - ) scheduler.add_job( update_all_movies_metadata, weekly_trigger, diff --git a/media_manager/tv/models.py b/media_manager/tv/models.py index ff557e4..bd108c4 100644 --- a/media_manager/tv/models.py +++ b/media_manager/tv/models.py @@ -3,7 +3,6 @@ from uuid import UUID from sqlalchemy import ForeignKey, PrimaryKeyConstraint, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship -from media_manager.auth.db import User from media_manager.database import Base from media_manager.torrent.models import Quality @@ -48,10 +47,6 @@ class Season(Base): back_populates="season", cascade="all, delete" ) - season_requests = relationship( - "SeasonRequest", back_populates="season", cascade="all, delete" - ) - class Episode(Base): __tablename__ = "episode" @@ -85,29 +80,3 @@ class EpisodeFile(Base): torrent = relationship("Torrent", back_populates="episode_files", uselist=False) episode = relationship("Episode", back_populates="episode_files", uselist=False) - - -class SeasonRequest(Base): - __tablename__ = "season_request" - __table_args__ = (UniqueConstraint("season_id", "wanted_quality"),) - id: Mapped[UUID] = mapped_column(primary_key=True) - season_id: Mapped[UUID] = mapped_column( - ForeignKey(column="season.id", ondelete="CASCADE"), - ) - wanted_quality: Mapped[Quality] - min_quality: Mapped[Quality] - requested_by_id: Mapped[UUID | None] = mapped_column( - ForeignKey(column="user.id", ondelete="SET NULL"), - ) - authorized: Mapped[bool] = mapped_column(default=False) - authorized_by_id: Mapped[UUID | None] = mapped_column( - ForeignKey(column="user.id", ondelete="SET NULL"), - ) - - requested_by: Mapped["User|None"] = relationship( - foreign_keys=[requested_by_id], uselist=False - ) - authorized_by: Mapped["User|None"] = relationship( - foreign_keys=[authorized_by_id], uselist=False - ) - season = relationship("Season", back_populates="season_requests", uselist=False) diff --git a/media_manager/tv/repository.py b/media_manager/tv/repository.py index ed0cc3d..1874df2 100644 --- a/media_manager/tv/repository.py +++ b/media_manager/tv/repository.py @@ -7,7 +7,7 @@ from media_manager.torrent.models import Torrent from media_manager.torrent.schemas import Torrent as TorrentSchema from media_manager.torrent.schemas import TorrentId from media_manager.tv import log -from media_manager.tv.models import Episode, EpisodeFile, Season, SeasonRequest, Show +from media_manager.tv.models import Episode, EpisodeFile, Season, Show from media_manager.tv.schemas import Episode as EpisodeSchema from media_manager.tv.schemas import EpisodeFile as EpisodeFileSchema from media_manager.tv.schemas import ( @@ -15,12 +15,9 @@ from media_manager.tv.schemas import ( EpisodeNumber, SeasonId, SeasonNumber, - SeasonRequestId, ShowId, ) -from media_manager.tv.schemas import RichSeasonRequest as RichSeasonRequestSchema from media_manager.tv.schemas import Season as SeasonSchema -from media_manager.tv.schemas import SeasonRequest as SeasonRequestSchema from media_manager.tv.schemas import Show as ShowSchema @@ -256,67 +253,6 @@ class TvRepository: ) raise - def add_season_request( - self, season_request: SeasonRequestSchema - ) -> SeasonRequestSchema: - """ - Adds a Season to the SeasonRequest table, which marks it as requested. - - :param season_request: The SeasonRequest object to add. - :return: The added SeasonRequest object. - :raises IntegrityError: If a similar request already exists or violates constraints. - :raises SQLAlchemyError: If a database error occurs. - """ - db_model = SeasonRequest( - id=season_request.id, - season_id=season_request.season_id, - wanted_quality=season_request.wanted_quality, - min_quality=season_request.min_quality, - requested_by_id=season_request.requested_by.id - if season_request.requested_by - else None, - authorized=season_request.authorized, - authorized_by_id=season_request.authorized_by.id - if season_request.authorized_by - else None, - ) - try: - self.db.add(db_model) - self.db.commit() - self.db.refresh(db_model) - return SeasonRequestSchema.model_validate(db_model) - except IntegrityError: - self.db.rollback() - log.exception("Integrity error while adding season request") - raise - except SQLAlchemyError: - self.db.rollback() - log.exception("Database error while adding season request") - raise - - def delete_season_request(self, season_request_id: SeasonRequestId) -> None: - """ - Removes a SeasonRequest by its ID. - - :param season_request_id: The ID of the season request to delete. - :raises NotFoundError: If the season request is not found. - :raises SQLAlchemyError: If a database error occurs. - """ - try: - stmt = delete(SeasonRequest).where(SeasonRequest.id == season_request_id) - result = self.db.execute(stmt) - if result.rowcount == 0: - self.db.rollback() - msg = f"SeasonRequest with id {season_request_id} not found." - raise NotFoundError(msg) - self.db.commit() - except SQLAlchemyError: - self.db.rollback() - log.exception( - f"Database error while deleting season request {season_request_id}" - ) - raise - def get_season_by_number(self, season_number: int, show_id: ShowId) -> SeasonSchema: """ Retrieve a season by its number and show ID. @@ -345,38 +281,6 @@ class TvRepository: ) raise - def get_season_requests(self) -> list[RichSeasonRequestSchema]: - """ - Retrieve all season requests. - - :return: A list of RichSeasonRequest objects. - :raises SQLAlchemyError: If a database error occurs. - """ - try: - stmt = select(SeasonRequest).options( - joinedload(SeasonRequest.requested_by), - joinedload(SeasonRequest.authorized_by), - joinedload(SeasonRequest.season).joinedload(Season.show), - ) - results = self.db.execute(stmt).scalars().unique().all() - return [ - RichSeasonRequestSchema( - id=SeasonRequestId(x.id), - min_quality=x.min_quality, - wanted_quality=x.wanted_quality, - season_id=SeasonId(x.season_id), - show=x.season.show, - season=x.season, - requested_by=x.requested_by, - authorized_by=x.authorized_by, - authorized=x.authorized, - ) - for x in results - ] - except SQLAlchemyError: - log.exception("Database error while retrieving season requests") - raise - def add_episode_file(self, episode_file: EpisodeFileSchema) -> EpisodeFileSchema: """ Adds an episode file record to the database. @@ -581,30 +485,6 @@ class TvRepository: ) raise - def get_season_request( - self, season_request_id: SeasonRequestId - ) -> SeasonRequestSchema: - """ - Retrieve a season request by its ID. - - :param season_request_id: The ID of the season request. - :return: A SeasonRequest object. - :raises NotFoundError: If the season request is not found. - :raises SQLAlchemyError: If a database error occurs. - """ - try: - request = self.db.get(SeasonRequest, season_request_id) - if not request: - log.warning(f"Season request with id {season_request_id} not found.") - msg = f"Season request with id {season_request_id} not found." - raise NotFoundError(msg) - return SeasonRequestSchema.model_validate(request) - except SQLAlchemyError: - log.exception( - f"Database error retrieving season request {season_request_id}" - ) - raise - def get_show_by_season_id(self, season_id: SeasonId) -> ShowSchema: """ Retrieve a show by one of its season's ID. diff --git a/media_manager/tv/router.py b/media_manager/tv/router.py index 41fcd65..eaf2a7b 100644 --- a/media_manager/tv/router.py +++ b/media_manager/tv/router.py @@ -1,10 +1,7 @@ from pathlib import Path -from typing import Annotated from fastapi import APIRouter, Depends, HTTPException, status -from media_manager.auth.db import User -from media_manager.auth.schemas import UserRead from media_manager.auth.users import current_active_user, current_superuser from media_manager.config import LibraryItem, MediaManagerConfig from media_manager.exceptions import MediaAlreadyExistsError, NotFoundError @@ -17,24 +14,18 @@ from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult from media_manager.schemas import MediaImportSuggestion from media_manager.torrent.schemas import Torrent from media_manager.torrent.utils import get_importable_media_directories -from media_manager.tv import log from media_manager.tv.dependencies import ( season_dep, show_dep, tv_service_dep, ) from media_manager.tv.schemas import ( - CreateSeasonRequest, PublicEpisodeFile, PublicShow, - RichSeasonRequest, RichShowTorrent, Season, - SeasonRequest, - SeasonRequestId, Show, ShowId, - UpdateSeasonRequest, ) router = APIRouter() @@ -278,110 +269,6 @@ def get_a_shows_torrents(show: show_dep, tv_service: tv_service_dep) -> RichShow return tv_service.get_torrents_for_show(show=show) -# ----------------------------------------------------------------------------- -# SEASONS - REQUESTS -# ----------------------------------------------------------------------------- - - -@router.get( - "/seasons/requests", - status_code=status.HTTP_200_OK, - dependencies=[Depends(current_active_user)], -) -def get_season_requests(tv_service: tv_service_dep) -> list[RichSeasonRequest]: - """ - Get all season requests. - """ - return tv_service.get_all_season_requests() - - -@router.post("/seasons/requests", status_code=status.HTTP_204_NO_CONTENT) -def request_a_season( - user: Annotated[User, Depends(current_active_user)], - season_request: CreateSeasonRequest, - tv_service: tv_service_dep, -) -> None: - """ - Create a new season request. - """ - request: SeasonRequest = SeasonRequest.model_validate(season_request) - request.requested_by = UserRead.model_validate(user) - if user.is_superuser: - request.authorized = True - request.authorized_by = UserRead.model_validate(user) - tv_service.add_season_request(request) - return - - -@router.put("/seasons/requests", status_code=status.HTTP_204_NO_CONTENT) -def update_request( - tv_service: tv_service_dep, - user: Annotated[User, Depends(current_active_user)], - season_request: UpdateSeasonRequest, -) -> None: - """ - Update an existing season request. - """ - updated_season_request: SeasonRequest = SeasonRequest.model_validate(season_request) - request = tv_service.get_season_request_by_id( - season_request_id=updated_season_request.id - ) - if request.requested_by.id == user.id or user.is_superuser: - updated_season_request.requested_by = UserRead.model_validate(user) - tv_service.update_season_request(season_request=updated_season_request) - return - - -@router.patch( - "/seasons/requests/{season_request_id}", status_code=status.HTTP_204_NO_CONTENT -) -def authorize_request( - tv_service: tv_service_dep, - user: Annotated[User, Depends(current_superuser)], - season_request_id: SeasonRequestId, - authorized_status: bool = False, -) -> None: - """ - Authorize or de-authorize a season request. - """ - season_request = tv_service.get_season_request_by_id( - season_request_id=season_request_id - ) - if not season_request: - raise NotFoundError - season_request.authorized_by = UserRead.model_validate(user) - season_request.authorized = authorized_status - if not authorized_status: - season_request.authorized_by = None - tv_service.update_season_request(season_request=season_request) - - -@router.delete( - "/seasons/requests/{request_id}", - status_code=status.HTTP_204_NO_CONTENT, -) -def delete_season_request( - tv_service: tv_service_dep, - user: Annotated[User, Depends(current_active_user)], - request_id: SeasonRequestId, -) -> None: - """ - Delete a season request. - """ - request = tv_service.get_season_request_by_id(season_request_id=request_id) - if user.is_superuser or request.requested_by.id == user.id: - tv_service.delete_season_request(season_request_id=request_id) - log.info(f"User {user.id} deleted season request {request_id}.") - return - log.warning( - f"User {user.id} tried to delete season request {request_id} but is not authorized." - ) - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail="Not authorized to delete this request", - ) - - # ----------------------------------------------------------------------------- # SEASONS # ----------------------------------------------------------------------------- diff --git a/media_manager/tv/schemas.py b/media_manager/tv/schemas.py index d1f2959..c909668 100644 --- a/media_manager/tv/schemas.py +++ b/media_manager/tv/schemas.py @@ -2,9 +2,8 @@ import typing import uuid from uuid import UUID -from pydantic import BaseModel, ConfigDict, Field, model_validator +from pydantic import BaseModel, ConfigDict, Field -from media_manager.auth.schemas import UserRead from media_manager.torrent.models import Quality from media_manager.torrent.schemas import TorrentId, TorrentStatus @@ -14,7 +13,6 @@ EpisodeId = typing.NewType("EpisodeId", UUID) SeasonNumber = typing.NewType("SeasonNumber", int) EpisodeNumber = typing.NewType("EpisodeNumber", int) -SeasonRequestId = typing.NewType("SeasonRequestId", UUID) class Episode(BaseModel): @@ -63,42 +61,6 @@ class Show(BaseModel): seasons: list[Season] -class SeasonRequestBase(BaseModel): - min_quality: Quality - wanted_quality: Quality - - @model_validator(mode="after") - def ensure_wanted_quality_is_eq_or_gt_min_quality(self) -> "SeasonRequestBase": - if self.min_quality.value < self.wanted_quality.value: - msg = "wanted_quality must be equal to or lower than minimum_quality." - raise ValueError(msg) - return self - - -class CreateSeasonRequest(SeasonRequestBase): - season_id: SeasonId - - -class UpdateSeasonRequest(SeasonRequestBase): - id: SeasonRequestId - - -class SeasonRequest(SeasonRequestBase): - model_config = ConfigDict(from_attributes=True) - - id: SeasonRequestId = Field(default_factory=lambda: SeasonRequestId(uuid.uuid4())) - - season_id: SeasonId - requested_by: UserRead | None = None - authorized: bool = False - authorized_by: UserRead | None = None - - -class RichSeasonRequest(SeasonRequest): - show: Show - season: Season - - class EpisodeFile(BaseModel): model_config = ConfigDict(from_attributes=True) diff --git a/media_manager/tv/service.py b/media_manager/tv/service.py index de417a4..c84ab6c 100644 --- a/media_manager/tv/service.py +++ b/media_manager/tv/service.py @@ -25,7 +25,6 @@ from media_manager.schemas import MediaImportSuggestion from media_manager.torrent.repository import TorrentRepository from media_manager.torrent.schemas import ( Quality, - QualityStrings, Torrent, TorrentStatus, ) @@ -48,17 +47,13 @@ from media_manager.tv.schemas import ( PublicEpisodeFile, PublicSeason, PublicShow, - RichSeasonRequest, RichSeasonTorrent, RichShowTorrent, Season, SeasonId, - SeasonRequest, - SeasonRequestId, Show, ShowId, ) -from media_manager.tv.schemas import Episode as EpisodeSchema class TvService: @@ -94,28 +89,6 @@ class TvService: metadata_provider.download_show_poster_image(show=saved_show) return saved_show - def add_season_request(self, season_request: SeasonRequest) -> SeasonRequest: - """ - Add a new season request. - - :param season_request: The season request to add. - :return: The added season request. - """ - return self.tv_repository.add_season_request(season_request=season_request) - - def get_season_request_by_id( - self, season_request_id: SeasonRequestId - ) -> SeasonRequest | None: - """ - Get a season request by its ID. - - :param season_request_id: The ID of the season request. - :return: The season request or None if not found. - """ - return self.tv_repository.get_season_request( - season_request_id=season_request_id - ) - def get_total_downloaded_episoded_count(self) -> int: """ Get total number of downloaded episodes. @@ -123,27 +96,9 @@ class TvService: return self.tv_repository.get_total_downloaded_episodes_count() - def update_season_request(self, season_request: SeasonRequest) -> SeasonRequest: - """ - Update an existing season request. - - :param season_request: The season request to update. - :return: The updated season request. - """ - self.tv_repository.delete_season_request(season_request_id=season_request.id) - return self.tv_repository.add_season_request(season_request=season_request) - def set_show_library(self, show: Show, library: str) -> None: self.tv_repository.set_show_library(show_id=show.id, library=library) - def delete_season_request(self, season_request_id: SeasonRequestId) -> None: - """ - Delete a season request by its ID. - - :param season_request_id: The ID of the season request to delete. - """ - self.tv_repository.delete_season_request(season_request_id=season_request_id) - def delete_show( self, show: Show, @@ -498,14 +453,6 @@ class TvService: """ return self.tv_repository.get_season_by_episode(episode_id=episode_id) - def get_all_season_requests(self) -> list[RichSeasonRequest]: - """ - Get all season requests. - - :return: A list of rich season requests. - """ - return self.tv_repository.get_season_requests() - def get_torrents_for_show(self, show: Show) -> RichShowTorrent: """ Get torrents for a given show. @@ -632,72 +579,6 @@ class TvService: return show_torrent - def download_approved_season_request( - self, season_request: SeasonRequest, show: Show - ) -> bool: - """ - Download an approved season request. - - :param season_request: The season request to download. - :param show: The Show object. - :return: True if the download was successful, False otherwise. - :raises ValueError: If the season request is not authorized. - """ - if not season_request.authorized: - msg = f"Season request {season_request.id} is not authorized for download" - raise ValueError(msg) - - log.info(f"Downloading approved season request {season_request.id}") - - season = self.get_season(season_id=season_request.season_id) - torrents = self.get_all_available_torrents_for_a_season( - season_number=season.number, show_id=show.id - ) - available_torrents: list[IndexerQueryResult] = [] - - for torrent in torrents: - if ( - (torrent.quality.value < season_request.wanted_quality.value) - or (torrent.quality.value > season_request.min_quality.value) - or (torrent.seeders < 3) - ): - log.info( - f"Skipping torrent {torrent.title} with quality {torrent.quality} for season {season.id}, because it does not match the requested quality {season_request.wanted_quality}" - ) - elif torrent.season != [season.number]: - log.info( - f"Skipping torrent {torrent.title} with quality {torrent.quality} for season {season.id}, because it contains to many/wrong seasons {torrent.season} (wanted: {season.number})" - ) - else: - available_torrents.append(torrent) - log.info( - f"Taking torrent {torrent.title} with quality {torrent.quality} for season {season.id} into consideration" - ) - - if len(available_torrents) == 0: - log.warning( - f"No torrents matching criteria were found (wanted quality: {season_request.wanted_quality}, min_quality: {season_request.min_quality} for season {season.id})" - ) - return False - - available_torrents.sort() - - torrent = self.torrent_service.download(indexer_result=available_torrents[0]) - season_file = SeasonFile( # noqa: F821 - season_id=season.id, - quality=torrent.quality, - torrent_id=torrent.id, - file_path_suffix=QualityStrings[torrent.quality.name].value.upper(), - ) - try: - self.tv_repository.add_season_file(season_file=season_file) - except IntegrityError: - log.warning( - f"Season file for season {season.id} and quality {torrent.quality} already exists, skipping." - ) - self.delete_season_request(season_request.id) - return True - def get_root_show_directory(self, show: Show) -> Path: misc_config = MediaManagerConfig().misc show_directory_name = f"{remove_special_characters(show.name)} ({show.year}) [{show.metadata_provider}id-{show.external_id}]" @@ -1056,7 +937,7 @@ class TvService: log.debug( f"Adding new episode {fresh_episode_data.number} to season {existing_season.number}" ) - episode_schema = EpisodeSchema( + episode_schema = Episode( id=EpisodeId(fresh_episode_data.id), number=fresh_episode_data.number, external_id=fresh_episode_data.external_id, @@ -1072,7 +953,7 @@ class TvService: f"Adding new season {fresh_season_data.number} to show {db_show.name}" ) episodes_for_schema = [ - EpisodeSchema( + Episode( id=EpisodeId(ep_data.id), number=ep_data.number, external_id=ep_data.external_id, @@ -1190,49 +1071,6 @@ class TvService: return import_suggestions -def auto_download_all_approved_season_requests() -> None: - """ - Auto download all approved season requests. - This is a standalone function as it creates its own DB session. - """ - with next(get_session()) as db: - tv_repository = TvRepository(db=db) - torrent_service = TorrentService(torrent_repository=TorrentRepository(db=db)) - indexer_service = IndexerService(indexer_repository=IndexerRepository(db=db)) - notification_service = NotificationService( - notification_repository=NotificationRepository(db=db) - ) - tv_service = TvService( - tv_repository=tv_repository, - torrent_service=torrent_service, - indexer_service=indexer_service, - notification_service=notification_service, - ) - - log.info("Auto downloading all approved season requests") - season_requests = tv_repository.get_season_requests() - log.info(f"Found {len(season_requests)} season requests to process") - count = 0 - - for season_request in season_requests: - if season_request.authorized: - log.info(f"Processing season request {season_request.id} for download") - show = tv_repository.get_show_by_season_id( - season_id=season_request.season_id - ) - if tv_service.download_approved_season_request( - season_request=season_request, show=show - ): - count += 1 - else: - log.warning( - f"Failed to download season request {season_request.id} for show {show.name}" - ) - - log.info(f"Auto downloaded {count} approved season requests") - db.commit() - - def import_all_show_torrents() -> None: with next(get_session()) as db: tv_repository = TvRepository(db=db) @@ -1310,30 +1148,8 @@ def update_all_non_ended_shows_metadata() -> None: db_show=show, metadata_provider=metadata_provider ) - # Automatically add season requests for new seasons - existing_seasons = [x.id for x in show.seasons] - new_seasons = [ - x for x in updated_show.seasons if x.id not in existing_seasons - ] - - if show.continuous_download: - for new_season in new_seasons: - log.info( - f"Automatically adding season request for new season {new_season.number} of show {updated_show.name}" - ) - tv_service.add_season_request( - SeasonRequest( - min_quality=Quality.sd, - wanted_quality=Quality.uhd, - season_id=new_season.id, - authorized=True, - ) - ) - if updated_show: - log.debug( - f"Added new seasons: {len(new_seasons)} to show: {updated_show.name}" - ) + log.debug("Updated show metadata", extra={"show": updated_show.name}) else: log.warning(f"Failed to update metadata for show: {show.name}") db.commit() diff --git a/web/package-lock.json b/web/package-lock.json index 9f01333..ea94a67 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -87,13 +87,13 @@ "license": "MIT" }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -112,9 +112,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", "dev": true, "license": "MIT", "optional": true, @@ -123,9 +123,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "dev": true, "license": "MIT", "optional": true, @@ -576,9 +576,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -717,9 +717,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", "dev": true, "license": "MIT", "engines": { @@ -761,9 +761,9 @@ "license": "MIT" }, "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", "dev": true, "license": "MIT", "dependencies": { @@ -771,13 +771,13 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", "dev": true, "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.3", + "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, @@ -1358,9 +1358,9 @@ } }, "node_modules/@internationalized/date": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.0.tgz", - "integrity": "sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.11.0.tgz", + "integrity": "sha512-BOx5huLAWhicM9/ZFs84CzP+V3gBW6vlpM02yzsdYC7TGlZJX1OJiEEHcSayF00Z+3jLlm4w79amvSt6RqKN3Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1447,9 +1447,9 @@ "license": "MIT" }, "node_modules/@redocly/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-EDtsGZS964mf9zAUXAl9Ew16eYbeyAFWhsPr0fX6oaJxgd8rApYlPBf0joyhnUHz88WxrigyFtTaqqzXNzPgqw==", + "version": "8.17.4", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.17.4.tgz", + "integrity": "sha512-BieiCML/IgP6x99HZByJSt7fJE4ipgzO7KAFss92Bs+PEI35BhY7vGIysFXLT+YmS7nHtQjZjhOQyPPEf7xGHA==", "dev": true, "license": "MIT", "dependencies": { @@ -1478,9 +1478,9 @@ "license": "MIT" }, "node_modules/@redocly/openapi-core": { - "version": "1.34.6", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.6.tgz", - "integrity": "sha512-2+O+riuIUgVSuLl3Lyh5AplWZyVMNuG2F98/o6NrutKJfW4/GTZdPpZlIphS0HGgcOHgmWcCSHj+dWFlZaGSHw==", + "version": "1.34.7", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.7.tgz", + "integrity": "sha512-gn2P0OER6qxF/+f4GqNv9XsnU5+6oszD/0SunulOvPYJDhrNkNVrVZV5waX25uqw5UDn2+roViWlRDHKFfHH0g==", "dev": true, "license": "MIT", "dependencies": { @@ -1510,9 +1510,9 @@ } }, "node_modules/@redocly/openapi-core/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz", + "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==", "dev": true, "license": "ISC", "dependencies": { @@ -1546,9 +1546,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -1560,9 +1560,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -1574,9 +1574,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], @@ -1588,9 +1588,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -1602,9 +1602,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], @@ -1616,9 +1616,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], @@ -1630,9 +1630,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], @@ -1644,9 +1644,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], @@ -1658,9 +1658,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], @@ -1672,9 +1672,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -1686,9 +1686,23 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], @@ -1700,9 +1714,23 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], @@ -1714,9 +1742,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], @@ -1728,9 +1756,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], @@ -1742,9 +1770,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], @@ -1756,9 +1784,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], @@ -1770,9 +1798,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], @@ -1783,10 +1811,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], @@ -1798,9 +1840,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -1812,9 +1854,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -1826,9 +1868,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], @@ -1840,9 +1882,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -1885,16 +1927,16 @@ "license": "MIT" }, "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true, "license": "MIT" }, "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", - "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", "license": "MIT", "peerDependencies": { "acorn": "^8.9.0" @@ -1940,9 +1982,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "2.51.0", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.51.0.tgz", - "integrity": "sha512-BkcfxVVYmfxHGYLugemb7TWW+y/MNZbxXHXJ141lyyi2ozq0Q4kbqoV0cBGlh7F0vNtCMvfr7UPnxIaBjcP9gg==", + "version": "2.53.0", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.53.0.tgz", + "integrity": "sha512-Brh/9h8QEg7rWIj+Nnz/2sC49NUeS8g3Qd9H5dTO3EbWG8vCEUl06jE+r5jQVDMHdr1swmCkwZkONFsWelGTpQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1951,12 +1993,11 @@ "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", - "devalue": "^5.6.2", + "devalue": "^5.6.3", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", - "sade": "^1.8.1", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, @@ -1968,10 +2009,10 @@ }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3", - "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "peerDependenciesMeta": { "@opentelemetry/api": { @@ -1983,16 +2024,16 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", - "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.4.tgz", + "integrity": "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==", "dev": true, "license": "MIT", "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", - "debug": "^4.4.1", "deepmerge": "^4.3.1", - "magic-string": "^0.30.17", + "magic-string": "^0.30.21", + "obug": "^2.1.0", "vitefu": "^1.1.1" }, "engines": { @@ -2004,13 +2045,13 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz", - "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.2.tgz", + "integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.1" + "obug": "^2.1.0" }, "engines": { "node": "^20.19 || ^22.12 || >=24" @@ -2022,9 +2063,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", + "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2042,9 +2083,9 @@ } }, "node_modules/@tailwindcss/forms": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.11.tgz", + "integrity": "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==", "dev": true, "license": "MIT", "dependencies": { @@ -2055,49 +2096,49 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz", - "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.0.tgz", + "integrity": "sha512-Yv+fn/o2OmL5fh/Ir62VXItdShnUxfpkMA4Y7jdeC8O81WPB8Kf6TT6GSHvnqgSwDzlB5iT7kDpeXxLsUS0T6Q==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "enhanced-resolve": "^5.18.3", + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", - "lightningcss": "1.30.2", + "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.1.17" + "tailwindcss": "4.2.0" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", - "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.0.tgz", + "integrity": "sha512-AZqQzADaj742oqn2xjl5JbIOzZB/DGCYF/7bpvhA8KvjUj9HJkag6bBuwZvH1ps6dfgxNHyuJVlzSr2VpMgdTQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.17", - "@tailwindcss/oxide-darwin-arm64": "4.1.17", - "@tailwindcss/oxide-darwin-x64": "4.1.17", - "@tailwindcss/oxide-freebsd-x64": "4.1.17", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", - "@tailwindcss/oxide-linux-x64-musl": "4.1.17", - "@tailwindcss/oxide-wasm32-wasi": "4.1.17", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" + "@tailwindcss/oxide-android-arm64": "4.2.0", + "@tailwindcss/oxide-darwin-arm64": "4.2.0", + "@tailwindcss/oxide-darwin-x64": "4.2.0", + "@tailwindcss/oxide-freebsd-x64": "4.2.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.0", + "@tailwindcss/oxide-linux-x64-musl": "4.2.0", + "@tailwindcss/oxide-wasm32-wasi": "4.2.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.0" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz", - "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.0.tgz", + "integrity": "sha512-F0QkHAVaW/JNBWl4CEKWdZ9PMb0khw5DCELAOnu+RtjAfx5Zgw+gqCHFvqg3AirU1IAd181fwOtJQ5I8Yx5wtw==", "cpu": [ "arm64" ], @@ -2108,13 +2149,13 @@ "android" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz", - "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.0.tgz", + "integrity": "sha512-I0QylkXsBsJMZ4nkUNSR04p6+UptjcwhcVo3Zu828ikiEqHjVmQL9RuQ6uT/cVIiKpvtVA25msu/eRV97JeNSA==", "cpu": [ "arm64" ], @@ -2125,13 +2166,13 @@ "darwin" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz", - "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.0.tgz", + "integrity": "sha512-6TmQIn4p09PBrmnkvbYQ0wbZhLtbaksCDx7Y7R3FYYx0yxNA7xg5KP7dowmQ3d2JVdabIHvs3Hx4K3d5uCf8xg==", "cpu": [ "x64" ], @@ -2142,13 +2183,13 @@ "darwin" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz", - "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.0.tgz", + "integrity": "sha512-qBudxDvAa2QwGlq9y7VIzhTvp2mLJ6nD/G8/tI70DCDoneaUeLWBJaPcbfzqRIWraj+o969aDQKvKW9dvkUizw==", "cpu": [ "x64" ], @@ -2159,13 +2200,13 @@ "freebsd" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz", - "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.0.tgz", + "integrity": "sha512-7XKkitpy5NIjFZNUQPeUyNJNJn1CJeV7rmMR+exHfTuOsg8rxIO9eNV5TSEnqRcaOK77zQpsyUkBWmPy8FgdSg==", "cpu": [ "arm" ], @@ -2176,13 +2217,13 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz", - "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.0.tgz", + "integrity": "sha512-Mff5a5Q3WoQR01pGU1gr29hHM1N93xYrKkGXfPw/aRtK4bOc331Ho4Tgfsm5WDGvpevqMpdlkCojT3qlCQbCpA==", "cpu": [ "arm64" ], @@ -2193,13 +2234,13 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz", - "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.0.tgz", + "integrity": "sha512-XKcSStleEVnbH6W/9DHzZv1YhjE4eSS6zOu2eRtYAIh7aV4o3vIBs+t/B15xlqoxt6ef/0uiqJVB6hkHjWD/0A==", "cpu": [ "arm64" ], @@ -2210,13 +2251,13 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz", - "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.0.tgz", + "integrity": "sha512-/hlXCBqn9K6fi7eAM0RsobHwJYa5V/xzWspVTzxnX+Ft9v6n+30Pz8+RxCn7sQL/vRHHLS30iQPrHQunu6/vJA==", "cpu": [ "x64" ], @@ -2227,13 +2268,13 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz", - "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.0.tgz", + "integrity": "sha512-lKUaygq4G7sWkhQbfdRRBkaq4LY39IriqBQ+Gk6l5nKq6Ay2M2ZZb1tlIyRNgZKS8cbErTwuYSor0IIULC0SHw==", "cpu": [ "x64" ], @@ -2244,13 +2285,13 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz", - "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.0.tgz", + "integrity": "sha512-xuDjhAsFdUuFP5W9Ze4k/o4AskUtI8bcAGU4puTYprr89QaYFmhYOPfP+d1pH+k9ets6RoE23BXZM1X1jJqoyw==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -2266,81 +2307,21 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.6.0", - "@emnapi/runtime": "^1.6.0", + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.0.7", + "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.4.0" + "tslib": "^2.8.1" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@tybys/wasm-util": "^0.10.1" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { - "version": "2.8.1", - "dev": true, - "inBundle": true, - "license": "0BSD", - "optional": true - }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz", - "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.0.tgz", + "integrity": "sha512-2UU/15y1sWDEDNJXxEIrfWKC2Yb4YgIW5Xz2fKFqGzFWfoMHWFlfa1EJlGO2Xzjkq/tvSarh9ZTjvbxqWvLLXA==", "cpu": [ "arm64" ], @@ -2351,13 +2332,13 @@ "win32" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz", - "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.0.tgz", + "integrity": "sha512-CrFadmFoc+z76EV6LPG1jx6XceDsaCG3lFhyLNo/bV9ByPrE+FnBPckXQVP4XRkN76h3Fjt/a+5Er/oA/nCBvQ==", "cpu": [ "x64" ], @@ -2368,7 +2349,7 @@ "win32" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/typography": { @@ -2385,15 +2366,15 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.17.tgz", - "integrity": "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.0.tgz", + "integrity": "sha512-da9mFCaHpoOgtQiWtDGIikTrSpUFBtIZCG3jy/u2BGV+l/X1/pbxzmIUxNt6JWm19N3WtGi4KlJdSH/Si83WOA==", "dev": true, "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.1.17", - "@tailwindcss/oxide": "4.1.17", - "tailwindcss": "4.1.17" + "@tailwindcss/node": "4.2.0", + "@tailwindcss/oxide": "4.2.0", + "tailwindcss": "4.2.0" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" @@ -2480,20 +2461,20 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.49.0.tgz", - "integrity": "sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", + "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.49.0", - "@typescript-eslint/type-utils": "8.49.0", - "@typescript-eslint/utils": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/type-utils": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2503,8 +2484,8 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.49.0", - "eslint": "^8.57.0 || ^9.0.0", + "@typescript-eslint/parser": "^8.56.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, @@ -2519,17 +2500,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.49.0.tgz", - "integrity": "sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", + "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.49.0", - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/typescript-estree": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2539,20 +2520,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.49.0.tgz", - "integrity": "sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", + "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.49.0", - "@typescript-eslint/types": "^8.49.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.56.0", + "@typescript-eslint/types": "^8.56.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2566,14 +2547,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.49.0.tgz", - "integrity": "sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", + "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0" + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2584,9 +2565,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.49.0.tgz", - "integrity": "sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", + "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", "dev": true, "license": "MIT", "engines": { @@ -2601,17 +2582,17 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.49.0.tgz", - "integrity": "sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", + "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/typescript-estree": "8.49.0", - "@typescript-eslint/utils": "8.49.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2621,14 +2602,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.49.0.tgz", - "integrity": "sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", + "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", "dev": true, "license": "MIT", "engines": { @@ -2640,21 +2621,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.49.0.tgz", - "integrity": "sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", + "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.49.0", - "@typescript-eslint/tsconfig-utils": "8.49.0", - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", + "@typescript-eslint/project-service": "8.56.0", + "@typescript-eslint/tsconfig-utils": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2667,24 +2648,37 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -2694,16 +2688,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.49.0.tgz", - "integrity": "sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", + "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.49.0", - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/typescript-estree": "8.49.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2713,19 +2707,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.49.0.tgz", - "integrity": "sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", + "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.49.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.56.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2735,6 +2729,19 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@vinejs/compiler": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@vinejs/compiler/-/compiler-2.5.1.tgz", @@ -2766,9 +2773,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -2798,9 +2805,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -2815,9 +2822,9 @@ } }, "node_modules/animejs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/animejs/-/animejs-4.2.2.tgz", - "integrity": "sha512-Ys3RuvLdAeI14fsdKCQy7ytu4057QX6Bb7m4jwmfd6iKmUmLquTwk1ut0e4NtRQgCeq/s2Lv5+oMBjz6c7ZuIg==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/animejs/-/animejs-4.3.6.tgz", + "integrity": "sha512-rzZ4bDc8JAtyx6hYwxj7s5M/yWfnM5qqY4hZDnhy1cWFvMb6H5/necHS2sbCY3WQTDbRLuZL10dPXSxSCFOr/w==", "license": "MIT", "funding": { "type": "github", @@ -2889,9 +2896,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "version": "10.4.24", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", "dev": true, "funding": [ { @@ -2909,10 +2916,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", "fraction.js": "^5.3.4", - "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -2943,13 +2949,16 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.6.tgz", - "integrity": "sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/bits-ui": { @@ -3048,9 +3057,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001760", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", - "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", + "version": "1.0.30001772", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001772.tgz", + "integrity": "sha512-mIwLZICj+ntVTw4BT2zfp+yu/AqV6GMKfJVJMx3MwPxs+uk/uj2GLl2dH8LQbjiLDX66amCga5nKFyDgRR43kg==", "dev": true, "funding": [ { @@ -3274,9 +3283,9 @@ "license": "MIT" }, "node_modules/effect": { - "version": "3.19.18", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.19.18.tgz", - "integrity": "sha512-KlbNuYzzwpOpnpshIhjCaqweQkthAT1oVG61Z2wIHqo6Sb6n/+pgzFXyTvsLyxcx5Cg3aWaQXa0XQHMuzdVW4A==", + "version": "3.19.19", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.19.19.tgz", + "integrity": "sha512-Yc8U/SVXo2dHnaP7zNBlAo83h/nzSJpi7vph6Hzyl4ulgMBIgPmz3UzOjb9sBgpFE00gC0iETR244sfXDNLHRg==", "dev": true, "license": "MIT", "optional": true, @@ -3286,9 +3295,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", "dev": true, "license": "ISC" }, @@ -3324,14 +3333,14 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" @@ -3403,9 +3412,9 @@ } }, "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", "dependencies": { @@ -3415,7 +3424,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", + "@eslint/js": "9.39.3", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -3479,9 +3488,9 @@ } }, "node_modules/eslint-plugin-svelte": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.13.1.tgz", - "integrity": "sha512-Ng+kV/qGS8P/isbNYVE3sJORtubB+yLEcYICMkUWNaDTb0SwZni/JhAYXh/Dz/q2eThUwWY0VMPZ//KYD1n3eQ==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.15.0.tgz", + "integrity": "sha512-QKB7zqfuB8aChOfBTComgDptMf2yxiJx7FE04nneCmtQzgTHvY8UJkuh8J2Rz7KB9FFV9aTHX6r7rdYGvG8T9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3503,7 +3512,7 @@ "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { - "eslint": "^8.57.1 || ^9.0.0", + "eslint": "^8.57.1 || ^9.0.0 || ^10.0.0", "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { @@ -3580,9 +3589,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4137,16 +4146,16 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.12.31", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.31.tgz", - "integrity": "sha512-Z3IhgVgrqO1S5xPYM3K5XwbkDasU67/Vys4heW+lfSBALcUZjeIIzI8zCLifY+OCzSq+fpDdywMDa7z+4srJPQ==", + "version": "1.12.37", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.37.tgz", + "integrity": "sha512-rDU6bkpuMs8YRt/UpkuYEAsYSoNuDEbrE41I3KNvmXREGH6DGBJ8Wbak4by29wNOQ27zk4g4HL82zf0OGhwRuw==", "dev": true, "license": "MIT" }, "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -4160,23 +4169,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", "cpu": [ "arm64" ], @@ -4195,9 +4204,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", "cpu": [ "arm64" ], @@ -4216,9 +4225,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", "cpu": [ "x64" ], @@ -4237,9 +4246,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", "cpu": [ "x64" ], @@ -4258,9 +4267,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", "cpu": [ "arm" ], @@ -4279,9 +4288,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", "cpu": [ "arm64" ], @@ -4300,9 +4309,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", "cpu": [ "arm64" ], @@ -4321,9 +4330,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", "cpu": [ "x64" ], @@ -4342,9 +4351,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", "cpu": [ "x64" ], @@ -4363,9 +4372,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", "cpu": [ "arm64" ], @@ -4384,9 +4393,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", "cpu": [ "x64" ], @@ -4479,9 +4488,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "license": "ISC", "dependencies": { @@ -4581,20 +4590,10 @@ "dev": true, "license": "MIT" }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/normalize-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", - "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "dev": true, "license": "MIT", "engines": { @@ -4604,6 +4603,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/openapi-fetch": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.14.1.tgz", @@ -4614,13 +4624,13 @@ } }, "node_modules/openapi-typescript": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.10.1.tgz", - "integrity": "sha512-rBcU8bjKGGZQT4K2ekSTY2Q5veOQbVG/lTKZ49DeCyT9z62hM2Vj/LLHjDHC9W7LJG8YMHcdXpRZDqC1ojB/lw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.13.0.tgz", + "integrity": "sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==", "dev": true, "license": "MIT", "dependencies": { - "@redocly/openapi-core": "^1.34.5", + "@redocly/openapi-core": "^1.34.6", "ansi-colors": "^4.1.3", "change-case": "^5.4.4", "parse-json": "^8.3.0", @@ -4991,9 +5001,9 @@ } }, "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", "bin": { @@ -5007,9 +5017,9 @@ } }, "node_modules/prettier-plugin-svelte": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.4.1.tgz", - "integrity": "sha512-xL49LCloMoZRvSwa6IEdN2GV6cq2IqpYGstYtMT+5wmml1/dClEoI0MZR78MiVPpu6BdQFfN0/y73yO6+br5Pg==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.5.0.tgz", + "integrity": "sha512-2lLO/7EupnjO/95t+XZesXs8Bf3nYLIDfCo270h5QWbj/vjLqmrQ1LiRk9LPggxSDsnVYfehamZNf+rgQYApZg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -5166,9 +5176,9 @@ } }, "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", "dependencies": { @@ -5182,28 +5192,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, @@ -5237,9 +5250,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -5396,9 +5409,9 @@ } }, "node_modules/svelte": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.53.0.tgz", - "integrity": "sha512-7dhHkSamGS2vtoBmIW2hRab+gl5Z60alEHZB4910ePqqJNxAWnDAxsofVmlZ2tREmWyHNE+A1nCKwICAquoD2A==", + "version": "5.53.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.53.2.tgz", + "integrity": "sha512-yGONuIrcl/BMmqbm6/52Q/NYzfkta7uVlos5NSzGTfNJTTFtPPzra6rAQoQIwAqupeM3s9uuTf5PvioeiCdg9g==", "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.4", @@ -5423,9 +5436,9 @@ } }, "node_modules/svelte-check": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.4.tgz", - "integrity": "sha512-DVWvxhBrDsd+0hHWKfjP99lsSXASeOhHJYyuKOFYJcP7ThfSCKgjVarE8XfuMWpS5JV3AlDf+iK1YGGo2TACdw==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.3.tgz", + "integrity": "sha512-4HtdEv2hOoLCEsSXI+RDELk9okP/4sImWa7X02OjMFFOWeSdFF3NFy3vqpw0z+eH9C88J9vxZfUXz/Uv2A1ANw==", "dev": true, "license": "MIT", "dependencies": { @@ -5555,9 +5568,9 @@ } }, "node_modules/sveltekit-superforms": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/sveltekit-superforms/-/sveltekit-superforms-2.29.1.tgz", - "integrity": "sha512-9Cv1beOVPgm8rb8NZBqLdlZ9cBqRBTk0+6/oHn7DWvHQoAFie1EPjh1e4NHO3Qouv1Zq9QTGrZNDbYcetkuOVw==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/sveltekit-superforms/-/sveltekit-superforms-2.30.0.tgz", + "integrity": "sha512-EzXD7sHbi7yBU/eNtzVm6P6axcrVM8BArkbiT96Vdx48s5m4KXte/tbbp3UULtEW8Nk9wt2hYkGeq7nDBwVceg==", "dev": true, "funding": [ { @@ -5575,12 +5588,13 @@ ], "license": "MIT", "dependencies": { - "devalue": "^5.6.1", + "devalue": "^5.6.3", "memoize-weak": "^1.0.2", "ts-deepmerge": "^7.0.3" }, "optionalDependencies": { "@exodus/schemasafe": "^1.3.0", + "@standard-schema/spec": "^1.0.0", "@typeschema/class-validator": "^0.3.0", "@valibot/to-json-schema": "^1.5.0", "@vinejs/vine": "^3.0.1", @@ -5711,9 +5725,9 @@ } }, "node_modules/sveltekit-superforms/node_modules/zod": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", - "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, "license": "MIT", "optional": true, @@ -5722,16 +5736,16 @@ } }, "node_modules/tabbable": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", - "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "dev": true, "license": "MIT" }, "node_modules/tailwind-merge": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", - "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", "dev": true, "license": "MIT", "funding": { @@ -5757,9 +5771,9 @@ } }, "node_modules/tailwind-variants/node_modules/tailwind-merge": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", - "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz", + "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==", "dev": true, "license": "MIT", "funding": { @@ -5768,9 +5782,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.0.tgz", + "integrity": "sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q==", "dev": true, "license": "MIT" }, @@ -5838,9 +5852,9 @@ "optional": true }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "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==", "dev": true, "license": "MIT", "engines": { @@ -5904,9 +5918,9 @@ } }, "node_modules/typebox": { - "version": "1.0.81", - "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.0.81.tgz", - "integrity": "sha512-bCslZUmZESHhBn4kHDghzH2oo3qu8m2W89xDLxQHv/aPvY4i81Nd1jvijlBp9wSpsVytDSfSoosbiBAjgsNb2Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.1.1.tgz", + "integrity": "sha512-LyVGXXUEiG7mGWQmu/aNILf4FqQPbsE528j7LatYH5hErt0OQcZPN84cyzXDSfBltP2BjkdqKAR7fxfC+fW0Eg==", "dev": true, "license": "MIT", "optional": true @@ -5926,16 +5940,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.49.0.tgz", - "integrity": "sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.0.tgz", + "integrity": "sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.49.0", - "@typescript-eslint/parser": "8.49.0", - "@typescript-eslint/typescript-estree": "8.49.0", - "@typescript-eslint/utils": "8.49.0" + "@typescript-eslint/eslint-plugin": "8.56.0", + "@typescript-eslint/parser": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/utils": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5945,14 +5959,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -6026,9 +6040,9 @@ } }, "node_modules/validator": { - "version": "13.15.23", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.23.tgz", - "integrity": "sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==", + "version": "13.15.26", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz", + "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==", "dev": true, "license": "MIT", "engines": { diff --git a/web/src/lib/api/api.d.ts b/web/src/lib/api/api.d.ts index 25f1c23..d0f4885 100644 --- a/web/src/lib/api/api.d.ts +++ b/web/src/lib/api/api.d.ts @@ -530,74 +530,6 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/tv/seasons/requests': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get Season Requests - * @description Get all season requests. - */ - get: operations['get_season_requests_api_v1_tv_seasons_requests_get']; - /** - * Update Request - * @description Update an existing season request. - */ - put: operations['update_request_api_v1_tv_seasons_requests_put']; - /** - * Request A Season - * @description Create a new season request. - */ - post: operations['request_a_season_api_v1_tv_seasons_requests_post']; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - '/api/v1/tv/seasons/requests/{season_request_id}': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** - * Authorize Request - * @description Authorize or de-authorize a season request. - */ - patch: operations['authorize_request_api_v1_tv_seasons_requests__season_request_id__patch']; - trace?: never; - }; - '/api/v1/tv/seasons/requests/{request_id}': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** - * Delete Season Request - * @description Delete a season request. - */ - delete: operations['delete_season_request_api_v1_tv_seasons_requests__request_id__delete']; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; '/api/v1/tv/seasons/{season_id}': { parameters: { query?: never; @@ -896,58 +828,6 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/movies/requests': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get All Movie Requests - * @description Get all movie requests. - */ - get: operations['get_all_movie_requests_api_v1_movies_requests_get']; - put?: never; - /** - * Create Movie Request - * @description Create a new movie request. - */ - post: operations['create_movie_request_api_v1_movies_requests_post']; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - '/api/v1/movies/requests/{movie_request_id}': { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** - * Update Movie Request - * @description Update an existing movie request. - */ - put: operations['update_movie_request_api_v1_movies_requests__movie_request_id__put']; - post?: never; - /** - * Delete Movie Request - * @description Delete a movie request. - */ - delete: operations['delete_movie_request_api_v1_movies_requests__movie_request_id__delete']; - options?: never; - head?: never; - /** - * Authorize Request - * @description Authorize or de-authorize a movie request. - */ - patch: operations['authorize_request_api_v1_movies_requests__movie_request_id__patch']; - trace?: never; - }; '/api/v1/movies/{movie_id}': { parameters: { query?: never; @@ -1283,26 +1163,6 @@ export interface components { /** Token */ token: string; }; - /** CreateMovieRequest */ - CreateMovieRequest: { - min_quality: components['schemas']['Quality']; - wanted_quality: components['schemas']['Quality']; - /** - * Movie Id - * Format: uuid - */ - movie_id: string; - }; - /** CreateSeasonRequest */ - CreateSeasonRequest: { - min_quality: components['schemas']['Quality']; - wanted_quality: components['schemas']['Quality']; - /** - * Season Id - * Format: uuid - */ - season_id: string; - }; /** Episode */ Episode: { /** @@ -1432,33 +1292,6 @@ export interface components { /** Imdb Id */ imdb_id?: string | null; }; - /** MovieRequest */ - MovieRequest: { - min_quality: components['schemas']['Quality']; - wanted_quality: components['schemas']['Quality']; - /** - * Id - * Format: uuid - */ - id?: string; - /** - * Movie Id - * Format: uuid - */ - movie_id: string; - requested_by?: components['schemas']['UserRead'] | null; - /** - * Authorized - * @default false - */ - authorized: boolean; - authorized_by?: components['schemas']['UserRead'] | null; - }; - /** MovieRequestBase */ - MovieRequestBase: { - min_quality: components['schemas']['Quality']; - wanted_quality: components['schemas']['Quality']; - }; /** MovieTorrent */ MovieTorrent: { /** @@ -1662,29 +1495,6 @@ export interface components { * @enum {integer} */ Quality: 1 | 2 | 3 | 4 | 5; - /** RichMovieRequest */ - RichMovieRequest: { - min_quality: components['schemas']['Quality']; - wanted_quality: components['schemas']['Quality']; - /** - * Id - * Format: uuid - */ - id?: string; - /** - * Movie Id - * Format: uuid - */ - movie_id: string; - requested_by?: components['schemas']['UserRead'] | null; - /** - * Authorized - * @default false - */ - authorized: boolean; - authorized_by?: components['schemas']['UserRead'] | null; - movie: components['schemas']['Movie']; - }; /** RichMovieTorrent */ RichMovieTorrent: { /** @@ -1701,30 +1511,6 @@ export interface components { /** Torrents */ torrents: components['schemas']['MovieTorrent'][]; }; - /** RichSeasonRequest */ - RichSeasonRequest: { - min_quality: components['schemas']['Quality']; - wanted_quality: components['schemas']['Quality']; - /** - * Id - * Format: uuid - */ - id?: string; - /** - * Season Id - * Format: uuid - */ - season_id: string; - requested_by?: components['schemas']['UserRead'] | null; - /** - * Authorized - * @default false - */ - authorized: boolean; - authorized_by?: components['schemas']['UserRead'] | null; - show: components['schemas']['Show']; - season: components['schemas']['Season']; - }; /** RichSeasonTorrent */ RichSeasonTorrent: { /** @@ -1846,16 +1632,6 @@ export interface components { * @enum {integer} */ TorrentStatus: 1 | 2 | 3 | 4; - /** UpdateSeasonRequest */ - UpdateSeasonRequest: { - min_quality: components['schemas']['Quality']; - wanted_quality: components['schemas']['Quality']; - /** - * Id - * Format: uuid - */ - id: string; - }; /** UserCreate */ UserCreate: { /** @@ -1930,6 +1706,10 @@ export interface components { msg: string; /** Error Type */ type: string; + /** Input */ + input?: unknown; + /** Context */ + ctx?: Record; }; }; responses: never; @@ -3085,148 +2865,6 @@ export interface operations { }; }; }; - get_season_requests_api_v1_tv_seasons_requests_get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['RichSeasonRequest'][]; - }; - }; - }; - }; - update_request_api_v1_tv_seasons_requests_put: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - 'application/json': components['schemas']['UpdateSeasonRequest']; - }; - }; - responses: { - /** @description Successful Response */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - request_a_season_api_v1_tv_seasons_requests_post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - 'application/json': components['schemas']['CreateSeasonRequest']; - }; - }; - responses: { - /** @description Successful Response */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - authorize_request_api_v1_tv_seasons_requests__season_request_id__patch: { - parameters: { - query?: { - authorized_status?: boolean; - }; - header?: never; - path: { - season_request_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - delete_season_request_api_v1_tv_seasons_requests__request_id__delete: { - parameters: { - query?: never; - header?: never; - path: { - request_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; get_season_api_v1_tv_seasons__season_id__get: { parameters: { query?: never; @@ -3741,154 +3379,6 @@ export interface operations { }; }; }; - get_all_movie_requests_api_v1_movies_requests_get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['RichMovieRequest'][]; - }; - }; - }; - }; - create_movie_request_api_v1_movies_requests_post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - 'application/json': components['schemas']['CreateMovieRequest']; - }; - }; - responses: { - /** @description Successful Response */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['MovieRequest']; - }; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - update_movie_request_api_v1_movies_requests__movie_request_id__put: { - parameters: { - query?: never; - header?: never; - path: { - movie_request_id: string; - }; - cookie?: never; - }; - requestBody: { - content: { - 'application/json': components['schemas']['MovieRequestBase']; - }; - }; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['MovieRequest']; - }; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - delete_movie_request_api_v1_movies_requests__movie_request_id__delete: { - parameters: { - query?: never; - header?: never; - path: { - movie_request_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; - authorize_request_api_v1_movies_requests__movie_request_id__patch: { - parameters: { - query?: { - authorized_status?: boolean; - }; - header?: never; - path: { - movie_request_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - 'application/json': components['schemas']['HTTPValidationError']; - }; - }; - }; - }; get_movie_by_id_api_v1_movies__movie_id__get: { parameters: { query?: never; diff --git a/web/src/lib/components/nav/app-sidebar.svelte b/web/src/lib/components/nav/app-sidebar.svelte index 7cd5018..f774e32 100644 --- a/web/src/lib/components/nav/app-sidebar.svelte +++ b/web/src/lib/components/nav/app-sidebar.svelte @@ -34,10 +34,6 @@ { title: 'Torrents', url: resolve('/dashboard/tv/torrents', {}) - }, - { - title: 'Requests', - url: resolve('/dashboard/tv/requests', {}) } ] }, @@ -54,10 +50,6 @@ { title: 'Torrents', url: resolve('/dashboard/movies/torrents', {}) - }, - { - title: 'Requests', - url: resolve('/dashboard/movies/requests', {}) } ] } diff --git a/web/src/lib/components/requests/request-movie-dialog.svelte b/web/src/lib/components/requests/request-movie-dialog.svelte deleted file mode 100644 index 8dd00f7..0000000 --- a/web/src/lib/components/requests/request-movie-dialog.svelte +++ /dev/null @@ -1,117 +0,0 @@ - - - - { - dialogOpen = true; - }} - > - Request Movie - - - - Request {getFullyQualifiedMediaName(movie)} - Select desired qualities to submit a request. - -
- -
- - - - {minQuality ? getTorrentQualityString(parseInt(minQuality)) : 'Select Minimum Quality'} - - - {#each qualityOptions as option (option.value)} - {option.label} - {/each} - - -
- - -
- - - - {wantedQuality - ? getTorrentQualityString(parseInt(wantedQuality)) - : 'Select Wanted Quality'} - - - {#each qualityOptions as option (option.value)} - {option.label} - {/each} - - -
- - {#if submitRequestError} -

{submitRequestError}

- {/if} -
- - - - -
-
diff --git a/web/src/lib/components/requests/request-season-dialog.svelte b/web/src/lib/components/requests/request-season-dialog.svelte deleted file mode 100644 index 3180685..0000000 --- a/web/src/lib/components/requests/request-season-dialog.svelte +++ /dev/null @@ -1,155 +0,0 @@ - - - - { - dialogOpen = true; - }} - > - Request Season - - - - Request a Season for {getFullyQualifiedMediaName(show)} - - Select a season and desired qualities to submit a request. - - -
- -
- - - - {#each selectedSeasonsIds as seasonId (seasonId)} - {#if show.seasons.find((season) => season.id === seasonId)} - Season {show.seasons.find((season) => season.id === seasonId)?.number},  - {/if} - {:else} - Select one or more seasons - {/each} - - - {#each show.seasons as season (season.id)} - - Season {season.number}{season.name ? `: ${season.name}` : ''} - - {/each} - - -
- - -
- - - - {minQuality ? getTorrentQualityString(parseInt(minQuality)) : 'Select Minimum Quality'} - - - {#each qualityOptions as option (option.value)} - {option.label} - {/each} - - -
- - -
- - - - {wantedQuality - ? getTorrentQualityString(parseInt(wantedQuality)) - : 'Select Wanted Quality'} - - - {#each qualityOptions as option (option.value)} - {option.label} - {/each} - - -
- - {#if submitRequestError} -

{submitRequestError}

- {/if} -
- - - - -
-
diff --git a/web/src/lib/components/requests/requests-table.svelte b/web/src/lib/components/requests/requests-table.svelte deleted file mode 100644 index f192271..0000000 --- a/web/src/lib/components/requests/requests-table.svelte +++ /dev/null @@ -1,227 +0,0 @@ - - - - A list of all requests. - - - {isShow ? 'Show' : 'Movie'} - {#if isShow} - Season - {/if} - Minimum Quality - Wanted Quality - Requested by - Approved - Approved by - Actions - - - - {#each requests as request (request.id)} - {#if filter(request)} - - - {#if isShow} - - {getFullyQualifiedMediaName( - (request as components['schemas']['RichSeasonRequest']).show - )} - - {:else} - - {getFullyQualifiedMediaName( - (request as components['schemas']['RichMovieRequest']).movie - )} - - {/if} - - {#if isShow} - - {(request as components['schemas']['RichSeasonRequest']).season.number} - - {/if} - - {getTorrentQualityString(request.min_quality)} - - - {getTorrentQualityString(request.wanted_quality)} - - - {request.requested_by?.email ?? 'N/A'} - - - - - - {request.authorized_by?.email ?? 'N/A'} - - - - {#if user().is_superuser} - - {#if isShow} - - {:else} - - {/if} - {/if} - {#if user().is_superuser || user().id === request.requested_by?.id} - - {/if} - - - {/if} - {:else} - - There are currently no requests. - - {/each} - - diff --git a/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte b/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte index fab2e16..91bceef 100644 --- a/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte +++ b/web/src/routes/dashboard/movies/[movieId=uuid]/+page.svelte @@ -11,7 +11,6 @@ import TorrentTable from '$lib/components/torrents/torrent-table.svelte'; import MediaPicture from '$lib/components/media-picture.svelte'; import DownloadMovieDialog from '$lib/components/download-dialogs/download-movie-dialog.svelte'; - import RequestMovieDialog from '$lib/components/requests/request-movie-dialog.svelte'; import LibraryCombobox from '$lib/components/library-combobox.svelte'; import { resolve } from '$app/paths'; import * as Card from '$lib/components/ui/card/index.js'; @@ -108,7 +107,6 @@ {#if user().is_superuser} {/if} - diff --git a/web/src/routes/dashboard/movies/requests/+page.svelte b/web/src/routes/dashboard/movies/requests/+page.svelte deleted file mode 100644 index bbb119e..0000000 --- a/web/src/routes/dashboard/movies/requests/+page.svelte +++ /dev/null @@ -1,48 +0,0 @@ - - - - Movie Requests - MediaManager - - - -
-
- - - - - - - -
-
- -
-

- Movie Requests -

- -
diff --git a/web/src/routes/dashboard/movies/requests/+page.ts b/web/src/routes/dashboard/movies/requests/+page.ts deleted file mode 100644 index e6ac5ed..0000000 --- a/web/src/routes/dashboard/movies/requests/+page.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { PageLoad } from './$types'; -import client from '$lib/api'; - -export const load: PageLoad = async ({ fetch }) => { - const { data } = await client.GET('/api/v1/movies/requests', { fetch: fetch }); - - return { - requestsData: data - }; -}; diff --git a/web/src/routes/dashboard/tv/[showId=uuid]/+page.svelte b/web/src/routes/dashboard/tv/[showId=uuid]/+page.svelte index 32ebb31..ef4e25f 100644 --- a/web/src/routes/dashboard/tv/[showId=uuid]/+page.svelte +++ b/web/src/routes/dashboard/tv/[showId=uuid]/+page.svelte @@ -15,7 +15,6 @@ import CheckmarkX from '$lib/components/checkmark-x.svelte'; import { page } from '$app/state'; import TorrentTable from '$lib/components/torrents/torrent-table.svelte'; - import RequestSeasonDialog from '$lib/components/requests/request-season-dialog.svelte'; import MediaPicture from '$lib/components/media-picture.svelte'; import { Switch } from '$lib/components/ui/switch/index.js'; import { toast } from 'svelte-sonner'; @@ -241,7 +240,6 @@ {/if} {/if} - diff --git a/web/src/routes/dashboard/tv/requests/+page.svelte b/web/src/routes/dashboard/tv/requests/+page.svelte deleted file mode 100644 index 19c0109..0000000 --- a/web/src/routes/dashboard/tv/requests/+page.svelte +++ /dev/null @@ -1,49 +0,0 @@ - - - - TV Show Requests - MediaManager - - - -
-
- - - - - - - -
-
- -
-

- Season Requests -

- -
diff --git a/web/src/routes/dashboard/tv/requests/+page.ts b/web/src/routes/dashboard/tv/requests/+page.ts deleted file mode 100644 index 6f8e758..0000000 --- a/web/src/routes/dashboard/tv/requests/+page.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { PageLoad } from './$types'; -import client from '$lib/api'; - -export const load: PageLoad = async ({ fetch }) => { - const { data } = await client.GET('/api/v1/tv/seasons/requests', { fetch: fetch }); - return { - requestsData: data - }; -};