diff --git a/backend/account/views.py b/backend/account/views.py
index 353ca1d..6905591 100644
--- a/backend/account/views.py
+++ b/backend/account/views.py
@@ -38,7 +38,7 @@ from rest_framework_simplejwt.views import TokenObtainPairView
# Custom Token obtaining view
@extend_schema(
- tags=["Authentication", "public"],
+ tags=["account", "public"],
summary="Obtain JWT access and refresh tokens (cookie-based)",
description="Authenticate user and obtain JWT access and refresh tokens. You can use either email or username.",
request=CustomTokenObtainPairSerializer,
@@ -107,7 +107,7 @@ class CookieTokenObtainPairView(TokenObtainPairView):
return super().validate(attrs)
@extend_schema(
- tags=["Authentication", "public"],
+ tags=["account", "public"],
summary="Refresh JWT token using cookie",
description="Refresh JWT access and refresh tokens using the refresh token stored in cookie.",
responses={
@@ -163,7 +163,7 @@ class CookieTokenRefreshView(APIView):
#---------------------------------------------LOGOUT------------------------------------------------
@extend_schema(
- tags=["Authentication", "public"],
+ tags=["account", "public"],
summary="Logout user (delete access and refresh token cookies)",
description="Logs out the user by deleting access and refresh token cookies.",
responses={
@@ -185,7 +185,7 @@ class LogoutView(APIView):
#--------------------------------------------------------------------------------------------------------------
@extend_schema(
- tags=["User"],
+ tags=["account"],
summary="List, retrieve, update, and delete users.",
description="Displays all users with filtering and ordering options. Requires authentication and appropriate role.",
responses={
@@ -223,7 +223,7 @@ class UserView(viewsets.ModelViewSet):
}
@extend_schema(
- tags=["User"],
+ tags=["account"],
summary="Get permissions based on user role and action.",
description="Determines permissions for various actions based on user role and ownership.",
responses={
@@ -261,7 +261,7 @@ class UserView(viewsets.ModelViewSet):
# Get current user data
@extend_schema(
- tags=["User"],
+ tags=["account"],
summary="Get current authenticated user",
description="Returns details of the currently authenticated user based on JWT token or session.",
responses={
@@ -281,7 +281,7 @@ class CurrentUserView(APIView):
#1. registration API
@extend_schema(
- tags=["User Registration"],
+ tags=["account", "public"],
summary="Register a new user (company or individual)",
description="Register a new user (company or individual). The user will receive an email with a verification link.",
request=UserRegistrationSerializer,
@@ -313,7 +313,7 @@ class UserRegistrationViewSet(ModelViewSet):
#2. confirming email
@extend_schema(
- tags=["User Registration"],
+ tags=["account", "public"],
summary="Verify user email via link",
description="Verify user email using the link with uid and token.",
parameters=[
@@ -346,7 +346,7 @@ class EmailVerificationView(APIView):
#1. PasswordReset + send Email
@extend_schema(
- tags=["User password reset"],
+ tags=["account", "public"],
summary="Request password reset (send email)",
description="Request password reset by providing registered email. An email with instructions will be sent.",
request=PasswordResetRequestSerializer,
@@ -376,7 +376,7 @@ class PasswordResetRequestView(APIView):
#2. Confirming reset
@extend_schema(
- tags=["User password reset"],
+ tags=["account", "public"],
summary="Confirm password reset via token",
description="Confirm password reset using token from email.",
request=PasswordResetConfirmSerializer,
diff --git a/backend/advertisement/views.py b/backend/advertisement/views.py
index bb2e42a..2de85f7 100644
--- a/backend/advertisement/views.py
+++ b/backend/advertisement/views.py
@@ -3,12 +3,14 @@ from rest_framework.response import Response
from rest_framework import status, viewsets
from rest_framework.permissions import AllowAny, IsAdminUser
from rest_framework.authentication import SessionAuthentication
+from drf_spectacular.utils import extend_schema, extend_schema_view
from .models import ContactMe
from .serializer import ContactMeSerializer
from .tasks import send_contact_me_email_task
+@extend_schema(tags=["advertisement", "public"])
class ContactMePublicView(APIView):
permission_classes = [AllowAny]
# Avoid CSRF for public endpoint by disabling SessionAuthentication
@@ -39,6 +41,14 @@ class ContactMePublicView(APIView):
return Response({"id": cm.id, "status": "queued"}, status=status.HTTP_201_CREATED)
+@extend_schema_view(
+ list=extend_schema(tags=["advertisement"], summary="List contact messages (admin)"),
+ retrieve=extend_schema(tags=["advertisement"], summary="Retrieve contact message (admin)"),
+ create=extend_schema(tags=["advertisement"], summary="Create contact message (admin)"),
+ partial_update=extend_schema(tags=["advertisement"], summary="Update contact message (admin)"),
+ update=extend_schema(tags=["advertisement"], summary="Replace contact message (admin)"),
+ destroy=extend_schema(tags=["advertisement"], summary="Delete contact message (admin)"),
+)
class ContactMeAdminViewSet(viewsets.ModelViewSet):
queryset = ContactMe.objects.all().order_by("-sent_at")
serializer_class = ContactMeSerializer
diff --git a/backend/commerce/serializers.py b/backend/commerce/serializers.py
index 64230c2..aa5a488 100644
--- a/backend/commerce/serializers.py
+++ b/backend/commerce/serializers.py
@@ -414,6 +414,11 @@ class PaymentReadSerializer(serializers.ModelSerializer):
class OrderMiniSerializer(serializers.ModelSerializer):
+ status = serializers.ChoiceField(
+ choices=Order.OrderStatus.choices,
+ read_only=True
+ )
+
class Meta:
model = Order
fields = ["id", "status", "total_price", "created_at"]
@@ -421,6 +426,10 @@ class OrderMiniSerializer(serializers.ModelSerializer):
class OrderReadSerializer(serializers.ModelSerializer):
+ status = serializers.ChoiceField(
+ choices=Order.OrderStatus.choices,
+ read_only=True
+ )
items = OrderItemReadSerializer(many=True, read_only=True)
carrier = CarrierReadSerializer(read_only=True)
payment = PaymentReadSerializer(read_only=True)
diff --git a/backend/commerce/views.py b/backend/commerce/views.py
index 4fe9dd0..3e310d4 100644
--- a/backend/commerce/views.py
+++ b/backend/commerce/views.py
@@ -44,8 +44,8 @@ from .serializers import (
#FIXME: uravit view na nový order serializer
@extend_schema_view(
- list=extend_schema(tags=["Orders"], summary="List Orders (public)"),
- retrieve=extend_schema(tags=["Orders"], summary="Retrieve Order (public)"),
+ list=extend_schema(tags=["commerce", "public"], summary="List Orders (public)"),
+ retrieve=extend_schema(tags=["commerce", "public"], summary="Retrieve Order (public)"),
)
class OrderViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
queryset = Order.objects.select_related("carrier", "payment").prefetch_related(
@@ -63,7 +63,7 @@ class OrderViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.Ge
return OrderReadSerializer
@extend_schema(
- tags=["Order"],
+ tags=["commerce", "public"],
summary="Create Order (public)",
request=OrderCreateSerializer,
responses={201: OrderReadSerializer},
@@ -101,7 +101,7 @@ class OrderViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.Ge
# -- List mini orders -- (public) --
@action(detail=False, methods=["get"], url_path="detail")
@extend_schema(
- tags=["Orders"],
+ tags=["commerce", "public"],
summary="List mini orders (public)",
responses={200: OrderMiniSerializer(many=True)},
)
@@ -119,7 +119,7 @@ class OrderViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.Ge
# -- Get order items -- (public) --
@action(detail=True, methods=["get"], url_path="items")
@extend_schema(
- tags=["Orders"],
+ tags=["commerce", "public"],
summary="List order items (public)",
responses={200: OrderItemReadSerializer(many=True)},
)
@@ -132,7 +132,7 @@ class OrderViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.Ge
# -- Get order carrier -- (public) --
@action(detail=True, methods=["get"], url_path="carrier")
@extend_schema(
- tags=["Orders"],
+ tags=["commerce", "public"],
summary="Get order carrier (public)",
responses={200: CarrierReadSerializer},
)
@@ -144,7 +144,7 @@ class OrderViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.Ge
# -- Get order payment -- (public) --
@action(detail=True, methods=["get"], url_path="payment")
@extend_schema(
- tags=["Orders"],
+ tags=["commerce", "public"],
summary="Get order payment (public)",
responses={200: PaymentReadSerializer},
)
@@ -161,7 +161,7 @@ class OrderViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.Ge
permission_classes=[IsAdminUser],
)
@extend_schema(
- tags=["Orders"],
+ tags=["commerce"],
summary="Mark carrier ready to pickup (admin)",
request=None,
responses={200: CarrierReadSerializer},
@@ -183,7 +183,7 @@ class OrderViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.Ge
permission_classes=[IsAdminUser],
)
@extend_schema(
- tags=["Orders"],
+ tags=["commerce"],
summary="Start ordering shipping (admin)",
request=None,
responses={200: CarrierReadSerializer},
@@ -202,7 +202,7 @@ class OrderViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.Ge
class OrderInvoice(viewsets.ViewSet):
@action(detail=True, methods=["get"], url_path="generate-invoice")
@extend_schema(
- tags=["Orders"],
+ tags=["commerce", "public"],
summary="Get Invoice PDF for Order (public)",
responses={200: "PDF File"},
)
@@ -237,12 +237,12 @@ class AdminOnlyForPatchOtherwisePublic(AllowAny.__class__):
# ---------- Public/admin viewsets ----------
@extend_schema_view(
- list=extend_schema(tags=["Products"], summary="List products (public)"),
- retrieve=extend_schema(tags=["Products"], summary="Retrieve product (public)"),
- create=extend_schema(tags=["Products"], summary="Create product (auth required)"),
- partial_update=extend_schema(tags=["Products"], summary="Update product (auth required)"),
- update=extend_schema(tags=["Products"], summary="Replace product (auth required)"),
- destroy=extend_schema(tags=["Products"], summary="Delete product (auth required)"),
+ list=extend_schema(tags=["commerce", "public"], summary="List products (public)"),
+ retrieve=extend_schema(tags=["commerce", "public"], summary="Retrieve product (public)"),
+ create=extend_schema(tags=["commerce"], summary="Create product (auth required)"),
+ partial_update=extend_schema(tags=["commerce"], summary="Update product (auth required)"),
+ update=extend_schema(tags=["commerce"], summary="Replace product (auth required)"),
+ destroy=extend_schema(tags=["commerce"], summary="Delete product (auth required)"),
)
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
@@ -255,12 +255,12 @@ class ProductViewSet(viewsets.ModelViewSet):
@extend_schema_view(
- list=extend_schema(tags=["Categories"], summary="List categories (public)"),
- retrieve=extend_schema(tags=["Categories"], summary="Retrieve category (public)"),
- create=extend_schema(tags=["Categories"], summary="Create category (auth required)"),
- partial_update=extend_schema(tags=["Categories"], summary="Update category (auth required)"),
- update=extend_schema(tags=["Categories"], summary="Replace category (auth required)"),
- destroy=extend_schema(tags=["Categories"], summary="Delete category (auth required)"),
+ list=extend_schema(tags=["commerce", "public"], summary="List categories (public)"),
+ retrieve=extend_schema(tags=["commerce", "public"], summary="Retrieve category (public)"),
+ create=extend_schema(tags=["commerce"], summary="Create category (auth required)"),
+ partial_update=extend_schema(tags=["commerce"], summary="Update category (auth required)"),
+ update=extend_schema(tags=["commerce"], summary="Replace category (auth required)"),
+ destroy=extend_schema(tags=["commerce"], summary="Delete category (auth required)"),
)
class CategoryViewSet(viewsets.ModelViewSet):
queryset = Category.objects.all()
@@ -273,12 +273,12 @@ class CategoryViewSet(viewsets.ModelViewSet):
@extend_schema_view(
- list=extend_schema(tags=["Product Images"], summary="List product images (public)"),
- retrieve=extend_schema(tags=["Product Images"], summary="Retrieve product image (public)"),
- create=extend_schema(tags=["Product Images"], summary="Create product image (auth required)"),
- partial_update=extend_schema(tags=["Product Images"], summary="Update product image (auth required)"),
- update=extend_schema(tags=["Product Images"], summary="Replace product image (auth required)"),
- destroy=extend_schema(tags=["Product Images"], summary="Delete product image (auth required)"),
+ list=extend_schema(tags=["commerce", "public"], summary="List product images (public)"),
+ retrieve=extend_schema(tags=["commerce", "public"], summary="Retrieve product image (public)"),
+ create=extend_schema(tags=["commerce"], summary="Create product image (auth required)"),
+ partial_update=extend_schema(tags=["commerce"], summary="Update product image (auth required)"),
+ update=extend_schema(tags=["commerce"], summary="Replace product image (auth required)"),
+ destroy=extend_schema(tags=["commerce"], summary="Delete product image (auth required)"),
)
class ProductImageViewSet(viewsets.ModelViewSet):
queryset = ProductImage.objects.all()
@@ -291,12 +291,12 @@ class ProductImageViewSet(viewsets.ModelViewSet):
@extend_schema_view(
- list=extend_schema(tags=["Discount Codes"], summary="List discount codes (public)"),
- retrieve=extend_schema(tags=["Discount Codes"], summary="Retrieve discount code (public)"),
- create=extend_schema(tags=["Discount Codes"], summary="Create discount code (auth required)"),
- partial_update=extend_schema(tags=["Discount Codes"], summary="Update discount code (auth required)"),
- update=extend_schema(tags=["Discount Codes"], summary="Replace discount code (auth required)"),
- destroy=extend_schema(tags=["Discount Codes"], summary="Delete discount code (auth required)"),
+ list=extend_schema(tags=["commerce", "public"], summary="List discount codes (public)"),
+ retrieve=extend_schema(tags=["commerce", "public"], summary="Retrieve discount code (public)"),
+ create=extend_schema(tags=["commerce"], summary="Create discount code (auth required)"),
+ partial_update=extend_schema(tags=["commerce"], summary="Update discount code (auth required)"),
+ update=extend_schema(tags=["commerce"], summary="Replace discount code (auth required)"),
+ destroy=extend_schema(tags=["commerce"], summary="Delete discount code (auth required)"),
)
class DiscountCodeViewSet(viewsets.ModelViewSet):
queryset = DiscountCode.objects.all()
@@ -310,12 +310,12 @@ class DiscountCodeViewSet(viewsets.ModelViewSet):
# -- Refund (Admin only) --
@extend_schema_view(
- list=extend_schema(tags=["Refunds"], summary="List refunds (admin)"),
- retrieve=extend_schema(tags=["Refunds"], summary="Retrieve refund (admin)"),
- create=extend_schema(tags=["Refunds"], summary="Create refund (admin)"),
- partial_update=extend_schema(tags=["Refunds"], summary="Update refund (admin)"),
- update=extend_schema(tags=["Refunds"], summary="Replace refund (admin)"),
- destroy=extend_schema(tags=["Refunds"], summary="Delete refund (admin)"),
+ list=extend_schema(tags=["commerce"], summary="List refunds (admin)"),
+ retrieve=extend_schema(tags=["commerce"], summary="Retrieve refund (admin)"),
+ create=extend_schema(tags=["commerce"], summary="Create refund (admin)"),
+ partial_update=extend_schema(tags=["commerce"], summary="Update refund (admin)"),
+ update=extend_schema(tags=["commerce"], summary="Replace refund (admin)"),
+ destroy=extend_schema(tags=["commerce"], summary="Delete refund (admin)"),
)
class RefundViewSet(viewsets.ModelViewSet):
queryset = Refund.objects.select_related("order").all().order_by("-created_at")
diff --git a/backend/configuration/views.py b/backend/configuration/views.py
index 6d92d6e..63b666d 100644
--- a/backend/configuration/views.py
+++ b/backend/configuration/views.py
@@ -1,5 +1,6 @@
from rest_framework import viewsets, mixins
from rest_framework.permissions import IsAdminUser, AllowAny
+from drf_spectacular.utils import extend_schema, extend_schema_view
from .models import SiteConfiguration
from .serializers import (
SiteConfigurationAdminSerializer,
@@ -15,11 +16,23 @@ class _SingletonQuerysetMixin:
return SiteConfiguration.get_solo()
+@extend_schema_view(
+ list=extend_schema(tags=["configuration"], summary="List site configuration (admin)"),
+ retrieve=extend_schema(tags=["configuration"], summary="Retrieve site configuration (admin)"),
+ create=extend_schema(tags=["configuration"], summary="Create site configuration (admin)"),
+ partial_update=extend_schema(tags=["configuration"], summary="Update site configuration (admin)"),
+ update=extend_schema(tags=["configuration"], summary="Replace site configuration (admin)"),
+ destroy=extend_schema(tags=["configuration"], summary="Delete site configuration (admin)"),
+)
class SiteConfigurationAdminViewSet(_SingletonQuerysetMixin, viewsets.ModelViewSet):
permission_classes = [IsAdminUser]
serializer_class = SiteConfigurationAdminSerializer
+@extend_schema_view(
+ list=extend_schema(tags=["configuration", "public"], summary="List site configuration (public)"),
+ retrieve=extend_schema(tags=["configuration", "public"], summary="Retrieve site configuration (public)"),
+)
class SiteConfigurationPublicViewSet(_SingletonQuerysetMixin, viewsets.ReadOnlyModelViewSet):
permission_classes = [AllowAny]
serializer_class = SiteConfigurationPublicSerializer
\ No newline at end of file
diff --git a/backend/thirdparty/gopay/views.py b/backend/thirdparty/gopay/views.py
index 948255a..3f42fcc 100644
--- a/backend/thirdparty/gopay/views.py
+++ b/backend/thirdparty/gopay/views.py
@@ -65,7 +65,7 @@ class CreatePaymentView(APIView):
permission_classes = [permissions.IsAuthenticated]
@extend_schema(
- tags=["GoPay"],
+ tags=["gopay"],
operation_id="gopay_create_payment",
summary="Vytvořit platbu (minimální vstup)",
description=(
@@ -146,7 +146,7 @@ class PaymentStatusView(APIView):
permission_classes = [permissions.IsAuthenticated]
@extend_schema(
- tags=["GoPay"],
+ tags=["gopay"],
operation_id="gopay_get_status",
summary="Získat stav platby",
parameters=[
@@ -202,7 +202,7 @@ class RefundPaymentView(APIView):
permission_classes = [permissions.IsAuthenticated]
@extend_schema(
- tags=["GoPay"],
+ tags=["gopay"],
operation_id="gopay_refund_payment",
summary="Refundovat platbu",
parameters=[
diff --git a/backend/thirdparty/zasilkovna/views.py b/backend/thirdparty/zasilkovna/views.py
index d2aaf4a..63c5837 100644
--- a/backend/thirdparty/zasilkovna/views.py
+++ b/backend/thirdparty/zasilkovna/views.py
@@ -18,13 +18,13 @@ from .serializers import (
@extend_schema_view(
list=extend_schema(
- tags=["Packeta-Shipment"],
+ tags=["zasilkovna"],
summary="Hromadný shipment",
description="Returns a paginated list of Packeta (Zásilkovna) shipments.",
responses=ZasilkovnaShipmentSerializer,
),
retrieve=extend_schema(
- tags=["Packeta-Shipment"],
+ tags=["zasilkovna"],
summary="Detail hromadné zásilky",
description="Returns detail for a single shipment.",
responses=ZasilkovnaShipmentSerializer,
@@ -42,7 +42,7 @@ class ZasilkovnaShipmentViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin
@extend_schema_view(
retrieve=extend_schema(
- tags=["Packet"],
+ tags=["zasilkovna"],
summary="Packet",
description="#TODO: Popis endpointu",
responses={200: ZasilkovnaPacketSerializer},
@@ -53,7 +53,7 @@ class ZasilkovnaPacketViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet
serializer_class = ZasilkovnaPacketSerializer
@extend_schema(
- tags=["Packet"],
+ tags=["zasilkovna"],
summary="Get public tracking URL",
description="Returns the public Zásilkovna tracking URL derived from the packet's barcode.",
responses=OpenApiResponse(response=TrackingURLSerializer),
@@ -74,7 +74,7 @@ class ZasilkovnaPacketViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet
#HOTOVO
@extend_schema(
- tags=["Packet"],
+ tags=["zasilkovna"],
summary="Order shipping",
description=(
"Objedná přepravu přes API Packety,"
@@ -96,7 +96,7 @@ class ZasilkovnaPacketViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet
#HOTOVO
@extend_schema(
- tags=["Packet"],
+ tags=["zasilkovna"],
summary="Cancel packet",
description=(
"Cancels the packet through the Packeta API and updates its state to CANCELED. "
@@ -118,7 +118,7 @@ class ZasilkovnaPacketViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet
#TODO: dodělat/domluvit se
@extend_schema(
- tags=["Packet"],
+ tags=["zasilkovna"],
summary="Get widget for user, to select pickup point.",
description=(
"Returns HTML widget for user to select pickup point. "
diff --git a/backend/vontor_cz/settings.py b/backend/vontor_cz/settings.py
index 2ddef56..d902e52 100644
--- a/backend/vontor_cz/settings.py
+++ b/backend/vontor_cz/settings.py
@@ -816,7 +816,9 @@ SPECTACULAR_DEFAULTS: Dict[str, Any] = {
# enum name overrides. dict with keys "YourEnum" and their choice values "field.choices"
# e.g. {'SomeEnum': ['A', 'B'], 'OtherEnum': 'import.path.to.choices'}
- 'ENUM_NAME_OVERRIDES': {},
+ 'ENUM_NAME_OVERRIDES': {
+ 'OrderStatusEnum': 'commerce.models.Order.OrderStatus.choices',
+ },
# Adds "blank" and "null" enum choices where appropriate. disable on client generation issues
'ENUM_ADD_EXPLICIT_BLANK_NULL_CHOICE': True,
diff --git a/backend/vontor_cz/views.py b/backend/vontor_cz/views.py
index bfde988..9ecc4e6 100644
--- a/backend/vontor_cz/views.py
+++ b/backend/vontor_cz/views.py
@@ -91,7 +91,7 @@ def choices(request):
@extend_schema(
- tags=["Testing"],
+ tags=["core", "testing"],
description="Testovací endpoint pro odeslání testovacího emailu.",
parameters=[
OpenApiParameter(
diff --git a/docker-compose.yml b/docker-compose.yml
index 00a51a4..72f8535 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -3,7 +3,7 @@ services:
container_name: backend-vontor-cz
build:
context: ./backend
- dockerfile: dockerfile
+ dockerfile: Dockerfile
restart: always
env_file:
- ./backend/.env
@@ -54,7 +54,7 @@ services:
container_name: celery-vontor-cz
build:
context: ./backend
- dockerfile: dockerfile
+ dockerfile: Dockerfile
command: sh -c "python manage.py migrate --noinput && celery -A vontor_cz worker --loglevel=info"
restart: always
env_file:
@@ -70,7 +70,7 @@ services:
container_name: celery-beat-vontor-cz
build:
context: ./backend
- dockerfile: dockerfile
+ dockerfile: Dockerfile
command: sh -c "python manage.py migrate --noinput && celery -A vontor_cz beat --loglevel=info"
restart: always
env_file:
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 34e19a5..3bc7aaf 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -32,6 +32,7 @@
"eslint-plugin-react-refresh": "^0.4.20",
"globals": "^16.3.0",
"orval": "^7.13.2",
+ "prettier": "^3.7.4",
"typescript": "~5.8.3",
"typescript-eslint": "^8.39.1",
"vite": "^7.1.2"
@@ -458,9 +459,9 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
- "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
"cpu": [
"ppc64"
],
@@ -474,9 +475,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz",
- "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
"cpu": [
"arm"
],
@@ -490,9 +491,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz",
- "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
"cpu": [
"arm64"
],
@@ -506,9 +507,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz",
- "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
"cpu": [
"x64"
],
@@ -522,9 +523,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz",
- "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
"cpu": [
"arm64"
],
@@ -538,9 +539,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz",
- "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
"cpu": [
"x64"
],
@@ -554,9 +555,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz",
- "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
"cpu": [
"arm64"
],
@@ -570,9 +571,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz",
- "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
"cpu": [
"x64"
],
@@ -586,9 +587,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz",
- "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
"cpu": [
"arm"
],
@@ -602,9 +603,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz",
- "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
"cpu": [
"arm64"
],
@@ -618,9 +619,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz",
- "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
"cpu": [
"ia32"
],
@@ -634,9 +635,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz",
- "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
"cpu": [
"loong64"
],
@@ -650,9 +651,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz",
- "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
"cpu": [
"mips64el"
],
@@ -666,9 +667,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz",
- "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
"cpu": [
"ppc64"
],
@@ -682,9 +683,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz",
- "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
"cpu": [
"riscv64"
],
@@ -698,9 +699,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz",
- "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
"cpu": [
"s390x"
],
@@ -714,9 +715,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz",
- "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
"cpu": [
"x64"
],
@@ -730,9 +731,9 @@
}
},
"node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz",
- "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
"cpu": [
"arm64"
],
@@ -746,9 +747,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz",
- "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
"cpu": [
"x64"
],
@@ -762,9 +763,9 @@
}
},
"node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz",
- "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
"cpu": [
"arm64"
],
@@ -778,9 +779,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz",
- "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
"cpu": [
"x64"
],
@@ -794,9 +795,9 @@
}
},
"node_modules/@esbuild/openharmony-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz",
- "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
"cpu": [
"arm64"
],
@@ -810,9 +811,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz",
- "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
"cpu": [
"x64"
],
@@ -826,9 +827,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz",
- "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
"cpu": [
"arm64"
],
@@ -842,9 +843,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz",
- "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
"cpu": [
"ia32"
],
@@ -858,9 +859,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz",
- "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
"cpu": [
"x64"
],
@@ -1115,9 +1116,9 @@
}
},
"node_modules/@ibm-cloud/openapi-ruleset": {
- "version": "1.33.4",
- "resolved": "https://registry.npmjs.org/@ibm-cloud/openapi-ruleset/-/openapi-ruleset-1.33.4.tgz",
- "integrity": "sha512-fF1/Uk8jbQIAnWueUxHan6ywORXwQbMvZ6hGjpY77sXLrgcVjWsbJPndeakJxOsTy3pxYcw9cvmkEv+IcIK+nQ==",
+ "version": "1.33.5",
+ "resolved": "https://registry.npmjs.org/@ibm-cloud/openapi-ruleset/-/openapi-ruleset-1.33.5.tgz",
+ "integrity": "sha512-oT8USsTulFAA8FiBN0lA2rJqQI2lIt+HP2pdakGQXo3EviL2vqJTgpSCRwjl6mLJL158f1BVcdQUOEFGxomK3w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1297,40 +1298,40 @@
}
},
"node_modules/@orval/angular": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/@orval/angular/-/angular-7.13.2.tgz",
- "integrity": "sha512-vcG3vlDWU3wHdB0u0O7pG2BFQCpPmny0Jx2L+wGti9sjFCcN2SJT9hSRF//EVY1ZQQx/2CZHV3N+DnEEJRO5gA==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@orval/angular/-/angular-7.17.0.tgz",
+ "integrity": "sha512-3DnUU/2vUhKC33bmM2xMGRbbJRs8Qvubvjg+0QGh3AxedOYWRcLTxsuZNyr6n4y2TomrsbB1rFMTveTotE2VuA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@orval/core": "7.13.2"
+ "@orval/core": "7.17.0"
}
},
"node_modules/@orval/axios": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/@orval/axios/-/axios-7.13.2.tgz",
- "integrity": "sha512-fFAQuHonmzSHjaJWojNj2rju8RrTIHRhDe/YTnRorl74MXjzoioMRPzjlpFul0h3kcrmGyK/o+AzY2nO0FEyNg==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@orval/axios/-/axios-7.17.0.tgz",
+ "integrity": "sha512-qbTOOOGjtfFDgpY1pHJNEO71CybSQiPJxuspVJDnWeoR7cwxOuZuWLWX3QE0bZ/2NHUg11rcuHwzzvPHGYmb0w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@orval/core": "7.13.2"
+ "@orval/core": "7.17.0"
}
},
"node_modules/@orval/core": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/@orval/core/-/core-7.13.2.tgz",
- "integrity": "sha512-7Z0hz5+un9/3B2TyBoQdhUUET4Zuiw3kd9SPIzzSxR7vvFfklr683Ztp0gJV3S+Uwpt4g6fyezp3IYtLYo0mag==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@orval/core/-/core-7.17.0.tgz",
+ "integrity": "sha512-oLHJitYNUbPYCijKt77az9Q7PnQE8ga79hVUt46c5cL4dXjjbRMLXSCIxB4M5lbu4D9q4G6ZgjCAxv+Fr7wGRA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@apidevtools/swagger-parser": "^12.0.0",
- "@ibm-cloud/openapi-ruleset": "^1.32.1",
+ "@apidevtools/swagger-parser": "^12.1.0",
+ "@ibm-cloud/openapi-ruleset": "^1.33.1",
"@stoplight/spectral-core": "^1.20.0",
"acorn": "^8.15.0",
"chalk": "^4.1.2",
"compare-versions": "^6.1.1",
"debug": "^4.4.3",
- "esbuild": "^0.25.9",
+ "esbuild": "^0.25.11",
"esutils": "2.0.3",
"fs-extra": "^11.3.1",
"globby": "11.1.0",
@@ -1341,90 +1342,90 @@
"micromatch": "^4.0.8",
"openapi3-ts": "4.5.0",
"swagger2openapi": "^7.0.8",
- "typedoc": "^0.28.12"
+ "typedoc": "^0.28.14"
}
},
"node_modules/@orval/fetch": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/@orval/fetch/-/fetch-7.13.2.tgz",
- "integrity": "sha512-Oj81JbRPC5GN71Bg2p/o7zM07QK/W/qhh9KyHekjwspVQZ7X/WTAmq8/QWgsn95+utCNirIh/nsh/al+v36kyA==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@orval/fetch/-/fetch-7.17.0.tgz",
+ "integrity": "sha512-VZuSKa2tMhHyL4BKiPyXmNj0Z5jF92lisTgWdm24WdmFfrzeGCHDyBbim6ivOMnrcvf0v7o16EeaTdMeNiaGdQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@orval/core": "7.13.2",
+ "@orval/core": "7.17.0",
"openapi3-ts": "4.5.0"
}
},
"node_modules/@orval/hono": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/@orval/hono/-/hono-7.13.2.tgz",
- "integrity": "sha512-k3CAN4T3SwnhAXOpwmzp6SAnkLrpFZfU6l/EdNy5VSdfpNE+o3MFiQS0sL28zMRUhMIH5l6ZuwAY92fGQqZTxw==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@orval/hono/-/hono-7.17.0.tgz",
+ "integrity": "sha512-/78Gb346+I0jPLML/s/QK7O8sJoiCIQxKT0sJ3YVXPLSKQ4aBEYGcXthAW/LwJTZWz8Rm0vGGnz4svra3gafwg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@orval/core": "7.13.2",
- "@orval/zod": "7.13.2",
- "fs-extra": "^11.3.1",
+ "@orval/core": "7.17.0",
+ "@orval/zod": "7.17.0",
+ "fs-extra": "^11.3.2",
"lodash.uniq": "^4.5.0",
"openapi3-ts": "4.5.0"
}
},
"node_modules/@orval/mcp": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/@orval/mcp/-/mcp-7.13.2.tgz",
- "integrity": "sha512-RPIF5WIm1DxOy7tYUbhFQUnWv7RK9+gSIz79gFMKdyhci+XrcvgyQU3rx6rFCXC/k3fwX2QXOYcTptR2EOHScg==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@orval/mcp/-/mcp-7.17.0.tgz",
+ "integrity": "sha512-izVIA3XgBpdQ6u2VLD7lxXbksq2K0wf8ypmQAufd5SewSoyEPcu8jIlLovGLTI5WiBr0pJnHLoltJ4Pl/zkZ0A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@orval/core": "7.13.2",
- "@orval/fetch": "7.13.2",
- "@orval/zod": "7.13.2",
+ "@orval/core": "7.17.0",
+ "@orval/fetch": "7.17.0",
+ "@orval/zod": "7.17.0",
"openapi3-ts": "4.5.0"
}
},
"node_modules/@orval/mock": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/@orval/mock/-/mock-7.13.2.tgz",
- "integrity": "sha512-1jF8SUx/L6E+sNfP9u69U+DnRbeWOcXbFPKc8iTqEr6o+xF3RnpQfDE+ipRsX3DEJVi96XRFq6EhYpuxKXezLw==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@orval/mock/-/mock-7.17.0.tgz",
+ "integrity": "sha512-A/A/50XXBgidhTlQDyPQp6nIUfrP27GagyEQ70ztXS5Z9y1WJe7K5ZjjCnISOc7cFTZJmsYKvuCUo4ptfTm1bA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@orval/core": "7.13.2",
+ "@orval/core": "7.17.0",
"openapi3-ts": "4.5.0"
}
},
"node_modules/@orval/query": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/@orval/query/-/query-7.13.2.tgz",
- "integrity": "sha512-s8LoQkbDXrfS4jwvy3RiM6SJLXrUogVkbE9oOGA6cYnjZDVG3gGtdcr8+2GkKGTXJFggMBR1JsV6I6IVdLBYoQ==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@orval/query/-/query-7.17.0.tgz",
+ "integrity": "sha512-h/XZRpOLOewIPa/3uSk68M6CSgylrGSUxHux9uEH3P2nYWjwYV+GxuOUptzuONA37LGd76mgytW6tK27VmYeCA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@orval/core": "7.13.2",
- "@orval/fetch": "7.13.2",
+ "@orval/core": "7.17.0",
+ "@orval/fetch": "7.17.0",
"chalk": "^4.1.2",
"lodash.omitby": "^4.6.0"
}
},
"node_modules/@orval/swr": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/@orval/swr/-/swr-7.13.2.tgz",
- "integrity": "sha512-O4bvu1gQwcrn86gCPHHhuSswOSx+0ySQVi4gT4cc2YKg0r5VF4TBiHCewpd3Q69R37vfOgBsK7PWZrKn9ZPFeg==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@orval/swr/-/swr-7.17.0.tgz",
+ "integrity": "sha512-ZC5ZjzILWt8WE3V4gWRIg9XWHjQBubUJzin67aKERlybPN+sqMdgMEl9/XL+emUItkAIdex9cCaDHZwqjrmbKg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@orval/core": "7.13.2",
- "@orval/fetch": "7.13.2"
+ "@orval/core": "7.17.0",
+ "@orval/fetch": "7.17.0"
}
},
"node_modules/@orval/zod": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/@orval/zod/-/zod-7.13.2.tgz",
- "integrity": "sha512-qOyIojDhZDQJhkUwlC01xnH9rAthBYA5xdCxMKqLr4alzaOSNjt2q9TRyrEvGOAYTJXeXwfnX6kUxqAOc/i2rw==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@orval/zod/-/zod-7.17.0.tgz",
+ "integrity": "sha512-ldwGUR4K0YIay+4UGR7ykTYD99Cs+CHIAOAVVny8/h9dU0CD/6sxomHuCzrC0Z2QxVZ4rL7k8g10Kffmp+dHBw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@orval/core": "7.13.2",
+ "@orval/core": "7.17.0",
"lodash.uniq": "^4.5.0",
"openapi3-ts": "4.5.0"
}
@@ -3997,9 +3998,9 @@
}
},
"node_modules/es-abstract": {
- "version": "1.24.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
- "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
+ "version": "1.24.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz",
+ "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4159,9 +4160,9 @@
"license": "MIT"
},
"node_modules/esbuild": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz",
- "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==",
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
@@ -4171,32 +4172,32 @@
"node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.9",
- "@esbuild/android-arm": "0.25.9",
- "@esbuild/android-arm64": "0.25.9",
- "@esbuild/android-x64": "0.25.9",
- "@esbuild/darwin-arm64": "0.25.9",
- "@esbuild/darwin-x64": "0.25.9",
- "@esbuild/freebsd-arm64": "0.25.9",
- "@esbuild/freebsd-x64": "0.25.9",
- "@esbuild/linux-arm": "0.25.9",
- "@esbuild/linux-arm64": "0.25.9",
- "@esbuild/linux-ia32": "0.25.9",
- "@esbuild/linux-loong64": "0.25.9",
- "@esbuild/linux-mips64el": "0.25.9",
- "@esbuild/linux-ppc64": "0.25.9",
- "@esbuild/linux-riscv64": "0.25.9",
- "@esbuild/linux-s390x": "0.25.9",
- "@esbuild/linux-x64": "0.25.9",
- "@esbuild/netbsd-arm64": "0.25.9",
- "@esbuild/netbsd-x64": "0.25.9",
- "@esbuild/openbsd-arm64": "0.25.9",
- "@esbuild/openbsd-x64": "0.25.9",
- "@esbuild/openharmony-arm64": "0.25.9",
- "@esbuild/sunos-x64": "0.25.9",
- "@esbuild/win32-arm64": "0.25.9",
- "@esbuild/win32-ia32": "0.25.9",
- "@esbuild/win32-x64": "0.25.9"
+ "@esbuild/aix-ppc64": "0.25.12",
+ "@esbuild/android-arm": "0.25.12",
+ "@esbuild/android-arm64": "0.25.12",
+ "@esbuild/android-x64": "0.25.12",
+ "@esbuild/darwin-arm64": "0.25.12",
+ "@esbuild/darwin-x64": "0.25.12",
+ "@esbuild/freebsd-arm64": "0.25.12",
+ "@esbuild/freebsd-x64": "0.25.12",
+ "@esbuild/linux-arm": "0.25.12",
+ "@esbuild/linux-arm64": "0.25.12",
+ "@esbuild/linux-ia32": "0.25.12",
+ "@esbuild/linux-loong64": "0.25.12",
+ "@esbuild/linux-mips64el": "0.25.12",
+ "@esbuild/linux-ppc64": "0.25.12",
+ "@esbuild/linux-riscv64": "0.25.12",
+ "@esbuild/linux-s390x": "0.25.12",
+ "@esbuild/linux-x64": "0.25.12",
+ "@esbuild/netbsd-arm64": "0.25.12",
+ "@esbuild/netbsd-x64": "0.25.12",
+ "@esbuild/openbsd-arm64": "0.25.12",
+ "@esbuild/openbsd-x64": "0.25.12",
+ "@esbuild/openharmony-arm64": "0.25.12",
+ "@esbuild/sunos-x64": "0.25.12",
+ "@esbuild/win32-arm64": "0.25.12",
+ "@esbuild/win32-ia32": "0.25.12",
+ "@esbuild/win32-x64": "0.25.12"
}
},
"node_modules/escalade": {
@@ -4657,9 +4658,9 @@
}
},
"node_modules/fs-extra": {
- "version": "11.3.2",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz",
- "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==",
+ "version": "11.3.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz",
+ "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5520,9 +5521,9 @@
"license": "MIT"
},
"node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6497,42 +6498,46 @@
}
},
"node_modules/orval": {
- "version": "7.13.2",
- "resolved": "https://registry.npmjs.org/orval/-/orval-7.13.2.tgz",
- "integrity": "sha512-juiE7Tz2aiZaEaKDi1EQNf6lm3D5N8dMkKEV3CtRK9SFhUhR4y6E/2oOA3w5y63kClfhGREGZxcNSSMdHctyzg==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/orval/-/orval-7.17.0.tgz",
+ "integrity": "sha512-iBqZC7HpSSL1CJ9jRCD+5vCYpedd03Udh+izcyFnWyVUN0ywuzGonizJgl5iGTgoe+VXsMM7ndV5h+DkghreMg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@apidevtools/swagger-parser": "^12.0.0",
+ "@apidevtools/swagger-parser": "^12.1.0",
"@commander-js/extra-typings": "^14.0.0",
- "@orval/angular": "7.13.2",
- "@orval/axios": "7.13.2",
- "@orval/core": "7.13.2",
- "@orval/fetch": "7.13.2",
- "@orval/hono": "7.13.2",
- "@orval/mcp": "7.13.2",
- "@orval/mock": "7.13.2",
- "@orval/query": "7.13.2",
- "@orval/swr": "7.13.2",
- "@orval/zod": "7.13.2",
+ "@orval/angular": "7.17.0",
+ "@orval/axios": "7.17.0",
+ "@orval/core": "7.17.0",
+ "@orval/fetch": "7.17.0",
+ "@orval/hono": "7.17.0",
+ "@orval/mcp": "7.17.0",
+ "@orval/mock": "7.17.0",
+ "@orval/query": "7.17.0",
+ "@orval/swr": "7.17.0",
+ "@orval/zod": "7.17.0",
"chalk": "^4.1.2",
"chokidar": "^4.0.3",
"commander": "^14.0.1",
"enquirer": "^2.4.1",
"execa": "^5.1.1",
"find-up": "5.0.0",
- "fs-extra": "^11.3.1",
- "js-yaml": "4.1.0",
+ "fs-extra": "^11.3.2",
+ "jiti": "^2.6.1",
+ "js-yaml": "4.1.1",
"lodash.uniq": "^4.5.0",
"openapi3-ts": "4.5.0",
"string-argv": "^0.3.2",
"tsconfck": "^2.1.2",
- "typedoc": "^0.28.12",
- "typedoc-plugin-coverage": "^4.0.1",
- "typedoc-plugin-markdown": "^4.8.1"
+ "typedoc": "^0.28.14",
+ "typedoc-plugin-coverage": "^4.0.2",
+ "typedoc-plugin-markdown": "^4.9.0"
},
"bin": {
"orval": "dist/bin/orval.js"
+ },
+ "engines": {
+ "node": ">=22.18.0"
}
},
"node_modules/own-keys": {
@@ -6712,6 +6717,22 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/prettier": {
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz",
+ "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -7957,9 +7978,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/frontend/package.json b/frontend/package.json
index f547f0a..3662bf5 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -35,6 +35,7 @@
"eslint-plugin-react-refresh": "^0.4.20",
"globals": "^16.3.0",
"orval": "^7.13.2",
+ "prettier": "^3.7.4",
"typescript": "~5.8.3",
"typescript-eslint": "^8.39.1",
"vite": "^7.1.2"
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index f5c8d2b..0fb556f 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -22,8 +22,9 @@ export default function App() {
} />
} />
- {/* Utilities */}
- } />
+ {/* APPS */}
+ } />
+
{/* Example protected route group (kept for future use) */}
diff --git a/frontend/src/api/generated/private/filler b/frontend/src/api/generated/private/filler
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/src/api/generated/private/models/filler b/frontend/src/api/generated/private/models/filler
deleted file mode 100644
index 3374a29..0000000
--- a/frontend/src/api/generated/private/models/filler
+++ /dev/null
@@ -1 +0,0 @@
-filler
diff --git a/frontend/src/api/generated/public/filler b/frontend/src/api/generated/public/filler
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/src/layouts/Default.tsx b/frontend/src/layouts/Default.tsx
deleted file mode 100644
index c2d7f01..0000000
--- a/frontend/src/layouts/Default.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import Footer from "../components/Footer/footer";
-import ContactMeForm from "../components/Forms/ContactMe/ContactMeForm";
-import Drone from "../components/ads/Drone/Drone";
-import Portfolio from "../components/ads/Portfolio/Portfolio";
-import Home from "../pages/home/home";
-import { Outlet } from "react-router";
-import Navbar from "../components/navbar/SiteNav";
-
-export default function HomeLayout(){
- return(
- <>
- {/* Example usage of imported components, adjust as needed */}
-
- {}} onLogout={() => {}} />
-
- {/*page*/}
-
-
-
-
-
-
-
-
-
- >
- )
-}
\ No newline at end of file