From e7ddf755eafb4dd7df2ad78c4853bdb9e93e5971 Mon Sep 17 00:00:00 2001 From: hitchhiker Date: Sat, 19 Apr 2025 19:24:27 +0200 Subject: [PATCH] first commit --- .env.development | 6 + .env.template | 6 + .gitignore | 6 + .husky/commit-msg | 3 + .husky/pre-commit | 3 + .npmrc | 1 + .vscode/launch.json | 33 + Dockerfile | 24 + README.md | 96 + babel.config.js | 7 + commitlint.config.js | 36 + docker-compose.override.yml.template | 12 + docker-compose.yml | 19 + docker-entrypoint.sh | 129 + docs/README.md | 45 + docs/VERSION_TAGGING.md | 107 + docs/architecture.md | 133 + docs/authentication.md | 208 + docs/client-env-vars.md | 120 + docs/configuration.md | 182 + docs/deployment.md | 98 + docs/effector-guide.md | 212 + docs/flux-vs-mvvm.md | 64 + docs/local-development.md | 121 + docs/project-structure.md | 140 + docs/typescript-conventions.md | 246 + docs/utils.md | 63 + eslint.config.mjs | 47 + index.html | 22 + memory-bank/README.md | 123 + memory-bank/projectbrief.md | 35 + memory-bank/systemPatterns.md | 54 + memory-bank/techContext.md | 85 + nginx.conf | 27 + package-lock.json | 7306 ++++++++++ package.json | 68 + postcss.config.js | 6 + public/app-config.js | 9 + react-spa-template.code-workspace | 8 + scripts/generate-app-config.js | 179 + scripts/vite-plugin-app-config.js | 98 + src/app/root.tsx | 13 + src/app/routes.tsx | 38 + src/domains/auth/index.ts | 12 + src/domains/auth/model.ts | 341 + src/domains/auth/oidc-config.ts | 122 + src/domains/auth/types.ts | 45 + src/domains/auth/ui/AuthCallback.tsx | 143 + src/domains/auth/ui/AuthProvider.tsx | 145 + src/domains/auth/ui/LoginPage.tsx | 111 + src/domains/auth/ui/LogoutButton.tsx | 19 + src/domains/auth/ui/ProtectedRoute.tsx | 62 + src/domains/auth/ui/index.ts | 4 + src/domains/auth/view-model.ts | 44 + src/domains/dashboard/index.ts | 1 + src/domains/dashboard/ui/Dashboard.tsx | 63 + src/domains/dashboard/ui/index.ts | 1 + src/index.css | 16 + src/lib/api/merchant/core/ApiError.ts | 29 + .../api/merchant/core/ApiRequestOptions.ts | 24 + src/lib/api/merchant/core/ApiResult.ts | 11 + .../api/merchant/core/CancelablePromise.ts | 130 + src/lib/api/merchant/core/OpenAPI.ts | 32 + src/lib/api/merchant/core/initialize.ts | 38 + src/lib/api/merchant/core/request.ts | 369 + src/lib/api/merchant/index.ts | 174 + .../models/QueryResultDto_CategoryDto_.ts | 13 + .../QueryResultDto_CategoryRevisionDto_.ts | 13 + .../QueryResultDto_OptionsRevisionDto_.ts | 13 + .../models/QueryResultDto_OrderViewDto_.ts | 13 + .../QueryResultDto_ProductRevisionDto_.ts | 13 + .../QueryResultDto_PromotionViewDto_.ts | 13 + .../models/QueryResultDto_SellerDto_.ts | 13 + .../QueryResultDto_SellerRevisionDto_.ts | 13 + .../models/QueryResultDto_TextRevisionDto_.ts | 13 + .../models/QueryResultDto_UserDto_.ts | 13 + src/lib/api/merchant/models/_void.ts | 5 + src/lib/api/merchant/models/addressDto.ts | 44 + src/lib/api/merchant/models/addressType.ts | 36 + src/lib/api/merchant/models/aspectType.ts | 31 + .../api/merchant/models/assetCollectionDto.ts | 18 + .../api/merchant/models/authDocumentDto.ts | 30 + .../merchant/models/authHeaderResponseDto.ts | 25 + .../models/authenticationResultDto.ts | 13 + .../models/baseCreateSellerRevisionDto.ts | 37 + src/lib/api/merchant/models/baseOfferDto.ts | 18 + src/lib/api/merchant/models/baseTriggerDto.ts | 9 + src/lib/api/merchant/models/basketDto.ts | 44 + .../merchant/models/bundleDiscountOfferDto.ts | 11 + .../api/merchant/models/bundleTriggerDto.ts | 10 + .../merchant/models/calculatedCheckoutDto.ts | 122 + .../merchant/models/calculatedProductDto.ts | 64 + .../merchant/models/categoryCompositeDto.ts | 22 + src/lib/api/merchant/models/categoryDto.ts | 13 + .../models/categoryQueryRequestDto.ts | 10 + .../merchant/models/categoryRevisionDto.ts | 24 + .../models/categoryRevisionQueryRequestDto.ts | 14 + .../merchant/models/categoryStopListDto.ts | 7 + .../api/merchant/models/categoryViewDto.ts | 19 + .../api/merchant/models/checkoutOptionsDto.ts | 27 + .../models/commonOrderFailureResult.ts | 61 + .../api/merchant/models/commonOrderStatus.ts | 73 + .../api/merchant/models/couponTriggerDto.ts | 10 + src/lib/api/merchant/models/courierInfoDto.ts | 12 + .../api/merchant/models/createCategoryDto.ts | 10 + .../models/createCategoryRevisionDto.ts | 14 + .../models/createOptionsRevisionDto.ts | 20 + .../api/merchant/models/createProductDto.ts | 9 + .../models/createProductRevisionDto.ts | 27 + .../api/merchant/models/createPromotionDto.ts | 10 + .../merchant/models/createRestaurantDto.ts | 24 + .../models/createRestaurantRevisionDto.ts | 44 + .../api/merchant/models/createSellerDto.ts | 36 + .../models/createSellerRevisionDto.ts | 27 + .../merchant/models/createTextRevisionDto.ts | 10 + .../models/customerGroupTriggerDto.ts | 10 + .../models/customerHistoryTriggerDto.ts | 10 + .../models/customerLoyaltyTriggerDto.ts | 10 + .../api/merchant/models/deliveryAddressDto.ts | 18 + .../merchant/models/deliveryFailureResult.ts | 51 + .../merchant/models/deliveryLocationDto.ts | 25 + .../merchant/models/deliveryOrderStatus.ts | 41 + .../api/merchant/models/deliveryStateDto.ts | 40 + .../models/digitalEngagementTriggerDto.ts | 10 + .../models/discountProductOfferDto.ts | 11 + .../merchant/models/discountTotalOfferDto.ts | 10 + src/lib/api/merchant/models/discountType.ts | 26 + .../api/merchant/models/dispatchMethodType.ts | 26 + .../merchant/models/freeDeliveryOfferDto.ts | 8 + .../api/merchant/models/freeItemOfferDto.ts | 9 + src/lib/api/merchant/models/gpsLocationDto.ts | 19 + .../api/merchant/models/holidayTriggerDto.ts | 10 + .../models/humanVerificationRequestDto.ts | 19 + .../models/humanVerificationStatusDto.ts | 19 + src/lib/api/merchant/models/iTriggerDto.ts | 34 + .../api/merchant/models/imageReferenceDto.ts | 23 + .../api/merchant/models/localizedTextDto.ts | 10 + .../models/managerOverrideTriggerDto.ts | 14 + .../merchant/models/oidcConnectResponseDto.ts | 18 + src/lib/api/merchant/models/optionDto.ts | 19 + .../api/merchant/models/optionsQueryDto.ts | 25 + .../api/merchant/models/optionsRevisionDto.ts | 30 + src/lib/api/merchant/models/optionsViewDto.ts | 25 + src/lib/api/merchant/models/orderCreateDto.ts | 40 + src/lib/api/merchant/models/orderDto.ts | 27 + .../merchant/models/orderFailureRequestDto.ts | 19 + .../api/merchant/models/orderNextStatusDto.ts | 16 + .../merchant/models/orderQueryRequestDto.ts | 71 + .../models/orderStateChangeRequestDto.ts | 21 + src/lib/api/merchant/models/orderStateDto.ts | 38 + .../api/merchant/models/orderTriggerDto.ts | 58 + src/lib/api/merchant/models/orderViewDto.ts | 56 + src/lib/api/merchant/models/paymentType.ts | 26 + .../merchant/models/phoneVerificationState.ts | 26 + .../merchant/models/preparationStateDto.ts | 25 + .../api/merchant/models/priceEstimationDto.ts | 37 + .../models/priceEstimationRequestDto.ts | 18 + src/lib/api/merchant/models/problemDetails.ts | 5 + .../merchant/models/productCompositeDto.ts | 36 + src/lib/api/merchant/models/productDto.ts | 13 + .../merchant/models/productQueryRequestDto.ts | 10 + .../api/merchant/models/productRevisionDto.ts | 38 + .../models/productRevisionQueryRequestDto.ts | 15 + .../api/merchant/models/productStopListDto.ts | 7 + .../merchant/models/productUnavailableDto.ts | 15 + .../models/productUnavailableReason.ts | 41 + .../models/promotionQueryRequestDto.ts | 14 + .../api/merchant/models/promotionViewDto.ts | 17 + .../api/merchant/models/purchaseTriggerDto.ts | 12 + src/lib/api/merchant/models/restaurantDto.ts | 37 + .../merchant/models/restaurantRevisionDto.ts | 76 + .../api/merchant/models/rolePermissionsDto.ts | 17 + src/lib/api/merchant/models/scheduleDto.ts | 28 + .../merchant/models/scheduleExceptionDto.ts | 19 + .../api/merchant/models/selectedOptionDto.ts | 23 + .../api/merchant/models/selectedProductDto.ts | 33 + .../api/merchant/models/sellerCompositeDto.ts | 61 + src/lib/api/merchant/models/sellerDto.ts | 40 + .../models/sellerOperationalStateDto.ts | 38 + .../sellerOperationalStateTriggerDto.ts | 17 + .../models/sellerPublicAggregateFullDto.ts | 22 + .../merchant/models/sellerQueryRequestDto.ts | 17 + .../api/merchant/models/sellerRevisionDto.ts | 59 + .../models/sellerRevisionQueryRequestDto.ts | 49 + src/lib/api/merchant/models/sellerViewDto.ts | 48 + .../merchant/models/sessionIpResponseDto.ts | 13 + src/lib/api/merchant/models/sessionStatus.ts | 38 + .../api/merchant/models/sessionStatusDto.ts | 23 + .../merchant/models/signedAuthDocumentDto.ts | 16 + .../api/merchant/models/simpleContactDto.ts | 11 + .../models/startSessionResponseDto.ts | 18 + .../api/merchant/models/stopListTriggerDto.ts | 11 + .../api/merchant/models/systemSecurityDto.ts | 23 + src/lib/api/merchant/models/tag.ts | 5 + .../merchant/models/textQueryRequestDto.ts | 17 + .../api/merchant/models/textRevisionDto.ts | 17 + src/lib/api/merchant/models/timeRangeDto.ts | 17 + src/lib/api/merchant/models/timeTriggerDto.ts | 17 + src/lib/api/merchant/models/triggerEffect.ts | 31 + .../models/updatePermissionsRequest.ts | 21 + src/lib/api/merchant/models/userDto.ts | 53 + .../api/merchant/models/userQueryRequest.ts | 30 + .../api/merchant/models/verifiedValueDto.ts | 21 + src/lib/api/merchant/models/versionCheck.ts | 26 + src/lib/api/merchant/open-api.json | 11211 ++++++++++++++++ src/lib/api/merchant/services/AiService.ts | 31 + .../services/AuthenticationService.ts | 132 + .../services/CategoriesCanonicalService.ts | 188 + .../services/CategoriesRevisionsService.ts | 148 + .../services/CategoriesViewsService.ts | 75 + .../merchant/services/DeliveriesService.ts | 82 + .../api/merchant/services/ImagesService.ts | 101 + src/lib/api/merchant/services/OidcService.ts | 44 + .../merchant/services/OrdersBasketService.ts | 31 + .../api/merchant/services/OrdersService.ts | 228 + .../ProductOptionsRevisionsService.ts | 169 + .../services/ProductsCanonicalService.ts | 188 + .../services/ProductsRevisionsService.ts | 147 + .../merchant/services/ProductsViewsService.ts | 75 + .../merchant/services/PromotionsService.ts | 125 + .../api/merchant/services/SecurityService.ts | 47 + .../services/SellersCanonicalService.ts | 193 + .../services/SellersRevisionsService.ts | 149 + .../merchant/services/SellersViewsService.ts | 187 + .../services/ServerSideEventsService.ts | 107 + .../api/merchant/services/SystemService.ts | 33 + src/lib/api/merchant/services/TestsService.ts | 51 + .../TranslatableTextRevisionsService.ts | 145 + src/lib/api/merchant/services/UserService.ts | 90 + .../merchant/services/VerificationsService.ts | 82 + src/lib/api/merchant/services/WebService.ts | 53 + src/main.tsx | 24 + src/routes/index.jsx | 97 + src/shared/lib/api-url.ts | 81 + src/shared/lib/api/apiService.ts | 90 + src/shared/lib/api/index.ts | 3 + src/shared/lib/api/types.ts | 37 + src/shared/lib/cn.ts | 11 + src/shared/lib/config.ts | 16 + src/shared/lib/diagnostics.ts | 50 + src/shared/lib/fonts.ts | 30 + src/shared/lib/index.ts | 6 + src/shared/lib/url-utils.ts | 150 + src/shared/types/global.d.ts | 45 + src/shared/ui/Button.tsx | 57 + src/shared/ui/Card.tsx | 85 + src/shared/ui/Dialog.tsx | 122 + src/shared/ui/ImageUpload.tsx | 164 + src/shared/ui/Input.tsx | 8 + src/shared/ui/Layout/Header.tsx | 40 + src/shared/ui/Layout/MainLayout.tsx | 25 + src/shared/ui/Layout/Sidebar.tsx | 62 + src/shared/ui/Layout/index.ts | 3 + src/shared/ui/Switch.tsx | 43 + src/shared/ui/Tabs.tsx | 71 + src/shared/ui/Textarea.tsx | 8 + src/shared/ui/TimeRangePicker.tsx | 30 + src/shared/ui/index.ts | 31 + src/styles/global.css | 17 + src/styles/index.ts | 4 + src/styles/theme-variables.css | 43 + tailwind.config.js | 71 + tsconfig.json | 57 + tsconfig.node.json | 11 + vite.config.ts | 81 + vite.server.js | 54 + 266 files changed, 31446 insertions(+) create mode 100644 .env.development create mode 100644 .env.template create mode 100644 .gitignore create mode 100644 .husky/commit-msg create mode 100644 .husky/pre-commit create mode 100644 .npmrc create mode 100644 .vscode/launch.json create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 babel.config.js create mode 100644 commitlint.config.js create mode 100644 docker-compose.override.yml.template create mode 100644 docker-compose.yml create mode 100644 docker-entrypoint.sh create mode 100644 docs/README.md create mode 100644 docs/VERSION_TAGGING.md create mode 100644 docs/architecture.md create mode 100644 docs/authentication.md create mode 100644 docs/client-env-vars.md create mode 100644 docs/configuration.md create mode 100644 docs/deployment.md create mode 100644 docs/effector-guide.md create mode 100644 docs/flux-vs-mvvm.md create mode 100644 docs/local-development.md create mode 100644 docs/project-structure.md create mode 100644 docs/typescript-conventions.md create mode 100644 docs/utils.md create mode 100644 eslint.config.mjs create mode 100644 index.html create mode 100644 memory-bank/README.md create mode 100644 memory-bank/projectbrief.md create mode 100644 memory-bank/systemPatterns.md create mode 100644 memory-bank/techContext.md create mode 100644 nginx.conf create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/app-config.js create mode 100644 react-spa-template.code-workspace create mode 100644 scripts/generate-app-config.js create mode 100644 scripts/vite-plugin-app-config.js create mode 100644 src/app/root.tsx create mode 100644 src/app/routes.tsx create mode 100644 src/domains/auth/index.ts create mode 100644 src/domains/auth/model.ts create mode 100644 src/domains/auth/oidc-config.ts create mode 100644 src/domains/auth/types.ts create mode 100644 src/domains/auth/ui/AuthCallback.tsx create mode 100644 src/domains/auth/ui/AuthProvider.tsx create mode 100644 src/domains/auth/ui/LoginPage.tsx create mode 100644 src/domains/auth/ui/LogoutButton.tsx create mode 100644 src/domains/auth/ui/ProtectedRoute.tsx create mode 100644 src/domains/auth/ui/index.ts create mode 100644 src/domains/auth/view-model.ts create mode 100644 src/domains/dashboard/index.ts create mode 100644 src/domains/dashboard/ui/Dashboard.tsx create mode 100644 src/domains/dashboard/ui/index.ts create mode 100644 src/index.css create mode 100644 src/lib/api/merchant/core/ApiError.ts create mode 100644 src/lib/api/merchant/core/ApiRequestOptions.ts create mode 100644 src/lib/api/merchant/core/ApiResult.ts create mode 100644 src/lib/api/merchant/core/CancelablePromise.ts create mode 100644 src/lib/api/merchant/core/OpenAPI.ts create mode 100644 src/lib/api/merchant/core/initialize.ts create mode 100644 src/lib/api/merchant/core/request.ts create mode 100644 src/lib/api/merchant/index.ts create mode 100644 src/lib/api/merchant/models/QueryResultDto_CategoryDto_.ts create mode 100644 src/lib/api/merchant/models/QueryResultDto_CategoryRevisionDto_.ts create mode 100644 src/lib/api/merchant/models/QueryResultDto_OptionsRevisionDto_.ts create mode 100644 src/lib/api/merchant/models/QueryResultDto_OrderViewDto_.ts create mode 100644 src/lib/api/merchant/models/QueryResultDto_ProductRevisionDto_.ts create mode 100644 src/lib/api/merchant/models/QueryResultDto_PromotionViewDto_.ts create mode 100644 src/lib/api/merchant/models/QueryResultDto_SellerDto_.ts create mode 100644 src/lib/api/merchant/models/QueryResultDto_SellerRevisionDto_.ts create mode 100644 src/lib/api/merchant/models/QueryResultDto_TextRevisionDto_.ts create mode 100644 src/lib/api/merchant/models/QueryResultDto_UserDto_.ts create mode 100644 src/lib/api/merchant/models/_void.ts create mode 100644 src/lib/api/merchant/models/addressDto.ts create mode 100644 src/lib/api/merchant/models/addressType.ts create mode 100644 src/lib/api/merchant/models/aspectType.ts create mode 100644 src/lib/api/merchant/models/assetCollectionDto.ts create mode 100644 src/lib/api/merchant/models/authDocumentDto.ts create mode 100644 src/lib/api/merchant/models/authHeaderResponseDto.ts create mode 100644 src/lib/api/merchant/models/authenticationResultDto.ts create mode 100644 src/lib/api/merchant/models/baseCreateSellerRevisionDto.ts create mode 100644 src/lib/api/merchant/models/baseOfferDto.ts create mode 100644 src/lib/api/merchant/models/baseTriggerDto.ts create mode 100644 src/lib/api/merchant/models/basketDto.ts create mode 100644 src/lib/api/merchant/models/bundleDiscountOfferDto.ts create mode 100644 src/lib/api/merchant/models/bundleTriggerDto.ts create mode 100644 src/lib/api/merchant/models/calculatedCheckoutDto.ts create mode 100644 src/lib/api/merchant/models/calculatedProductDto.ts create mode 100644 src/lib/api/merchant/models/categoryCompositeDto.ts create mode 100644 src/lib/api/merchant/models/categoryDto.ts create mode 100644 src/lib/api/merchant/models/categoryQueryRequestDto.ts create mode 100644 src/lib/api/merchant/models/categoryRevisionDto.ts create mode 100644 src/lib/api/merchant/models/categoryRevisionQueryRequestDto.ts create mode 100644 src/lib/api/merchant/models/categoryStopListDto.ts create mode 100644 src/lib/api/merchant/models/categoryViewDto.ts create mode 100644 src/lib/api/merchant/models/checkoutOptionsDto.ts create mode 100644 src/lib/api/merchant/models/commonOrderFailureResult.ts create mode 100644 src/lib/api/merchant/models/commonOrderStatus.ts create mode 100644 src/lib/api/merchant/models/couponTriggerDto.ts create mode 100644 src/lib/api/merchant/models/courierInfoDto.ts create mode 100644 src/lib/api/merchant/models/createCategoryDto.ts create mode 100644 src/lib/api/merchant/models/createCategoryRevisionDto.ts create mode 100644 src/lib/api/merchant/models/createOptionsRevisionDto.ts create mode 100644 src/lib/api/merchant/models/createProductDto.ts create mode 100644 src/lib/api/merchant/models/createProductRevisionDto.ts create mode 100644 src/lib/api/merchant/models/createPromotionDto.ts create mode 100644 src/lib/api/merchant/models/createRestaurantDto.ts create mode 100644 src/lib/api/merchant/models/createRestaurantRevisionDto.ts create mode 100644 src/lib/api/merchant/models/createSellerDto.ts create mode 100644 src/lib/api/merchant/models/createSellerRevisionDto.ts create mode 100644 src/lib/api/merchant/models/createTextRevisionDto.ts create mode 100644 src/lib/api/merchant/models/customerGroupTriggerDto.ts create mode 100644 src/lib/api/merchant/models/customerHistoryTriggerDto.ts create mode 100644 src/lib/api/merchant/models/customerLoyaltyTriggerDto.ts create mode 100644 src/lib/api/merchant/models/deliveryAddressDto.ts create mode 100644 src/lib/api/merchant/models/deliveryFailureResult.ts create mode 100644 src/lib/api/merchant/models/deliveryLocationDto.ts create mode 100644 src/lib/api/merchant/models/deliveryOrderStatus.ts create mode 100644 src/lib/api/merchant/models/deliveryStateDto.ts create mode 100644 src/lib/api/merchant/models/digitalEngagementTriggerDto.ts create mode 100644 src/lib/api/merchant/models/discountProductOfferDto.ts create mode 100644 src/lib/api/merchant/models/discountTotalOfferDto.ts create mode 100644 src/lib/api/merchant/models/discountType.ts create mode 100644 src/lib/api/merchant/models/dispatchMethodType.ts create mode 100644 src/lib/api/merchant/models/freeDeliveryOfferDto.ts create mode 100644 src/lib/api/merchant/models/freeItemOfferDto.ts create mode 100644 src/lib/api/merchant/models/gpsLocationDto.ts create mode 100644 src/lib/api/merchant/models/holidayTriggerDto.ts create mode 100644 src/lib/api/merchant/models/humanVerificationRequestDto.ts create mode 100644 src/lib/api/merchant/models/humanVerificationStatusDto.ts create mode 100644 src/lib/api/merchant/models/iTriggerDto.ts create mode 100644 src/lib/api/merchant/models/imageReferenceDto.ts create mode 100644 src/lib/api/merchant/models/localizedTextDto.ts create mode 100644 src/lib/api/merchant/models/managerOverrideTriggerDto.ts create mode 100644 src/lib/api/merchant/models/oidcConnectResponseDto.ts create mode 100644 src/lib/api/merchant/models/optionDto.ts create mode 100644 src/lib/api/merchant/models/optionsQueryDto.ts create mode 100644 src/lib/api/merchant/models/optionsRevisionDto.ts create mode 100644 src/lib/api/merchant/models/optionsViewDto.ts create mode 100644 src/lib/api/merchant/models/orderCreateDto.ts create mode 100644 src/lib/api/merchant/models/orderDto.ts create mode 100644 src/lib/api/merchant/models/orderFailureRequestDto.ts create mode 100644 src/lib/api/merchant/models/orderNextStatusDto.ts create mode 100644 src/lib/api/merchant/models/orderQueryRequestDto.ts create mode 100644 src/lib/api/merchant/models/orderStateChangeRequestDto.ts create mode 100644 src/lib/api/merchant/models/orderStateDto.ts create mode 100644 src/lib/api/merchant/models/orderTriggerDto.ts create mode 100644 src/lib/api/merchant/models/orderViewDto.ts create mode 100644 src/lib/api/merchant/models/paymentType.ts create mode 100644 src/lib/api/merchant/models/phoneVerificationState.ts create mode 100644 src/lib/api/merchant/models/preparationStateDto.ts create mode 100644 src/lib/api/merchant/models/priceEstimationDto.ts create mode 100644 src/lib/api/merchant/models/priceEstimationRequestDto.ts create mode 100644 src/lib/api/merchant/models/problemDetails.ts create mode 100644 src/lib/api/merchant/models/productCompositeDto.ts create mode 100644 src/lib/api/merchant/models/productDto.ts create mode 100644 src/lib/api/merchant/models/productQueryRequestDto.ts create mode 100644 src/lib/api/merchant/models/productRevisionDto.ts create mode 100644 src/lib/api/merchant/models/productRevisionQueryRequestDto.ts create mode 100644 src/lib/api/merchant/models/productStopListDto.ts create mode 100644 src/lib/api/merchant/models/productUnavailableDto.ts create mode 100644 src/lib/api/merchant/models/productUnavailableReason.ts create mode 100644 src/lib/api/merchant/models/promotionQueryRequestDto.ts create mode 100644 src/lib/api/merchant/models/promotionViewDto.ts create mode 100644 src/lib/api/merchant/models/purchaseTriggerDto.ts create mode 100644 src/lib/api/merchant/models/restaurantDto.ts create mode 100644 src/lib/api/merchant/models/restaurantRevisionDto.ts create mode 100644 src/lib/api/merchant/models/rolePermissionsDto.ts create mode 100644 src/lib/api/merchant/models/scheduleDto.ts create mode 100644 src/lib/api/merchant/models/scheduleExceptionDto.ts create mode 100644 src/lib/api/merchant/models/selectedOptionDto.ts create mode 100644 src/lib/api/merchant/models/selectedProductDto.ts create mode 100644 src/lib/api/merchant/models/sellerCompositeDto.ts create mode 100644 src/lib/api/merchant/models/sellerDto.ts create mode 100644 src/lib/api/merchant/models/sellerOperationalStateDto.ts create mode 100644 src/lib/api/merchant/models/sellerOperationalStateTriggerDto.ts create mode 100644 src/lib/api/merchant/models/sellerPublicAggregateFullDto.ts create mode 100644 src/lib/api/merchant/models/sellerQueryRequestDto.ts create mode 100644 src/lib/api/merchant/models/sellerRevisionDto.ts create mode 100644 src/lib/api/merchant/models/sellerRevisionQueryRequestDto.ts create mode 100644 src/lib/api/merchant/models/sellerViewDto.ts create mode 100644 src/lib/api/merchant/models/sessionIpResponseDto.ts create mode 100644 src/lib/api/merchant/models/sessionStatus.ts create mode 100644 src/lib/api/merchant/models/sessionStatusDto.ts create mode 100644 src/lib/api/merchant/models/signedAuthDocumentDto.ts create mode 100644 src/lib/api/merchant/models/simpleContactDto.ts create mode 100644 src/lib/api/merchant/models/startSessionResponseDto.ts create mode 100644 src/lib/api/merchant/models/stopListTriggerDto.ts create mode 100644 src/lib/api/merchant/models/systemSecurityDto.ts create mode 100644 src/lib/api/merchant/models/tag.ts create mode 100644 src/lib/api/merchant/models/textQueryRequestDto.ts create mode 100644 src/lib/api/merchant/models/textRevisionDto.ts create mode 100644 src/lib/api/merchant/models/timeRangeDto.ts create mode 100644 src/lib/api/merchant/models/timeTriggerDto.ts create mode 100644 src/lib/api/merchant/models/triggerEffect.ts create mode 100644 src/lib/api/merchant/models/updatePermissionsRequest.ts create mode 100644 src/lib/api/merchant/models/userDto.ts create mode 100644 src/lib/api/merchant/models/userQueryRequest.ts create mode 100644 src/lib/api/merchant/models/verifiedValueDto.ts create mode 100644 src/lib/api/merchant/models/versionCheck.ts create mode 100644 src/lib/api/merchant/open-api.json create mode 100644 src/lib/api/merchant/services/AiService.ts create mode 100644 src/lib/api/merchant/services/AuthenticationService.ts create mode 100644 src/lib/api/merchant/services/CategoriesCanonicalService.ts create mode 100644 src/lib/api/merchant/services/CategoriesRevisionsService.ts create mode 100644 src/lib/api/merchant/services/CategoriesViewsService.ts create mode 100644 src/lib/api/merchant/services/DeliveriesService.ts create mode 100644 src/lib/api/merchant/services/ImagesService.ts create mode 100644 src/lib/api/merchant/services/OidcService.ts create mode 100644 src/lib/api/merchant/services/OrdersBasketService.ts create mode 100644 src/lib/api/merchant/services/OrdersService.ts create mode 100644 src/lib/api/merchant/services/ProductOptionsRevisionsService.ts create mode 100644 src/lib/api/merchant/services/ProductsCanonicalService.ts create mode 100644 src/lib/api/merchant/services/ProductsRevisionsService.ts create mode 100644 src/lib/api/merchant/services/ProductsViewsService.ts create mode 100644 src/lib/api/merchant/services/PromotionsService.ts create mode 100644 src/lib/api/merchant/services/SecurityService.ts create mode 100644 src/lib/api/merchant/services/SellersCanonicalService.ts create mode 100644 src/lib/api/merchant/services/SellersRevisionsService.ts create mode 100644 src/lib/api/merchant/services/SellersViewsService.ts create mode 100644 src/lib/api/merchant/services/ServerSideEventsService.ts create mode 100644 src/lib/api/merchant/services/SystemService.ts create mode 100644 src/lib/api/merchant/services/TestsService.ts create mode 100644 src/lib/api/merchant/services/TranslatableTextRevisionsService.ts create mode 100644 src/lib/api/merchant/services/UserService.ts create mode 100644 src/lib/api/merchant/services/VerificationsService.ts create mode 100644 src/lib/api/merchant/services/WebService.ts create mode 100644 src/main.tsx create mode 100644 src/routes/index.jsx create mode 100644 src/shared/lib/api-url.ts create mode 100644 src/shared/lib/api/apiService.ts create mode 100644 src/shared/lib/api/index.ts create mode 100644 src/shared/lib/api/types.ts create mode 100644 src/shared/lib/cn.ts create mode 100644 src/shared/lib/config.ts create mode 100644 src/shared/lib/diagnostics.ts create mode 100644 src/shared/lib/fonts.ts create mode 100644 src/shared/lib/index.ts create mode 100644 src/shared/lib/url-utils.ts create mode 100644 src/shared/types/global.d.ts create mode 100644 src/shared/ui/Button.tsx create mode 100644 src/shared/ui/Card.tsx create mode 100644 src/shared/ui/Dialog.tsx create mode 100644 src/shared/ui/ImageUpload.tsx create mode 100644 src/shared/ui/Input.tsx create mode 100644 src/shared/ui/Layout/Header.tsx create mode 100644 src/shared/ui/Layout/MainLayout.tsx create mode 100644 src/shared/ui/Layout/Sidebar.tsx create mode 100644 src/shared/ui/Layout/index.ts create mode 100644 src/shared/ui/Switch.tsx create mode 100644 src/shared/ui/Tabs.tsx create mode 100644 src/shared/ui/Textarea.tsx create mode 100644 src/shared/ui/TimeRangePicker.tsx create mode 100644 src/shared/ui/index.ts create mode 100644 src/styles/global.css create mode 100644 src/styles/index.ts create mode 100644 src/styles/theme-variables.css create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts create mode 100644 vite.server.js diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..f65f92c --- /dev/null +++ b/.env.development @@ -0,0 +1,6 @@ +CLIENT_BASE_PATH=/ +CLIENT_API_URL=https://localhost:7205 +CLIENT_APP_NAME=Merchant Operator App +CLIENT_DEBUG=true +CLIENT_MAP_TILE_ENDPOINT=https://tiles.locationiq.com/v3/streets/vector.json +CLIENT_MAP_TILE_API_KEY=pk.19d62daa998822ac22861d96a0424b58 \ No newline at end of file diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..d800135 --- /dev/null +++ b/.env.template @@ -0,0 +1,6 @@ +CLIENT_BASE_PATH=/ +CLIENT_API_URL=https:// +CLIENT_APP_NAME=Merchant Operator App +CLIENT_DEBUG=true +CLIENT_MAP_TILE_ENDPOINT=https:// +CLIENT_MAP_TILE_API_KEY= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..167b5ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/node_modules/ +/dist/ +.env +.env.local +.env.*.local +docker-compose.override.yml diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..d85401d --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,3 @@ +#!/usr/bin/env sh + +npx --no -- commitlint --edit ${1} \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..2f453ac --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,3 @@ +#!/usr/bin/env sh + +npx lint-staged \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..62c045c --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@g1:registry=https://git.generation.one/api/packages/GenerationOne/npm/ diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..34b0df6 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,33 @@ +{ + "version": "0.2.0", + "compounds": [ + { + "name": "Debug Vite (server + browser)", + "configurations": [ + "Launch Vite Dev Server", + "Launch Brave against localhost" + ] + } + ], + "configurations": [ + { + "name": "Launch Brave against localhost", + "type": "pwa-chrome", + "request": "launch", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}/src", + "runtimeExecutable": "C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe" + }, + { + "type": "pwa-node", + "request": "launch", + "name": "Launch Vite Dev Server", + "program": "${workspaceFolder}/node_modules/vite/bin/vite.js", + "args": ["--port", "5173"], + "cwd": "${workspaceFolder}", + "autoAttachChildProcesses": true, + "skipFiles": ["/**"] + } + ] + } + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7d9a3fe --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +# Build stage +FROM node:slim AS build +WORKDIR /app +COPY package*.json ./ +RUN npm install +COPY . . + +# Build the application +RUN npm run build -- --base=./ + +# NOTE: We copy the environment variables CLIENT_ to an .env file in the running container. +# This is done with the docker-entrypoint.sh script. +# We do this so one build can support many different environments. + +# Production stage +FROM nginx:alpine + +COPY --from=build /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY docker-entrypoint.sh /docker-entrypoint.sh +RUN sed -i 's/\r$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh + +EXPOSE 369 +ENTRYPOINT ["/docker-entrypoint.sh"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..c73aa97 --- /dev/null +++ b/README.md @@ -0,0 +1,96 @@ +# Merchant Operator Web + +Merchant Operator App is a browser-only React SPA that lets local businesses create, edit, and audit their own merchant records on Local—a community-commerce network running on the peer-to-peer FogBox stack. Its mission is to decentralize ownership of commercial data and return technological control to merchants and their customers. Data is written locally first, then synchronised through FogBox nodes—no central server—ensuring autonomy and resilience. Open, well-documented APIs let any citizen-developer extend, fork, or integrate the codebase without gatekeepers. + +## Architecture + +This project follows a Flux-style architecture using Effector for state management. The architecture is organized around domains, with each domain containing its model (events, stores, effects), view-model (React hooks), and UI components. + +For more details, see the [Architecture Documentation](./docs/architecture.md). + +## Project Structure + +The project follows a domain-driven structure for better maintainability and scalability: + +``` +merchant-operator-web/ +├── src/ +│ ├── app/ # Application entry point and configuration +│ │ ├── root.tsx # Root component +│ │ └── routes.tsx # Route definitions +│ ├── domains/ # Feature domains +│ │ └── / # e.g., products, auth, orders +│ │ ├── model.ts # Effector events, stores, effects +│ │ ├── view-model.ts # React hooks +│ │ └── ui/ # React components +│ ├── shared/ # Shared code +│ │ ├── lib/ # Utilities, helpers, adapters +│ │ └── ui/ # Reusable UI components +│ ├── assets/ # Static assets (images, fonts) +│ ├── styles/ # Global styles +│ └── types/ # TypeScript types +├── public/ # Static files +├── config/ # Build/env configuration +└── docs/ # Documentation +``` + +## Path Aliases + +The project uses path aliases for cleaner imports: + +- `@` - Points to the `src` directory +- `@app` - Points to the `src/app` directory +- `@domains` - Points to the `src/domains` directory +- `@shared` - Points to the `src/shared` directory +- `@shared/ui` - Points to the `src/shared/ui` directory +- `@shared/lib` - Points to the `src/shared/lib` directory +- `@assets` - Points to the `src/assets` directory +- `@styles` - Points to the `src/styles` directory +- `@types` - Points to the `src/types` directory + +## Development + +### Prerequisites + +- Node.js (v18+) +- npm or yarn + +### Installation + +```bash +npm install +``` + +### Running the Development Server + +```bash +npm run dev +``` + +### Building for Production + +```bash +npm run build +``` + +### Preview Production Build + +```bash +npm run preview +``` + +## Configuration + +The application uses runtime environment variables for configuration, which are injected into the application through `window.appConfig`. + +For detailed configuration options, see the [Configuration Documentation](./docs/configuration.md). + +## Documentation + +For more detailed documentation, see the [docs](./docs) directory: + +- [Architecture](./docs/architecture.md) - Overview of our Flux-style architecture with Effector +- [Project Structure](./docs/project-structure.md) - Detailed explanation of our project structure +- [Configuration](./docs/configuration.md) - Detailed configuration options and environment variables +- [Effector Guide](./docs/effector-guide.md) - Comprehensive guide on how to use Effector +- [TypeScript Conventions](./docs/typescript-conventions.md) - TypeScript conventions for the project diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..faefe80 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,7 @@ +module.exports = { + presets: [ + ["@babel/preset-env", { targets: { browsers: "last 2 versions" } }], + ["@babel/preset-react", { runtime: "automatic" }], + ], + plugins: ["@babel/plugin-transform-react-jsx"], +}; diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..a167ecb --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,36 @@ +export default { + extends: ["@commitlint/config-conventional"], + rules: { + "body-leading-blank": [1, "always"], + "body-max-line-length": [2, "always", 100], + "footer-leading-blank": [1, "always"], + "footer-max-line-length": [2, "always", 100], + "header-max-length": [2, "always", 100], + "subject-case": [ + 2, + "never", + ["sentence-case", "start-case", "pascal-case", "upper-case"], + ], + "subject-empty": [2, "never"], + "subject-full-stop": [2, "never", "."], + "type-case": [2, "always", "lower-case"], + "type-empty": [2, "never"], + "type-enum": [ + 2, + "always", + [ + "build", + "chore", + "ci", + "docs", + "feat", + "fix", + "perf", + "refactor", + "revert", + "style", + "test", + ], + ], + }, +}; diff --git a/docker-compose.override.yml.template b/docker-compose.override.yml.template new file mode 100644 index 0000000..a3e1efb --- /dev/null +++ b/docker-compose.override.yml.template @@ -0,0 +1,12 @@ +services: + merchant-operator-web: + environment: + - CLIENT_BASE_PATH= + - CLIENT_API_URL=https:// + - CLIENT_APP_NAME= + - CLIENT_DEBUG= + - CLIENT_MAP_TILE_ENDPOINT=https:// + - CLIENT_MAP_TILE_API_KEY= +networks: + traefik: # ← key stays literal, no variables here + external: true # shorthand; Compose will look for a network literally named “traefik” \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..1df166a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,19 @@ +services: + merchant-operator-web: + build: + context: . + container_name: ${APP_CONTAINER_NAME:-merchant-operator-web} + environment: + - CLIENT_BASE_PATH=${CLIENT_BASE_PATH:-/} + - CLIENT_API_URL=${CLIENT_API_URL:-} + - CLIENT_APP_NAME=${CLIENT_APP_NAME:-Merchant Operator App} + - CLIENT_DEBUG=${CLIENT_DEBUG:-false} + labels: + - "traefik.enable=true" + - "traefik.http.routers.${APP_NAME:-merchant-operator-web}.rule=Host(`${APP_DOMAIN:-localhost}`) && PathPrefix(`${BASE_PATH:-/}`)" + - "traefik.http.routers.${APP_NAME:-merchant-operator-web}.entrypoints=${TRAEFIK_ENTRYPOINT:-websecure}" + - "traefik.http.routers.${APP_NAME:-merchant-operator-web}.tls=${ENABLE_TLS:-false}" + - "traefik.http.routers.${APP_NAME:-merchant-operator-web}.tls.certresolver=${CERT_RESOLVER:-letsencrypt}" + - "traefik.http.services.${APP_NAME:-merchant-operator-web}.loadbalancer.server.port=369" + - "traefik.http.routers.${APP_NAME:-merchant-operator-web}.middlewares=${APP_NAME:-merchant-operator-web}-strip" + - "traefik.http.middlewares.${APP_NAME:-merchant-operator-web}-strip.stripprefix.prefixes=${BASE_PATH:-/}" diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..7122e8e --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,129 @@ +#!/bin/sh +# +# docker-entrypoint.sh +# ──────────────────── +# Creates /usr/share/nginx/html/app-config.js from CLIENT_* env‑vars +# and then starts Nginx. +# + +set -e + +echo "Starting docker-entrypoint.sh script..." +echo "Current directory: $(pwd)" +echo "Preparing runtime environment..." + +TARGET_DIR="/usr/share/nginx/html" + +echo "Checking target directory: $TARGET_DIR" +if [ -d "$TARGET_DIR" ]; then + echo "Target directory exists" + ls -la "$TARGET_DIR" +else + echo "ERROR: Target directory does not exist: $TARGET_DIR" + exit 1 +fi + +echo "Creating runtime environment variables script..." + +if [ -d "$TARGET_DIR" ]; then + TEMP_DIR="/tmp/app-config" + mkdir -p "$TEMP_DIR" + rm -rf "$TEMP_DIR"/* + + # + # ──────────────────────────────────────────────────────────────── + # 1. Robust camel‑case conversion ← *changed* + # ──────────────────────────────────────────────────────────────── + # + to_camel_case() { + # Converts FOO_BAR_BAZ → fooBarBaz (POSIX‑sh + awk) + printf '%s\n' "$1" | awk -F'_' '{ + for (i = 1; i <= NF; i++) { + if (i == 1) { + # first chunk stays lower‑case + printf tolower($i) + } else { + # capitalise 1st, lower‑case rest + printf toupper(substr($i,1,1)) tolower(substr($i,2)) + } + } + }' + } + + echo "Processing CLIENT_ environment variables..." + env | grep '^CLIENT_' | while IFS='=' read -r key value; do + key_without_prefix="${key#CLIENT_}" + camel_key="$(to_camel_case "$key_without_prefix")" + echo "$value" > "$TEMP_DIR/$camel_key" + echo " Processed $key -> $camel_key" + done + + # + # ──────────────────────────────────────────────────────────────── + # 2. Add defaults only if the key is still missing ← *changed* + # ──────────────────────────────────────────────────────────────── + # + [ -f "$TEMP_DIR/apiUrl" ] || echo "https://localhost:7205" >"$TEMP_DIR/apiUrl" + [ -f "$TEMP_DIR/basePath" ] || echo "/" >"$TEMP_DIR/basePath" + [ -f "$TEMP_DIR/appName" ] || echo "Merchant Operator App" >"$TEMP_DIR/appName" + [ -f "$TEMP_DIR/debug" ] || echo "false" >"$TEMP_DIR/debug" + + echo "Generating app-config.js..." + { + echo "// Runtime environment variables - Generated by docker-entrypoint.sh" + echo "window.appConfig = {" + for file in "$TEMP_DIR"/*; do + key="$(basename "$file")" + value="$(cat "$file")" + if echo "$value" | grep -Eq '^(true|false|null|[0-9]+)$'; then + echo " $key: $value," + else + # escape double quotes just in case + esc_value=$(printf '%s' "$value" | sed 's/"/\\"/g') + echo " $key: \"$esc_value\"," + fi + done + echo "};" + } > "$TARGET_DIR/app-config.js" + + rm -rf "$TEMP_DIR" + chmod 644 "$TARGET_DIR/app-config.js" + + if [ -f "$TARGET_DIR/index.html" ]; then + if ! grep -q "app-config.js" "$TARGET_DIR/index.html"; then + sed -i 's||\n |' "$TARGET_DIR/index.html" + echo "Added app-config.js script to index.html" + else + echo "app-config.js script already exists in index.html" + fi + else + echo "ERROR: index.html not found in $TARGET_DIR" + fi + + echo "Runtime environment variables script created successfully." +else + echo "ERROR: Target directory does not exist: $TARGET_DIR" +fi + +echo "Environment variables extracted. Starting Nginx server..." + +echo "Checking Nginx configuration..." +if [ -f "/etc/nginx/conf.d/default.conf" ]; then + echo "Nginx configuration found at: /etc/nginx/conf.d/default.conf" + cat /etc/nginx/conf.d/default.conf +else + echo "ERROR: Nginx configuration not found at /etc/nginx/conf.d/default.conf" + ls -la /etc/nginx/conf.d/ +fi + +if command -v nginx >/dev/null 2>&1; then + echo "Nginx found at: $(which nginx)" + nginx -v 2>&1 + echo "Testing Nginx configuration..." + nginx -t + echo "Starting Nginx with: nginx -g 'daemon off;'" + exec nginx -g 'daemon off;' +else + echo "ERROR: Nginx not found or not executable" + exit 1 +fi diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..0fca78b --- /dev/null +++ b/docs/README.md @@ -0,0 +1,45 @@ +# Merchant Operator App Documentation + +## Project Overview + +Merchant Operator App is a browser-only React SPA for local businesses to manage their merchant records on a decentralized commerce network. It uses a peer-to-peer architecture with local-first data storage and synchronization through FogBox nodes. + +## Agent Guidelines + +- **Architecture**: Use Flux-style with Effector for state management +- **File Structure**: Follow domain-driven organization (model.ts, view-model.ts, ui/) +- **TypeScript**: Use strict mode with proper typing +- **Components**: Keep UI components pure and presentational +- **State Management**: Use Effector events, stores, and effects +- **API Models**: Use the generated DTOs from the API client +- **Naming**: Use $ prefix for stores, Fx suffix for effects +- **Exports**: Use named exports only, avoid default exports + +## Architecture & Project Structure + +- [Architecture](./architecture.md) - Overview of our Flux-style architecture with Effector +- [Flux vs. MVVM](./flux-vs-mvvm.md) - Comparison between Flux and MVVM architectures +- [Project Structure](./project-structure.md) - Detailed explanation of our project structure +- [Effector Guide](./effector-guide.md) - Comprehensive guide on how to use Effector +- [TypeScript Conventions](./typescript-conventions.md) - TypeScript conventions for the project + +## Deployment & Development + +- [Deployment Guide](./deployment.md) - Instructions for deploying the application with path-agnostic configuration +- [Local Development Guide](./local-development.md) - Instructions for running the application locally with different base paths +- [Client-Side Environment Variables](./client-env-vars.md) - Documentation for client-side environment variables + +## Components & Utilities + +- [Utility Functions](./utils.md) - Documentation for utility functions used in the application +- [NEW Components](./new-components.md) - Guide for using and adding components from the NEW directory + +## Path-Agnostic SPA Deployment + +The application is configured for path-agnostic deployment, allowing it to be served from any base path without requiring a rebuild. This is particularly useful for: + +- Deploying to different environments (development, staging, production) +- Serving the application from a subdirectory +- Using the same build with different routing configurations + +See the [Deployment Guide](./deployment.md) for detailed instructions on how to configure and deploy the application. diff --git a/docs/VERSION_TAGGING.md b/docs/VERSION_TAGGING.md new file mode 100644 index 0000000..9e300a0 --- /dev/null +++ b/docs/VERSION_TAGGING.md @@ -0,0 +1,107 @@ +# Git Version Tagging Guide + +This document outlines the process for managing version tags in the project's Git repository. + +--- + +## Version Tagging Conventions + +The project follows these versioning conventions: + +- Production releases: `v0.0.X` (e.g., `v0.0.35`) +- Development releases: `v0.0.X-dev1` (e.g., `v0.0.34-dev1`) +- Format follows a modified semantic versioning pattern + +--- + +## Incrementing Version Tags + +Follow these steps to increment the version tag for a new release: + +### 1. Check Existing Tags + +List all existing version tags to understand the current versioning state: + +```powershell +git tag -l "v*" +``` + +### 2. Find the Latest Version Tag + +For Windows PowerShell, use these commands to find the latest tags: + +```powershell +# Find latest production tag (frank) +git tag -l "v0.0.*-frank" | Sort-Object -Property @{Expression={[int]($_ -replace '^v0.0.', '' -replace '-frank$', '')}; Descending=$true} | Select-Object -First 1 + +# Find latest development tag (dev) +git tag -l "v0.0.*-dev*" | Sort-Object -Property @{Expression={[int]($_ -replace '^v0.0.', '' -replace '-dev.*$', '')}; Descending=$true} | Select-Object -First 1 +``` + +For Linux/macOS bash, use these commands: + +```bash +# Find latest production tag (frank) +git tag -l "v0.0.*-frank" | sort -V | tail -1 + +# Find latest development tag (dev) +git tag -l "v0.0.*-dev*" | sort -V | tail -1 +``` + +### 3. Increment the Version Number + +Based on the latest tag, increment the version number according to the project's versioning scheme: + +- If the latest tag is `v0.0.34-frank`, the new tag would be `v0.0.35-frank` +- For development versions, increment the version number only (e.g., `v0.0.34-dev1` → `v0.0.35-dev1`) +- Important: "dev1" is the channel identifier and remains constant; only increment the version number +- Example: `v0.0.87-dev1` → `v0.0.88-dev1` (correct) +- Example: `v0.0.87-dev1` → `v0.0.87-dev2` (incorrect) + +### 4. Create a New Annotated Tag + +Create a new annotated tag with a descriptive message: + +```powershell +git tag -a v0.0.35-frank -m "Description of changes in this version" +``` + +### 5. Push the New Tag to the Remote Repository + +Push the new tag to the remote repository: + +```powershell +git push origin v0.0.35-frank +``` + +--- + +## Best Practices + +- **Use Annotated Tags**: Always use annotated tags (`-a` flag) for releases, as they contain metadata including the tagger's name, email, date, and a message. + +- **Descriptive Messages**: Include a concise but descriptive message that summarizes the key changes in this version. + +- **Consistent Naming**: Follow the established naming convention consistently. + +- **Tag After Testing**: Create and push tags only after the code has been tested and confirmed to be working correctly. + +- **Don't Reuse Tags**: Never reuse or move existing tags. If a mistake is made, delete the tag and create a new one. + +--- + +## Deleting Tags (If Necessary) + +If you need to delete a tag (e.g., if it was created incorrectly): + +```powershell +# Delete local tag +git tag -d v0.0.35-frank + +# Delete remote tag +git push origin :refs/tags/v0.0.35-frank +``` + +--- + +_End of VERSION_TAGGING.md_ diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..32edee5 --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,133 @@ +# Architecture: Flux-style with Effector + +## 1. Terminology & Core Concepts + +| Term | Definition | +|------|------------| +| SPA (Single-Page Application) | Entire UI is boot-strapped once in the browser; further navigation is handled client-side. | +| Client-Side Rendering (CSR) | The browser runs JavaScript (React) that turns JSON/state into DOM; no HTML is streamed from the server after first load. | +| Effector | A small TypeScript-first library that implements Flux-style one-way data-flow with four primitives (event, store, effect, domain). | +| Flux-style architecture | Events mutate stores ➜ stores notify subscribed views; data always moves in one direction. | +| Effector-based Flux architecture | Using Effector as the single source of truth for state inside a React SPA. | + +## 2. Effector Primitives → Flux Mapping + +``` +createEvent() ≈ Action +(create)Store() ≈ Store +createEffect() ≈ Async side-effect handler +Domains ≈ Namespace / module boundary +View ≈ React component using `useStore` / `useUnit` +``` + +Flow diagram: + +``` +event ─┐ + │ triggers +store ──┤ update → React re-render + │ +effect ←┘ (async; dispatches success/fail events) +``` + +## 3. Project Layout + +``` +src/ + app/ + root.tsx # , routing + routes.tsx # Route definitions + domains/ + / + model.ts # Effector events, stores, effects (pure, testable) + view-model.ts # Thin hooks that adapt model to React + ui/ # Dumb presentational components + shared/ + ui/ # Design-system atoms + lib/ # Generic helpers + tests/ # Test files +``` + +## 4. Coding Guidelines + +| Guideline | Why it helps | +|-----------|--------------| +| TypeScript strict mode | Types give static guarantees for safe edits. | +| Pure functions in model.ts | Deterministic behavior is easier to reason about. | +| Named exports only | Eliminates default-export rename hazards. | +| Small files, single responsibility | Enables chunked, parallel code transforms. | +| Unit tests co-located with domain logic | Provide regression oracles for automated changes. | +| Runtime schema checks (e.g., Zod) | Fail fast on unexpected data. | + +## 5. Implementation Example + +### model.ts +```typescript +import { createStore, createEvent, createEffect } from 'effector'; +import { ProductsViewsService } from '@lib/api/merchant/services/ProductsViewsService'; +import type { productCompositeDto } from '@lib/api/merchant/models/productCompositeDto'; + +// Define events +export const setProductsFilter = createEvent>(); + +// Define effects +export const fetchProductsFx = createEffect(async (filter: productQueryRequestDto) => { + return await ProductsViewsService.postApiProductCompositeQueryByCanonical({ + requestBody: filter + }); +}); + +// Create stores +export const $products = createStore([]) + .on(fetchProductsFx.doneData, (_, payload) => Array.isArray(payload) ? payload : [payload]); +``` + +### view-model.ts +```typescript +import { useStore } from 'effector-react'; +import { useCallback } from 'react'; +import { + $products, + $productsLoading, + setProductsFilter, + fetchProductsFx +} from './model'; + +export const useProducts = () => { + const products = useStore($products); + const isLoading = useStore($productsLoading); + + const updateFilter = useCallback((newFilter) => { + setProductsFilter(newFilter); + }, []); + + return { + products, + isLoading, + updateFilter + }; +}; +``` + +### UI Component +```typescript +import React from 'react'; +import { useProducts } from '../view-model'; +import { ProductCard } from './ProductCard'; + +export const ProductsList: React.FC = () => { + const { products, isLoading } = useProducts(); + + if (isLoading) { + return
Loading...
; + } + + return ( +
+ {products.map(product => ( + + ))} +
+ ); +}; +``` diff --git a/docs/authentication.md b/docs/authentication.md new file mode 100644 index 0000000..313e148 --- /dev/null +++ b/docs/authentication.md @@ -0,0 +1,208 @@ +# Authentication Documentation + +This document explains the authentication setup for the Merchant Operator App. + +## OIDC Authentication + +The application uses OpenID Connect (OIDC) for authentication with the following features: + +- Dynamic configuration loading from API endpoint `/oidc.json` +- Token storage in localStorage via WebStorageStateStore +- Automatic token refresh with silent renewal +- Refresh token support via offline_access scope +- Protected routes with role-based access control +- Smart authentication flow with auto-login and manual logout tracking + +### Configuration + +The OIDC configuration is fetched from the API endpoint `/oidc.json`. This endpoint should return a JSON object with the following structure: + +```json +{ + "authorityUrl": "https://your-oidc-provider.com", + "clientId": "your-client-id" +} +``` + +The application requires the `CLIENT_API_URL` environment variable to be set to the base URL of the API server. The OIDC configuration is then fetched from `${CLIENT_API_URL}/oidc.json` using the OidcService. + +#### OIDC Client Configuration + +The application configures the OIDC client with the following settings: + +```typescript +{ + authority: config.authorityUrl, + client_id: config.clientId, + redirect_uri: `${window.location.origin}/auth/callback`, + response_type: "code", + scope: "openid profile email offline_access", // offline_access for refresh tokens + post_logout_redirect_uri: window.location.origin, + userStore: new WebStorageStateStore({ store: window.localStorage }), + loadUserInfo: true, + automaticSilentRenew: true, + revokeTokensOnSignout: true, + monitorSession: true, +} +``` + +Key configuration details: +- `offline_access` scope is requested to enable refresh tokens +- `automaticSilentRenew` is enabled to automatically refresh tokens in the background +- `revokeTokensOnSignout` ensures tokens are properly revoked when logging out +- `monitorSession` enables session monitoring to detect changes + +### Authentication Flow + +#### Initial Authentication + +1. The `AuthProvider` component initializes the `UserManager` from `oidc-client-ts` using the configuration fetched from the API endpoint `/oidc.json`. +2. It checks if the user is already authenticated by calling `userManager.getUser()`. +3. If a user is found but the token is expired or about to expire, it attempts a silent token renewal. +4. If no user is found and the user has not manually logged out (tracked in localStorage), the app automatically initiates the login process. +5. The login process first tries silent login (`userManager.signinSilent()`). +6. If silent login fails, it falls back to redirect login (`userManager.signinRedirect()`). +7. After successful authentication at the provider, the user is redirected back to the application's callback URL (`/auth/callback`). +8. The `AuthCallback` component handles the redirect, processes the response, and stores the user session. + +#### Token Renewal + +1. The application uses `automaticSilentRenew` to automatically refresh tokens in the background. +2. When a token is about to expire, the OIDC client attempts a silent renewal. +3. If silent renewal fails, the application will detect this during API calls and can redirect to login if needed. + +#### Manual vs. Auto Login + +The application implements a smart authentication flow that distinguishes between first visits and visits after manual logout: + +1. **First Visit or Regular Visit**: The app automatically initiates the login process. +2. **After Manual Logout**: The app requires the user to click the "Sign in" button to log in again. + +This behavior is controlled by a `manuallyLoggedOut` flag that is: +- Stored in localStorage to persist across page refreshes and browser sessions +- Set to `true` when the user manually logs out +- Reset to `false` when the user successfully logs in or manually clicks the login button + +### Protected Routes + +Routes that require authentication can be protected using the `ProtectedRoute` component: + +```jsx +import { ProtectedRoute } from '@domains/auth'; // Adjusted path based on current structure + +// Basic protection + + + + +// With role-based protection + + + +``` + +### Making Authenticated API Calls + +Use the `useApiService` hook (now located in `src/shared/lib/api/apiService.ts`) to make API calls. + +```jsx +import { useApiService } from '@shared/lib/api'; // Use the alias + +function YourComponent() { + const api = useApiService(); + + const fetchData = async () => { + const response = await api.get('/your-endpoint'); + const data = await response.json(); + // Process data + }; + + // ... +} +``` + +The current simplified `useApiService` hook: +- Checks if the user is authenticated using `useAuth`. +- **Does not** automatically add the access token to requests (this would need to be added if required by the backend). +- **Does not** handle token refresh or expiration explicitly. It relies on the underlying `oidc-client-ts` library's session management. +- Logs an error if a 401 Unauthorized response is received. + +### Logout + +To log a user out, use the `logout` function returned by the `useAuth` hook. This function triggers the `logoutFx` effect, which performs the following steps: + +1. Sets the `manuallyLoggedOut` flag to `true` in localStorage +2. Clears the user from the store +3. Initiates the OIDC sign-out redirect flow via `userManager.signoutRedirect()` + +The logout process is designed to ensure that the user remains logged out even after page refreshes or browser restarts, until they explicitly choose to log in again. + +```jsx +import { useAuth } from '@domains/auth'; + +function LogoutButton() { + const { logout, user } = useAuth(); + + return ( + + ); +} +``` + +The `logoutFx` effect is configured to revoke tokens on signout using the `revokeTokensOnSignout: true` setting in the OIDC client configuration. This ensures that tokens are properly invalidated when logging out. + +## Troubleshooting + +### Common Issues + +1. **Authentication configuration error** + - Check that the API endpoint `/oidc.json` is accessible + - Verify that the API returns the correct JSON structure with `authorityUrl` and `clientId` fields + - Ensure the `CLIENT_API_URL` environment variable is correctly set + +2. **Token refresh failures** + - Check that the OIDC server is configured to allow refresh tokens + - Verify that the `offline_access` scope is included in the OIDC configuration + - Check browser console for silent renewal errors + +3. **CORS errors** + - Ensure the OIDC server has the correct origins configured + - Check that redirect URIs are properly set up + - Verify that the OIDC server allows the application's origin + +4. **Auto-login not working** + - Check if the `auth_manually_logged_out` flag in localStorage is set to `true` + - Clear the flag by setting it to `false` or removing it from localStorage + - Verify that the user doesn't have an existing session that's invalid + +5. **Logout not working properly** + - Check browser console for errors during the logout process + - Verify that the `revokeTokensOnSignout` setting is enabled + - Check if the OIDC server is properly configured to handle logout requests + +### Debugging + +The application includes extensive logging to help diagnose authentication issues: + +1. **Check localStorage**: The application stores authentication state in localStorage: + - `auth_manually_logged_out`: Tracks if the user has manually logged out + - `oidc.user:[authority]:[client_id]`: Contains the user session data + +2. **Console Logging**: The application logs detailed information about the authentication process: + - Authentication initialization and configuration + - Token validation and renewal attempts + - Login and logout operations + - State changes in the authentication store + +3. **Enable Debug Mode**: For even more detailed logging, enable debug mode by setting the `CLIENT_DEBUG` environment variable to `true` in your `.env` file: + +``` +CLIENT_DEBUG=true +``` + +This enables additional logging in various parts of the application, including more detailed OIDC client logs. diff --git a/docs/client-env-vars.md b/docs/client-env-vars.md new file mode 100644 index 0000000..dcf57bb --- /dev/null +++ b/docs/client-env-vars.md @@ -0,0 +1,120 @@ +# Client-Side Environment Variables + +This document explains the client-side environment variables used in the application. + +## Available Variables + +The application uses the following client-side environment variables, all prefixed with `CLIENT_`: + +| Variable | Description | Default | +|---------------------|--------------------------------------------|-------------------------| +| `CLIENT_API_URL` | Base URL for backend API requests | `https://localhost:7205`| +| `CLIENT_BASE_PATH` | Base path for client-side routing | `/` | +| `CLIENT_APP_NAME` | Application name displayed in UI | `Merchant Operator App` | +| `CLIENT_DEBUG` | Enable debug mode | `false` | + +## How to Set Variables + +### Development Environment + +For local development, set these variables in: + +1. `.env.development` (shared development settings) +2. `.env.development.local` (personal development settings, gitignored) + +Example `.env.development`: +``` +CLIENT_BASE_PATH=/ +CLIENT_API_URL=https://localhost:7205 +CLIENT_APP_NAME=Merchant Operator App +CLIENT_DEBUG=true +``` + +Vite automatically makes variables prefixed with `CLIENT_` available via `import.meta.env`. **Remember to restart the Vite dev server after changing `.env` files.** + +### Docker Environment + +For Docker deployments, environment variables are configured **at runtime** through Docker Compose or environment variables: + +#### Using docker-compose.yml + +```yaml +services: + merchant-operator-app: + environment: + - CLIENT_API_URL=https://api.example.com + - CLIENT_BASE_PATH=/merchant-app + - CLIENT_APP_NAME=Merchant Operator App + - CLIENT_DEBUG=false +``` + +#### Using docker-compose.override.yml + +Create a `docker-compose.override.yml` file from the template and set your environment-specific values: + +```yaml +services: + merchant-operator-app: + environment: + - CLIENT_API_URL=https://api.example.com + - CLIENT_BASE_PATH=/merchant-app + - CLIENT_APP_NAME=Merchant Operator App + - CLIENT_DEBUG=false +``` + +#### Using .env file with docker-compose + +Create a `.env` file in the same directory as your `docker-compose.yml`: + +```dotenv +# .env +CLIENT_API_URL=https://api.example.com +CLIENT_BASE_PATH=/merchant-app +CLIENT_APP_NAME=Merchant Operator App +CLIENT_DEBUG=false +# ... other variables +``` + +#### Using Docker run command + +```bash +docker run -e CLIENT_BASE_PATH=/merchant-app -e CLIENT_API_URL=https://api.example.com -e CLIENT_APP_NAME="Merchant Operator App" -e CLIENT_DEBUG=false your-image-name +``` + +## How Runtime Environment Variables Work + +The application uses a special mechanism to handle environment variables at runtime in Docker: + +1. When the Docker container starts, the `docker-entrypoint.sh` script runs +2. The script extracts all environment variables starting with `CLIENT_` from the container's environment +3. These variables are written to a `.env` file in the app's directory +4. The Vite app reads these variables at runtime + +This approach allows you to: +- Use the same container image in different environments +- Change environment variables without rebuilding the image +- Pass environment variables through Docker Compose, environment files, or directly via Docker run commands + +## Accessing Variables in Code + +All environment variables are accessed using Vite's `import.meta.env` object: + +```javascript +// Direct access +const apiUrl = import.meta.env.CLIENT_API_URL; +const basePath = import.meta.env.CLIENT_BASE_PATH; +const appName = import.meta.env.CLIENT_APP_NAME; +const debug = import.meta.env.CLIENT_DEBUG; +``` + +Utility functions are available to access common values: + +```javascript +import { getBasePath, getAssetPath } from '../shared/lib/config'; + +// Get the base path +const basePath = getBasePath(); // "/merchant-app" + +// Get a path with the base path prepended +const logoPath = getAssetPath('/images/logo.png'); // "/merchant-app/images/logo.png" +``` diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000..162a760 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,182 @@ +# Merchant Operator App Configuration + +This document describes the configuration options and mechanisms used in the Merchant Operator App. + +## Environment Variables + +The application uses environment variables for configuration, which are injected into the application at runtime through `window.appConfig`. + +### Runtime Environment Variables + +Environment variables are loaded at runtime, not build time. This allows for different configurations in different environments without rebuilding the application. + +#### Development Environment + +In development, environment variables are loaded from `.env` files and injected into the application through `window.appConfig` by the Vite plugin. + +#### Production Environment + +In production (Docker), environment variables are loaded from the container environment and injected into the application through `window.appConfig` by the `docker-entrypoint.sh` script. + +### Environment Variable Naming + +- All environment variables used by the client application should start with `CLIENT_` +- These variables are converted to camelCase in `window.appConfig` +- Example: `CLIENT_API_URL` becomes `window.appConfig.apiUrl` + +### Available Environment Variables + +| Environment Variable | Description | Default Value | +|----------------------|-------------|---------------| +| `CLIENT_API_URL` | URL of the API server | Required, or can be set to "DETECT" for auto-detection | +| `CLIENT_BASE_PATH` | Base path of the application | "/" | +| `CLIENT_APP_NAME` | Name of the application | "Merchant Operator App" | +| `CLIENT_DEBUG` | Enable debug mode | "false" | +| `CLIENT_MAP_TILE_ENDPOINT` | Endpoint for map tiles | "" | +| `CLIENT_MAP_TILE_API_KEY` | API key for map tiles | "" | + +## URL Handling + +The application uses the built-in `URL` class for proper URL handling to avoid issues with slashes and ensure consistent URL formatting. + +### URL Utilities + +The application includes utility functions in `src/shared/lib/url-utils.ts` for common URL operations: + +#### `joinUrl(base, ...paths)` + +Safely joins a base URL with path segments. + +```typescript +// Example +const apiUrl = joinUrl('https://api.example.com', 'v1', 'users'); +// Result: https://api.example.com/v1/users +``` + +#### `createHashUrl(base, basePath, hashPath)` + +Creates a properly formatted hash URL with the hash fragment after the trailing slash of the base path. + +```typescript +// Example +const url = createHashUrl('https://example.com', 'app', 'users/123'); +// Result: https://example.com/app/#users/123 +``` + +#### `normalizeUrl(url)` + +Normalizes a URL by ensuring it has a trailing slash. + +```typescript +// Example +const normalizedUrl = normalizeUrl('https://api.example.com/v1'); +// Result: https://api.example.com/v1/ +``` + +#### `cleanupUrl()` + +Cleans up the current URL by removing query parameters and hash fragments. + +```typescript +// Example: Current URL is https://example.com/app/?code=123#/callback +cleanupUrl(); +// Result: https://example.com/app/ +``` + +### Hash-Based Routing + +The application uses hash-based routing (`/#`) instead of URL-based routing for better compatibility with static hosting and to avoid server configuration for deep linking. + +- All routes are prefixed with `/#` +- The hash fragment always comes after the trailing slash of the base path +- Example: `https://example.com/app/#users` (correct) vs `https://example.com/app#users` (incorrect) + +## OIDC Authentication + +The application uses OIDC for authentication with the following configuration: + +### OIDC Configuration + +- The OIDC configuration is fetched from the API server at `/apiendpoint/oidc.json` +- The OIDC provider is separate from the API provider +- The API provider gives information about the OIDC provider location + +### OIDC URLs + +- Authority URL: The URL of the OIDC provider, normalized to ensure it has a trailing slash +- Redirect URI: The URL to redirect to after authentication, using hash-based routing +- Post-Logout Redirect URI: The URL to redirect to after logout, using hash-based routing + +### OIDC Callback Handling + +- After authentication, the callback URL is cleaned up to remove query parameters and hash fragments +- The user is redirected to the intended page or the home page + +## API URL Configuration + +The API URL can be configured in several ways: + +### Static Configuration + +Set the `CLIENT_API_URL` environment variable to the URL of the API server. + +### Auto-Detection + +Set the `CLIENT_API_URL` environment variable to `"DETECT"` to automatically detect the API URL based on the current window location. + +The auto-detection logic: +1. Takes the current window location (e.g., `https://www.example.com/path1/path2/path3`) +2. Extracts the first path segment (e.g., `path1`) +3. Constructs a new URL with just the origin and first path segment (e.g., `https://www.example.com/path1/`) + +Examples: +- `https://www.example.com/path1/path2/path3/` → `https://www.example.com/path1/` +- `https://www.example.com/` → `https://www.example.com/` +- `https://www.example.com/path1` → `https://www.example.com/path1/` + +If auto-detection fails, a fatal error is logged and the application does not proceed. + +## Accessing Configuration in Code + +### API URL + +```typescript +// Use OpenAPI.BASE for the normalized API URL +import { OpenAPI } from "@merchant-api/core/OpenAPI"; + +const apiUrl = OpenAPI.BASE; +``` + +### Other Configuration + +```typescript +// Access environment variables through window.appConfig +const appName = window.appConfig.appName; +const debug = window.appConfig.debug; +``` + +## Development Scripts + +### Generate App Config + +```bash +npm run generate-app-config +``` + +Generates the `app-config.js` file in the `public` directory based on environment variables. + +### Build + +```bash +npm run build +``` + +Builds the application for production. + +### Development Server + +```bash +npm run dev +``` + +Starts the development server with hot reloading. diff --git a/docs/deployment.md b/docs/deployment.md new file mode 100644 index 0000000..73e516b --- /dev/null +++ b/docs/deployment.md @@ -0,0 +1,98 @@ +# Path-Agnostic SPA Deployment Guide + +This project is configured for path-agnostic deployment, allowing the application to be served from any base path without requiring a rebuild. + +## Configuration Files + +- **docker-compose.yml**: Main Docker Compose configuration with variables +- **docker-compose.override.yml.template**: Template for environment-specific overrides +- **.env.template**: Template for environment variables + +## Setup Instructions + +1. Copy the template files to create your environment-specific configurations: + +```bash +cp docker-compose.override.yml.template docker-compose.override.yml +cp .env.template .env +``` + +2. Edit the `.env` and/or `docker-compose.override.yml` files to set your environment-specific values: + +### Key Configuration Variables + +| Variable | Description | Default | +|---------------------|--------------------------------------------|-------------------------| +| CLIENT_BASE_PATH | Base path where the app will be served | `/` | +| CLIENT_API_URL | Base URL for backend API | `https://localhost:7205`| +| CLIENT_APP_NAME | Application name displayed in UI | `Merchant Operator App` | +| CLIENT_DEBUG | Enable debug mode | `false` | +| ENABLE_TLS | Whether to enable TLS | `false` | +| TRAEFIK_ENTRYPOINT | Traefik entrypoint to use | `web` | + +## Deployment + +### Local Development + +For local development, you can use the default values or customize as needed: + +```bash +docker-compose up -d +``` + +### Production Deployment + +For production, build the image and then deploy with environment variables: + +```bash +# Build the image +docker build -t merchant-operator-app . + +# Deploy with environment variables +docker-compose up -d +``` + +Environment variables are passed at runtime through docker-compose.yml or docker-compose.override.yml: + +```yaml +services: + merchant-operator-app: + environment: + - CLIENT_BASE_PATH=/app + - CLIENT_API_URL=https://api.example.com + - CLIENT_APP_NAME=Merchant Operator App + - CLIENT_DEBUG=false + - CLIENT_OIDC_AUTHORITY=https://auth.example.com + - CLIENT_OIDC_CLIENT_ID=your-client-id +``` + + + +Variable names are converted from `CLIENT_SNAKE_CASE` to `camelCase` automatically. + +## Using Base Path in the Application + +The application is configured to use the base path from the configuration. In your React components, use the utility functions from `src/utils/config.js`: + +```jsx +import { getAssetPath } from '../utils/config'; + +function MyComponent() { + return Logo; +} +``` + +## How It Works + +1. During development, Vite makes environment variables prefixed with `CLIENT_` available via `import.meta.env`. +2. The application is built without any environment-specific configuration. +3. At container startup, the `docker-entrypoint.sh` script extracts all environment variables starting with `CLIENT_` and writes them to a `.env` file in the app's directory. +4. The Vite application reads these variables at runtime. +5. The Nginx configuration is set up to handle SPA routing and asset caching. +6. The `getBasePath()` and `getAssetPath()` utility functions provide the correct paths in your application code. + +## Troubleshooting + +- If assets are not loading, check that you're using the `getAssetPath()` function for all asset URLs. +- If routing is not working, ensure that your router is configured to use the base path. +- Check Nginx logs for any errors: `docker-compose logs Merchant-operator-app` diff --git a/docs/effector-guide.md b/docs/effector-guide.md new file mode 100644 index 0000000..007da8b --- /dev/null +++ b/docs/effector-guide.md @@ -0,0 +1,212 @@ +# Effector Guide + +This guide provides an overview of how to use Effector in our application, following our Flux-style architecture. + +## Core Concepts + +Effector is a state management library that implements the Flux pattern with three main primitives: + +1. **Events**: Trigger state changes +2. **Stores**: Hold application state +3. **Effects**: Handle side effects (async operations) + +## Basic Usage + +### Creating Events + +Events are functions that can be called to trigger state changes: + +```typescript +import { createEvent } from 'effector'; + +// Create an event +export const increment = createEvent(); +export const addTodo = createEvent(); +export const updateUser = createEvent<{ name: string, email: string }>(); + +// Call the event +increment(); +addTodo('Buy milk'); +updateUser({ name: 'John', email: 'john@example.com' }); +``` + +### Creating Stores + +Stores hold the application state and update in response to events: + +```typescript +import { createStore } from 'effector'; +import { increment, addTodo } from './events'; + +// Create a store with initial state +export const $counter = createStore(0) + .on(increment, state => state + 1); + +export const $todos = createStore([]) + .on(addTodo, (state, todo) => [...state, todo]); +``` + +### Creating Effects + +Effects handle asynchronous operations: + +```typescript +import { createEffect } from 'effector'; +import { api } from '@shared/lib/api'; + +// Create an effect +export const fetchUserFx = createEffect(async (userId: string) => { + const response = await api.getUser(userId); + return response.data; +}); + +// Call the effect +fetchUserFx('123'); +``` + +### Handling Effect States + +Effects have three states: pending, done, and fail: + +```typescript +import { createStore } from 'effector'; +import { fetchUserFx } from './effects'; + +// Create stores for different effect states +export const $isLoading = createStore(false) + .on(fetchUserFx.pending, (_, isPending) => isPending); + +export const $user = createStore(null) + .on(fetchUserFx.doneData, (_, user) => user); + +export const $error = createStore(null) + .on(fetchUserFx.failData, (_, error) => error) + .on(fetchUserFx, () => null); // Reset error when effect is called +``` + +## Using with React + +### useStore Hook + +The `useStore` hook connects Effector stores to React components: + +```typescript +import { useStore } from 'effector-react'; +import { $counter, increment } from './model'; + +const Counter = () => { + const count = useStore($counter); + + return ( +
+

Count: {count}

+ +
+ ); +}; +``` + +### useEvent Hook + +The `useEvent` hook creates a stable callback for events: + +```typescript +import { useStore, useEvent } from 'effector-react'; +import { $todos, addTodo } from './model'; + +const TodoList = () => { + const todos = useStore($todos); + const handleAddTodo = useEvent(addTodo); + + return ( +
+ +
    + {todos.map((todo, index) => ( +
  • {todo}
  • + ))} +
+
+ ); +}; +``` + +## Advanced Patterns + +### Derived Stores (Computed Values) + +Create derived stores using the `.map` method: + +```typescript +import { createStore } from 'effector'; + +export const $todos = createStore([ + { id: 1, text: 'Buy milk', completed: false }, + { id: 2, text: 'Clean house', completed: true } +]); + +// Derived store for completed todos +export const $completedTodos = $todos.map( + todos => todos.filter(todo => todo.completed) +); + +// Derived store for todo count +export const $todoCount = $todos.map(todos => todos.length); +``` + +### Combining Stores + +Combine multiple stores into one: + +```typescript +import { createStore, combine } from 'effector'; + +export const $user = createStore({ name: 'John' }); +export const $settings = createStore({ theme: 'dark' }); + +// Combined store +export const $appState = combine({ + user: $user, + settings: $settings +}); + +// Or with a custom mapper function +export const $userData = combine( + $user, + $settings, + (user, settings) => ({ + ...user, + theme: settings.theme + }) +); +``` + +### Reset Events + +Reset stores to their initial state: + +```typescript +import { createEvent, createStore } from 'effector'; + +export const reset = createEvent(); + +export const $counter = createStore(0) + .reset(reset); // Reset to initial state (0) + +// Call reset to restore initial state +reset(); +``` + +## Best Practices + +1. **Keep model.ts pure**: Avoid side effects in store updates. + +2. **Use TypeScript**: Define types for all events, stores, and effects. + +3. **Organize by domain**: Group related events, stores, and effects in domain folders. + +4. **Use view-model.ts**: Create hooks that encapsulate Effector logic for React components. + +5. **Keep UI components simple**: UI components should only consume data from hooks and call events. + +6. **Test model.ts**: Write unit tests for your Effector logic. diff --git a/docs/flux-vs-mvvm.md b/docs/flux-vs-mvvm.md new file mode 100644 index 0000000..cabca3a --- /dev/null +++ b/docs/flux-vs-mvvm.md @@ -0,0 +1,64 @@ +# Flux vs. MVVM Architecture + +## Decision Matrix: Flux vs. MVVM + +| Criterion | Plain Effector (Flux) | MVVM Layer on Top | +|-----------|----------------------|-------------------| +| Boilerplate | Low | Higher | +| React Ecosystem Fit | Native | Non-idiomatic | +| Two-way Binding Risk | None | Possible | +| Testability | High (domain files are pure) | High but more layers | +| Refactor Complexity | Lower | Higher | + +## Why We Chose Flux with Effector + +For our React SPA, we've adopted an "Effector-based Flux architecture" for the following reasons: + +1. **Better React Integration**: Flux's unidirectional data flow aligns perfectly with React's rendering model. + +2. **Simplicity**: Fewer abstractions and less boilerplate compared to MVVM. + +3. **Predictability**: One-way data flow makes it easier to trace how state changes propagate through the application. + +4. **Testability**: Pure functions in model.ts are easy to test without complex mocking. + +5. **TypeScript Friendly**: Effector has excellent TypeScript support, providing type safety throughout the application. + +## Flux Architecture Flow + +``` +┌─────────────┐ ┌─────────────┐ ┌─────────────┐ +│ Actions │────>│ Store │────>│ View │ +│ (Events) │ │ (State) │ │ (React) │ +└─────────────┘ └─────────────┘ └─────────────┘ + ▲ │ + │ │ + └───────────────────────────────────────┘ + User Interaction +``` + +## Effector Implementation + +Effector provides three main primitives that map to Flux concepts: + +1. **Events** (Actions): Trigger state changes + ```typescript + export const setProductName = createEvent(); + ``` + +2. **Stores** (State): Hold application state + ```typescript + export const $product = createStore(initialState) + .on(setProductName, (state, name) => ({ ...state, name })); + ``` + +3. **Effects** (Async Actions): Handle side effects + ```typescript + export const fetchProductFx = createEffect(async (id: string) => { + return await api.getProduct(id); + }); + ``` + +## Conclusion + +While MVVM is a valid architecture pattern, Flux with Effector provides a more natural fit for React applications, with less boilerplate and better alignment with React's unidirectional data flow model. This approach keeps our codebase clean, testable, and maintainable. diff --git a/docs/local-development.md b/docs/local-development.md new file mode 100644 index 0000000..d920b1e --- /dev/null +++ b/docs/local-development.md @@ -0,0 +1,121 @@ +# Local Development Guide + +This guide explains how to run the application locally with different base path configurations. + +## Environment Variables + +The application uses environment variables to configure settings during development. These variables can be set in several ways: + +1. In `.env.development` (shared development settings) +2. In `.env.development.local` (personal development settings, gitignored) +3. Via command line when running scripts + +### Client-Side Environment Variables + +Variables with the `CLIENT_` prefix will be available in the browser through the `window.appConfig` object. For example: + +``` +CLIENT_API_URL=https://localhost:7205 +CLIENT_APP_NAME=My App +CLIENT_DEBUG=true +``` + +These will be available in the browser as: + +```javascript +window.appConfig.apiUrl // "https://localhost:7205" +window.appConfig.appName // "My App" +window.appConfig.debug // "true" +``` + +Variable names are converted from `CLIENT_SNAKE_CASE` to `camelCase` automatically. + +## Setting Up Local Development + +### Basic Setup + +1. Copy the template file to create your local environment configuration: + +```bash +cp .env.development.local.template .env.development.local +``` + +2. Edit `.env.development.local` to set your preferred base path: + +``` +BASE_PATH=/your-path +``` + +### Running the Development Server + +#### Default Development (Root Path) + +To run the development server with the default configuration (usually root path `/`): + +```bash +npm run dev +``` + +#### Custom Path Development + +To run the development server with a predefined custom path (`/Merchant-app`): + +```bash +npm run dev:path +``` + +#### Custom Path via Command Line + +To run the development server with any custom path: + +```bash +BASE_PATH=/custom-path npm run dev +``` + +## Building for Different Paths + +### Default Build + +To build the application with the default configuration: + +```bash +npm run build +``` + +### Custom Path Build + +To build with a predefined custom path (`/Merchant-app`): + +```bash +npm run build:path +``` + +### Custom Path via Command Line + +To build with any custom path: + +```bash +BASE_PATH=/custom-path npm run build +``` + +## How It Works + +1. The Vite configuration reads the `BASE_PATH` environment variable +2. It dynamically updates the `config.js` file with the appropriate base path during development +3. The application uses this configuration to construct URLs correctly +4. In production, the `docker-entrypoint.sh` script replaces a placeholder in `config.js` with the actual base path + +## Testing Different Paths + +To test how the application behaves with different base paths: + +1. Set a custom base path in `.env.development.local` or via command line +2. Run the development server +3. Verify that all links and assets load correctly +4. Test navigation within the application + +## Troubleshooting + +- If assets are not loading, check that you're using the `getAssetPath()` function for all asset URLs +- If the base path is not being applied, make sure the environment variable is being set correctly +- Check the console for any error messages related to path configuration diff --git a/docs/project-structure.md b/docs/project-structure.md new file mode 100644 index 0000000..aa94ccc --- /dev/null +++ b/docs/project-structure.md @@ -0,0 +1,140 @@ +# Project Structure + +This document outlines the structure of our application, which follows a domain-driven, Flux-style architecture using Effector for state management. + +## Directory Structure + +``` +src/ + app/ # Application entry point and configuration + root.tsx # Root component + routes.tsx # Route definitions + domains/ # Feature domains + / # e.g., products, auth, orders + model.ts # Effector events, stores, effects + view-model.ts # React hooks for connecting to the model + ui/ # React components + index.ts # Exports all components + Component.tsx # Individual components + shared/ # Shared code + lib/ # Utilities, helpers, adapters + ui/ # Reusable UI components + tests/ # Test files +``` + +## Domain Structure + +Each domain follows a consistent structure: + +### model.ts + +Contains all Effector-related code: +- Events (actions) +- Stores (state) +- Effects (async operations) + +Example: +```typescript +// domains/products/model.ts +import { createStore, createEvent, createEffect } from 'effector'; +import { ProductsViewsService } from '@lib/api/merchant/services/ProductsViewsService'; +import type { productCompositeDto } from '@lib/api/merchant/models/productCompositeDto'; + +// Events +export const setProductsFilter = createEvent>(); + +// Effects +export const fetchProductsFx = createEffect(async (filter: productQueryRequestDto) => { + return await ProductsViewsService.postApiProductCompositeQueryByCanonical({ + requestBody: filter + }); +}); + +// Stores +export const $products = createStore([]) + .on(fetchProductsFx.doneData, (_, payload) => Array.isArray(payload) ? payload : [payload]); +``` + +### view-model.ts + +Contains React hooks that connect to the Effector model: + +```typescript +// domains/products/view-model.ts +import { useStore } from 'effector-react'; +import { useCallback } from 'react'; +import { + $products, + $productsLoading, + setProductsFilter, + fetchProductsFx +} from './model'; + +export const useProducts = () => { + const products = useStore($products); + const isLoading = useStore($productsLoading); + + const updateFilter = useCallback((newFilter) => { + setProductsFilter(newFilter); + }, []); + + return { + products, + isLoading, + updateFilter + }; +}; +``` + +### ui/ + +Contains React components that use the view-model: + +```typescript +// domains/products/ui/ProductsList.tsx +import React from 'react'; +import { useProducts } from '../view-model'; +import { ProductCard } from './ProductCard'; + +export const ProductsList: React.FC = () => { + const { products, isLoading } = useProducts(); + + if (isLoading) { + return
Loading...
; + } + + return ( +
+ {products.map(product => ( + + ))} +
+ ); +}; +``` + +## Shared Code + +### shared/lib/ + +Contains utilities, helpers, and adapters that are used across multiple domains. + +### shared/ui/ + +Contains reusable UI components that are not tied to any specific domain. + +## Tests + +Tests are organized alongside the code they test, following the same structure. + +## Best Practices + +1. **Keep domains isolated**: Each domain should be self-contained and not depend on other domains. + +2. **Use named exports**: Avoid default exports to make refactoring easier. + +3. **Keep files small**: Each file should have a single responsibility. + +4. **Use TypeScript**: All files should be written in TypeScript for type safety. + +5. **Follow Flux pattern**: Maintain unidirectional data flow from events to stores to views. diff --git a/docs/typescript-conventions.md b/docs/typescript-conventions.md new file mode 100644 index 0000000..9f1e02f --- /dev/null +++ b/docs/typescript-conventions.md @@ -0,0 +1,246 @@ +# TypeScript Conventions + +This document outlines our TypeScript conventions for the project. + +## Configuration + +We use strict TypeScript settings to ensure type safety: + +```json +{ + "compilerOptions": { + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + } +} +``` + +## Naming Conventions + +### Files and Directories + +- Use kebab-case for file and directory names: `product-list.tsx`, `view-model.ts` +- Exception: React components can use PascalCase: `ProductCard.tsx` + +### Variables and Functions + +- Use camelCase for variables and functions: `productList`, `fetchProducts` +- Use PascalCase for React components and types: `ProductList`, `ProductDto` +- Use ALL_CAPS for constants: `MAX_ITEMS`, `API_URL` + +### Effector Naming + +- Prefix store names with `$`: `$products`, `$isLoading` +- Suffix effect names with `Fx`: `fetchProductsFx`, `saveUserFx` +- Use descriptive names for events: `setProductFilter`, `resetForm` + +## Type Definitions + +### Interfaces vs. Types + +- Use `interface` for object shapes that might be extended +- Use `type` for unions, intersections, and simple object shapes + +```typescript +// Interface for extendable objects +interface User { + id: string; + name: string; +} + +interface AdminUser extends User { + permissions: string[]; +} + +// Type for unions and simple objects +type Status = 'idle' | 'loading' | 'success' | 'error'; + +type ProductFilter = { + category?: string; + minPrice?: number; + maxPrice?: number; +}; +``` + +### API Models + +- Use the generated types from the API client +- Create wrapper types when needed for additional properties + +```typescript +import type { productCompositeDto } from '@lib/api/merchant/models/productCompositeDto'; + +// Extended type with UI-specific properties +type ProductWithUIState = productCompositeDto & { + isSelected: boolean; + isExpanded: boolean; +}; +``` + +## React Component Types + +### Functional Components + +```typescript +import React from 'react'; + +interface ButtonProps { + label: string; + onClick: () => void; + disabled?: boolean; +} + +export const Button: React.FC = ({ + label, + onClick, + disabled = false +}) => { + return ( + + ); +}; +``` + +### Event Handlers + +```typescript +// Form event +const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + // ... +}; + +// Input change +const handleChange = (e: React.ChangeEvent) => { + const { name, value } = e.target; + // ... +}; + +// Click event +const handleClick = (e: React.MouseEvent) => { + // ... +}; +``` + +## Effector Types + +### Events + +```typescript +import { createEvent } from 'effector'; + +// Event with no payload +export const resetFilter = createEvent(); + +// Event with payload +export const setSearchQuery = createEvent(); + +// Event with complex payload +export const updateFilter = createEvent<{ + category?: string; + minPrice?: number; + maxPrice?: number; +}>(); +``` + +### Stores + +```typescript +import { createStore } from 'effector'; + +// Define the store state type +interface FilterState { + searchQuery: string; + category: string | null; + minPrice: number | null; + maxPrice: number | null; +} + +// Initial state +const initialState: FilterState = { + searchQuery: '', + category: null, + minPrice: null, + maxPrice: null +}; + +// Create the store +export const $filter = createStore(initialState); +``` + +### Effects + +```typescript +import { createEffect } from 'effector'; +import { ProductsViewsService } from '@lib/api/merchant/services/ProductsViewsService'; +import type { productQueryRequestDto } from '@lib/api/merchant/models/productQueryRequestDto'; +import type { productCompositeDto } from '@lib/api/merchant/models/productCompositeDto'; + +// Define effect with explicit parameter and return types +export const fetchProductsFx = createEffect< + productQueryRequestDto, + productCompositeDto[], + Error +>(async (filter) => { + const response = await ProductsViewsService.postApiProductCompositeQueryByCanonical({ + requestBody: filter + }); + return Array.isArray(response) ? response : [response]; +}); +``` + +## Best Practices + +1. **Avoid `any`**: Never use the `any` type. Use `unknown` if the type is truly unknown. + +2. **Use type inference**: Let TypeScript infer types when possible, but add explicit types for function parameters and return values. + +3. **Null vs. undefined**: Use `undefined` for optional values, `null` for intentionally absent values. + +4. **Non-null assertion**: Avoid using the non-null assertion operator (`!`) when possible. Use optional chaining (`?.`) and nullish coalescing (`??`) instead. + +5. **Type guards**: Use type guards to narrow types: + +```typescript +function isProduct(item: unknown): item is productCompositeDto { + return ( + typeof item === 'object' && + item !== null && + 'id' in item + ); +} +``` + +6. **Readonly**: Use `readonly` for immutable properties: + +```typescript +interface Config { + readonly apiUrl: string; + readonly timeout: number; +} +``` + +7. **Generics**: Use generics for reusable components and functions: + +```typescript +function fetchData(url: string): Promise { + return fetch(url).then(res => res.json()); +} + +const data = await fetchData('/api/users'); +``` diff --git a/docs/utils.md b/docs/utils.md new file mode 100644 index 0000000..67e8b51 --- /dev/null +++ b/docs/utils.md @@ -0,0 +1,63 @@ +# Utility Functions + +## Configuration Utilities + +The application includes utility functions for working with the base path configuration. These functions are located in `src/utils/config.js`. + +### getBasePath() + +Returns the base path from the application configuration. + +```javascript +import { getBasePath } from '../utils/config'; + +// Example usage +const basePath = getBasePath(); // Returns the base path, e.g., '/Merchant-app' +``` + +### getAssetPath(path) + +Constructs a complete path for an asset by prepending the base path. + +```javascript +import { getAssetPath } from '../utils/config'; + +// Example usage +const logoPath = getAssetPath('/images/logo.png'); +// If base path is '/Merchant-app', returns '/Merchant-app/images/logo.png' + +// Works with paths with or without leading slash +const cssPath = getAssetPath('styles/main.css'); +// Returns '/Merchant-app/styles/main.css' +``` + +## When to Use These Functions + +Use these utility functions whenever you need to reference: + +- Static assets (images, CSS, JavaScript) +- API endpoints +- Navigation links +- Any URL that should be relative to the application's base path + +## Example in a React Component + +```jsx +import React from 'react'; +import { getAssetPath } from '../utils/config'; + +function Header() { + return ( +
+ Company Logo + +
+ ); +} + +export default Header; +``` diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..1eb3df4 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,47 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +export default [ + // 1. Ignore the directories you don't want to lint. + { + ignores: [ + "./src/lib/api/core/**", + "./src/lib/api/services/**", + "./src/lib/api/models/**", + ], + }, + + // 2. Extend Next.js configs (converted to flat config by `FlatCompat`). + ...compat.extends("next/core-web-vitals", "next/typescript"), + + // 3. Any plugin or custom rules config you need. + ...compat.config({ + plugins: ["eslint-comments"], + rules: { + "eslint-comments/no-unused-disable": "off", + }, + }), + + // 4. Additional custom rules. + { + rules: { + "no-console": ["error", { allow: ["error"] }], + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unsafe-function-type": "off", + "@typescript-eslint/no-require-imports": "off", + "prefer-const": "off", + "react-hooks/exhaustive-deps": "warn", + "react-hooks/rules-of-hooks": "warn", + "@next/next/no-img-element": "off", + }, + }, +]; diff --git a/index.html b/index.html new file mode 100644 index 0000000..5faf606 --- /dev/null +++ b/index.html @@ -0,0 +1,22 @@ + + + + + + + + + + + Merchant Operator App + + +
+ + + diff --git a/memory-bank/README.md b/memory-bank/README.md new file mode 100644 index 0000000..a13ff85 --- /dev/null +++ b/memory-bank/README.md @@ -0,0 +1,123 @@ +# Memory Bank + +I am an expert software engineer with a unique characteristic: my memory resets completely between sessions. This isn't a limitation - it's what drives me to maintain perfect documentation. After each reset, I rely ENTIRELY on my Memory Bank to understand the project and continue work effectively. I MUST read ALL memory bank files at the start of EVERY task - this is not optional. + +## Quick Reference (Project Overview) + +## Agent Guidelines + +- **Architecture**: Use Flux-style with Effector for state management +- **File Structure**: Follow domain-driven organization (model.ts, view-model.ts, ui/) +- **TypeScript**: Use strict mode with proper typing +- **Components**: Keep UI components pure and presentational +- **State Management**: Use Effector events, stores, and effects +- **API Models**: Use the generated DTOs from the API client +- **Naming**: Use $ prefix for stores, Fx suffix for effects +- **Exports**: Use named exports only, avoid default exports + +### Project Summary +- **Name**: Merchant Operator Web Application +- **Type**: Client-side only React application for Merchant management +- **Core Features**: Menu management, order tracking, Merchant operations +- **Tech Stack**: React, TypeScript, Tailwind CSS, Effector, Vite +- **Deployment**: Static site deployment +- **Current Status**: In development + +### Important Workflow Preferences +- **Git Commits**: NEVER commit without asking the user first +- **Completion Reminders**: Remind/ask the user when big sections have been done and tested +- **Command Line**: Use PowerShell for all command-line operations (Windows environment) +- **Development Server**: NEVER run the server unless specifically asked, as user often runs it in the background + +### Key Files Summary +1. **projectbrief.md**: Merchant management app with menu editing, order tracking, and Merchant operations +2. **systemPatterns.md**: Client-side SPA with React, Effector for state management, component-based architecture +3. **techContext.md**: React, TypeScript, Tailwind CSS, Effector, Vite, Jest, ESLint, Prettier, Husky + +### Documentation Sources +- **AI Agent Documentation** (`/docs`): Concise, up-to-date docs designed for AI agents + +## Memory Bank Structure + +The Memory Bank consists of core files and optional context files, all in Markdown format. Files build upon each other in a clear hierarchy: + +flowchart TD + PB[projectbrief.md] --> SP[systemPatterns.md] + PB --> TC[techContext.md] + + +### Core Files (Required) +1. `projectbrief.md` + - Foundation document that shapes all other files + - Created at project start if it doesn't exist + - Defines core requirements and goals + - Source of truth for project scope + +2. `systemPatterns.md` + - System architecture + - Key technical decisions + - Design patterns in use + - Component relationships + - Critical implementation paths + +3. `techContext.md` + - Technologies used + - Development setup + - Technical constraints + - Dependencies + - Tool usage patterns + +### Additional Context +Create additional files/folders within memory-bank/ when they help organize: +- Complex feature documentation +- Integration specifications +- API documentation +- Testing strategies +- Deployment procedures + +## Core Workflows + +### Plan Mode +flowchart TD + Start[Start] --> ReadFiles[Read Memory Bank] + ReadFiles --> CheckFiles{Files Complete?} + + CheckFiles -->|No| Plan[Create Plan] + Plan --> Document[Document in Chat] + + CheckFiles -->|Yes| Verify[Verify Context] + Verify --> Strategy[Develop Strategy] + Strategy --> Present[Present Approach] + +### Act Mode +flowchart TD + Start[Start] --> Context[Check Memory Bank] + Context --> Update[Update Documentation] + Update --> Execute[Execute Task] + Execute --> Document[Document Changes] + +## Documentation Updates + +Memory Bank updates occur when: +1. Discovering new project patterns +2. After implementing significant changes +3. When user requests with **update memory bank** (MUST review ALL files) +4. When context needs clarification + +flowchart TD + Start[Update Process] + + subgraph Process + P1[Review ALL Files] + P2[Document Current State] + P3[Clarify Next Steps] + P4[Document Insights & Patterns] + + P1 --> P2 --> P3 --> P4 + end + + Start --> Process + +Note: When triggered by **update memory bank**, I MUST review every memory bank file, even if some don't require updates. Focus particularly on activeContext.md and progress.md as they track current state. + +REMEMBER: After every memory reset, I begin completely fresh. The Memory Bank is my only link to previous work. It must be maintained with precision and clarity, as my effectiveness depends entirely on its accuracy. diff --git a/memory-bank/projectbrief.md b/memory-bank/projectbrief.md new file mode 100644 index 0000000..b8d8831 --- /dev/null +++ b/memory-bank/projectbrief.md @@ -0,0 +1,35 @@ +# Project Brief: Merchant Operator Web Application + +## Project Overview +A client-side React application for Merchant owners to manage menus, track orders, and handle operations. + +Merchant Operator App is a browser-only React SPA that lets local businesses create, edit, and audit their own merchant records on Local—a community-commerce network running on the peer-to-peer FogBox stack. Its mission is to decentralize ownership of commercial data and return technological control to merchants and their customers. Data is written locally first, then synchronised through FogBox nodes—no central server—ensuring autonomy and resilience. Open, well-documented APIs let any citizen-developer extend, fork, or integrate the codebase without gatekeepers. + +## Core Features + +### Menu Management +- Create and edit menu items (name, price, description, image) +- Configure options (size, dough type) and additions/toppings +- Set availability times + +### Order Management +- View active orders +- Track order status +- Process fulfillment + +### Merchant Operations +- Dashboard with key metrics +- Seller management +- Security controls + +## UI Design +- Dark-themed interface +- Sidebar navigation +- Responsive layout +- Intuitive forms + +## Technical Approach +- React with TypeScript +- Effector for state management +- Tailwind CSS for styling +- Component-based architecture diff --git a/memory-bank/systemPatterns.md b/memory-bank/systemPatterns.md new file mode 100644 index 0000000..bd8a34f --- /dev/null +++ b/memory-bank/systemPatterns.md @@ -0,0 +1,54 @@ +# System Patterns: Merchant Operator Web Application + +## Architecture Overview +The application follows a domain-driven, Effector-based Flux architecture. + +### Domain Structure +Each feature domain in `src/domains//` contains: +- `model.ts`: Effector events, stores, and effects (pure, testable) +- `view-model.ts`: React hooks (`useStore`/`useUnit`) adapting model logic to components +- `ui/`: Dumb presentational React components + +The application entry point (``) and routing are in `src/app/root.tsx` and `src/app/routes.tsx`. + +## Key Design Patterns + +### Effector-based Flux +- **Events**: `createEvent()` represent actions triggered by the user or effects +- **Stores**: `createStore()` hold application state and update via `.on(event, ...)` +- **Effects**: `createEffect()` handle async side-effects, dispatching success/fail events +- **Domains**: Group related events, stores, and effects into isolated modules + +### ViewModel Layer +- Encapsulates Effector usage in thin hooks (`view-model.ts`) +- Components consume view-model hooks and remain focused on presentation + +### UI Components +- Design-system atoms in `src/shared/ui/` +- Domain-specific components in `src/domains//ui/` +- Core UI components include: Button, Input, Textarea, Switch, Tabs, ImageUpload, Card, Dialog + +## Data Flow +``` +event ───┐ + │ triggers +store ───┤ updates ──> view-model hook ──> React component render + │ +effect <─┘ (async; dispatches done/fail events) +``` +User interactions invoke events, stores update state, view-model hooks propagate changes to the UI. + +## Authentication +- OpenID Connect (OIDC) for authentication via dynamic `/oidc.json` configuration +- `AuthProvider` initializes auth flow; tokens stored in `localStorage` with auto-refresh +- Protected routes using the `ProtectedRoute` component with optional `requiredRoles` + +## Deployment +- Path-agnostic SPA deployment with Vite and Docker +- `BASE_PATH` injected into `public/config.js` at container startup by `docker-entrypoint.sh` +- Client-side environment variables (`CLIENT_*`) surfaced on `window.appConfig` +- Asset paths managed via `getAssetPath()` in `src/utils/config.ts` + +## Styling +- Tailwind CSS configured via `tailwind.config.js` +- Utility-first styling with dark theme support and a consistent design system diff --git a/memory-bank/techContext.md b/memory-bank/techContext.md new file mode 100644 index 0000000..0f53b76 --- /dev/null +++ b/memory-bank/techContext.md @@ -0,0 +1,85 @@ +# Technical Context: Merchant Operator Web Application + +## Technology Stack + +### Core Technologies +- React (Client-side rendering, SPA) +- TypeScript (strict mode enabled) +- Vite (build tool, dev server) +- Tailwind CSS (utility-first styling, dark theme) +- Effector (Flux-style state management) + +### Authentication & API +- OpenID Connect (OIDC) via dynamic `/oidc.json` +- `useApiService` hook for authenticated API calls +- Tokens stored in `localStorage`, auto-refresh on expiration + +### Development & Testing Tools +- ESLint (linting) +- Prettier (formatting) +- Husky (Git hooks) +- Jest & Testing Library (unit and integration tests) + +## Project Structure + +``` +src/ + app/ + root.tsx # entry and routing + routes.tsx # Route definitions + domains/ + / + model.ts # Effector events, stores, effects (pure, testable) + view-model.ts # Hooks adapting model to React + ui/ # Presentational components + shared/ + ui/ # Design-system atoms + lib/ # Utilities and helpers + services/ + apiService.ts # Authenticated API wrapper + utils/ + config.ts # getBasePath(), getAssetPath() + components/ # Miscellaneous components (if any) +public/ + config.js # Base path placeholder replaced at runtime + oidc.json # Dynamic OIDC config +``` + +## Component Organization +- **Feature domains**: Self-contained under `src/domains/` +- **ViewModel layer**: Thin hooks (`view-model.ts`) encapsulate Effector logic +- **UI components**: Presentational, located in each domain’s `ui/` folder +- **Shared UI atoms**: In `src/shared/ui`, for consistent design + +## State Management with Effector +- **Events** (`createEvent`): Actions triggered by user or effects +- **Stores** (`createStore`): Immutable state containers updated via `.on(...)` +- **Effects** (`createEffect`): Async side-effects dispatching done/fail events +- **Advanced patterns**: Derived stores, combine, reset events + +## Authentication +- **OIDC Flow**: `AuthProvider` initializes using `/oidc.json` +- **ProtectedRoute**: Secures routes, supports role-based access +- **useAuth** & **useApiService** hooks manage login, logout, token handling + +## Deployment & Environment Variables +- **Path-agnostic SPA**: `BASE_PATH` injected into `public/config.js` by `docker-entrypoint.sh` +- **Client-side vars** (`CLIENT_BASE_PATH`, `CLIENT_API_URL`, `CLIENT_APP_NAME`, `CLIENT_DEBUG`) exposed on `window.appConfig` +- **Asset utils**: `getBasePath()` and `getAssetPath()` in `src/utils/config.ts` + +## Coding Guidelines +- **TypeScript strict mode**: Ensures type safety +- **Pure domain logic**: In `model.ts`, avoid side-effects +- **Named exports only**: Prevents default-export rename issues +- **Small files, single responsibility**: Easier automated refactoring +- **Co-located tests**: Provide regression safety +- **Runtime schema checks** (e.g., Zod): Fail fast on invalid data + +## Architecture Rationale +Flux with Effector was chosen over MVVM for: +- Native React integration and unidirectional data flow +- Minimal boilerplate and predictable state management +- High testability and TypeScript support +- Lower complexity for automated refactors + +Refer to `docs/flux-vs-mvvm.md` for the decision matrix and detailed comparison. diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..8bc9229 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,27 @@ +server { + listen 369; + server_name _; + root /usr/share/nginx/html; + index index.html; + absolute_redirect off; + + # This is needed for path-agnostic SPA deployment + # It allows the app to be served from any base path + location / { + try_files $uri $uri/ /index.html; + } + + # Handle assets with or without base path + location ~ ^/assets/ { + expires 1y; + add_header Cache-Control "public"; + try_files $uri =404; + } + + # Also serve assets from the base path + location ~ ^/[^/]+/assets/ { + expires 1y; + add_header Cache-Control "public"; + try_files $uri =404; + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9998385 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7306 @@ +{ + "name": "merchant-operator", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "merchant-operator", + "version": "0.1.0", + "dependencies": { + "@g1/sse-client": "^0.2.0", + "@radix-ui/react-dialog": "^1.1.7", + "@radix-ui/react-slot": "^1.2.0", + "@tailwindcss/postcss": "^4.1.4", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "effector": "^23.3.0", + "effector-react": "^23.3.0", + "lucide-react": "^0.488.0", + "oidc-client-ts": "^3.2.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-feather": "^2.0.10", + "react-oidc-context": "^3.3.0", + "react-router-dom": "^7.5.0", + "tailwind-merge": "^3.2.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@babel/core": "^7.26.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/preset-env": "^7.26.9", + "@babel/preset-react": "^7.26.3", + "@commitlint/cli": "^19.8.0", + "@commitlint/config-conventional": "^19.8.0", + "@commitlint/types": "^19.8.0", + "@g1/api-generator": "latest", + "@types/react": "^18.2.56", + "@types/react-dom": "^18.2.19", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.16", + "cross-env": "^7.0.3", + "dotenv": "^16.5.0", + "husky": "^9.1.7", + "lint-staged": "^15.5.1", + "postcss": "^8.4.33", + "postcss-load-config": "^5.0.3", + "prettier": "^3.5.3", + "tailwindcss": "^4.0.0", + "ts-node": "^10.9.2", + "vite": "^5.1.4" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", + "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", + "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.27.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz", + "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz", + "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz", + "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz", + "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", + "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@commitlint/cli": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.0.tgz", + "integrity": "sha512-t/fCrLVu+Ru01h0DtlgHZXbHV2Y8gKocTR5elDOqIRUzQd0/6hpt2VIWOj9b3NDo7y4/gfxeR2zRtXq/qO6iUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/format": "^19.8.0", + "@commitlint/lint": "^19.8.0", + "@commitlint/load": "^19.8.0", + "@commitlint/read": "^19.8.0", + "@commitlint/types": "^19.8.0", + "tinyexec": "^0.3.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.0.tgz", + "integrity": "sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.0", + "conventional-changelog-conventionalcommits": "^7.0.2" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.0.tgz", + "integrity": "sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.0", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/ensure": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.0.tgz", + "integrity": "sha512-kNiNU4/bhEQ/wutI1tp1pVW1mQ0QbAjfPRo5v8SaxoVV+ARhkB8Wjg3BSseNYECPzWWfg/WDqQGIfV1RaBFQZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.0", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.0.tgz", + "integrity": "sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.0.tgz", + "integrity": "sha512-EOpA8IERpQstxwp/WGnDArA7S+wlZDeTeKi98WMOvaDLKbjptuHWdOYYr790iO7kTCif/z971PKPI2PkWMfOxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.0.tgz", + "integrity": "sha512-L2Jv9yUg/I+jF3zikOV0rdiHUul9X3a/oU5HIXhAJLE2+TXTnEBfqYP9G5yMw/Yb40SnR764g4fyDK6WR2xtpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.0", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/lint": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.0.tgz", + "integrity": "sha512-+/NZKyWKSf39FeNpqhfMebmaLa1P90i1Nrb1SrA7oSU5GNN/lksA4z6+ZTnsft01YfhRZSYMbgGsARXvkr/VLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/is-ignored": "^19.8.0", + "@commitlint/parse": "^19.8.0", + "@commitlint/rules": "^19.8.0", + "@commitlint/types": "^19.8.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.0.tgz", + "integrity": "sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^19.8.0", + "@commitlint/execute-rule": "^19.8.0", + "@commitlint/resolve-extends": "^19.8.0", + "@commitlint/types": "^19.8.0", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^6.1.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/message": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.0.tgz", + "integrity": "sha512-qs/5Vi9bYjf+ZV40bvdCyBn5DvbuelhR6qewLE8Bh476F7KnNyLfdM/ETJ4cp96WgeeHo6tesA2TMXS0sh5X4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.0.tgz", + "integrity": "sha512-YNIKAc4EXvNeAvyeEnzgvm1VyAe0/b3Wax7pjJSwXuhqIQ1/t2hD3OYRXb6D5/GffIvaX82RbjD+nWtMZCLL7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.0", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.0.tgz", + "integrity": "sha512-6ywxOGYajcxK1y1MfzrOnwsXO6nnErna88gRWEl3qqOOP8MDu/DTeRkGLXBFIZuRZ7mm5yyxU5BmeUvMpNte5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/top-level": "^19.8.0", + "@commitlint/types": "^19.8.0", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8", + "tinyexec": "^0.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.0.tgz", + "integrity": "sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^19.8.0", + "@commitlint/types": "^19.8.0", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.0.tgz", + "integrity": "sha512-IZ5IE90h6DSWNuNK/cwjABLAKdy8tP8OgGVGbXe1noBEX5hSsu00uRlLu6JuruiXjWJz2dZc+YSw3H0UZyl/mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/ensure": "^19.8.0", + "@commitlint/message": "^19.8.0", + "@commitlint/to-lines": "^19.8.0", + "@commitlint/types": "^19.8.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.0.tgz", + "integrity": "sha512-3CKLUw41Cur8VMjh16y8LcsOaKbmQjAKCWlXx6B0vOUREplp6em9uIVhI8Cv934qiwkbi2+uv+mVZPnXJi1o9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.0.tgz", + "integrity": "sha512-Rphgoc/omYZisoNkcfaBRPQr4myZEHhLPx2/vTXNLjiCw4RgfPR1wEgUpJ9OOmDCiv5ZyIExhprNLhteqH4FuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^7.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.0.tgz", + "integrity": "sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@g1/api-generator": { + "version": "0.2.1", + "resolved": "https://git.generation.one/api/packages/GenerationOne/npm/%40g1%2Fapi-generator/-/0.2.1/api-generator-0.2.1.tgz", + "integrity": "sha512-jT7LxS9hjRfcoLmcwMZ0y/z8h223Rh8JkJQUfH7pbtFppf02vw0C9RFP2hGnohqodr0tGFMO6WTr1e71m1mOBQ==", + "dev": true, + "license": "UNLICENSED", + "dependencies": { + "axios": "^1.8.4", + "openapi-typescript-codegen": "^0.29.0" + }, + "bin": { + "g1-api-generator": "dist/cli.js" + } + }, + "node_modules/@g1/sse-client": { + "version": "0.2.2", + "resolved": "https://git.generation.one/api/packages/GenerationOne/npm/%40g1%2Fsse-client/-/0.2.2/sse-client-0.2.2.tgz", + "integrity": "sha512-wNgBlijluPOTBuHdLHS017J6Tcj+0zHmgx0BSW2+oDecDvniIWBuT0chwRFOMhwF6wLBOVlf0iR8kswdvR9UPQ==", + "license": "MIT", + "dependencies": { + "event-source-polyfill": "^1.0.31" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.7.tgz", + "integrity": "sha512-EIdma8C0C/I6kL6sO02avaCRqi3fmWJpxH6mqbVScorW6nNktzKJT/le7VPho3o/7wCsyRg3z0+Q+Obr0Gy/VQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.6", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.3", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.5", + "@radix-ui/react-presence": "1.1.3", + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-slot": "1.2.0", + "@radix-ui/react-use-controllable-state": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.6.tgz", + "integrity": "sha512-7gpgMT2gyKym9Jz2ZhlRXSg2y6cNQIK8d/cqBZ0RBCaps8pFryCWXiUKI+uHGFrhMrbGUP7U6PWgiXzIxoyF3Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", + "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.3.tgz", + "integrity": "sha512-4XaDlq0bPt7oJwR+0k0clCiCO/7lO7NKZTAaJBYxDNQT/vj4ig0/UvctrRscZaFREpRvUTkpKR96ov1e6jptQg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.5.tgz", + "integrity": "sha512-ps/67ZqsFm+Mb6lSPJpfhRLrVL2i2fntgCmGMqqth4eaGUf+knAuuRtWVJrNjUhExgmdRqftSgzpf0DF0n6yXA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.3.tgz", + "integrity": "sha512-IrVLIhskYhH3nLvtcBLQFZr61tBG7wx7O3kEmdzcYwRGAEBmBicGGL7ATzNgruYJ3xBTbuzEEq9OXJM3PAX3tA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.3.tgz", + "integrity": "sha512-Pf/t/GkndH7CQ8wE2hbkXA+WyZ83fhQQn5DDmwDiDo6AwN/fhaH8oqZ0jRjMrO2iaMhDi6P1HRx6AZwyMinY1g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", + "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.1.tgz", + "integrity": "sha512-YnEXIy8/ga01Y1PN0VfaNH//MhA91JlEGVBDxDzROqwrAtG5Yr2QGEPz8A/rJA3C7ZAHryOYGaUv8fLSW2H/mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", + "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", + "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", + "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", + "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", + "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", + "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", + "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz", + "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz", + "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz", + "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz", + "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz", + "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz", + "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz", + "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz", + "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", + "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", + "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz", + "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz", + "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz", + "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.4.tgz", + "integrity": "sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==", + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.4" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.4.tgz", + "integrity": "sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.4", + "@tailwindcss/oxide-darwin-arm64": "4.1.4", + "@tailwindcss/oxide-darwin-x64": "4.1.4", + "@tailwindcss/oxide-freebsd-x64": "4.1.4", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.4", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.4", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.4", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.4", + "@tailwindcss/oxide-linux-x64-musl": "4.1.4", + "@tailwindcss/oxide-wasm32-wasi": "4.1.4", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.4", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.4" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.4.tgz", + "integrity": "sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.4.tgz", + "integrity": "sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.4.tgz", + "integrity": "sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.4.tgz", + "integrity": "sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.4.tgz", + "integrity": "sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.4.tgz", + "integrity": "sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.4.tgz", + "integrity": "sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.4.tgz", + "integrity": "sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.4.tgz", + "integrity": "sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.4.tgz", + "integrity": "sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@emnapi/wasi-threads": "^1.0.1", + "@napi-rs/wasm-runtime": "^0.2.8", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.4.tgz", + "integrity": "sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.4.tgz", + "integrity": "sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.4.tgz", + "integrity": "sha512-bjV6sqycCEa+AQSt2Kr7wpGF1bOZJ5wsqnLEkqSbM/JEHxx/yhMH8wHmdkPyApF9xhHeMSwnnkDUUMMM/hYnXw==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.4", + "@tailwindcss/oxide": "4.1.4", + "postcss": "^8.4.41", + "tailwindcss": "4.1.4" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/conventional-commits-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz", + "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", + "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz", + "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.0.tgz", + "integrity": "sha512-x/EztcTKVj+TDeANY1WjNeYsvZjZdfWRMP/KXi5Yn8BoTzpa13ZltaQqKfvWYbX8CE10GOHHdC5v86jY9x8i/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.10", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001714", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001714.tgz", + "integrity": "sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/core-js-compat": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz", + "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jiti": "^2.4.1" + }, + "engines": { + "node": ">=v18" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=9", + "typescript": ">=5" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/effector": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/effector/-/effector-23.3.0.tgz", + "integrity": "sha512-ZnQ3POaNARlxT9+kxrK58PO/xmStBdxfPq0rceglENg8Ryxx/yx+1RsV/ziznrFPhLkZYc7NdDA1OKxnMW98/g==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/zero_bias" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/effector" + } + ], + "license": "MIT", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/effector-react": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/effector-react/-/effector-react-23.3.0.tgz", + "integrity": "sha512-QR0+x1EnbiWhO80Yc0GVF+I9xCYoxBm3t+QLB5Wg+1uY1Q1BrSWDmKvJaJJZ/+9BU4RAr25yS5J2EkdWnicu8g==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/zero_bias" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/effector" + } + ], + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.0.0" + }, + "engines": { + "node": ">=11.0.0" + }, + "peerDependencies": { + "effector": "^23.0.0", + "react": ">=16.8.0 <20.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.138", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.138.tgz", + "integrity": "sha512-FWlQc52z1dXqm+9cCJ2uyFgJkESd+16j6dBEjsgDNuHjBpuIzL8/lRc0uvh1k8RNI6waGo6tcy2DvwkTBJOLDg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-source-polyfill": { + "version": "1.0.31", + "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.31.tgz", + "integrity": "sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lint-staged": { + "version": "15.5.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.1.tgz", + "integrity": "sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.4.1", + "commander": "^13.1.0", + "debug": "^4.4.0", + "execa": "^8.0.1", + "lilconfig": "^3.1.3", + "listr2": "^8.2.5", + "micromatch": "^4.0.8", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.7.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/listr2": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.2.tgz", + "integrity": "sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.488.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.488.0.tgz", + "integrity": "sha512-ronlL0MyKut4CEzBY/ai2ZpKPxyWO4jUqdAkm2GNK5Zn3Rj+swDz+3lvyAUXN0PNqPKIX6XM9Xadwz/skLs/pQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "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/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oidc-client-ts": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-3.2.0.tgz", + "integrity": "sha512-wUvVcG3SXzZDKHxi/VGQGaTUk9qguMKfYh26Y1zOVrQsu1zp85JWx/SjZzKSXK5j3NA1RcasgMoaHe6gt1WNtw==", + "license": "Apache-2.0", + "dependencies": { + "jwt-decode": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-typescript-codegen": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.29.0.tgz", + "integrity": "sha512-/wC42PkD0LGjDTEULa/XiWQbv4E9NwLjwLjsaJ/62yOsoYhwvmBR31kPttn1DzQ2OlGe5stACcF/EIkZk43M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^11.5.4", + "camelcase": "^6.3.0", + "commander": "^12.0.0", + "fs-extra": "^11.2.0", + "handlebars": "^4.7.8" + }, + "bin": { + "openapi": "bin/index.js" + } + }, + "node_modules/openapi-typescript-codegen/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + } + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.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", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-feather": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/react-feather/-/react-feather-2.0.10.tgz", + "integrity": "sha512-BLhukwJ+Z92Nmdcs+EMw6dy1Z/VLiJTzEQACDUEnWMClhYnFykJCGWQx+NmwP/qQHGX/5CzQ+TGi8ofg2+HzVQ==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-oidc-context": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/react-oidc-context/-/react-oidc-context-3.3.0.tgz", + "integrity": "sha512-302T/ma4AOVAxrHdYctDSKXjCq9KNHT564XEO2yOPxRfxEP58xa4nz+GQinNl8x7CnEXECSM5JEjQJk3Cr5BvA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "oidc-client-ts": "^3.1.0", + "react": ">=16.14.0" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz", + "integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.1.tgz", + "integrity": "sha512-/jjU3fcYNd2bwz9Q0xt5TwyiyoO8XjSEFXJY4O/lMAlkGTHWuHRAbR9Etik+lSDqMC7A7mz3UlXzgYT6Vl58sA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.1.tgz", + "integrity": "sha512-5DPSPc7ENrt2tlKPq0FtpG80ZbqA9aIKEyqX6hSNJDlol/tr6iqCK4crqdsusmOSSotq6zDsn0y3urX9TuTNmA==", + "license": "MIT", + "dependencies": { + "react-router": "7.5.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", + "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.40.0", + "@rollup/rollup-android-arm64": "4.40.0", + "@rollup/rollup-darwin-arm64": "4.40.0", + "@rollup/rollup-darwin-x64": "4.40.0", + "@rollup/rollup-freebsd-arm64": "4.40.0", + "@rollup/rollup-freebsd-x64": "4.40.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", + "@rollup/rollup-linux-arm-musleabihf": "4.40.0", + "@rollup/rollup-linux-arm64-gnu": "4.40.0", + "@rollup/rollup-linux-arm64-musl": "4.40.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", + "@rollup/rollup-linux-riscv64-gnu": "4.40.0", + "@rollup/rollup-linux-riscv64-musl": "4.40.0", + "@rollup/rollup-linux-s390x-gnu": "4.40.0", + "@rollup/rollup-linux-x64-gnu": "4.40.0", + "@rollup/rollup-linux-x64-musl": "4.40.0", + "@rollup/rollup-win32-arm64-msvc": "4.40.0", + "@rollup/rollup-win32-ia32-msvc": "4.40.0", + "@rollup/rollup-win32-x64-msvc": "4.40.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.2.0.tgz", + "integrity": "sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.4.tgz", + "integrity": "sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==", + "license": "MIT" + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.18", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.18.tgz", + "integrity": "sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..02d9b2f --- /dev/null +++ b/package.json @@ -0,0 +1,68 @@ +{ + "name": "merchant-operator", + "version": "0.1.0", + "private": true, + "type": "module", + "dependencies": { + "@g1/sse-client": "^0.2.0", + "@radix-ui/react-dialog": "^1.1.7", + "@radix-ui/react-slot": "^1.2.0", + "@tailwindcss/postcss": "^4.1.4", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "effector": "^23.3.0", + "effector-react": "^23.3.0", + "lucide-react": "^0.488.0", + "oidc-client-ts": "^3.2.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-feather": "^2.0.10", + "react-oidc-context": "^3.3.0", + "react-router-dom": "^7.5.0", + "tailwind-merge": "^3.2.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@babel/core": "^7.26.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/preset-env": "^7.26.9", + "@babel/preset-react": "^7.26.3", + "@commitlint/cli": "^19.8.0", + "@commitlint/config-conventional": "^19.8.0", + "@commitlint/types": "^19.8.0", + "@g1/api-generator": "latest", + "@types/react": "^18.2.56", + "@types/react-dom": "^18.2.19", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.16", + "cross-env": "^7.0.3", + "dotenv": "^16.5.0", + "husky": "^9.1.7", + "lint-staged": "^15.5.1", + "postcss": "^8.4.33", + "postcss-load-config": "^5.0.3", + "prettier": "^3.5.3", + "tailwindcss": "^4.0.0", + "ts-node": "^10.9.2", + "vite": "^5.1.4" + }, + "scripts": { + "dev": "vite", + "dev:path": "CLIENT_BASE_PATH=/Merchant-app vite", + "dev:custom": "node vite.server.js", + "build": "tsc && vite build", + "build:path": "tsc && CLIENT_BASE_PATH=/Merchant-app vite build", + "preview": "vite preview", + "preview:path": "CLIENT_BASE_PATH=/Merchant-app vite preview", + "prepare": "husky", + "api:generate": "g1-api-generator https://localhost:7205/openapi/schema.json src/lib/api/merchant --skip-tls-verify", + "typecheck": "tsc --noEmit", + "generate-app-config": "node scripts/generate-app-config.js", + "generate-app-config:prod": "cross-env NODE_ENV=production node scripts/generate-app-config.js" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx}": [ + "prettier --write" + ] + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..1c87846 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +} diff --git a/public/app-config.js b/public/app-config.js new file mode 100644 index 0000000..3f042c7 --- /dev/null +++ b/public/app-config.js @@ -0,0 +1,9 @@ +// Runtime environment variables - Generated by generate-app-config.js +window.appConfig = { + apiUrl: "https://localhost:7205", + appName: "Merchant Operator App", + basePath: "/", + debug: true, + mapTileApiKey: "pk.19d62daa998822ac22861d96a0424b58", + mapTileEndpoint: "https://tiles.locationiq.com/v3/streets/vector.json", +}; \ No newline at end of file diff --git a/react-spa-template.code-workspace b/react-spa-template.code-workspace new file mode 100644 index 0000000..876a149 --- /dev/null +++ b/react-spa-template.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/scripts/generate-app-config.js b/scripts/generate-app-config.js new file mode 100644 index 0000000..022543c --- /dev/null +++ b/scripts/generate-app-config.js @@ -0,0 +1,179 @@ +#!/usr/bin/env node + +/** + * This script generates a app-config.js file with environment variables + * starting with CLIENT_ for both development and production environments. + * + * It works in both local development and production environments, + * eliminating the need for a separate Docker entrypoint script. + */ + +import fs from "fs"; +import path from "path"; +import dotenv from "dotenv"; +import { fileURLToPath } from "url"; + +// Get the directory name in ESM +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Determine if we're in production or development mode +const isProduction = process.env.NODE_ENV === "production"; + +// Load environment variables from .env files +// In production, we prioritize .env.production and .env +// In development, we use the standard Vite hierarchy +if (isProduction) { + dotenv.config({ path: path.resolve(process.cwd(), ".env.production") }); + dotenv.config({ path: path.resolve(process.cwd(), ".env") }); +} else { + // Development mode - follow Vite's loading order + dotenv.config({ path: path.resolve(process.cwd(), ".env") }); + dotenv.config({ path: path.resolve(process.cwd(), ".env.development") }); + dotenv.config({ path: path.resolve(process.cwd(), ".env.local") }); + dotenv.config({ + path: path.resolve(process.cwd(), ".env.development.local"), + }); +} + +// Determine the target directory based on environment +// In production, we use the dist directory (or a specified output directory) +// In development, we use the public directory +const targetDir = isProduction + ? process.env.OUTPUT_DIR || path.resolve(process.cwd(), "dist") + : path.resolve(process.cwd(), "public"); + +// Ensure the target directory exists +if (!fs.existsSync(targetDir)) { + fs.mkdirSync(targetDir, { recursive: true }); + console.log(`Created directory: ${targetDir}`); +} + +// Function to convert SNAKE_CASE to camelCase +function toCamelCase(str) { + return str + .toLowerCase() + .replace(/_([a-z])/g, (_, letter) => letter.toUpperCase()); +} + +// Create the app-config.js file +const configFilePath = path.join(targetDir, "app-config.js"); +let configContent = + "// Runtime environment variables - Generated by generate-app-config.js\n"; +configContent += "window.appConfig = {\n"; + +// Get all environment variables starting with CLIENT_ +const clientEnvVars = Object.entries(process.env).filter(([key]) => + key.startsWith("CLIENT_"), +); + +// Add each environment variable to the config +clientEnvVars.forEach(([key, value]) => { + // Remove CLIENT_ prefix + const keyWithoutPrefix = key.replace(/^CLIENT_/, ""); + + // Convert to camelCase + const camelKey = toCamelCase(keyWithoutPrefix); + + // Add the key-value pair to the config + // If the value is 'true', 'false', 'null', or a number, don't add quotes + if ( + value === "true" || + value === "false" || + value === "null" || + /^[0-9]+$/.test(value) + ) { + configContent += ` ${camelKey}: ${value},\n`; + } else { + configContent += ` ${camelKey}: "${value}",\n`; + } +}); + +// Add default values for essential variables if they don't exist +if (!process.env.CLIENT_BASE_PATH) { + configContent += ' basePath: "/",\n'; +} +if (!process.env.CLIENT_APP_NAME) { + configContent += ' appName: "Merchant Operator App",\n'; +} +if (!process.env.CLIENT_DEBUG) { + configContent += " debug: " + (isProduction ? "false" : "true") + ",\n"; +} + +// Close the object +configContent += "};"; + +// Helper function for colorized logging like Vite +function formatLog(label, message, color = "\x1b[36m ") { + // Default to cyan color + const reset = "\x1b[0m"; + const dim = "\x1b[2m"; + const arrow = `${dim}${color}➜${reset}`; + const formattedLabel = `${color}${label}:${reset}`; + return ` ${arrow} ${formattedLabel} ${message}`; +} + +// Write the config file +fs.writeFileSync(configFilePath, configContent); +console.log(formatLog("Generated", `app-config.js at ${configFilePath}`)); + +// Check if index.html exists in the target directory +const indexHtmlPath = path.join(targetDir, "index.html"); +if (fs.existsSync(indexHtmlPath)) { + let indexHtmlContent = fs.readFileSync(indexHtmlPath, "utf8"); + + // Check if the script tag already exists + if (!indexHtmlContent.includes("app-config.js")) { + // Insert the script tag after the opening head tag + indexHtmlContent = indexHtmlContent.replace( + "", + '\n ', + ); + + // Write the updated index.html + fs.writeFileSync(indexHtmlPath, indexHtmlContent); + console.log( + formatLog( + "Updated", + `injected script tag into ${path.basename(indexHtmlPath)}`, + ), + ); + } else { + console.log( + formatLog( + "Note", + `app-config.js script already exists in ${path.basename(indexHtmlPath)}`, + "\x1b[33m ", + ), + ); // Yellow + } +} else { + console.log( + formatLog("Note", `index.html not found in ${targetDir}`, "\x1b[34m "), + ); // Blue + if (!isProduction) { + console.log( + formatLog( + "Vite", + "script will be injected during development", + "\x1b[34m ", + ), + ); // Blue + } else { + console.log( + formatLog( + "Warning", + "index.html not found in production build directory!", + "\x1b[33m ", + ), + ); // Yellow + } +} + +console.log( + formatLog( + "Ready", + `app-config generated for ${isProduction ? "production" : "development"} environment`, + "\x1b[32m ", + ), +); // Green diff --git a/scripts/vite-plugin-app-config.js b/scripts/vite-plugin-app-config.js new file mode 100644 index 0000000..e000ade --- /dev/null +++ b/scripts/vite-plugin-app-config.js @@ -0,0 +1,98 @@ +/** + * Vite plugin to inject app-config.js into the HTML head during development + */ + +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; +import { spawn } from "child_process"; + +// Get the directory name in ESM +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Helper function for colorized logging like Vite +function formatLog(label, message, color = "\x1b[36m ") { + // Default to cyan color + const reset = "\x1b[0m"; + const dim = "\x1b[2m"; + const arrow = `${dim}${color}➜${reset}`; + const formattedLabel = `${color}${label}:${reset}`; + return ` ${arrow} ${formattedLabel} ${message}`; +} + +/** + * Creates a Vite plugin that injects the app-config.js script into the HTML head + * @returns {import('vite').Plugin} + */ +function appConfigPlugin() { + return { + name: "vite-plugin-app-config", + + configureServer(server) { + // Run the generate-app-config.js script when the dev server starts + const scriptPath = path.resolve(__dirname, "generate-app-config.js"); + const generateConfig = () => { + const process = spawn("node", [scriptPath], { + stdio: "inherit", + shell: true, + }); + + process.on("error", (err) => { + console.error( + formatLog( + "Error", + `Failed to run generate-app-config.js: ${err}`, + "\x1b[31m ", + ), + ); // Red + }); + }; + + // Generate config on server start + generateConfig(); + + // Watch for changes in .env files and regenerate app-config.js + const envFiles = [ + ".env", + ".env.development", + ".env.local", + ".env.development.local", + ]; + + envFiles.forEach((file) => { + const filePath = path.resolve(process.cwd(), file); + if (fs.existsSync(filePath)) { + server.watcher.add(filePath); + } + }); + + server.watcher.on("change", (file) => { + if (envFiles.some((envFile) => file.endsWith(envFile))) { + console.log( + formatLog( + "Changed", + `ENV file: ${path.basename(file)}`, + "\x1b[34m ", + ), + ); // Blue + generateConfig(); + } + }); + }, + + transformIndexHtml(html) { + // Check if the app-config.js script is already in the HTML + if (!html.includes("app-config.js")) { + // Insert the script tag after the opening head tag + return html.replace( + "", + '\n ', + ); + } + return html; + }, + }; +} + +export default appConfigPlugin; diff --git a/src/app/root.tsx b/src/app/root.tsx new file mode 100644 index 0000000..8ae55da --- /dev/null +++ b/src/app/root.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import { AuthProvider } from "@domains/auth"; +import { AppRouter } from "./routes"; + +export const Root: React.FC = () => { + return ( + + + + + + ); +}; diff --git a/src/app/routes.tsx b/src/app/routes.tsx new file mode 100644 index 0000000..c285b3d --- /dev/null +++ b/src/app/routes.tsx @@ -0,0 +1,38 @@ +import React from "react"; +import { createHashRouter, RouterProvider, Outlet } from "react-router-dom"; +import { ProtectedRoute, LoginPage, AuthCallback } from "@domains/auth"; +import { Dashboard } from "@domains/dashboard"; +import { MainLayout } from "@shared/ui"; + +// Define routes +const router = createHashRouter([ + { + path: "/", + element: ( + + + + + + ), + children: [ + { + index: true, + element: , + } + ], + }, + { + path: "/login", + element: , + }, + { + path: "/auth/callback", + element: , + }, + // Add other routes as needed +]); + +export const AppRouter: React.FC = () => { + return ; +}; diff --git a/src/domains/auth/index.ts b/src/domains/auth/index.ts new file mode 100644 index 0000000..19b95ea --- /dev/null +++ b/src/domains/auth/index.ts @@ -0,0 +1,12 @@ +// Export model +export * from "./model"; + +// Export view-model +export * from "./view-model"; + +// Export UI components +export * from "./ui"; +export { AuthCallback } from "./ui/AuthCallback"; // Add export for AuthCallback + +// Re-export AuthProvider from UI +export { AuthProvider } from "./ui"; diff --git a/src/domains/auth/model.ts b/src/domains/auth/model.ts new file mode 100644 index 0000000..ea6f4aa --- /dev/null +++ b/src/domains/auth/model.ts @@ -0,0 +1,341 @@ +import { createStore, createEvent, createEffect } from "effector"; +import { User, IdTokenClaims } from "oidc-client-ts"; // UserManager removed +import { getUserManager } from "./oidc-config"; // Import getUserManager + +// Define types +export interface AppUser { + id: string; + name: string; + email: string; + roles: string[]; +} + +interface OidcUserProfile { + sub: string; + name?: string; + preferred_username?: string; + email?: string; + roles?: string[]; + [key: string]: unknown; +} + +interface OidcUser extends Omit { + profile: OidcUserProfile & Partial; + [key: string]: unknown; +} + +export interface AuthState { + user: AppUser | null; + isAuthenticated: boolean; + isLoading: boolean; + error: string | null; + manuallyLoggedOut: boolean; // Track if user manually logged out +} + +// Define events +export const setUser = createEvent(); +export const setIsLoading = createEvent(); +export const setError = createEvent(); +export const logout = createEvent(); + +// Define effects +export const loginFx = createEffect(async () => { + const userManager = getUserManager(); // Get instance + + // First try to get the current user + const currentUser = await userManager.getUser(); + + // If we have a valid user that's not expired, we're already logged in + if (currentUser && !currentUser.expired) { + console.log("loginFx: User is already logged in and token is valid"); + return currentUser; + } + + // Try silent login first + try { + console.log("loginFx: Attempting silent login"); + const user = await userManager.signinSilent(); + console.log("loginFx: Silent login successful"); + return user; + } catch (silentError) { + console.log( + "loginFx: Silent login failed, falling back to redirect:", + silentError, + ); + // Fall back to redirect login + await userManager.signinRedirect(); + return null; // This line won't be reached as signinRedirect redirects the page + } +}); + +export const logoutFx = createEffect(async () => { + // Set the manuallyLoggedOut flag in localStorage first + setManuallyLoggedOutInStorage(true); + console.log("logoutFx: Set manuallyLoggedOut to true in localStorage"); + + // Clear the user from the store before redirecting + // This will prevent auto-login from triggering + logout(); + + // Get the UserManager instance + const userManager = getUserManager(); + + // Use a small delay to ensure the flag is set before redirecting + await new Promise((resolve) => setTimeout(resolve, 100)); + + // Now redirect to the identity provider for logout + await userManager.signoutRedirect(); +}); + +export const checkAuthFx = createEffect( + async () => { + console.log("checkAuthFx: Starting to check authentication status"); + try { + const userManager = getUserManager(); // Get instance + console.log("checkAuthFx: Got UserManager instance"); + + // First try to get the user from storage + let user = await userManager.getUser(); + console.log("checkAuthFx: User from storage:", user); + + // If we have a user but the token is expired or about to expire, try silent renew + if ( + user && + (user.expired || (user.expires_in && user.expires_in < 300)) + ) { + console.log( + "checkAuthFx: Token is expired or about to expire, attempting silent renew", + ); + try { + user = await userManager.signinSilent(); + console.log("checkAuthFx: Silent renew successful, new user:", user); + } catch (renewError) { + console.warn("checkAuthFx: Silent renew failed:", renewError); + // Continue with the expired user, the app will handle redirect if needed + } + } + + if (!user) { + console.log("checkAuthFx: No user found, user is not authenticated"); + } else { + console.log("checkAuthFx: User found, user is authenticated"); + } + + return user as OidcUser | null; + } catch (error) { + console.error("checkAuthFx: Error checking authentication:", error); + throw error; + } + }, +); + +export const handleCallbackFx = createEffect( + async () => { + console.log("handleCallbackFx: Starting to process callback"); + try { + const userManager = getUserManager(); // Get instance + console.log("handleCallbackFx: Got UserManager instance"); + + const user = await userManager.signinRedirectCallback(); + console.log( + "handleCallbackFx: Successfully processed callback, user:", + user, + ); + + return user as OidcUser; + } catch (error) { + console.error("handleCallbackFx: Error processing callback:", error); + throw error; + } + }, +); + +// Helper functions for localStorage +const getManuallyLoggedOutFromStorage = (): boolean => { + try { + const value = localStorage.getItem("auth_manually_logged_out"); + return value === "true"; + } catch (e) { + console.error("Error reading from localStorage:", e); + return false; + } +}; + +const setManuallyLoggedOutInStorage = (value: boolean): void => { + try { + localStorage.setItem("auth_manually_logged_out", value.toString()); + } catch (e) { + console.error("Error writing to localStorage:", e); + } +}; + +// Define initial state +const initialState: AuthState = { + user: null, + isAuthenticated: false, + isLoading: false, + error: null, + manuallyLoggedOut: getManuallyLoggedOutFromStorage(), +}; + +// Create store +export const $auth = createStore(initialState) + .on(checkAuthFx.pending, (state) => { + console.log("checkAuthFx.pending handler called", { prevState: state }); + return { + // Add pending handler + ...state, + isLoading: true, + error: null, + }; + }) + .on(checkAuthFx.doneData, (state, result) => { + console.log("checkAuthFx.doneData handler called", { + result, + prevState: state, + }); + + // If a user is found, reset the manuallyLoggedOut flag in localStorage + if (result) { + setManuallyLoggedOutInStorage(false); + console.log( + "checkAuthFx.doneData: User found, reset manuallyLoggedOut to false in localStorage", + ); + } else { + console.log( + "checkAuthFx.doneData: No user found, keeping manuallyLoggedOut as", + state.manuallyLoggedOut, + ); + } + + return { + ...state, + isLoading: false, // Set loading false on done + user: result + ? { + id: result.profile.sub, + name: + result.profile.name || result.profile.preferred_username || "", + email: result.profile.email || "", + roles: result.profile.roles || [], + } + : null, + isAuthenticated: !!result, + // If a user is found, reset the manuallyLoggedOut flag + manuallyLoggedOut: result ? false : state.manuallyLoggedOut, + }; + }) + .on(checkAuthFx.fail, (state, { error }) => { + console.log("checkAuthFx.fail handler called", { error, prevState: state }); + return { + // Add fail handler + ...state, + isLoading: false, + error: error.message, + }; + }) + .on(handleCallbackFx.pending, (state) => { + console.log("handleCallbackFx.pending handler called", { + prevState: state, + }); + return { + // Add pending handler for callback + ...state, + isLoading: true, + error: null, + }; + }) + .on(handleCallbackFx.doneData, (state, result) => { + console.log("handleCallbackFx.doneData handler called", { + result, + prevState: state, + }); + + // Reset flag in localStorage when user successfully logs in + setManuallyLoggedOutInStorage(false); + console.log( + "handleCallbackFx.doneData: Reset manuallyLoggedOut to false in localStorage", + ); + + return { + ...state, + isLoading: false, // Set loading false on done + user: { + id: result.profile.sub, + name: result.profile.name || result.profile.preferred_username || "", + email: result.profile.email || "", + roles: result.profile.roles || [], + }, + isAuthenticated: true, + manuallyLoggedOut: false, // Reset the flag when user successfully logs in + }; + }) + .on(handleCallbackFx.fail, (state, { error }) => { + console.log("handleCallbackFx.fail handler called", { + error, + prevState: state, + }); + return { + // Add fail handler for callback + ...state, + isLoading: false, + error: error.message, + }; + }) + .on(setUser, (state, user) => ({ + ...state, + user, + isAuthenticated: !!user, + })) + .on(setIsLoading, (state, isLoading) => ({ + ...state, + isLoading, + })) + .on(setError, (state, error) => ({ + ...state, + error, + })) + .on(loginFx.pending, (state) => ({ + ...state, + isLoading: true, + error: null, + })) + .on(loginFx.done, (state) => ({ + ...state, + isLoading: false, + error: null, + })) + .on(loginFx.fail, (state, { error }) => ({ + ...state, + isLoading: false, + error: error.message, + })) + .on(logoutFx.pending, (state) => ({ + ...state, + isLoading: true, + })) + .on(logoutFx.done, () => { + // Set flag in localStorage + setManuallyLoggedOutInStorage(true); + console.log("logoutFx.done: Set manuallyLoggedOut to true in localStorage"); + + return { + ...initialState, + manuallyLoggedOut: true, // Set flag when user manually logs out + }; + }) + .on(logoutFx.fail, (state, { error }) => ({ + ...state, + isLoading: false, + error: error.message, + })) + .on(logout, () => { + // Set flag in localStorage + setManuallyLoggedOutInStorage(true); + console.log("logout event: Set manuallyLoggedOut to true in localStorage"); + + return { + ...initialState, + manuallyLoggedOut: true, // Set flag when user manually logs out + }; + }); diff --git a/src/domains/auth/oidc-config.ts b/src/domains/auth/oidc-config.ts new file mode 100644 index 0000000..42f4dda --- /dev/null +++ b/src/domains/auth/oidc-config.ts @@ -0,0 +1,122 @@ +import { + UserManager, + WebStorageStateStore, + UserManagerSettings, +} from "oidc-client-ts"; +import { OidcService } from "@merchant-api/services/OidcService"; +import { oidcConnectResponseDto } from "@merchant-api/models/oidcConnectResponseDto"; +import { OpenAPI } from "@merchant-api/core/OpenAPI"; +import { createHashUrl, normalizeUrl } from "@shared/lib/url-utils"; +import { getApiUrlSingleton } from "@shared/lib/api-url"; + +let userManagerInstance: UserManager | null = null; + +export const getOidcConfig = async (): Promise => { + try { + // Get the API URL using our utility function + try { + // This will handle auto-detection if needed + const apiUrl = getApiUrlSingleton(); + + console.log(`Using API URL for OIDC config: ${apiUrl}`); + // Ensure OpenAPI.BASE is set before making any API calls + // This is a safeguard in case the initialize.ts module hasn't run yet + OpenAPI.BASE = apiUrl; + } catch (apiUrlError) { + console.error("FATAL ERROR: Failed to get API URL:", apiUrlError); + throw apiUrlError; + } + + console.log("Fetching OIDC config using OidcService"); + + // Use the OidcService to fetch the OIDC configuration + console.log("About to call OidcService.getOidcJson()"); + let config: oidcConnectResponseDto; + try { + config = await OidcService.getOidcJson(); + console.log("OIDC config received:", config); + } catch (fetchError) { + console.error("Error from OidcService.getOidcJson():", fetchError); + console.error( + "This may be due to CLIENT_API_URL being incorrect or the API server being unavailable", + ); + console.error(`Current OpenAPI.BASE: ${OpenAPI.BASE}`); + throw fetchError; + } + + if (!config || !config.authorityUrl || !config.clientId) { + console.error( + "FATAL ERROR: Invalid OIDC config received from API - missing authorityUrl or clientId", + ); + throw new Error("Invalid OIDC config received from API"); + } + + // Log the authorityUrl that will be used for OIDC + console.log(`Using OIDC authorityUrl: ${config.authorityUrl}`); + + // Important: We use the authorityUrl directly from the OIDC config + // This URL will be used for all identity/.well-known endpoint checks + + // Properly construct the redirect URI using our utility functions + const redirectUri = createHashUrl( + window.location.origin, + window.appConfig?.basePath, + "auth/callback", + ); + + // Create the post-logout redirect URI + const logoutRedirectUri = createHashUrl( + window.location.origin, + window.appConfig?.basePath, + "", + ); + + // Normalize the authority URL to ensure it has a trailing slash + var normalizedAuthorityUrl = normalizeUrl(config.authorityUrl); + + console.log( + `Using normalized OIDC authorityUrl: ${normalizedAuthorityUrl}`, + ); + console.log(`Constructed redirect URI: ${redirectUri}`); + console.log(`Constructed logout redirect URI: ${logoutRedirectUri}`); + + return { + authority: normalizedAuthorityUrl, // Using normalized authorityUrl + client_id: config.clientId, + redirect_uri: redirectUri, + response_type: "code", + scope: "openid profile email offline_access", // Added offline_access for refresh tokens + post_logout_redirect_uri: logoutRedirectUri, + userStore: new WebStorageStateStore({ store: window.localStorage }), + loadUserInfo: true, + automaticSilentRenew: true, + revokeTokensOnSignout: true, + monitorSession: true, + }; + } catch (error) { + console.error( + "FATAL ERROR: Failed to initialize OIDC configuration:", + error, + ); + throw error; // Re-throw to propagate the error + } +}; + +export const initializeUserManager = async (): Promise => { + if (userManagerInstance) { + return userManagerInstance; + } + const settings = await getOidcConfig(); + userManagerInstance = new UserManager(settings); + return userManagerInstance; +}; + +// Function to get the initialized instance, throws error if not initialized +export const getUserManager = (): UserManager => { + if (!userManagerInstance) { + throw new Error( + "UserManager not initialized. Call initializeUserManager first.", + ); + } + return userManagerInstance; +}; diff --git a/src/domains/auth/types.ts b/src/domains/auth/types.ts new file mode 100644 index 0000000..47bdedf --- /dev/null +++ b/src/domains/auth/types.ts @@ -0,0 +1,45 @@ +import { User, UserManager } from "oidc-client-ts"; + +// Auth User Type +export interface AuthUser extends Omit { + roles?: string[]; + resource_access?: { + roles?: string[]; + [key: string]: any; + }; + expires_at?: number; + access_token?: string; +} + +// Auth Context Type +export interface AuthContext { + isLoading: boolean; + isAuthenticated: boolean; + user: AuthUser | null; + error: Error | null; + signinRedirect: () => Promise; + signinSilent: () => Promise; + removeUser: () => Promise; + userManager: UserManager; + settings: any; + events: any; + isSignedIn: boolean; + signinPopup: () => Promise; + signinSilentCallback: () => Promise; + signinPopupCallback: () => Promise; + signinRedirectCallback: () => Promise; + signoutRedirect: (args?: any) => Promise; + signoutRedirectCallback: () => Promise; + signoutPopup: (args?: any) => Promise; + signoutPopupCallback: () => Promise; + signoutSilent: (args?: any) => Promise; + signoutSilentCallback: () => Promise; +} + +// Extended Auth Context Type +export interface ExtendedAuthContext extends AuthContext { + hasRole: (role: string) => boolean; + getAccessToken: () => string | undefined; + isTokenExpiringSoon: () => boolean; + refreshToken: () => Promise; +} diff --git a/src/domains/auth/ui/AuthCallback.tsx b/src/domains/auth/ui/AuthCallback.tsx new file mode 100644 index 0000000..7b538f1 --- /dev/null +++ b/src/domains/auth/ui/AuthCallback.tsx @@ -0,0 +1,143 @@ +import React, { useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { handleCallbackFx, setIsLoading } from "../model"; // Import the effect and events +import { useAuth } from "../view-model"; +import { cleanupUrl } from "@shared/lib/url-utils"; + +export const AuthCallback: React.FC = () => { + const navigate = useNavigate(); + const { isAuthenticated } = useAuth(); + + const [status, setStatus] = useState("processing"); + + // We're using the imported cleanupUrl function from url-utils + + useEffect(() => { + const processCallback = async () => { + // If user is already authenticated, just redirect to home + if (isAuthenticated) { + console.log( + "AuthCallback: User is already authenticated, redirecting to home", + ); + setStatus("success"); + setIsLoading(false); + + // Redirect to home page + setTimeout(() => { + navigate("/", { replace: true }); + }, 500); + return; + } + + try { + console.log("AuthCallback: Starting to process callback"); + // Use the effect to handle the callback and update the store + await handleCallbackFx(); + console.log("AuthCallback: Callback processed successfully"); + + // Explicitly set loading to false to prevent loading screen + setIsLoading(false); + setStatus("success"); + + // Redirect to the intended page after successful login + // Retrieve the stored return URL or default to '/' + const returnUrl = sessionStorage.getItem("oidc_return_url") || "/"; + sessionStorage.removeItem("oidc_return_url"); // Clean up + + console.log("AuthCallback: Redirecting to", returnUrl); + + // Clean up URL + cleanupUrl(); + + // Add a small delay before redirecting to ensure state is updated + setTimeout(() => { + navigate(returnUrl, { replace: true }); + }, 500); + } catch (err) { + console.error("Error handling OIDC callback:", err); + + // If the error is about missing state but user is authenticated, + // we can just redirect to home + const errorMessage = err instanceof Error ? err.message : String(err); + if ( + errorMessage.includes("No matching state found") && + isAuthenticated + ) { + console.log( + "AuthCallback: State error but user is authenticated, redirecting to home", + ); + setStatus("success"); + setIsLoading(false); + + // Clean up URL + cleanupUrl(); + + setTimeout(() => { + navigate("/", { replace: true }); + }, 500); + return; + } + + setStatus("error"); + setIsLoading(false); + + // Clean up URL + cleanupUrl(); + + // Redirect to login page on error after a small delay + setTimeout(() => { + navigate("/login", { replace: true }); + }, 500); + } + }; + + processCallback(); + }, [navigate, isAuthenticated]); + + // Display a loading indicator while processing the callback using the same design as login page + return ( +
+
+
+

Merchant Operator

+ + {status === "processing" && ( +
+
+
+

Completing login...

+

+ Please wait while we verify your credentials +

+
+
+ )} + + {status === "success" && ( +
+
+
+

Login successful!

+

+ Redirecting to your dashboard... +

+
+
+ )} + + {status === "error" && ( +
+
+
+

Login failed

+

+ Redirecting to login page... +

+
+
+ )} +
+
+
+ ); +}; diff --git a/src/domains/auth/ui/AuthProvider.tsx b/src/domains/auth/ui/AuthProvider.tsx new file mode 100644 index 0000000..21a15f2 --- /dev/null +++ b/src/domains/auth/ui/AuthProvider.tsx @@ -0,0 +1,145 @@ +import React, { ReactNode, useEffect, useState } from "react"; +import { useAuth } from "../view-model"; +import { checkAuthFx, setError, setIsLoading } from "../model"; // Import effect and events +import { initializeUserManager } from "../oidc-config"; // Import initializer +import { checkApiUrlConfig } from "@shared/lib/diagnostics"; // Import diagnostics utility + +interface AuthProviderProps { + children: ReactNode; +} + +export const AuthProvider: React.FC = ({ children }) => { + const { isLoading, error } = useAuth(); + const [isInitialized, setIsInitialized] = useState(false); + + // Initialize UserManager and check authentication status on component mount + useEffect(() => { + let isMounted = true; // Flag to prevent state updates after unmount + + const initAuth = async () => { + try { + console.log("AuthProvider: Starting initialization"); + + // Run diagnostics to check API URL configuration + console.log("AuthProvider: Running API URL diagnostics"); + const apiUrl = checkApiUrlConfig(); + if (!apiUrl) { + console.error( + "AuthProvider: window.appConfig.apiUrl is not defined, authentication will likely fail", + ); + } + + await initializeUserManager(); // Initialize first + console.log("AuthProvider: UserManager initialized"); + + if (isMounted) { + const result = await checkAuthFx(); // Then check auth status + console.log( + "AuthProvider: Authentication check completed", + result ? "User authenticated" : "No user", + ); + + if (isMounted) { + setIsInitialized(true); + setIsLoading(false); // Explicitly set loading to false + console.log( + "AuthProvider: Initialization complete, isInitialized set to true, isLoading set to false", + ); + } + } + } catch (initError) { + console.error( + "FATAL ERROR: Failed to initialize OIDC or check auth:", + initError, + ); + + if (isMounted) { + setError( + initError instanceof Error + ? initError.message + : "Authentication initialization failed", + ); + setIsInitialized(true); // Mark as initialized even on error to stop loading screen + setIsLoading(false); // Explicitly set loading to false + console.log( + "AuthProvider: Initialization failed, but isInitialized set to true, isLoading set to false", + ); + } + } + }; + + initAuth(); + + // Cleanup function to prevent state updates after unmount + return () => { + isMounted = false; + }; + }, []); + + // If not initialized yet, render nothing (or a minimal loader) + if (!isInitialized) { + console.log("AuthProvider render: Not initialized yet", { + isLoading, + isInitialized, + }); + return null; // Return nothing, the login page will handle the loading state + } + + // Show error state + if (error) { + console.log("AuthProvider render: Showing error state", { error }); + return ( +
+
+
+

Merchant Operator

+ +
+
+
+

Authentication Error

+

{error}

+ +
+

Possible solutions:

+
    +
  1. + Check that the API server is running at the URL specified + in window.appConfig.apiUrl +
  2. +
  3. + Verify that the /oidc.json endpoint is accessible from the + API +
  4. +
  5. + Ensure the OIDC configuration has valid authorityUrl and + clientId values +
  6. +
  7. Check browser console for detailed error messages
  8. +
  9. + If window.appConfig.apiUrl is not defined, check your + environment variables and restart the development server +
  10. +
+
+ + +
+
+
+
+
+ ); + } + + // Render children when authentication is ready + console.log( + "AuthProvider render: Rendering children, authentication is ready", + ); + return <>{children}; +}; diff --git a/src/domains/auth/ui/LoginPage.tsx b/src/domains/auth/ui/LoginPage.tsx new file mode 100644 index 0000000..b0ebb4a --- /dev/null +++ b/src/domains/auth/ui/LoginPage.tsx @@ -0,0 +1,111 @@ +import React, { useEffect } from "react"; +import { useAuth } from "../view-model"; + +export const LoginPage: React.FC = () => { + const { login, isLoading, manuallyLoggedOut, isAuthenticated, user } = + useAuth(); + + // Auto-login when component mounts if not manually logged out and not already authenticated + useEffect(() => { + // If already authenticated, no need to do anything + if (isAuthenticated || user) { + console.log( + "LoginPage: User is already authenticated, no need to auto-login", + ); + return; + } + + // Check localStorage directly for the manuallyLoggedOut flag + const isManuallyLoggedOut = + localStorage.getItem("auth_manually_logged_out") === "true"; + console.log( + "LoginPage: localStorage auth_manually_logged_out =", + isManuallyLoggedOut, + ); + console.log("LoginPage: manuallyLoggedOut from state =", manuallyLoggedOut); + + // Only auto-login if not manually logged out (checking both state and localStorage) + // and not already loading + if (!isManuallyLoggedOut && !manuallyLoggedOut && !isLoading) { + console.log( + "LoginPage: Auto-authenticating because user has not manually logged out", + ); + login().catch((err) => { + console.error("FATAL ERROR: Auto-login failed:", err); + }); + } else { + console.log( + "LoginPage: Not auto-authenticating because user manually logged out or is loading", + ); + console.log( + "isManuallyLoggedOut:", + isManuallyLoggedOut, + "manuallyLoggedOut:", + manuallyLoggedOut, + "isLoading:", + isLoading, + ); + } + }, [login, manuallyLoggedOut, isLoading, isAuthenticated, user]); + + const handleLogin = async () => { + try { + console.log("LoginPage: Manual login initiated"); + + // Reset the manuallyLoggedOut flag in localStorage when user manually clicks login + localStorage.setItem("auth_manually_logged_out", "false"); + console.log( + "LoginPage: Reset manuallyLoggedOut to false in localStorage", + ); + + // Store the current path as the return URL after login + const returnUrl = window.location.hash.substring(1) || "/"; + sessionStorage.setItem("oidc_return_url", returnUrl); + console.log("LoginPage: Stored return URL:", returnUrl); + + await login(); + } catch (err) { + console.error("FATAL ERROR: Login failed:", err); + alert( + `Login failed: ${err instanceof Error ? err.message : "Unknown error"}.\n\nCheck the console for more details.`, + ); + } + }; + + return ( +
+
+
+

Merchant Operator

+

+ Sign in with your identity provider +

+
+ +
+ + +
+

This will redirect you to your configured identity provider.

+

+ Make sure your OIDC configuration is properly set up. +

+
+
+
+
+ ); +}; diff --git a/src/domains/auth/ui/LogoutButton.tsx b/src/domains/auth/ui/LogoutButton.tsx new file mode 100644 index 0000000..f6bd12a --- /dev/null +++ b/src/domains/auth/ui/LogoutButton.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import { useAuth } from "../view-model"; +import Button from "@shared/ui/Button"; + +export const LogoutButton: React.FC<{ className?: string }> = ({ + className = "", +}) => { + const { isAuthenticated, logout } = useAuth(); + + if (!isAuthenticated) { + return null; + } + + return ( + + ); +}; diff --git a/src/domains/auth/ui/ProtectedRoute.tsx b/src/domains/auth/ui/ProtectedRoute.tsx new file mode 100644 index 0000000..33b4448 --- /dev/null +++ b/src/domains/auth/ui/ProtectedRoute.tsx @@ -0,0 +1,62 @@ +import React, { ReactNode } from "react"; +import { useAuth } from "../view-model"; +import { Navigate, useLocation } from "react-router-dom"; + +interface ProtectedRouteProps { + children: ReactNode; + requiredRoles?: string[]; + redirectTo?: string; +} + +export const ProtectedRoute: React.FC = ({ + children, + requiredRoles = [], + redirectTo = "/login", +}) => { + const { isAuthenticated, isLoading, hasRole } = useAuth(); + const location = useLocation(); + + console.log("ProtectedRoute: Rendering with state", { + isAuthenticated, + isLoading, + path: location.pathname, + }); + + // If still loading, redirect to login page which will show the loading state + if (isLoading) { + console.log("ProtectedRoute: Still loading, redirecting to login page"); + return ; + } + + // Redirect to login if not authenticated + if (!isAuthenticated) { + console.log( + `User not authenticated, redirecting to ${redirectTo} from ${location.pathname}`, + ); + // Store the current location so we can redirect back after login + sessionStorage.setItem("oidc_return_url", location.pathname); + return ( + + ); + } + + // Check for required roles if specified + if (requiredRoles.length > 0) { + const hasRequiredRole = requiredRoles.some((role) => hasRole(role)); + + if (!hasRequiredRole) { + return ( +
+
+
Access Denied
+
You don't have permission to access this page.
+
+
+ ); + } + } + + // Render the protected content + console.log("ProtectedRoute: Rendering protected content"); + return <>{children}; +}; diff --git a/src/domains/auth/ui/index.ts b/src/domains/auth/ui/index.ts new file mode 100644 index 0000000..f5d0d38 --- /dev/null +++ b/src/domains/auth/ui/index.ts @@ -0,0 +1,4 @@ +export { ProtectedRoute } from "./ProtectedRoute"; +export { LogoutButton } from "./LogoutButton"; +export { AuthProvider } from "./AuthProvider"; +export { LoginPage } from "./LoginPage"; diff --git a/src/domains/auth/view-model.ts b/src/domains/auth/view-model.ts new file mode 100644 index 0000000..ed69bc5 --- /dev/null +++ b/src/domains/auth/view-model.ts @@ -0,0 +1,44 @@ +import { useUnit } from "effector-react"; +import { useCallback } from "react"; +import { $auth, loginFx, logoutFx } from "./model"; + +export const useAuth = () => { + const { user, isAuthenticated, isLoading, error, manuallyLoggedOut } = + useUnit($auth); + + const login = useCallback(async () => { + try { + await loginFx(); + return true; + } catch (err) { + return false; + } + }, []); + + const logout = useCallback(async () => { + try { + await logoutFx(); + return true; + } catch (err) { + return false; + } + }, []); + + const hasRole = useCallback( + (role: string) => { + return user?.roles.includes(role) || false; + }, + [user], + ); + + return { + user, + isAuthenticated, + isLoading, + error, + manuallyLoggedOut, + login, + logout, + hasRole, + }; +}; diff --git a/src/domains/dashboard/index.ts b/src/domains/dashboard/index.ts new file mode 100644 index 0000000..4aedf59 --- /dev/null +++ b/src/domains/dashboard/index.ts @@ -0,0 +1 @@ +export * from "./ui"; diff --git a/src/domains/dashboard/ui/Dashboard.tsx b/src/domains/dashboard/ui/Dashboard.tsx new file mode 100644 index 0000000..485a818 --- /dev/null +++ b/src/domains/dashboard/ui/Dashboard.tsx @@ -0,0 +1,63 @@ +import React from "react"; +import { useAuth } from "@domains/auth"; +import { Card, CardContent, CardHeader, CardTitle } from "@shared/ui"; + +export const Dashboard: React.FC = () => { + const { user } = useAuth(); + + return ( +
+

Dashboard

+ +
+ + + Welcome + + +

Hello, {user?.name || "Merchant"}!

+

+ Welcome to the Merchant Operator App. Use the sidebar to navigate + to different sections. +

+
+
+ + + + Quick Stats + + +
+
+ Products + 12 +
+
+ Categories + 4 +
+
+ Orders + 24 +
+
+
+
+ + + + Recent Activity + + +
    +
  • Product "Espresso" updated
  • +
  • New category "Beverages" added
  • +
  • Price for "Cappuccino" changed
  • +
+
+
+
+
+ ); +}; diff --git a/src/domains/dashboard/ui/index.ts b/src/domains/dashboard/ui/index.ts new file mode 100644 index 0000000..11db219 --- /dev/null +++ b/src/domains/dashboard/ui/index.ts @@ -0,0 +1 @@ +export { Dashboard } from "./Dashboard"; diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..891a458 --- /dev/null +++ b/src/index.css @@ -0,0 +1,16 @@ +@import "tailwindcss"; + +/* Inter font is now loaded from public/fonts/inter.css */ + +body { + background-color: #131215; + color: white; + font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + margin: 0; + padding: 0; +} + +input::placeholder, +textarea::placeholder { + color: #adaab7; +} diff --git a/src/lib/api/merchant/core/ApiError.ts b/src/lib/api/merchant/core/ApiError.ts new file mode 100644 index 0000000..3335e5a --- /dev/null +++ b/src/lib/api/merchant/core/ApiError.ts @@ -0,0 +1,29 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from "./ApiRequestOptions"; +import type { ApiResult } from "./ApiResult"; + +export class ApiError extends Error { + public readonly url: string; + public readonly status: number; + public readonly statusText: string; + public readonly body: any; + public readonly request: ApiRequestOptions; + + constructor( + request: ApiRequestOptions, + response: ApiResult, + message: string, + ) { + super(message); + + this.name = "ApiError"; + this.url = response.url; + this.status = response.status; + this.statusText = response.statusText; + this.body = response.body; + this.request = request; + } +} diff --git a/src/lib/api/merchant/core/ApiRequestOptions.ts b/src/lib/api/merchant/core/ApiRequestOptions.ts new file mode 100644 index 0000000..13f2bdf --- /dev/null +++ b/src/lib/api/merchant/core/ApiRequestOptions.ts @@ -0,0 +1,24 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiRequestOptions = { + readonly method: + | "GET" + | "PUT" + | "POST" + | "DELETE" + | "OPTIONS" + | "HEAD" + | "PATCH"; + readonly url: string; + readonly path?: Record; + readonly cookies?: Record; + readonly headers?: Record; + readonly query?: Record; + readonly formData?: Record; + readonly body?: any; + readonly mediaType?: string; + readonly responseHeader?: string; + readonly errors?: Record; +}; diff --git a/src/lib/api/merchant/core/ApiResult.ts b/src/lib/api/merchant/core/ApiResult.ts new file mode 100644 index 0000000..24c93fc --- /dev/null +++ b/src/lib/api/merchant/core/ApiResult.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiResult = { + readonly url: string; + readonly ok: boolean; + readonly status: number; + readonly statusText: string; + readonly body: any; +}; diff --git a/src/lib/api/merchant/core/CancelablePromise.ts b/src/lib/api/merchant/core/CancelablePromise.ts new file mode 100644 index 0000000..442c2be --- /dev/null +++ b/src/lib/api/merchant/core/CancelablePromise.ts @@ -0,0 +1,130 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export class CancelError extends Error { + constructor(message: string) { + super(message); + this.name = "CancelError"; + } + + public get isCancelled(): boolean { + return true; + } +} + +export interface OnCancel { + readonly isResolved: boolean; + readonly isRejected: boolean; + readonly isCancelled: boolean; + + (cancelHandler: () => void): void; +} + +export class CancelablePromise implements Promise { + #isResolved: boolean; + #isRejected: boolean; + #isCancelled: boolean; + readonly #cancelHandlers: (() => void)[]; + readonly #promise: Promise; + #resolve?: (value: T | PromiseLike) => void; + #reject?: (reason?: any) => void; + + constructor( + executor: ( + resolve: (value: T | PromiseLike) => void, + reject: (reason?: any) => void, + onCancel: OnCancel, + ) => void, + ) { + this.#isResolved = false; + this.#isRejected = false; + this.#isCancelled = false; + this.#cancelHandlers = []; + this.#promise = new Promise((resolve, reject) => { + this.#resolve = resolve; + this.#reject = reject; + + const onResolve = (value: T | PromiseLike): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isResolved = true; + if (this.#resolve) this.#resolve(value); + }; + + const onReject = (reason?: any): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isRejected = true; + if (this.#reject) this.#reject(reason); + }; + + const onCancel = (cancelHandler: () => void): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#cancelHandlers.push(cancelHandler); + }; + + Object.defineProperty(onCancel, "isResolved", { + get: (): boolean => this.#isResolved, + }); + + Object.defineProperty(onCancel, "isRejected", { + get: (): boolean => this.#isRejected, + }); + + Object.defineProperty(onCancel, "isCancelled", { + get: (): boolean => this.#isCancelled, + }); + + return executor(onResolve, onReject, onCancel as OnCancel); + }); + } + + get [Symbol.toStringTag]() { + return "Cancellable Promise"; + } + + public then( + onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onRejected?: ((reason: any) => TResult2 | PromiseLike) | null, + ): Promise { + return this.#promise.then(onFulfilled, onRejected); + } + + public catch( + onRejected?: ((reason: any) => TResult | PromiseLike) | null, + ): Promise { + return this.#promise.catch(onRejected); + } + + public finally(onFinally?: (() => void) | null): Promise { + return this.#promise.finally(onFinally); + } + + public cancel(): void { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isCancelled = true; + if (this.#cancelHandlers.length) { + try { + for (const cancelHandler of this.#cancelHandlers) { + cancelHandler(); + } + } catch (error) { + console.warn("Cancellation threw an error", error); + return; + } + } + this.#cancelHandlers.length = 0; + if (this.#reject) this.#reject(new CancelError("Request aborted")); + } + + public get isCancelled(): boolean { + return this.#isCancelled; + } +} diff --git a/src/lib/api/merchant/core/OpenAPI.ts b/src/lib/api/merchant/core/OpenAPI.ts new file mode 100644 index 0000000..dcacd77 --- /dev/null +++ b/src/lib/api/merchant/core/OpenAPI.ts @@ -0,0 +1,32 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from "./ApiRequestOptions"; + +type Resolver = (options: ApiRequestOptions) => Promise; +type Headers = Record; + +export type OpenAPIConfig = { + BASE: string; + VERSION: string; + WITH_CREDENTIALS: boolean; + CREDENTIALS: "include" | "omit" | "same-origin"; + TOKEN?: string | Resolver | undefined; + USERNAME?: string | Resolver | undefined; + PASSWORD?: string | Resolver | undefined; + HEADERS?: Headers | Resolver | undefined; + ENCODE_PATH?: ((path: string) => string) | undefined; +}; + +export const OpenAPI: OpenAPIConfig = { + BASE: "", + VERSION: "0.0.0", + WITH_CREDENTIALS: false, + CREDENTIALS: "include", + TOKEN: undefined, + USERNAME: undefined, + PASSWORD: undefined, + HEADERS: undefined, + ENCODE_PATH: undefined, +}; diff --git a/src/lib/api/merchant/core/initialize.ts b/src/lib/api/merchant/core/initialize.ts new file mode 100644 index 0000000..c002738 --- /dev/null +++ b/src/lib/api/merchant/core/initialize.ts @@ -0,0 +1,38 @@ +// Initialize OpenAPI configuration +import { OpenAPI } from "./OpenAPI"; +import { getApiUrlSingleton } from "@shared/lib/api-url"; + +// Add a global debug function for consistent logging +const debug = (message: string) => { + console.log(`[OPENAPI-INIT] ${message}`); +}; + +/** + * Initialize the OpenAPI configuration with the API URL + */ +export const initializeOpenAPI = () => { + try { + debug("Initializing OpenAPI configuration"); + + // Get the API URL using our utility function + const apiUrl = getApiUrlSingleton(); + + // Set the OpenAPI base URL + OpenAPI.BASE = apiUrl; + debug(`OpenAPI initialized with BASE URL: ${OpenAPI.BASE}`); + + return true; + } catch (error) { + console.error("FATAL ERROR: Failed to initialize OpenAPI:", error); + return false; + } +}; + +// Add a debug statement to confirm the script is being executed +debug("initialize.ts script is being executed"); + +// Call initialization function +const initialized = initializeOpenAPI(); + +// Log initialization status +debug(`OpenAPI initialization ${initialized ? "successful" : "failed"}`); diff --git a/src/lib/api/merchant/core/request.ts b/src/lib/api/merchant/core/request.ts new file mode 100644 index 0000000..7f2dd66 --- /dev/null +++ b/src/lib/api/merchant/core/request.ts @@ -0,0 +1,369 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import axios from "axios"; +import type { + AxiosError, + AxiosRequestConfig, + AxiosResponse, + AxiosInstance, +} from "axios"; +import FormData from "form-data"; + +import { ApiError } from "./ApiError"; +import type { ApiRequestOptions } from "./ApiRequestOptions"; +import type { ApiResult } from "./ApiResult"; +import { CancelablePromise } from "./CancelablePromise"; +import type { OnCancel } from "./CancelablePromise"; +import type { OpenAPIConfig } from "./OpenAPI"; + +export const isDefined = ( + value: T | null | undefined, +): value is Exclude => { + return value !== undefined && value !== null; +}; + +export const isString = (value: any): value is string => { + return typeof value === "string"; +}; + +export const isStringWithValue = (value: any): value is string => { + return isString(value) && value !== ""; +}; + +export const isBlob = (value: any): value is Blob => { + return ( + typeof value === "object" && + typeof value.type === "string" && + typeof value.stream === "function" && + typeof value.arrayBuffer === "function" && + typeof value.constructor === "function" && + typeof value.constructor.name === "string" && + /^(Blob|File)$/.test(value.constructor.name) && + /^(Blob|File)$/.test(value[Symbol.toStringTag]) + ); +}; + +export const isFormData = (value: any): value is FormData => { + return value instanceof FormData; +}; + +export const isSuccess = (status: number): boolean => { + return status >= 200 && status < 300; +}; + +export const base64 = (str: string): string => { + try { + return btoa(str); + } catch (err) { + // @ts-ignore + return Buffer.from(str).toString("base64"); + } +}; + +export const getQueryString = (params: Record): string => { + const qs: string[] = []; + + const append = (key: string, value: any) => { + qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); + }; + + const process = (key: string, value: any) => { + if (isDefined(value)) { + if (Array.isArray(value)) { + value.forEach((v) => { + process(key, v); + }); + } else if (typeof value === "object") { + Object.entries(value).forEach(([k, v]) => { + process(`${key}[${k}]`, v); + }); + } else { + append(key, value); + } + } + }; + + Object.entries(params).forEach(([key, value]) => { + process(key, value); + }); + + if (qs.length > 0) { + return `?${qs.join("&")}`; + } + + return ""; +}; + +const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { + const encoder = config.ENCODE_PATH || encodeURI; + + const path = options.url + .replace("{api-version}", config.VERSION) + .replace(/{(.*?)}/g, (substring: string, group: string) => { + if (options.path?.hasOwnProperty(group)) { + return encoder(String(options.path[group])); + } + return substring; + }); + + const url = `${config.BASE}${path}`; + if (options.query) { + return `${url}${getQueryString(options.query)}`; + } + return url; +}; + +export const getFormData = ( + options: ApiRequestOptions, +): FormData | undefined => { + if (options.formData) { + const formData = new FormData(); + + const process = (key: string, value: any) => { + if (isString(value) || isBlob(value)) { + formData.append(key, value); + } else { + formData.append(key, JSON.stringify(value)); + } + }; + + Object.entries(options.formData) + .filter(([_, value]) => isDefined(value)) + .forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach((v) => process(key, v)); + } else { + process(key, value); + } + }); + + return formData; + } + return undefined; +}; + +type Resolver = (options: ApiRequestOptions) => Promise; + +export const resolve = async ( + options: ApiRequestOptions, + resolver?: T | Resolver, +): Promise => { + if (typeof resolver === "function") { + return (resolver as Resolver)(options); + } + return resolver; +}; + +export const getHeaders = async ( + config: OpenAPIConfig, + options: ApiRequestOptions, + formData?: FormData, +): Promise> => { + const [token, username, password, additionalHeaders] = await Promise.all([ + resolve(options, config.TOKEN), + resolve(options, config.USERNAME), + resolve(options, config.PASSWORD), + resolve(options, config.HEADERS), + ]); + + const formHeaders = + (typeof formData?.getHeaders === "function" && formData?.getHeaders()) || + {}; + + const headers = Object.entries({ + Accept: "application/json", + ...additionalHeaders, + ...options.headers, + ...formHeaders, + }) + .filter(([_, value]) => isDefined(value)) + .reduce( + (headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), + {} as Record, + ); + + if (isStringWithValue(token)) { + headers["Authorization"] = `Bearer ${token}`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers["Authorization"] = `Basic ${credentials}`; + } + + if (options.body !== undefined) { + if (options.mediaType) { + headers["Content-Type"] = options.mediaType; + } else if (isBlob(options.body)) { + headers["Content-Type"] = options.body.type || "application/octet-stream"; + } else if (isString(options.body)) { + headers["Content-Type"] = "text/plain"; + } else if (!isFormData(options.body)) { + headers["Content-Type"] = "application/json"; + } + } + + return headers; +}; + +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body) { + return options.body; + } + return undefined; +}; + +export const sendRequest = async ( + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Record, + onCancel: OnCancel, + axiosClient: AxiosInstance, +): Promise> => { + const source = axios.CancelToken.source(); + + const requestConfig: AxiosRequestConfig = { + url, + headers, + data: body ?? formData, + method: options.method, + withCredentials: config.WITH_CREDENTIALS, + withXSRFToken: + config.CREDENTIALS === "include" ? config.WITH_CREDENTIALS : false, + cancelToken: source.token, + }; + + onCancel(() => source.cancel("The user aborted a request.")); + + try { + return await axiosClient.request(requestConfig); + } catch (error) { + const axiosError = error as AxiosError; + if (axiosError.response) { + return axiosError.response; + } + throw error; + } +}; + +export const getResponseHeader = ( + response: AxiosResponse, + responseHeader?: string, +): string | undefined => { + if (responseHeader) { + const content = response.headers[responseHeader]; + if (isString(content)) { + return content; + } + } + return undefined; +}; + +export const getResponseBody = (response: AxiosResponse): any => { + if (response.status !== 204) { + return response.data; + } + return undefined; +}; + +export const catchErrorCodes = ( + options: ApiRequestOptions, + result: ApiResult, +): void => { + const errors: Record = { + 400: "Bad Request", + 401: "Unauthorized", + 403: "Forbidden", + 404: "Not Found", + 500: "Internal Server Error", + 502: "Bad Gateway", + 503: "Service Unavailable", + ...options.errors, + }; + + const error = errors[result.status]; + if (error) { + throw new ApiError(options, result, error); + } + + if (!result.ok) { + const errorStatus = result.status ?? "unknown"; + const errorStatusText = result.statusText ?? "unknown"; + const errorBody = (() => { + try { + return JSON.stringify(result.body, null, 2); + } catch (e) { + return undefined; + } + })(); + + throw new ApiError( + options, + result, + `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`, + ); + } +}; + +/** + * Request method + * @param config The OpenAPI configuration object + * @param options The request options from the service + * @param axiosClient The axios client instance to use + * @returns CancelablePromise + * @throws ApiError + */ +export const request = ( + config: OpenAPIConfig, + options: ApiRequestOptions, + axiosClient: AxiosInstance = axios, +): CancelablePromise => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options, formData); + + if (!onCancel.isCancelled) { + const response = await sendRequest( + config, + options, + url, + body, + formData, + headers, + onCancel, + axiosClient, + ); + const responseBody = getResponseBody(response); + const responseHeader = getResponseHeader( + response, + options.responseHeader, + ); + + const result: ApiResult = { + url, + ok: isSuccess(response.status), + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); +}; diff --git a/src/lib/api/merchant/index.ts b/src/lib/api/merchant/index.ts new file mode 100644 index 0000000..a9fc832 --- /dev/null +++ b/src/lib/api/merchant/index.ts @@ -0,0 +1,174 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export { ApiError } from "./core/ApiError"; +export { CancelablePromise, CancelError } from "./core/CancelablePromise"; +export { OpenAPI } from "./core/OpenAPI"; +export type { OpenAPIConfig } from "./core/OpenAPI"; + +export type { _void } from "./models/_void"; +export type { addressDto } from "./models/addressDto"; +export { addressType } from "./models/addressType"; +export { aspectType } from "./models/aspectType"; +export type { assetCollectionDto } from "./models/assetCollectionDto"; +export type { authDocumentDto } from "./models/authDocumentDto"; +export type { authenticationResultDto } from "./models/authenticationResultDto"; +export type { authHeaderResponseDto } from "./models/authHeaderResponseDto"; +export type { baseCreateSellerRevisionDto } from "./models/baseCreateSellerRevisionDto"; +export type { baseOfferDto } from "./models/baseOfferDto"; +export type { baseTriggerDto } from "./models/baseTriggerDto"; +export type { basketDto } from "./models/basketDto"; +export type { bundleDiscountOfferDto } from "./models/bundleDiscountOfferDto"; +export type { bundleTriggerDto } from "./models/bundleTriggerDto"; +export type { calculatedCheckoutDto } from "./models/calculatedCheckoutDto"; +export type { calculatedProductDto } from "./models/calculatedProductDto"; +export type { categoryCompositeDto } from "./models/categoryCompositeDto"; +export type { categoryDto } from "./models/categoryDto"; +export type { categoryQueryRequestDto } from "./models/categoryQueryRequestDto"; +export type { categoryRevisionDto } from "./models/categoryRevisionDto"; +export type { categoryRevisionQueryRequestDto } from "./models/categoryRevisionQueryRequestDto"; +export type { categoryStopListDto } from "./models/categoryStopListDto"; +export type { categoryViewDto } from "./models/categoryViewDto"; +export type { checkoutOptionsDto } from "./models/checkoutOptionsDto"; +export { commonOrderFailureResult } from "./models/commonOrderFailureResult"; +export { commonOrderStatus } from "./models/commonOrderStatus"; +export type { couponTriggerDto } from "./models/couponTriggerDto"; +export type { courierInfoDto } from "./models/courierInfoDto"; +export type { createCategoryDto } from "./models/createCategoryDto"; +export type { createCategoryRevisionDto } from "./models/createCategoryRevisionDto"; +export type { createOptionsRevisionDto } from "./models/createOptionsRevisionDto"; +export type { createProductDto } from "./models/createProductDto"; +export type { createProductRevisionDto } from "./models/createProductRevisionDto"; +export type { createPromotionDto } from "./models/createPromotionDto"; +export type { createRestaurantDto } from "./models/createRestaurantDto"; +export type { createRestaurantRevisionDto } from "./models/createRestaurantRevisionDto"; +export type { createSellerDto } from "./models/createSellerDto"; +export type { createSellerRevisionDto } from "./models/createSellerRevisionDto"; +export type { createTextRevisionDto } from "./models/createTextRevisionDto"; +export type { customerGroupTriggerDto } from "./models/customerGroupTriggerDto"; +export type { customerHistoryTriggerDto } from "./models/customerHistoryTriggerDto"; +export type { customerLoyaltyTriggerDto } from "./models/customerLoyaltyTriggerDto"; +export type { deliveryAddressDto } from "./models/deliveryAddressDto"; +export { deliveryFailureResult } from "./models/deliveryFailureResult"; +export type { deliveryLocationDto } from "./models/deliveryLocationDto"; +export { deliveryOrderStatus } from "./models/deliveryOrderStatus"; +export type { deliveryStateDto } from "./models/deliveryStateDto"; +export type { digitalEngagementTriggerDto } from "./models/digitalEngagementTriggerDto"; +export type { discountProductOfferDto } from "./models/discountProductOfferDto"; +export type { discountTotalOfferDto } from "./models/discountTotalOfferDto"; +export { discountType } from "./models/discountType"; +export { dispatchMethodType } from "./models/dispatchMethodType"; +export type { freeDeliveryOfferDto } from "./models/freeDeliveryOfferDto"; +export type { freeItemOfferDto } from "./models/freeItemOfferDto"; +export type { gpsLocationDto } from "./models/gpsLocationDto"; +export type { holidayTriggerDto } from "./models/holidayTriggerDto"; +export type { humanVerificationRequestDto } from "./models/humanVerificationRequestDto"; +export type { humanVerificationStatusDto } from "./models/humanVerificationStatusDto"; +export type { imageReferenceDto } from "./models/imageReferenceDto"; +export type { iTriggerDto } from "./models/iTriggerDto"; +export type { localizedTextDto } from "./models/localizedTextDto"; +export type { managerOverrideTriggerDto } from "./models/managerOverrideTriggerDto"; +export type { oidcConnectResponseDto } from "./models/oidcConnectResponseDto"; +export type { optionDto } from "./models/optionDto"; +export type { optionsQueryDto } from "./models/optionsQueryDto"; +export type { optionsRevisionDto } from "./models/optionsRevisionDto"; +export type { optionsViewDto } from "./models/optionsViewDto"; +export type { orderCreateDto } from "./models/orderCreateDto"; +export type { orderDto } from "./models/orderDto"; +export type { orderFailureRequestDto } from "./models/orderFailureRequestDto"; +export type { orderNextStatusDto } from "./models/orderNextStatusDto"; +export type { orderQueryRequestDto } from "./models/orderQueryRequestDto"; +export type { orderStateChangeRequestDto } from "./models/orderStateChangeRequestDto"; +export type { orderStateDto } from "./models/orderStateDto"; +export { orderTriggerDto } from "./models/orderTriggerDto"; +export type { orderViewDto } from "./models/orderViewDto"; +export { paymentType } from "./models/paymentType"; +export { phoneVerificationState } from "./models/phoneVerificationState"; +export type { preparationStateDto } from "./models/preparationStateDto"; +export type { priceEstimationDto } from "./models/priceEstimationDto"; +export type { priceEstimationRequestDto } from "./models/priceEstimationRequestDto"; +export type { problemDetails } from "./models/problemDetails"; +export type { productCompositeDto } from "./models/productCompositeDto"; +export type { productDto } from "./models/productDto"; +export type { productQueryRequestDto } from "./models/productQueryRequestDto"; +export type { productRevisionDto } from "./models/productRevisionDto"; +export type { productRevisionQueryRequestDto } from "./models/productRevisionQueryRequestDto"; +export type { productStopListDto } from "./models/productStopListDto"; +export type { productUnavailableDto } from "./models/productUnavailableDto"; +export { productUnavailableReason } from "./models/productUnavailableReason"; +export type { promotionQueryRequestDto } from "./models/promotionQueryRequestDto"; +export type { promotionViewDto } from "./models/promotionViewDto"; +export type { purchaseTriggerDto } from "./models/purchaseTriggerDto"; +export type { QueryResultDto_CategoryDto_ } from "./models/QueryResultDto_CategoryDto_"; +export type { QueryResultDto_CategoryRevisionDto_ } from "./models/QueryResultDto_CategoryRevisionDto_"; +export type { QueryResultDto_OptionsRevisionDto_ } from "./models/QueryResultDto_OptionsRevisionDto_"; +export type { QueryResultDto_OrderViewDto_ } from "./models/QueryResultDto_OrderViewDto_"; +export type { QueryResultDto_ProductRevisionDto_ } from "./models/QueryResultDto_ProductRevisionDto_"; +export type { QueryResultDto_PromotionViewDto_ } from "./models/QueryResultDto_PromotionViewDto_"; +export type { QueryResultDto_SellerDto_ } from "./models/QueryResultDto_SellerDto_"; +export type { QueryResultDto_SellerRevisionDto_ } from "./models/QueryResultDto_SellerRevisionDto_"; +export type { QueryResultDto_TextRevisionDto_ } from "./models/QueryResultDto_TextRevisionDto_"; +export type { QueryResultDto_UserDto_ } from "./models/QueryResultDto_UserDto_"; +export type { restaurantDto } from "./models/restaurantDto"; +export type { restaurantRevisionDto } from "./models/restaurantRevisionDto"; +export type { rolePermissionsDto } from "./models/rolePermissionsDto"; +export type { scheduleDto } from "./models/scheduleDto"; +export type { scheduleExceptionDto } from "./models/scheduleExceptionDto"; +export type { selectedOptionDto } from "./models/selectedOptionDto"; +export type { selectedProductDto } from "./models/selectedProductDto"; +export type { sellerCompositeDto } from "./models/sellerCompositeDto"; +export type { sellerDto } from "./models/sellerDto"; +export type { sellerOperationalStateDto } from "./models/sellerOperationalStateDto"; +export type { sellerOperationalStateTriggerDto } from "./models/sellerOperationalStateTriggerDto"; +export type { sellerPublicAggregateFullDto } from "./models/sellerPublicAggregateFullDto"; +export type { sellerQueryRequestDto } from "./models/sellerQueryRequestDto"; +export type { sellerRevisionDto } from "./models/sellerRevisionDto"; +export type { sellerRevisionQueryRequestDto } from "./models/sellerRevisionQueryRequestDto"; +export type { sellerViewDto } from "./models/sellerViewDto"; +export type { sessionIpResponseDto } from "./models/sessionIpResponseDto"; +export { sessionStatus } from "./models/sessionStatus"; +export type { sessionStatusDto } from "./models/sessionStatusDto"; +export type { signedAuthDocumentDto } from "./models/signedAuthDocumentDto"; +export type { simpleContactDto } from "./models/simpleContactDto"; +export type { startSessionResponseDto } from "./models/startSessionResponseDto"; +export type { stopListTriggerDto } from "./models/stopListTriggerDto"; +export type { systemSecurityDto } from "./models/systemSecurityDto"; +export type { tag } from "./models/tag"; +export type { textQueryRequestDto } from "./models/textQueryRequestDto"; +export type { textRevisionDto } from "./models/textRevisionDto"; +export type { timeRangeDto } from "./models/timeRangeDto"; +export type { timeTriggerDto } from "./models/timeTriggerDto"; +export { triggerEffect } from "./models/triggerEffect"; +export type { updatePermissionsRequest } from "./models/updatePermissionsRequest"; +export type { userDto } from "./models/userDto"; +export type { userQueryRequest } from "./models/userQueryRequest"; +export type { verifiedValueDto } from "./models/verifiedValueDto"; +export { versionCheck } from "./models/versionCheck"; + +export { AiService } from "./services/AiService"; +export { AuthenticationService } from "./services/AuthenticationService"; +export { CategoriesCanonicalService } from "./services/CategoriesCanonicalService"; +export { CategoriesRevisionsService } from "./services/CategoriesRevisionsService"; +export { CategoriesViewsService } from "./services/CategoriesViewsService"; +export { DeliveriesService } from "./services/DeliveriesService"; +export { ImagesService } from "./services/ImagesService"; +export { OidcService } from "./services/OidcService"; +export { OrdersService } from "./services/OrdersService"; +export { OrdersBasketService } from "./services/OrdersBasketService"; +export { ProductOptionsRevisionsService } from "./services/ProductOptionsRevisionsService"; +export { ProductsCanonicalService } from "./services/ProductsCanonicalService"; +export { ProductsRevisionsService } from "./services/ProductsRevisionsService"; +export { ProductsViewsService } from "./services/ProductsViewsService"; +export { PromotionsService } from "./services/PromotionsService"; +export { SecurityService } from "./services/SecurityService"; +export { SellersCanonicalService } from "./services/SellersCanonicalService"; +export { SellersRevisionsService } from "./services/SellersRevisionsService"; +export { SellersViewsService } from "./services/SellersViewsService"; +export { ServerSideEventsService } from "./services/ServerSideEventsService"; +export { SystemService } from "./services/SystemService"; +export { TestsService } from "./services/TestsService"; +export { TranslatableTextRevisionsService } from "./services/TranslatableTextRevisionsService"; +export { UserService } from "./services/UserService"; +export { VerificationsService } from "./services/VerificationsService"; +export { WebService } from "./services/WebService"; diff --git a/src/lib/api/merchant/models/QueryResultDto_CategoryDto_.ts b/src/lib/api/merchant/models/QueryResultDto_CategoryDto_.ts new file mode 100644 index 0000000..6c67d26 --- /dev/null +++ b/src/lib/api/merchant/models/QueryResultDto_CategoryDto_.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { categoryDto } from "./categoryDto"; +/** + * The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed. + * It is important to populate this field with the server's time at the beginning of the query execution. + */ +export type QueryResultDto_CategoryDto_ = { + serverTimeUtc?: string; + results?: Array; +}; diff --git a/src/lib/api/merchant/models/QueryResultDto_CategoryRevisionDto_.ts b/src/lib/api/merchant/models/QueryResultDto_CategoryRevisionDto_.ts new file mode 100644 index 0000000..6153bc6 --- /dev/null +++ b/src/lib/api/merchant/models/QueryResultDto_CategoryRevisionDto_.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { categoryRevisionDto } from "./categoryRevisionDto"; +/** + * The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed. + * It is important to populate this field with the server's time at the beginning of the query execution. + */ +export type QueryResultDto_CategoryRevisionDto_ = { + serverTimeUtc?: string; + results?: Array; +}; diff --git a/src/lib/api/merchant/models/QueryResultDto_OptionsRevisionDto_.ts b/src/lib/api/merchant/models/QueryResultDto_OptionsRevisionDto_.ts new file mode 100644 index 0000000..d273ad8 --- /dev/null +++ b/src/lib/api/merchant/models/QueryResultDto_OptionsRevisionDto_.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { optionsRevisionDto } from "./optionsRevisionDto"; +/** + * The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed. + * It is important to populate this field with the server's time at the beginning of the query execution. + */ +export type QueryResultDto_OptionsRevisionDto_ = { + serverTimeUtc?: string; + results?: Array; +}; diff --git a/src/lib/api/merchant/models/QueryResultDto_OrderViewDto_.ts b/src/lib/api/merchant/models/QueryResultDto_OrderViewDto_.ts new file mode 100644 index 0000000..2b67bff --- /dev/null +++ b/src/lib/api/merchant/models/QueryResultDto_OrderViewDto_.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { orderViewDto } from "./orderViewDto"; +/** + * The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed. + * It is important to populate this field with the server's time at the beginning of the query execution. + */ +export type QueryResultDto_OrderViewDto_ = { + serverTimeUtc?: string; + results?: Array; +}; diff --git a/src/lib/api/merchant/models/QueryResultDto_ProductRevisionDto_.ts b/src/lib/api/merchant/models/QueryResultDto_ProductRevisionDto_.ts new file mode 100644 index 0000000..e1c83ec --- /dev/null +++ b/src/lib/api/merchant/models/QueryResultDto_ProductRevisionDto_.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { productRevisionDto } from "./productRevisionDto"; +/** + * The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed. + * It is important to populate this field with the server's time at the beginning of the query execution. + */ +export type QueryResultDto_ProductRevisionDto_ = { + serverTimeUtc?: string; + results?: Array; +}; diff --git a/src/lib/api/merchant/models/QueryResultDto_PromotionViewDto_.ts b/src/lib/api/merchant/models/QueryResultDto_PromotionViewDto_.ts new file mode 100644 index 0000000..c5ce7c8 --- /dev/null +++ b/src/lib/api/merchant/models/QueryResultDto_PromotionViewDto_.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { promotionViewDto } from "./promotionViewDto"; +/** + * The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed. + * It is important to populate this field with the server's time at the beginning of the query execution. + */ +export type QueryResultDto_PromotionViewDto_ = { + serverTimeUtc?: string; + results?: Array; +}; diff --git a/src/lib/api/merchant/models/QueryResultDto_SellerDto_.ts b/src/lib/api/merchant/models/QueryResultDto_SellerDto_.ts new file mode 100644 index 0000000..76836fa --- /dev/null +++ b/src/lib/api/merchant/models/QueryResultDto_SellerDto_.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { sellerDto } from "./sellerDto"; +/** + * The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed. + * It is important to populate this field with the server's time at the beginning of the query execution. + */ +export type QueryResultDto_SellerDto_ = { + serverTimeUtc?: string; + results?: Array; +}; diff --git a/src/lib/api/merchant/models/QueryResultDto_SellerRevisionDto_.ts b/src/lib/api/merchant/models/QueryResultDto_SellerRevisionDto_.ts new file mode 100644 index 0000000..5fd7c19 --- /dev/null +++ b/src/lib/api/merchant/models/QueryResultDto_SellerRevisionDto_.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { sellerRevisionDto } from "./sellerRevisionDto"; +/** + * The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed. + * It is important to populate this field with the server's time at the beginning of the query execution. + */ +export type QueryResultDto_SellerRevisionDto_ = { + serverTimeUtc?: string; + results?: Array; +}; diff --git a/src/lib/api/merchant/models/QueryResultDto_TextRevisionDto_.ts b/src/lib/api/merchant/models/QueryResultDto_TextRevisionDto_.ts new file mode 100644 index 0000000..3c27b2c --- /dev/null +++ b/src/lib/api/merchant/models/QueryResultDto_TextRevisionDto_.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { textRevisionDto } from "./textRevisionDto"; +/** + * The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed. + * It is important to populate this field with the server's time at the beginning of the query execution. + */ +export type QueryResultDto_TextRevisionDto_ = { + serverTimeUtc?: string; + results?: Array; +}; diff --git a/src/lib/api/merchant/models/QueryResultDto_UserDto_.ts b/src/lib/api/merchant/models/QueryResultDto_UserDto_.ts new file mode 100644 index 0000000..ab046e5 --- /dev/null +++ b/src/lib/api/merchant/models/QueryResultDto_UserDto_.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { userDto } from "./userDto"; +/** + * The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed. + * It is important to populate this field with the server's time at the beginning of the query execution. + */ +export type QueryResultDto_UserDto_ = { + serverTimeUtc?: string; + results?: Array; +}; diff --git a/src/lib/api/merchant/models/_void.ts b/src/lib/api/merchant/models/_void.ts new file mode 100644 index 0000000..e48c892 --- /dev/null +++ b/src/lib/api/merchant/models/_void.ts @@ -0,0 +1,5 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type _void = Record; diff --git a/src/lib/api/merchant/models/addressDto.ts b/src/lib/api/merchant/models/addressDto.ts new file mode 100644 index 0000000..6562bfa --- /dev/null +++ b/src/lib/api/merchant/models/addressDto.ts @@ -0,0 +1,44 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { addressType } from "./addressType"; +export type addressDto = { + /** + * Primary address line; required and defaults to an empty string. + */ + line1?: string | null; + /** + * Optional second address line for additional info. + */ + line2?: string | null; + /** + * Optional third address line. + */ + line3?: string | null; + /** + * Optional floor information (e.g., "3", "roof", "ground floor"). + */ + floor?: string | null; + /** + * Optional flat or apartment number. + */ + flat?: string | null; + /** + * Optional building identifier (name or number). + */ + building?: string | null; + /** + * Optional comments for extra address details. + */ + comment?: string | null; + /** + * Optional postal code. + */ + postCode?: string | null; + /** + * Optional region (e.g., state or province). + */ + region?: string | null; + type?: addressType; +}; diff --git a/src/lib/api/merchant/models/addressType.ts b/src/lib/api/merchant/models/addressType.ts new file mode 100644 index 0000000..94789a8 --- /dev/null +++ b/src/lib/api/merchant/models/addressType.ts @@ -0,0 +1,36 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **None** + * - 1 - **House** + * - 2 - **Apartment** + * - 3 - **Office** + * - 4 - **Other** + * + */ +export enum addressType { + /** + * (value: 0) + */ + None = 0, + /** + * (value: 1) + */ + House = 1, + /** + * (value: 2) + */ + Apartment = 2, + /** + * (value: 3) + */ + Office = 3, + /** + * (value: 4) + */ + Other = 4, +} diff --git a/src/lib/api/merchant/models/aspectType.ts b/src/lib/api/merchant/models/aspectType.ts new file mode 100644 index 0000000..a7c620f --- /dev/null +++ b/src/lib/api/merchant/models/aspectType.ts @@ -0,0 +1,31 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **None** + * - 10 - **Landscape** + * - 20 - **Square** + * - 30 - **Portrait** + * + */ +export enum aspectType { + /** + * (value: 0) + */ + None = 0, + /** + * (value: 10) + */ + Landscape = 10, + /** + * (value: 20) + */ + Square = 20, + /** + * (value: 30) + */ + Portrait = 30, +} diff --git a/src/lib/api/merchant/models/assetCollectionDto.ts b/src/lib/api/merchant/models/assetCollectionDto.ts new file mode 100644 index 0000000..81b5644 --- /dev/null +++ b/src/lib/api/merchant/models/assetCollectionDto.ts @@ -0,0 +1,18 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * This Dto represents a reference to a list of stored media assets, such as an image or video. + * The assets are referenced by hash digests, which are unique identifiers for the asset. + */ +export type assetCollectionDto = { + /** + * This is the kind of media being referenced. + */ + kind?: string | null; + /** + * A list of base58-encoded SHA-256 digests for the media assets. + */ + digests?: Array | null; +}; diff --git a/src/lib/api/merchant/models/authDocumentDto.ts b/src/lib/api/merchant/models/authDocumentDto.ts new file mode 100644 index 0000000..4c6cdb9 --- /dev/null +++ b/src/lib/api/merchant/models/authDocumentDto.ts @@ -0,0 +1,30 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Represents the authentication document that the mobile app creates. + * It is signed to prove the identity and includes session and timing details. + */ +export type authDocumentDto = { + /** + * Gets or sets the unique session identifier. + */ + sessionId: string | null; + /** + * Gets or sets the client IP address fetched from the hub. + */ + clientIp: string | null; + /** + * Gets or sets the timestamp when the auth document is issued. + */ + issuedAt?: string; + /** + * Gets or sets the timestamp when the auth document expires. + */ + expiresAt?: string; + /** + * Gets or sets the mobile app's Ed25519 public key. + */ + publicKey: string; +}; diff --git a/src/lib/api/merchant/models/authHeaderResponseDto.ts b/src/lib/api/merchant/models/authHeaderResponseDto.ts new file mode 100644 index 0000000..97d2d2a --- /dev/null +++ b/src/lib/api/merchant/models/authHeaderResponseDto.ts @@ -0,0 +1,25 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Response DTO for retrieving the authentication header for a session. + */ +export type authHeaderResponseDto = { + /** + * Gets or sets the unique session identifier. + */ + sessionId: string | null; + /** + * Gets or sets the X-Signed-Auth header value. + */ + headerValue: string | null; + /** + * Gets or sets the public key used for authentication. + */ + publicKey: string | null; + /** + * The UTC expiry date of the signed authorization header. + */ + utcExpires: string; +}; diff --git a/src/lib/api/merchant/models/authenticationResultDto.ts b/src/lib/api/merchant/models/authenticationResultDto.ts new file mode 100644 index 0000000..8b48ec5 --- /dev/null +++ b/src/lib/api/merchant/models/authenticationResultDto.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * DTO for the authentication result. + */ +export type authenticationResultDto = { + /** + * Gets or sets the session ID that was authenticated. + */ + sessionId: string | null; +}; diff --git a/src/lib/api/merchant/models/baseCreateSellerRevisionDto.ts b/src/lib/api/merchant/models/baseCreateSellerRevisionDto.ts new file mode 100644 index 0000000..3b854c7 --- /dev/null +++ b/src/lib/api/merchant/models/baseCreateSellerRevisionDto.ts @@ -0,0 +1,37 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { addressDto } from "./addressDto"; +import type { createRestaurantRevisionDto } from "./createRestaurantRevisionDto"; +import type { createSellerRevisionDto } from "./createSellerRevisionDto"; +import type { gpsLocationDto } from "./gpsLocationDto"; +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { simpleContactDto } from "./simpleContactDto"; +/** + * Base class for seller data transfer objects, encapsulating common seller properties. + * Restaurants, farms, shops and other merchants inherit this class. + */ +export type baseCreateSellerRevisionDto = + | createRestaurantRevisionDto + | createSellerRevisionDto + | { + /** + * Version number of the document. + */ + documentVersion?: number; + schedule?: scheduleDto; + address?: addressDto; + contactInfo?: simpleContactDto; + location?: gpsLocationDto; + /** + * A key value collection for storing additional information + */ + additional?: Record | null; + /** + * A list of image references. + */ + images?: Array | null; + type?: string; + }; diff --git a/src/lib/api/merchant/models/baseOfferDto.ts b/src/lib/api/merchant/models/baseOfferDto.ts new file mode 100644 index 0000000..5136a61 --- /dev/null +++ b/src/lib/api/merchant/models/baseOfferDto.ts @@ -0,0 +1,18 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { bundleDiscountOfferDto } from "./bundleDiscountOfferDto"; +import type { discountProductOfferDto } from "./discountProductOfferDto"; +import type { discountTotalOfferDto } from "./discountTotalOfferDto"; +import type { freeDeliveryOfferDto } from "./freeDeliveryOfferDto"; +import type { freeItemOfferDto } from "./freeItemOfferDto"; +export type baseOfferDto = + | discountTotalOfferDto + | discountProductOfferDto + | freeDeliveryOfferDto + | freeItemOfferDto + | bundleDiscountOfferDto + | { + readonly type?: string | null; + }; diff --git a/src/lib/api/merchant/models/baseTriggerDto.ts b/src/lib/api/merchant/models/baseTriggerDto.ts new file mode 100644 index 0000000..f50aa56 --- /dev/null +++ b/src/lib/api/merchant/models/baseTriggerDto.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type baseTriggerDto = { + readonly type?: string | null; + effect?: triggerEffect; +}; diff --git a/src/lib/api/merchant/models/basketDto.ts b/src/lib/api/merchant/models/basketDto.ts new file mode 100644 index 0000000..801e0aa --- /dev/null +++ b/src/lib/api/merchant/models/basketDto.ts @@ -0,0 +1,44 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { dispatchMethodType } from "./dispatchMethodType"; +import type { gpsLocationDto } from "./gpsLocationDto"; +import type { selectedProductDto } from "./selectedProductDto"; +/** + * Represents a customer's basket containing selected products for checkout processing. + */ +export type basketDto = { + /** + * Gets the unique identifier for this basket. + */ + id?: string; + /** + * Gets the unique identifier of the seller. + */ + sellerId: string; + /** + * When the order is scheduled for delivery or pickup, this property indicates the scheduled time. + */ + scheduledFor?: string; + /** + * Gets the collection of selected products in this basket. + */ + items?: Array | null; + gpsLocation: gpsLocationDto; + /** + * Gets or sets whether community change is enabled for this basket. + */ + isCommunityChangeEnabled?: boolean; + dispatchType?: dispatchMethodType; + /** + * Optional: The customer has selected a delivery price that was on offer. + */ + selectedDeliveryPrice?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; +}; diff --git a/src/lib/api/merchant/models/bundleDiscountOfferDto.ts b/src/lib/api/merchant/models/bundleDiscountOfferDto.ts new file mode 100644 index 0000000..e1c7516 --- /dev/null +++ b/src/lib/api/merchant/models/bundleDiscountOfferDto.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { discountType } from "./discountType"; +export type bundleDiscountOfferDto = { + readonly type?: "bundle_discount" | null; + productIds: Array | null; + discountType: discountType; + value: number; +}; diff --git a/src/lib/api/merchant/models/bundleTriggerDto.ts b/src/lib/api/merchant/models/bundleTriggerDto.ts new file mode 100644 index 0000000..0893944 --- /dev/null +++ b/src/lib/api/merchant/models/bundleTriggerDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type bundleTriggerDto = { + effect?: triggerEffect; + productIds?: Array | null; + readonly type?: "bundle" | null; +}; diff --git a/src/lib/api/merchant/models/calculatedCheckoutDto.ts b/src/lib/api/merchant/models/calculatedCheckoutDto.ts new file mode 100644 index 0000000..1a6ba1b --- /dev/null +++ b/src/lib/api/merchant/models/calculatedCheckoutDto.ts @@ -0,0 +1,122 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { calculatedProductDto } from "./calculatedProductDto"; +import type { productUnavailableDto } from "./productUnavailableDto"; +/** + * Represents a calculated checkout with comprehensive pricing information for all items, including taxes, discounts, and delivery fees. + */ +export type calculatedCheckoutDto = { + /** + * Must be set if the basket is to be considered valid. + */ + isValid?: boolean; + /** + * Gets or sets the collection of calculated products in this checkout. + */ + items?: Array | null; + /** + * Gets or sets the subtotal of all items before applying discounts. + */ + itemSubTotal?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Gets or sets the subtotal of all items with any discounts applied. + */ + itemDiscountedSubTotal?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Gets or sets the tax amount applied to this checkout, if any. + */ + tax?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Gets or sets the community contribution amount, if any. + */ + communityChange?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * The user selected to enable community change. + */ + communityChangeIncluded?: boolean; + /** + * Returns the value of any discount applied at the order level. + */ + discount?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Returns the delivery fee, if any. + */ + delivery?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Gets or sets additional charges or fees associated with this checkout. + */ + extras?: Record< + string, + { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } + > | null; + /** + * Gets or sets the final total price of this checkout after all calculations. + */ + final?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Gets the collection of all active promotion IDs applied to this checkout. + */ + readonly activePromotionIds?: Array | null; + /** + * Gets or sets the list of unavailable products related to this checkout. + */ + unavailableProducts?: Array | null; + /** + * When doing cash payments, this is the first hint for the amount of cash the customer has prepared for the order. + */ + cashChangeHint1?: number | null; + /** + * When doing cash payments, this is the second hint for the amount of cash the customer has prepared for the order. + */ + cashChangeHint2?: number | null; +}; diff --git a/src/lib/api/merchant/models/calculatedProductDto.ts b/src/lib/api/merchant/models/calculatedProductDto.ts new file mode 100644 index 0000000..12ca20d --- /dev/null +++ b/src/lib/api/merchant/models/calculatedProductDto.ts @@ -0,0 +1,64 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Represents a calculated product with pricing information, including subtotal, discounts, and final price. + */ +export type calculatedProductDto = { + /** + * Represents the unique 'line' identifier of the item in the checkout. + */ + id: string; + /** + * Gets the unique identifier of the product. + */ + productId: string; + /** + * This value will be null if the Final amount is not a discount. + */ + subTotal: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * This value will be null if the Final amount is not a discount. + */ + discountedTotal?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Gets or sets additional charges or fees associated with this product. + */ + extras?: Record< + string, + { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } + > | null; + /** + * Gets or sets the final price of this product after all calculations. + */ + final?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Gets or sets the collection of active promotion IDs applied to this product. + */ + activePromotionIds?: Array | null; +}; diff --git a/src/lib/api/merchant/models/categoryCompositeDto.ts b/src/lib/api/merchant/models/categoryCompositeDto.ts new file mode 100644 index 0000000..727d503 --- /dev/null +++ b/src/lib/api/merchant/models/categoryCompositeDto.ts @@ -0,0 +1,22 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { localizedTextDto } from "./localizedTextDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { tag } from "./tag"; +export type categoryCompositeDto = { + tags?: Array | null; + additional?: Record | null; + images?: Array | null; + schedule?: scheduleDto; + sortOrder?: number; + id?: string; + revisionId?: string; + promotionIds?: Array | null; + title?: localizedTextDto; + description?: localizedTextDto; + isAvailable?: boolean; + isStopListed?: boolean; +}; diff --git a/src/lib/api/merchant/models/categoryDto.ts b/src/lib/api/merchant/models/categoryDto.ts new file mode 100644 index 0000000..6d18ccf --- /dev/null +++ b/src/lib/api/merchant/models/categoryDto.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { iTriggerDto } from "./iTriggerDto"; +export type categoryDto = { + promotionIds?: Array | null; + sellerId?: string; + availabilityTriggers?: Array | null; + id?: string; + updatedByUserId?: string; + utcUpdated?: string; +}; diff --git a/src/lib/api/merchant/models/categoryQueryRequestDto.ts b/src/lib/api/merchant/models/categoryQueryRequestDto.ts new file mode 100644 index 0000000..1970f2d --- /dev/null +++ b/src/lib/api/merchant/models/categoryQueryRequestDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type categoryQueryRequestDto = { + categoryIds?: Array | null; + sellerId?: string | null; + offset?: number; + limit?: number; +}; diff --git a/src/lib/api/merchant/models/categoryRevisionDto.ts b/src/lib/api/merchant/models/categoryRevisionDto.ts new file mode 100644 index 0000000..b2d4a9e --- /dev/null +++ b/src/lib/api/merchant/models/categoryRevisionDto.ts @@ -0,0 +1,24 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { localizedTextDto } from "./localizedTextDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { tag } from "./tag"; +export type categoryRevisionDto = { + tags?: Array | null; + additional?: Record | null; + images?: Array | null; + schedule?: scheduleDto; + sortOrder?: number; + revisionId?: string; + categoryId?: string; + creatorId?: string; + utcCreated?: string; + title?: localizedTextDto; + description?: localizedTextDto; + isPublished?: boolean; + utcPublished?: string | null; + publishedByUserId?: string | null; +}; diff --git a/src/lib/api/merchant/models/categoryRevisionQueryRequestDto.ts b/src/lib/api/merchant/models/categoryRevisionQueryRequestDto.ts new file mode 100644 index 0000000..4c7b9c7 --- /dev/null +++ b/src/lib/api/merchant/models/categoryRevisionQueryRequestDto.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type categoryRevisionQueryRequestDto = { + categoryId?: string | null; + offset?: number; + limit?: number; + utcCreatedFrom?: string | null; + utcCreatedTo?: string | null; + isPublished?: boolean | null; + publishedByUserId?: string | null; + utcCreated?: string | null; +}; diff --git a/src/lib/api/merchant/models/categoryStopListDto.ts b/src/lib/api/merchant/models/categoryStopListDto.ts new file mode 100644 index 0000000..f702848 --- /dev/null +++ b/src/lib/api/merchant/models/categoryStopListDto.ts @@ -0,0 +1,7 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type categoryStopListDto = { + categoryIds: Array; +}; diff --git a/src/lib/api/merchant/models/categoryViewDto.ts b/src/lib/api/merchant/models/categoryViewDto.ts new file mode 100644 index 0000000..3c3f265 --- /dev/null +++ b/src/lib/api/merchant/models/categoryViewDto.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { localizedTextDto } from "./localizedTextDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { tag } from "./tag"; +export type categoryViewDto = { + tags?: Array | null; + additional?: Record | null; + images?: Array | null; + schedule?: scheduleDto; + sortOrder?: number; + revisionId?: string; + categoryId?: string; + title?: localizedTextDto; + description?: localizedTextDto; +}; diff --git a/src/lib/api/merchant/models/checkoutOptionsDto.ts b/src/lib/api/merchant/models/checkoutOptionsDto.ts new file mode 100644 index 0000000..5105149 --- /dev/null +++ b/src/lib/api/merchant/models/checkoutOptionsDto.ts @@ -0,0 +1,27 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { deliveryLocationDto } from "./deliveryLocationDto"; +import type { dispatchMethodType } from "./dispatchMethodType"; +import type { simpleContactDto } from "./simpleContactDto"; +/** + * Data transfer object for restaurant checkout options + */ +export type checkoutOptionsDto = { + dispatchType?: dispatchMethodType; + /** + * Gets or sets the scheduled date and time for the order. + */ + scheduledFor?: string | null; + contact?: simpleContactDto; + /** + * Gets or sets the cash amount prepared for the order. + */ + cashAmount?: number | null; + deliveryLocation?: deliveryLocationDto; + /** + * Gets or sets whether community change is enabled for this basket. + */ + isCommunityChangeEnabled?: boolean; +}; diff --git a/src/lib/api/merchant/models/commonOrderFailureResult.ts b/src/lib/api/merchant/models/commonOrderFailureResult.ts new file mode 100644 index 0000000..e4d56ee --- /dev/null +++ b/src/lib/api/merchant/models/commonOrderFailureResult.ts @@ -0,0 +1,61 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **None** + * - 10 - **Cancelled** + * - 20 - **SystemError** + * - 30 - **CreationError** + * - 40 - **PaymentIssue** + * - 50 - **DeliveryIssue** + * - 60 - **LossOrDamage** + * - 70 - **Accident** + * - 80 - **StockIssue** + * - 1000 - **Other** + * + */ +export enum commonOrderFailureResult { + /** + * (value: 0) + */ + None = 0, + /** + * (value: 10) + */ + Cancelled = 10, + /** + * (value: 20) + */ + SystemError = 20, + /** + * (value: 30) + */ + CreationError = 30, + /** + * (value: 40) + */ + PaymentIssue = 40, + /** + * (value: 50) + */ + DeliveryIssue = 50, + /** + * (value: 60) + */ + LossOrDamage = 60, + /** + * (value: 70) + */ + Accident = 70, + /** + * (value: 80) + */ + StockIssue = 80, + /** + * (value: 1000) + */ + Other = 1000, +} diff --git a/src/lib/api/merchant/models/commonOrderStatus.ts b/src/lib/api/merchant/models/commonOrderStatus.ts new file mode 100644 index 0000000..48b41bb --- /dev/null +++ b/src/lib/api/merchant/models/commonOrderStatus.ts @@ -0,0 +1,73 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Test + * + * **Enum Values:** + * + * - 0 - **None**: The order is in an unknown state, usually awaiting confirmation from other services. + * - 5 - **Creating**: The order is being validated/saved/created + * - 10 - **Created**: The order has been confirmed by all services. + * - 15 - **PendingPayment**: The order is awaiting payment. + * - 20 - **Placed**: The order has been successfully placed by the customer. + * - 22 - **Seen**: The business has seen the order. This state might be skipped. + * - 25 - **Accepted**: The business has approved the order. This state might be skipped for unscheduled orders. + * - 30 - **Preparing**: The order is being prepared. + * - 35 - **ReadyForCollection**: The order is ready for collection by the consumer or courier depending on the obtaining type. + * - 40 - **InDelivery**: The order is being delivered. + * - 45 - **Ending**: The order is completed but the system finalizes all states + * - 1111 - **Ended**: The order has ended, either successfully or unsuccessfully. + * + */ +export enum commonOrderStatus { + /** + * (value: 0) The order is in an unknown state, usually awaiting confirmation from other services. + */ + None = 0, + /** + * (value: 5) The order is being validated/saved/created + */ + Creating = 5, + /** + * (value: 10) The order has been confirmed by all services. + */ + Created = 10, + /** + * (value: 15) The order is awaiting payment. + */ + PendingPayment = 15, + /** + * (value: 20) The order has been successfully placed by the customer. + */ + Placed = 20, + /** + * (value: 22) The business has seen the order. This state might be skipped. + */ + Seen = 22, + /** + * (value: 25) The business has approved the order. This state might be skipped for unscheduled orders. + */ + Accepted = 25, + /** + * (value: 30) The order is being prepared. + */ + Preparing = 30, + /** + * (value: 35) The order is ready for collection by the consumer or courier depending on the obtaining type. + */ + ReadyForCollection = 35, + /** + * (value: 40) The order is being delivered. + */ + InDelivery = 40, + /** + * (value: 45) The order is completed but the system finalizes all states + */ + Ending = 45, + /** + * (value: 1111) The order has ended, either successfully or unsuccessfully. + */ + Ended = 1111, +} diff --git a/src/lib/api/merchant/models/couponTriggerDto.ts b/src/lib/api/merchant/models/couponTriggerDto.ts new file mode 100644 index 0000000..5d65c60 --- /dev/null +++ b/src/lib/api/merchant/models/couponTriggerDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type couponTriggerDto = { + effect?: triggerEffect; + readonly type?: "coupon" | null; + code: string | null; +}; diff --git a/src/lib/api/merchant/models/courierInfoDto.ts b/src/lib/api/merchant/models/courierInfoDto.ts new file mode 100644 index 0000000..1a01f73 --- /dev/null +++ b/src/lib/api/merchant/models/courierInfoDto.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Data transfer object containing courier information + */ +export type courierInfoDto = { + courierId?: string | null; + name?: string | null; + phoneNumber?: string | null; +}; diff --git a/src/lib/api/merchant/models/createCategoryDto.ts b/src/lib/api/merchant/models/createCategoryDto.ts new file mode 100644 index 0000000..d3c447a --- /dev/null +++ b/src/lib/api/merchant/models/createCategoryDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { iTriggerDto } from "./iTriggerDto"; +export type createCategoryDto = { + promotionIds?: Array | null; + sellerId?: string; + availabilityTriggers?: Array | null; +}; diff --git a/src/lib/api/merchant/models/createCategoryRevisionDto.ts b/src/lib/api/merchant/models/createCategoryRevisionDto.ts new file mode 100644 index 0000000..d2b951e --- /dev/null +++ b/src/lib/api/merchant/models/createCategoryRevisionDto.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { tag } from "./tag"; +export type createCategoryRevisionDto = { + tags?: Array | null; + additional?: Record | null; + images?: Array | null; + schedule?: scheduleDto; + sortOrder?: number; +}; diff --git a/src/lib/api/merchant/models/createOptionsRevisionDto.ts b/src/lib/api/merchant/models/createOptionsRevisionDto.ts new file mode 100644 index 0000000..dae9568 --- /dev/null +++ b/src/lib/api/merchant/models/createOptionsRevisionDto.ts @@ -0,0 +1,20 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { optionDto } from "./optionDto"; +export type createOptionsRevisionDto = { + friendlyName?: string | null; + minRequired?: number; + maxLimit?: number; + /** + * A time value in 24-hour format (HH:mm:ss.FFFFFFF). + */ + availableFrom?: string | null; + /** + * A time value in 24-hour format (HH:mm:ss.FFFFFFF). + */ + availableTo?: string | null; + options?: Array | null; + additional?: Record | null; +}; diff --git a/src/lib/api/merchant/models/createProductDto.ts b/src/lib/api/merchant/models/createProductDto.ts new file mode 100644 index 0000000..5dc79a2 --- /dev/null +++ b/src/lib/api/merchant/models/createProductDto.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { iTriggerDto } from "./iTriggerDto"; +export type createProductDto = { + sellerId?: string; + availabilityTriggers?: Array | null; +}; diff --git a/src/lib/api/merchant/models/createProductRevisionDto.ts b/src/lib/api/merchant/models/createProductRevisionDto.ts new file mode 100644 index 0000000..8ce9964 --- /dev/null +++ b/src/lib/api/merchant/models/createProductRevisionDto.ts @@ -0,0 +1,27 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { assetCollectionDto } from "./assetCollectionDto"; +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { tag } from "./tag"; +export type createProductRevisionDto = { + price?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + optionsIds?: Array | null; + categoryIds?: Array | null; + sortOrder?: number; + assets?: Array | null; + isEnabled?: boolean; + notAvailableReason?: string | null; + tags?: Array | null; + additional?: Record | null; + images?: Array | null; + schedule?: scheduleDto; +}; diff --git a/src/lib/api/merchant/models/createPromotionDto.ts b/src/lib/api/merchant/models/createPromotionDto.ts new file mode 100644 index 0000000..fa718fb --- /dev/null +++ b/src/lib/api/merchant/models/createPromotionDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { baseOfferDto } from "./baseOfferDto"; +import type { baseTriggerDto } from "./baseTriggerDto"; +export type createPromotionDto = { + triggers?: Array | null; + offer: baseOfferDto; +}; diff --git a/src/lib/api/merchant/models/createRestaurantDto.ts b/src/lib/api/merchant/models/createRestaurantDto.ts new file mode 100644 index 0000000..b632f7f --- /dev/null +++ b/src/lib/api/merchant/models/createRestaurantDto.ts @@ -0,0 +1,24 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { iTriggerDto } from "./iTriggerDto"; +/** + * Create a new restaurant. + */ +export type createRestaurantDto = { + name?: string | null; + /** + * Endpoint URL for the seller. + */ + endpoint?: string | null; + /** + * The promotion ids for this seller. + */ + promotionIds?: Array | null; + /** + * The availability triggers. + */ + availabilityTriggers?: Array | null; + readonly type?: "restaurant" | null; +}; diff --git a/src/lib/api/merchant/models/createRestaurantRevisionDto.ts b/src/lib/api/merchant/models/createRestaurantRevisionDto.ts new file mode 100644 index 0000000..b2a1857 --- /dev/null +++ b/src/lib/api/merchant/models/createRestaurantRevisionDto.ts @@ -0,0 +1,44 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { addressDto } from "./addressDto"; +import type { gpsLocationDto } from "./gpsLocationDto"; +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { simpleContactDto } from "./simpleContactDto"; +/** + * Represents a restaurant with seller details and associated tags. + */ +export type createRestaurantRevisionDto = { + /** + * Version number of the document. + */ + documentVersion?: number; + schedule?: scheduleDto; + address?: addressDto; + contactInfo?: simpleContactDto; + location?: gpsLocationDto; + /** + * A key value collection for storing additional information + */ + additional?: Record | null; + /** + * A list of image references. + */ + images?: Array | null; + /** + * Optional minimum order amount required by the restaurant. + */ + minimumOrder?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Tags associated with the restaurant. + */ + tags?: Array | null; +}; diff --git a/src/lib/api/merchant/models/createSellerDto.ts b/src/lib/api/merchant/models/createSellerDto.ts new file mode 100644 index 0000000..38b077f --- /dev/null +++ b/src/lib/api/merchant/models/createSellerDto.ts @@ -0,0 +1,36 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { createRestaurantDto } from "./createRestaurantDto"; +import type { iTriggerDto } from "./iTriggerDto"; +import type { restaurantDto } from "./restaurantDto"; +import type { sellerDto } from "./sellerDto"; +/** + * Base class for seller data transfer objects, encapsulating common seller properties. + * Restaurants, farms, shops and other merchants inherit this class. + */ +export type createSellerDto = + | createRestaurantDto + | any + | sellerDto + | restaurantDto + | { + /** + * The document type 'restaurant' or 'shop'. + */ + type?: string | null; + name?: string | null; + /** + * Endpoint URL for the seller. + */ + endpoint?: string | null; + /** + * The promotion ids for this seller. + */ + promotionIds?: Array | null; + /** + * The availability triggers. + */ + availabilityTriggers?: Array | null; + }; diff --git a/src/lib/api/merchant/models/createSellerRevisionDto.ts b/src/lib/api/merchant/models/createSellerRevisionDto.ts new file mode 100644 index 0000000..e1a984a --- /dev/null +++ b/src/lib/api/merchant/models/createSellerRevisionDto.ts @@ -0,0 +1,27 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { addressDto } from "./addressDto"; +import type { gpsLocationDto } from "./gpsLocationDto"; +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { simpleContactDto } from "./simpleContactDto"; +export type createSellerRevisionDto = { + /** + * Version number of the document. + */ + documentVersion?: number; + schedule?: scheduleDto; + address?: addressDto; + contactInfo?: simpleContactDto; + location?: gpsLocationDto; + /** + * A key value collection for storing additional information + */ + additional?: Record | null; + /** + * A list of image references. + */ + images?: Array | null; +}; diff --git a/src/lib/api/merchant/models/createTextRevisionDto.ts b/src/lib/api/merchant/models/createTextRevisionDto.ts new file mode 100644 index 0000000..bd0b7b5 --- /dev/null +++ b/src/lib/api/merchant/models/createTextRevisionDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type createTextRevisionDto = { + documentId?: string; + key?: string | null; + lang?: string | null; + value?: string | null; +}; diff --git a/src/lib/api/merchant/models/customerGroupTriggerDto.ts b/src/lib/api/merchant/models/customerGroupTriggerDto.ts new file mode 100644 index 0000000..a52bda2 --- /dev/null +++ b/src/lib/api/merchant/models/customerGroupTriggerDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type customerGroupTriggerDto = { + effect?: triggerEffect; + readonly type?: "customer_group" | null; + customerValue: string | null; +}; diff --git a/src/lib/api/merchant/models/customerHistoryTriggerDto.ts b/src/lib/api/merchant/models/customerHistoryTriggerDto.ts new file mode 100644 index 0000000..32a4c20 --- /dev/null +++ b/src/lib/api/merchant/models/customerHistoryTriggerDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type customerHistoryTriggerDto = { + effect?: triggerEffect; + readonly type?: "customer_history" | null; + customerValue: string | null; +}; diff --git a/src/lib/api/merchant/models/customerLoyaltyTriggerDto.ts b/src/lib/api/merchant/models/customerLoyaltyTriggerDto.ts new file mode 100644 index 0000000..3365a95 --- /dev/null +++ b/src/lib/api/merchant/models/customerLoyaltyTriggerDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type customerLoyaltyTriggerDto = { + effect?: triggerEffect; + readonly type?: "customer_loyalty" | null; + customerValue: string | null; +}; diff --git a/src/lib/api/merchant/models/deliveryAddressDto.ts b/src/lib/api/merchant/models/deliveryAddressDto.ts new file mode 100644 index 0000000..ea917c0 --- /dev/null +++ b/src/lib/api/merchant/models/deliveryAddressDto.ts @@ -0,0 +1,18 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Data transfer object for delivery address information + */ +export type deliveryAddressDto = { + line1?: string | null; + line2?: string | null; + line3?: string | null; + building?: string | null; + floor?: string | null; + flat?: string | null; + postCode?: string | null; + comment?: string | null; + additionalInfo?: string | null; +}; diff --git a/src/lib/api/merchant/models/deliveryFailureResult.ts b/src/lib/api/merchant/models/deliveryFailureResult.ts new file mode 100644 index 0000000..633379e --- /dev/null +++ b/src/lib/api/merchant/models/deliveryFailureResult.ts @@ -0,0 +1,51 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **None** + * - 1 - **Cancelled** + * - 2 - **Exception** + * - 3 - **RouteIssue** + * - 4 - **WaypointFail** + * - 5 - **PricingIssue** + * - 6 - **NoCourier** + * - 7 - **Other** + * + */ +export enum deliveryFailureResult { + /** + * (value: 0) + */ + None = 0, + /** + * (value: 1) + */ + Cancelled = 1, + /** + * (value: 2) + */ + Exception = 2, + /** + * (value: 3) + */ + RouteIssue = 3, + /** + * (value: 4) + */ + WaypointFail = 4, + /** + * (value: 5) + */ + PricingIssue = 5, + /** + * (value: 6) + */ + NoCourier = 6, + /** + * (value: 7) + */ + Other = 7, +} diff --git a/src/lib/api/merchant/models/deliveryLocationDto.ts b/src/lib/api/merchant/models/deliveryLocationDto.ts new file mode 100644 index 0000000..9e9d25a --- /dev/null +++ b/src/lib/api/merchant/models/deliveryLocationDto.ts @@ -0,0 +1,25 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { deliveryAddressDto } from "./deliveryAddressDto"; +import type { gpsLocationDto } from "./gpsLocationDto"; +/** + * Data transfer object for delivery location information + */ +export type deliveryLocationDto = { + /** + * Gets or sets the unique identifier for this delivery location. + */ + id?: string; + address?: deliveryAddressDto; + gpsLocation?: gpsLocationDto; + /** + * Gets or sets whether this delivery location is enabled. + */ + isEnabled?: boolean; + /** + * Gets or sets additional delivery instructions. + */ + instructions?: string | null; +}; diff --git a/src/lib/api/merchant/models/deliveryOrderStatus.ts b/src/lib/api/merchant/models/deliveryOrderStatus.ts new file mode 100644 index 0000000..2f88204 --- /dev/null +++ b/src/lib/api/merchant/models/deliveryOrderStatus.ts @@ -0,0 +1,41 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **None** + * - 1 - **Initializing** + * - 2 - **NeedsCourier** + * - 3 - **Ready** + * - 4 - **InProgress** + * - 5 - **Ended** + * + */ +export enum deliveryOrderStatus { + /** + * (value: 0) + */ + None = 0, + /** + * (value: 1) + */ + Initializing = 1, + /** + * (value: 2) + */ + NeedsCourier = 2, + /** + * (value: 3) + */ + Ready = 3, + /** + * (value: 4) + */ + InProgress = 4, + /** + * (value: 5) + */ + Ended = 5, +} diff --git a/src/lib/api/merchant/models/deliveryStateDto.ts b/src/lib/api/merchant/models/deliveryStateDto.ts new file mode 100644 index 0000000..6c11b07 --- /dev/null +++ b/src/lib/api/merchant/models/deliveryStateDto.ts @@ -0,0 +1,40 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { courierInfoDto } from "./courierInfoDto"; +import type { deliveryFailureResult } from "./deliveryFailureResult"; +import type { deliveryOrderStatus } from "./deliveryOrderStatus"; +/** + * Data transfer object for delivery information + */ +export type deliveryStateDto = { + deliveryOrderStatus?: deliveryOrderStatus; + deliveryFailureResult?: deliveryFailureResult; + /** + * The scheduled start time + */ + utcScheduled?: string | null; + /** + * The actual start time + */ + utcStarted?: string | null; + /** + * The actual end time + */ + utcEndedActual?: string | null; + /** + * The estimated time of completion in seconds + */ + etcSeconds?: number; + salePrice?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + courierInfo?: courierInfoDto; + dispatchRequired?: boolean | null; + dspOrderId?: string | null; +}; diff --git a/src/lib/api/merchant/models/digitalEngagementTriggerDto.ts b/src/lib/api/merchant/models/digitalEngagementTriggerDto.ts new file mode 100644 index 0000000..9907758 --- /dev/null +++ b/src/lib/api/merchant/models/digitalEngagementTriggerDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type digitalEngagementTriggerDto = { + effect?: triggerEffect; + readonly type?: "digital_engagement" | null; + action: string | null; +}; diff --git a/src/lib/api/merchant/models/discountProductOfferDto.ts b/src/lib/api/merchant/models/discountProductOfferDto.ts new file mode 100644 index 0000000..082c81f --- /dev/null +++ b/src/lib/api/merchant/models/discountProductOfferDto.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { discountType } from "./discountType"; +export type discountProductOfferDto = { + readonly type?: "discount_product" | null; + discountType: discountType; + value: number; + productIds: Array | null; +}; diff --git a/src/lib/api/merchant/models/discountTotalOfferDto.ts b/src/lib/api/merchant/models/discountTotalOfferDto.ts new file mode 100644 index 0000000..3610ac8 --- /dev/null +++ b/src/lib/api/merchant/models/discountTotalOfferDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { discountType } from "./discountType"; +export type discountTotalOfferDto = { + readonly type?: "discount_total" | null; + discountType: discountType; + value: number; +}; diff --git a/src/lib/api/merchant/models/discountType.ts b/src/lib/api/merchant/models/discountType.ts new file mode 100644 index 0000000..18ddab3 --- /dev/null +++ b/src/lib/api/merchant/models/discountType.ts @@ -0,0 +1,26 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **None** + * - 1 - **Fixed**: A fixed amount discount (e.g., $10 off). + * - 2 - **Percentage**: A percentage-based discount (e.g., 20% off). + * + */ +export enum discountType { + /** + * (value: 0) + */ + None = 0, + /** + * (value: 1) A fixed amount discount (e.g., $10 off). + */ + Fixed = 1, + /** + * (value: 2) A percentage-based discount (e.g., 20% off). + */ + Percentage = 2, +} diff --git a/src/lib/api/merchant/models/dispatchMethodType.ts b/src/lib/api/merchant/models/dispatchMethodType.ts new file mode 100644 index 0000000..81c5749 --- /dev/null +++ b/src/lib/api/merchant/models/dispatchMethodType.ts @@ -0,0 +1,26 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **None** + * - 10 - **Pickup** + * - 20 - **Delivery** + * + */ +export enum dispatchMethodType { + /** + * (value: 0) + */ + None = 0, + /** + * (value: 10) + */ + Pickup = 10, + /** + * (value: 20) + */ + Delivery = 20, +} diff --git a/src/lib/api/merchant/models/freeDeliveryOfferDto.ts b/src/lib/api/merchant/models/freeDeliveryOfferDto.ts new file mode 100644 index 0000000..e03d8b5 --- /dev/null +++ b/src/lib/api/merchant/models/freeDeliveryOfferDto.ts @@ -0,0 +1,8 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type freeDeliveryOfferDto = { + readonly type?: "free_delivery" | null; + minPurchaseAmount?: number | null; +}; diff --git a/src/lib/api/merchant/models/freeItemOfferDto.ts b/src/lib/api/merchant/models/freeItemOfferDto.ts new file mode 100644 index 0000000..387dadf --- /dev/null +++ b/src/lib/api/merchant/models/freeItemOfferDto.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type freeItemOfferDto = { + readonly type?: "free_item" | null; + productIds: Array | null; + quantity: number; +}; diff --git a/src/lib/api/merchant/models/gpsLocationDto.ts b/src/lib/api/merchant/models/gpsLocationDto.ts new file mode 100644 index 0000000..1a393a2 --- /dev/null +++ b/src/lib/api/merchant/models/gpsLocationDto.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Represents a GPS location with latitude and longitude coordinates. + */ +export type gpsLocationDto = { + /** + * Latitude is a geographic coordinate that measures how far north or south a location is from the equator, + * expressed in degrees from -90 (South Pole) to 90 (North Pole). + */ + latitude?: number; + /** + * Longitude is a geographic coordinate that measures how far east or west a location is from the Prime Meridian, + * expressed in degrees from -180 (West) to 180 (East). + */ + longitude?: number; +}; diff --git a/src/lib/api/merchant/models/holidayTriggerDto.ts b/src/lib/api/merchant/models/holidayTriggerDto.ts new file mode 100644 index 0000000..678e16f --- /dev/null +++ b/src/lib/api/merchant/models/holidayTriggerDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type holidayTriggerDto = { + effect?: triggerEffect; + readonly type?: "holiday" | null; + holiday: string | null; +}; diff --git a/src/lib/api/merchant/models/humanVerificationRequestDto.ts b/src/lib/api/merchant/models/humanVerificationRequestDto.ts new file mode 100644 index 0000000..da39178 --- /dev/null +++ b/src/lib/api/merchant/models/humanVerificationRequestDto.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { phoneVerificationState } from "./phoneVerificationState"; +/** + * DTO for Human verification of public key by phone number. + */ +export type humanVerificationRequestDto = { + /** + * The Public key being verified. + */ + publicKey?: string; + /** + * The phone number that was used to verify the public key. + */ + phoneNumber?: string | null; + state?: phoneVerificationState; +}; diff --git a/src/lib/api/merchant/models/humanVerificationStatusDto.ts b/src/lib/api/merchant/models/humanVerificationStatusDto.ts new file mode 100644 index 0000000..5215e78 --- /dev/null +++ b/src/lib/api/merchant/models/humanVerificationStatusDto.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { phoneVerificationState } from "./phoneVerificationState"; +/** + * The status of a Human verification process. + */ +export type humanVerificationStatusDto = { + /** + * The Public key that was verified. + */ + publicKey?: string; + /** + * The phone number used to verify the public key. + */ + phoneNumber?: string | null; + state?: phoneVerificationState; +}; diff --git a/src/lib/api/merchant/models/iTriggerDto.ts b/src/lib/api/merchant/models/iTriggerDto.ts new file mode 100644 index 0000000..6ab69c1 --- /dev/null +++ b/src/lib/api/merchant/models/iTriggerDto.ts @@ -0,0 +1,34 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { bundleTriggerDto } from "./bundleTriggerDto"; +import type { couponTriggerDto } from "./couponTriggerDto"; +import type { customerGroupTriggerDto } from "./customerGroupTriggerDto"; +import type { customerHistoryTriggerDto } from "./customerHistoryTriggerDto"; +import type { customerLoyaltyTriggerDto } from "./customerLoyaltyTriggerDto"; +import type { digitalEngagementTriggerDto } from "./digitalEngagementTriggerDto"; +import type { holidayTriggerDto } from "./holidayTriggerDto"; +import type { managerOverrideTriggerDto } from "./managerOverrideTriggerDto"; +import type { purchaseTriggerDto } from "./purchaseTriggerDto"; +import type { sellerOperationalStateTriggerDto } from "./sellerOperationalStateTriggerDto"; +import type { stopListTriggerDto } from "./stopListTriggerDto"; +import type { timeTriggerDto } from "./timeTriggerDto"; +import type { triggerEffect } from "./triggerEffect"; +export type iTriggerDto = + | timeTriggerDto + | purchaseTriggerDto + | managerOverrideTriggerDto + | holidayTriggerDto + | digitalEngagementTriggerDto + | customerLoyaltyTriggerDto + | customerHistoryTriggerDto + | customerGroupTriggerDto + | couponTriggerDto + | bundleTriggerDto + | sellerOperationalStateTriggerDto + | stopListTriggerDto + | { + effect?: triggerEffect; + type?: string; + }; diff --git a/src/lib/api/merchant/models/imageReferenceDto.ts b/src/lib/api/merchant/models/imageReferenceDto.ts new file mode 100644 index 0000000..42d110f --- /dev/null +++ b/src/lib/api/merchant/models/imageReferenceDto.ts @@ -0,0 +1,23 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { aspectType } from "./aspectType"; +export type imageReferenceDto = { + /** + * The key refers to the particular image in a set of images. + * eg: 'primary' might refer to the main image of a product. + * 'alt' might refer to an alternate image. + */ + key: string | null; + /** + * A base58-encoded SHA-256 digest for the asset. + * This is the digest (or hash) of the original image + */ + digest: string | null; + /** + * A list of 'aspects' available for this digest. + * In the future this may include more than just 'ratios'. + */ + aspects: Array | null; +}; diff --git a/src/lib/api/merchant/models/localizedTextDto.ts b/src/lib/api/merchant/models/localizedTextDto.ts new file mode 100644 index 0000000..86ff1df --- /dev/null +++ b/src/lib/api/merchant/models/localizedTextDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type localizedTextDto = { + type?: number; + value?: string | null; + lang?: string | null; + revisionId?: string | null; +}; diff --git a/src/lib/api/merchant/models/managerOverrideTriggerDto.ts b/src/lib/api/merchant/models/managerOverrideTriggerDto.ts new file mode 100644 index 0000000..9b666b6 --- /dev/null +++ b/src/lib/api/merchant/models/managerOverrideTriggerDto.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type managerOverrideTriggerDto = { + effect?: triggerEffect; + readonly type?: "manager_override" | null; + key?: string | null; + clearWhen?: string | null; + utcCreated?: string; + isAvailable: boolean; + managerUserId?: string; +}; diff --git a/src/lib/api/merchant/models/oidcConnectResponseDto.ts b/src/lib/api/merchant/models/oidcConnectResponseDto.ts new file mode 100644 index 0000000..d23e58c --- /dev/null +++ b/src/lib/api/merchant/models/oidcConnectResponseDto.ts @@ -0,0 +1,18 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Data transfer object representing connection information for an OIDC client. + */ +export type oidcConnectResponseDto = { + /** + * Client identifier used for the OIDC connection. + */ + clientId?: string | null; + /** + * Authority URL of the OIDC provider. + * This is the URL that the client will connect to for authentication. + */ + authorityUrl?: string | null; +}; diff --git a/src/lib/api/merchant/models/optionDto.ts b/src/lib/api/merchant/models/optionDto.ts new file mode 100644 index 0000000..eda142a --- /dev/null +++ b/src/lib/api/merchant/models/optionDto.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { localizedTextDto } from "./localizedTextDto"; +export type optionDto = { + id?: string; + title?: localizedTextDto; + description?: localizedTextDto; + price?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + isFixedPrice?: boolean; + additional?: Record | null; +}; diff --git a/src/lib/api/merchant/models/optionsQueryDto.ts b/src/lib/api/merchant/models/optionsQueryDto.ts new file mode 100644 index 0000000..af3ccc4 --- /dev/null +++ b/src/lib/api/merchant/models/optionsQueryDto.ts @@ -0,0 +1,25 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type optionsQueryDto = { + optionsId?: string | null; + friendlyName?: string | null; + minRequired?: number | null; + maxLimit?: number | null; + /** + * A time value in 24-hour format (HH:mm:ss.FFFFFFF). + */ + availableFrom?: string | null; + /** + * A time value in 24-hour format (HH:mm:ss.FFFFFFF). + */ + availableTo?: string | null; + offset?: number; + limit?: number; + utcCreatedFrom?: string | null; + utcCreatedTo?: string | null; + isPublished?: boolean | null; + publishedByUserId?: string | null; + utcCreated?: string | null; +}; diff --git a/src/lib/api/merchant/models/optionsRevisionDto.ts b/src/lib/api/merchant/models/optionsRevisionDto.ts new file mode 100644 index 0000000..e36a087 --- /dev/null +++ b/src/lib/api/merchant/models/optionsRevisionDto.ts @@ -0,0 +1,30 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { localizedTextDto } from "./localizedTextDto"; +import type { optionDto } from "./optionDto"; +export type optionsRevisionDto = { + friendlyName?: string | null; + minRequired?: number; + maxLimit?: number; + /** + * A time value in 24-hour format (HH:mm:ss.FFFFFFF). + */ + availableFrom?: string | null; + /** + * A time value in 24-hour format (HH:mm:ss.FFFFFFF). + */ + availableTo?: string | null; + options?: Array | null; + additional?: Record | null; + optionsId?: string; + revisionId?: string; + title?: localizedTextDto; + description?: localizedTextDto; + creatorId?: string; + utcCreated?: string; + isPublished?: boolean; + utcPublished?: string | null; + publishedByUserId?: string | null; +}; diff --git a/src/lib/api/merchant/models/optionsViewDto.ts b/src/lib/api/merchant/models/optionsViewDto.ts new file mode 100644 index 0000000..adcd86f --- /dev/null +++ b/src/lib/api/merchant/models/optionsViewDto.ts @@ -0,0 +1,25 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { localizedTextDto } from "./localizedTextDto"; +import type { optionDto } from "./optionDto"; +export type optionsViewDto = { + friendlyName?: string | null; + minRequired?: number; + maxLimit?: number; + /** + * A time value in 24-hour format (HH:mm:ss.FFFFFFF). + */ + availableFrom?: string | null; + /** + * A time value in 24-hour format (HH:mm:ss.FFFFFFF). + */ + availableTo?: string | null; + options?: Array | null; + additional?: Record | null; + optionsId?: string; + revisionId?: string; + title?: localizedTextDto; + description?: localizedTextDto; +}; diff --git a/src/lib/api/merchant/models/orderCreateDto.ts b/src/lib/api/merchant/models/orderCreateDto.ts new file mode 100644 index 0000000..58c01a2 --- /dev/null +++ b/src/lib/api/merchant/models/orderCreateDto.ts @@ -0,0 +1,40 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { checkoutOptionsDto } from "./checkoutOptionsDto"; +import type { paymentType } from "./paymentType"; +import type { selectedProductDto } from "./selectedProductDto"; +export type orderCreateDto = { + sellerId?: string; + /** + * The consumer's public key. + */ + consumerKey?: string; + paymentType?: paymentType; + options?: checkoutOptionsDto; + /** + * The items in this order. + */ + items?: Array | null; + /** + * Additional instructions or comments regarding the order. + */ + comments?: string | null; + dispatchRequired?: boolean; + agreedPrice?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + agreedDeliveryPrice?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + deliveryEstSeconds?: number; +}; diff --git a/src/lib/api/merchant/models/orderDto.ts b/src/lib/api/merchant/models/orderDto.ts new file mode 100644 index 0000000..689b7ba --- /dev/null +++ b/src/lib/api/merchant/models/orderDto.ts @@ -0,0 +1,27 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { checkoutOptionsDto } from "./checkoutOptionsDto"; +import type { paymentType } from "./paymentType"; +import type { selectedProductDto } from "./selectedProductDto"; +/** + * Data transfer object for common order information. + */ +export type orderDto = { + sellerId?: string; + /** + * The consumer's public key. + */ + consumerKey?: string; + paymentType?: paymentType; + options?: checkoutOptionsDto; + /** + * The items in this order. + */ + items?: Array | null; + /** + * Additional instructions or comments regarding the order. + */ + comments?: string | null; +}; diff --git a/src/lib/api/merchant/models/orderFailureRequestDto.ts b/src/lib/api/merchant/models/orderFailureRequestDto.ts new file mode 100644 index 0000000..78671a9 --- /dev/null +++ b/src/lib/api/merchant/models/orderFailureRequestDto.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { commonOrderFailureResult } from "./commonOrderFailureResult"; +/** + * Request DTO for cancelling/rejecting an order with a specific failure reason. + */ +export type orderFailureRequestDto = { + /** + * Unique identifier of the order to be cancelled. + */ + orderId?: string; + failureResult?: commonOrderFailureResult; + /** + * Optional additional reason or notes about the cancellation. + */ + reason?: string | null; +}; diff --git a/src/lib/api/merchant/models/orderNextStatusDto.ts b/src/lib/api/merchant/models/orderNextStatusDto.ts new file mode 100644 index 0000000..85a7150 --- /dev/null +++ b/src/lib/api/merchant/models/orderNextStatusDto.ts @@ -0,0 +1,16 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { commonOrderStatus } from "./commonOrderStatus"; +export type orderNextStatusDto = { + orderStatus?: commonOrderStatus; + /** + * The expected completion date and time of the order. + */ + expectedCompleted?: string | null; + /** + * Indicates whether the order requires dispatching via the engine. + */ + dispatchRequired?: boolean | null; +}; diff --git a/src/lib/api/merchant/models/orderQueryRequestDto.ts b/src/lib/api/merchant/models/orderQueryRequestDto.ts new file mode 100644 index 0000000..55345f6 --- /dev/null +++ b/src/lib/api/merchant/models/orderQueryRequestDto.ts @@ -0,0 +1,71 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { commonOrderFailureResult } from "./commonOrderFailureResult"; +import type { commonOrderStatus } from "./commonOrderStatus"; +/** + * Data transfer object for querying orders using various filters. + */ +export type orderQueryRequestDto = { + /** + * Text search filter for orders. + */ + textSearch?: string | null; + /** + * Order code filter. + */ + orderCode?: string | null; + /** + * Filter by the seller's public key. + */ + sellerKey?: string | null; + /** + * Filter by the consumer's public key. + */ + consumerKey?: string | null; + /** + * Pagination offset; defaults to 0. + */ + offset?: number; + /** + * Limit for number of orders to return; defaults to 20. + */ + limit?: number; + /** + * UTC date filter for orders created on or after this date. + */ + utcCreatedFrom?: string | null; + /** + * UTC date filter for orders created on or before this date. + */ + utcCreatedTo?: string | null; + /** + * UTC date filter for orders updated on or after this date. + */ + utcUpdatedFrom?: string | null; + /** + * UTC date filter for orders updated on or before this date. + */ + utcUpdatedTo?: string | null; + /** + * Filter to include active orders in the results. + */ + activeOrders?: boolean | null; + /** + * Filter to include completed orders in the results. + */ + completedOrders?: boolean | null; + /** + * Filter to include cancelled orders in the results. + */ + cancelledOrders?: boolean | null; + /** + * Results will match to any of the provided order statuses. + */ + statusAny?: Array | null; + /** + * Array of order failure results to filter orders by any matching failure type. + */ + failureAny?: Array | null; +}; diff --git a/src/lib/api/merchant/models/orderStateChangeRequestDto.ts b/src/lib/api/merchant/models/orderStateChangeRequestDto.ts new file mode 100644 index 0000000..2203322 --- /dev/null +++ b/src/lib/api/merchant/models/orderStateChangeRequestDto.ts @@ -0,0 +1,21 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { commonOrderFailureResult } from "./commonOrderFailureResult"; +import type { orderTriggerDto } from "./orderTriggerDto"; +/** + * Request DTO for changing the state of an order. + */ +export type orderStateChangeRequestDto = { + /** + * Unique identifier of the order. + */ + orderId?: string; + orderTrigger?: orderTriggerDto; + failureResult?: commonOrderFailureResult; + /** + * Optional expected ready time for the order. + */ + expectedReady?: string | null; +}; diff --git a/src/lib/api/merchant/models/orderStateDto.ts b/src/lib/api/merchant/models/orderStateDto.ts new file mode 100644 index 0000000..ab2408a --- /dev/null +++ b/src/lib/api/merchant/models/orderStateDto.ts @@ -0,0 +1,38 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { commonOrderFailureResult } from "./commonOrderFailureResult"; +import type { commonOrderStatus } from "./commonOrderStatus"; +import type { deliveryStateDto } from "./deliveryStateDto"; +import type { preparationStateDto } from "./preparationStateDto"; +/** + * Represents the current state of an order. + */ +export type orderStateDto = { + orderStatus?: commonOrderStatus; + /** + * A key value store of timestamps indicating when each status was reached. + * The key is the integer value of the 'CommonOrderStatus'. + */ + orderStatusTimes?: Record | null; + failureResult?: commonOrderFailureResult; + /** + * The scheduled start time + */ + utcScheduled?: string | null; + /** + * The actual start time + */ + utcStarted?: string | null; + /** + * The actual end time + */ + utcEndedActual?: string | null; + preparationState?: preparationStateDto; + deliveryState?: deliveryStateDto; + /** + * Optional: Readable explanation as to the failure result. + */ + failureExplain?: string | null; +}; diff --git a/src/lib/api/merchant/models/orderTriggerDto.ts b/src/lib/api/merchant/models/orderTriggerDto.ts new file mode 100644 index 0000000..737c6ed --- /dev/null +++ b/src/lib/api/merchant/models/orderTriggerDto.ts @@ -0,0 +1,58 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * DTO representation of order state triggers + * + * **Enum Values:** + * + * - 0 - **ConfirmCreation** + * - 1 - **PaymentReceived** + * - 2 - **PlaceOrder** + * - 3 - **AcceptOrder** + * - 4 - **PrepareOrder** + * - 5 - **Prepared** + * - 6 - **OrderCollected** + * - 7 - **CompleteOrder** + * - 8 - **Cancel** + * + */ +export enum orderTriggerDto { + /** + * (value: 0) + */ + ConfirmCreation = 0, + /** + * (value: 1) + */ + PaymentReceived = 1, + /** + * (value: 2) + */ + PlaceOrder = 2, + /** + * (value: 3) + */ + AcceptOrder = 3, + /** + * (value: 4) + */ + PrepareOrder = 4, + /** + * (value: 5) + */ + Prepared = 5, + /** + * (value: 6) + */ + OrderCollected = 6, + /** + * (value: 7) + */ + CompleteOrder = 7, + /** + * (value: 8) + */ + Cancel = 8, +} diff --git a/src/lib/api/merchant/models/orderViewDto.ts b/src/lib/api/merchant/models/orderViewDto.ts new file mode 100644 index 0000000..6190d81 --- /dev/null +++ b/src/lib/api/merchant/models/orderViewDto.ts @@ -0,0 +1,56 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { calculatedCheckoutDto } from "./calculatedCheckoutDto"; +import type { checkoutOptionsDto } from "./checkoutOptionsDto"; +import type { orderStateDto } from "./orderStateDto"; +import type { paymentType } from "./paymentType"; +import type { selectedProductDto } from "./selectedProductDto"; +/** + * Represents an order with checkout options, calculated totals, items, products, and product options. + * Inherits from CreateOrderDto to include standard order properties. + */ +export type orderViewDto = { + sellerId?: string; + /** + * The consumer's public key. + */ + consumerKey?: string; + paymentType?: paymentType; + options?: checkoutOptionsDto; + /** + * The items in this order. + */ + items?: Array | null; + /** + * Additional instructions or comments regarding the order. + */ + comments?: string | null; + /** + * Unique identifier for the order. + */ + id?: string; + orderState: orderStateDto; + /** + * A unique code (identifier) that is publicly visible and can be used to reference the order. + */ + orderCode?: string | null; + /** + * Timestamp (UTC) when the order was created. + */ + utcCreated?: string; + /** + * Timestamp (UTC) when the order was last updated. + */ + utcUpdated?: string; + /** + * Indicates whether the order is active. + */ + isActive?: boolean; + /** + * Indicates whether the order has failed. + */ + isFailed?: boolean; + prices?: calculatedCheckoutDto; +}; diff --git a/src/lib/api/merchant/models/paymentType.ts b/src/lib/api/merchant/models/paymentType.ts new file mode 100644 index 0000000..2a9e0b4 --- /dev/null +++ b/src/lib/api/merchant/models/paymentType.ts @@ -0,0 +1,26 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **None** + * - 10 - **Postpaid** + * - 20 - **Prepaid** + * + */ +export enum paymentType { + /** + * (value: 0) + */ + None = 0, + /** + * (value: 10) + */ + Postpaid = 10, + /** + * (value: 20) + */ + Prepaid = 20, +} diff --git a/src/lib/api/merchant/models/phoneVerificationState.ts b/src/lib/api/merchant/models/phoneVerificationState.ts new file mode 100644 index 0000000..d639a91 --- /dev/null +++ b/src/lib/api/merchant/models/phoneVerificationState.ts @@ -0,0 +1,26 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **Verified** + * - 1 - **Blocked** + * - 2 - **NotVerified** + * + */ +export enum phoneVerificationState { + /** + * (value: 0) + */ + Verified = 0, + /** + * (value: 1) + */ + Blocked = 1, + /** + * (value: 2) + */ + NotVerified = 2, +} diff --git a/src/lib/api/merchant/models/preparationStateDto.ts b/src/lib/api/merchant/models/preparationStateDto.ts new file mode 100644 index 0000000..e94af6e --- /dev/null +++ b/src/lib/api/merchant/models/preparationStateDto.ts @@ -0,0 +1,25 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Data transfer object for order preparation information + */ +export type preparationStateDto = { + /** + * The scheduled start time + */ + utcScheduled?: string | null; + /** + * The actual start time + */ + utcStarted?: string | null; + /** + * The actual end time + */ + utcEndedActual?: string | null; + /** + * The estimated time of completion in seconds + */ + etcSeconds?: number; +}; diff --git a/src/lib/api/merchant/models/priceEstimationDto.ts b/src/lib/api/merchant/models/priceEstimationDto.ts new file mode 100644 index 0000000..0dca411 --- /dev/null +++ b/src/lib/api/merchant/models/priceEstimationDto.ts @@ -0,0 +1,37 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Data transfer object containing price estimate information. + */ +export type priceEstimationDto = { + /** + * Estimated price for the delivery. + */ + price?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Original price before any adjustments or discounts. + */ + originalPrice?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Total distance of the delivery route in meters. + */ + distanceMetres?: number; + /** + * The estimated amount of time in seconds the delivery could take. + */ + secondsEstimated?: number; +}; diff --git a/src/lib/api/merchant/models/priceEstimationRequestDto.ts b/src/lib/api/merchant/models/priceEstimationRequestDto.ts new file mode 100644 index 0000000..546cb30 --- /dev/null +++ b/src/lib/api/merchant/models/priceEstimationRequestDto.ts @@ -0,0 +1,18 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { gpsLocationDto } from "./gpsLocationDto"; +/** + * Request DTO for estimating delivery prices + */ +export type priceEstimationRequestDto = { + /** + * UTC timestamp when the delivery is scheduled for. + */ + utcScheduledFor?: string; + /** + * List of GPS locations defining the delivery route. + */ + locations?: Array | null; +}; diff --git a/src/lib/api/merchant/models/problemDetails.ts b/src/lib/api/merchant/models/problemDetails.ts new file mode 100644 index 0000000..9afd898 --- /dev/null +++ b/src/lib/api/merchant/models/problemDetails.ts @@ -0,0 +1,5 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type problemDetails = Record; diff --git a/src/lib/api/merchant/models/productCompositeDto.ts b/src/lib/api/merchant/models/productCompositeDto.ts new file mode 100644 index 0000000..9253f58 --- /dev/null +++ b/src/lib/api/merchant/models/productCompositeDto.ts @@ -0,0 +1,36 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { assetCollectionDto } from "./assetCollectionDto"; +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { localizedTextDto } from "./localizedTextDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { tag } from "./tag"; +export type productCompositeDto = { + price?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + optionsIds?: Array | null; + categoryIds?: Array | null; + sortOrder?: number; + assets?: Array | null; + isEnabled?: boolean; + notAvailableReason?: string | null; + tags?: Array | null; + additional?: Record | null; + images?: Array | null; + schedule?: scheduleDto; + id?: string; + revisionId?: string; + promotionIds?: Array | null; + title?: localizedTextDto; + description?: localizedTextDto; + isVisible?: boolean; + isAvailable?: boolean; + isStopListed?: boolean; +}; diff --git a/src/lib/api/merchant/models/productDto.ts b/src/lib/api/merchant/models/productDto.ts new file mode 100644 index 0000000..adebc06 --- /dev/null +++ b/src/lib/api/merchant/models/productDto.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { iTriggerDto } from "./iTriggerDto"; +export type productDto = { + availabilityTriggers?: Array | null; + id?: string; + sellerId?: string; + updatedByUserId?: string; + utcUpdated?: string; + promotionIds?: Array | null; +}; diff --git a/src/lib/api/merchant/models/productQueryRequestDto.ts b/src/lib/api/merchant/models/productQueryRequestDto.ts new file mode 100644 index 0000000..0fcbc29 --- /dev/null +++ b/src/lib/api/merchant/models/productQueryRequestDto.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type productQueryRequestDto = { + offset?: number; + limit?: number; + sellerId?: string | null; + productIds?: Array | null; +}; diff --git a/src/lib/api/merchant/models/productRevisionDto.ts b/src/lib/api/merchant/models/productRevisionDto.ts new file mode 100644 index 0000000..6a96e9b --- /dev/null +++ b/src/lib/api/merchant/models/productRevisionDto.ts @@ -0,0 +1,38 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { assetCollectionDto } from "./assetCollectionDto"; +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { localizedTextDto } from "./localizedTextDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { tag } from "./tag"; +export type productRevisionDto = { + price?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + optionsIds?: Array | null; + categoryIds?: Array | null; + sortOrder?: number; + assets?: Array | null; + isEnabled?: boolean; + notAvailableReason?: string | null; + tags?: Array | null; + additional?: Record | null; + images?: Array | null; + schedule?: scheduleDto; + revisionId?: string; + productId?: string; + sellerId?: string; + title?: localizedTextDto; + description?: localizedTextDto; + creatorId?: string; + utcCreated?: string; + isPublished?: boolean; + utcPublished?: string | null; + publishedByUserId?: string | null; +}; diff --git a/src/lib/api/merchant/models/productRevisionQueryRequestDto.ts b/src/lib/api/merchant/models/productRevisionQueryRequestDto.ts new file mode 100644 index 0000000..9a18906 --- /dev/null +++ b/src/lib/api/merchant/models/productRevisionQueryRequestDto.ts @@ -0,0 +1,15 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type productRevisionQueryRequestDto = { + productId?: string | null; + offset?: number; + limit?: number; + utcCreatedFrom?: string | null; + utcCreatedTo?: string | null; + isPublished?: boolean | null; + publishedByUserId?: string | null; + utcCreated?: string | null; + categoryIds?: Array | null; +}; diff --git a/src/lib/api/merchant/models/productStopListDto.ts b/src/lib/api/merchant/models/productStopListDto.ts new file mode 100644 index 0000000..ed3089c --- /dev/null +++ b/src/lib/api/merchant/models/productStopListDto.ts @@ -0,0 +1,7 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type productStopListDto = { + productIds: Array; +}; diff --git a/src/lib/api/merchant/models/productUnavailableDto.ts b/src/lib/api/merchant/models/productUnavailableDto.ts new file mode 100644 index 0000000..cf8b0fc --- /dev/null +++ b/src/lib/api/merchant/models/productUnavailableDto.ts @@ -0,0 +1,15 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { productUnavailableReason } from "./productUnavailableReason"; +/** + * Represents a product that is unavailable during checkout, including the reason. + */ +export type productUnavailableDto = { + /** + * Gets or sets the unique identifier of the unavailable product. + */ + productId?: string; + reason?: productUnavailableReason; +}; diff --git a/src/lib/api/merchant/models/productUnavailableReason.ts b/src/lib/api/merchant/models/productUnavailableReason.ts new file mode 100644 index 0000000..7d4fdb5 --- /dev/null +++ b/src/lib/api/merchant/models/productUnavailableReason.ts @@ -0,0 +1,41 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **None**: Unknown reason. + * - 10 - **NotFound**: The product is not available for the selected delivery time. + * - 20 - **NotAvailable**: Unavailable product. + * - 30 - **NotInStock**: Currently out of stock or unavailable. + * - 40 - **NotInAvailabilityTime**: The product is not available at the time of ordering. + * - 50 - **OptionsUnavailable**: Some of the product's options are not available. + * + */ +export enum productUnavailableReason { + /** + * (value: 0) Unknown reason. + */ + None = 0, + /** + * (value: 10) The product is not available for the selected delivery time. + */ + NotFound = 10, + /** + * (value: 20) Unavailable product. + */ + NotAvailable = 20, + /** + * (value: 30) Currently out of stock or unavailable. + */ + NotInStock = 30, + /** + * (value: 40) The product is not available at the time of ordering. + */ + NotInAvailabilityTime = 40, + /** + * (value: 50) Some of the product's options are not available. + */ + OptionsUnavailable = 50, +} diff --git a/src/lib/api/merchant/models/promotionQueryRequestDto.ts b/src/lib/api/merchant/models/promotionQueryRequestDto.ts new file mode 100644 index 0000000..d0de997 --- /dev/null +++ b/src/lib/api/merchant/models/promotionQueryRequestDto.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type promotionQueryRequestDto = { + offset?: number; + limit?: number; + ids?: Array | null; + updatedByUserId?: string | null; + utcCreatedFrom?: string | null; + utcCreatedTo?: string | null; + utcUpdatedFrom?: string | null; + utcUpdatedTo?: string | null; +}; diff --git a/src/lib/api/merchant/models/promotionViewDto.ts b/src/lib/api/merchant/models/promotionViewDto.ts new file mode 100644 index 0000000..f92947c --- /dev/null +++ b/src/lib/api/merchant/models/promotionViewDto.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { baseOfferDto } from "./baseOfferDto"; +import type { baseTriggerDto } from "./baseTriggerDto"; +import type { localizedTextDto } from "./localizedTextDto"; +export type promotionViewDto = { + triggers?: Array | null; + offer: baseOfferDto; + id?: string; + title?: localizedTextDto; + description?: localizedTextDto; + updatedByUserId?: string; + utcCreated?: string; + utcUpdated?: string; +}; diff --git a/src/lib/api/merchant/models/purchaseTriggerDto.ts b/src/lib/api/merchant/models/purchaseTriggerDto.ts new file mode 100644 index 0000000..0f5e9e7 --- /dev/null +++ b/src/lib/api/merchant/models/purchaseTriggerDto.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type purchaseTriggerDto = { + effect?: triggerEffect; + readonly type?: "purchase" | null; + minPurchase?: number | null; + minQuantity?: number | null; + minGroupSize?: number | null; +}; diff --git a/src/lib/api/merchant/models/restaurantDto.ts b/src/lib/api/merchant/models/restaurantDto.ts new file mode 100644 index 0000000..8d1a956 --- /dev/null +++ b/src/lib/api/merchant/models/restaurantDto.ts @@ -0,0 +1,37 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { iTriggerDto } from "./iTriggerDto"; +export type restaurantDto = { + name?: string | null; + /** + * Endpoint URL for the seller. + */ + endpoint?: string | null; + /** + * The promotion ids for this seller. + */ + promotionIds?: Array | null; + /** + * The availability triggers. + */ + availabilityTriggers?: Array | null; + /** + * Identifier for the seller. + */ + id?: string; + /** + * Base58 ED25519 public key for this seller. + */ + publicKey?: string; + /** + * Gets or sets the ID of the user who last updated the item. + */ + updatedByUserId?: string; + /** + * Gets or sets the UTC date and time when last updated. + */ + utcUpdated?: string; + readonly type?: "restaurant-view" | null; +}; diff --git a/src/lib/api/merchant/models/restaurantRevisionDto.ts b/src/lib/api/merchant/models/restaurantRevisionDto.ts new file mode 100644 index 0000000..6724d81 --- /dev/null +++ b/src/lib/api/merchant/models/restaurantRevisionDto.ts @@ -0,0 +1,76 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { addressDto } from "./addressDto"; +import type { gpsLocationDto } from "./gpsLocationDto"; +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { localizedTextDto } from "./localizedTextDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { simpleContactDto } from "./simpleContactDto"; +/** + * Represents a restaurant with seller details and associated tags. + */ +export type restaurantRevisionDto = { + /** + * Version number of the document. + */ + documentVersion?: number; + schedule?: scheduleDto; + address?: addressDto; + contactInfo?: simpleContactDto; + location?: gpsLocationDto; + /** + * A key value collection for storing additional information + */ + additional?: Record | null; + /** + * A list of image references. + */ + images?: Array | null; + /** + * Optional minimum order amount required by the restaurant. + */ + minimumOrder?: { + /** + * Currency code ISO 4217 + */ + currency?: string; + value?: number; + } | null; + /** + * Tags associated with the restaurant. + */ + tags?: Array | null; + /** + * Unique identifier of the restaurant (local to this system). + */ + revisionId?: string; + /** + * The document id for this revision. + */ + sellerId?: string; + title?: localizedTextDto; + description?: localizedTextDto; + tagLine?: localizedTextDto; + /** + * The user who created this revision. + */ + creatorId?: string; + /** + * UTC timestamp when the seller was created. + */ + utcCreated?: string; + /** + * Flag indicating whether the seller is published and visible to the public. + */ + isPublished?: boolean; + /** + * UTC timestamp when the seller was published. + */ + utcPublished?: string | null; + /** + * Unique identifier of the user who published the seller. + */ + publisherId?: string | null; +}; diff --git a/src/lib/api/merchant/models/rolePermissionsDto.ts b/src/lib/api/merchant/models/rolePermissionsDto.ts new file mode 100644 index 0000000..9f58783 --- /dev/null +++ b/src/lib/api/merchant/models/rolePermissionsDto.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Represents an association between a role and its permissions. + */ +export type rolePermissionsDto = { + /** + * Role name. + */ + role?: string; + /** + * Collection of permissions linked to the role. + */ + permissions?: Array | null; +}; diff --git a/src/lib/api/merchant/models/scheduleDto.ts b/src/lib/api/merchant/models/scheduleDto.ts new file mode 100644 index 0000000..068102e --- /dev/null +++ b/src/lib/api/merchant/models/scheduleDto.ts @@ -0,0 +1,28 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { scheduleExceptionDto } from "./scheduleExceptionDto"; +import type { timeRangeDto } from "./timeRangeDto"; +/** + * Data transfer object for Schedule. + */ +export type scheduleDto = { + /** + * Gets or sets the regular hours for each day of the week. + * Keys are integers representing days of the week (0 = Sunday, 1 = Monday, etc.). + */ + regularHours?: { + Sunday?: Array; + Monday?: Array; + Tuesday?: Array; + Wednesday?: Array; + Thursday?: Array; + Friday?: Array; + Saturday?: Array; + } | null; + /** + * Gets or sets the list of schedule exceptions. + */ + exceptions?: Array | null; +}; diff --git a/src/lib/api/merchant/models/scheduleExceptionDto.ts b/src/lib/api/merchant/models/scheduleExceptionDto.ts new file mode 100644 index 0000000..99c9cbb --- /dev/null +++ b/src/lib/api/merchant/models/scheduleExceptionDto.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { timeRangeDto } from "./timeRangeDto"; +/** + * Data transfer object for ScheduleException. + */ +export type scheduleExceptionDto = { + /** + * Gets or sets the date of the exception (format: yyyy-MM-dd). + */ + date?: string; + /** + * Gets or sets the override time ranges for this date. + * Empty array means the location is closed on this date. + */ + overrideHours?: Array | null; +}; diff --git a/src/lib/api/merchant/models/selectedOptionDto.ts b/src/lib/api/merchant/models/selectedOptionDto.ts new file mode 100644 index 0000000..84ef782 --- /dev/null +++ b/src/lib/api/merchant/models/selectedOptionDto.ts @@ -0,0 +1,23 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { localizedTextDto } from "./localizedTextDto"; +/** + * Represents the details of a selected option for a product, such as toppings, sauces, or other customizations. + */ +export type selectedOptionDto = { + /** + * Gets the unique identifier for the selected option. + */ + id?: string; + /** + * Gets the unique identifier for the set this option belongs to. + */ + setId?: string; + /** + * Gets the quantity of this option. + */ + quantity: number; + title?: localizedTextDto; +}; diff --git a/src/lib/api/merchant/models/selectedProductDto.ts b/src/lib/api/merchant/models/selectedProductDto.ts new file mode 100644 index 0000000..67b5fe3 --- /dev/null +++ b/src/lib/api/merchant/models/selectedProductDto.ts @@ -0,0 +1,33 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { localizedTextDto } from "./localizedTextDto"; +import type { selectedOptionDto } from "./selectedOptionDto"; +/** + * Represents a selected product in a checkout, such as a menu item with its selected options and quantity. + */ +export type selectedProductDto = { + /** + * Gets the unique identifier for this selected product. + */ + id?: string; + /** + * Gets the unique identifier of the product. + */ + productId: string; + /** + * Gets the quantity of this product. Decimal is used to represent fractional quantities. + */ + quantity: number; + /** + * Gets the collection of selected options for this product. + */ + options: Array | null; + title?: localizedTextDto; + /** + * Additional instructions or comments regarding the product. + */ + comments?: string | null; + readonly documentId?: string; +}; diff --git a/src/lib/api/merchant/models/sellerCompositeDto.ts b/src/lib/api/merchant/models/sellerCompositeDto.ts new file mode 100644 index 0000000..6a3f5d6 --- /dev/null +++ b/src/lib/api/merchant/models/sellerCompositeDto.ts @@ -0,0 +1,61 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { addressDto } from "./addressDto"; +import type { gpsLocationDto } from "./gpsLocationDto"; +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { localizedTextDto } from "./localizedTextDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { simpleContactDto } from "./simpleContactDto"; +export type sellerCompositeDto = { + /** + * Version number of the document. + */ + documentVersion?: number; + schedule?: scheduleDto; + address?: addressDto; + contactInfo?: simpleContactDto; + location?: gpsLocationDto; + /** + * A key value collection for storing additional information + */ + additional?: Record | null; + /** + * A list of image references. + */ + images?: Array | null; + /** + * Identifier for the seller. + */ + id?: string; + /** + * Current published revision id. + */ + revisionId?: string | null; + /** + * Base58 ED25519 public key for this seller. + */ + publicKey?: string; + /** + * The endpoint URL for the seller. + * This is the origin API endpoint for the seller. + */ + endpoint?: string | null; + title?: localizedTextDto; + description?: localizedTextDto; + tagLine?: localizedTextDto; + /** + * Is the seller visible? + */ + isVisible?: boolean; + /** + * Indicates if the seller is currently available + */ + isAvailable?: boolean; + /** + * A list of promotion identifiers. + */ + promotionIds?: Array | null; + readonly documentId?: string; +}; diff --git a/src/lib/api/merchant/models/sellerDto.ts b/src/lib/api/merchant/models/sellerDto.ts new file mode 100644 index 0000000..4e81c5b --- /dev/null +++ b/src/lib/api/merchant/models/sellerDto.ts @@ -0,0 +1,40 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { iTriggerDto } from "./iTriggerDto"; +export type sellerDto = { + /** + * The document type 'restaurant' or 'shop'. + */ + type?: "seller-view" | null; + name?: string | null; + /** + * Endpoint URL for the seller. + */ + endpoint?: string | null; + /** + * The promotion ids for this seller. + */ + promotionIds?: Array | null; + /** + * The availability triggers. + */ + availabilityTriggers?: Array | null; + /** + * Identifier for the seller. + */ + id?: string; + /** + * Base58 ED25519 public key for this seller. + */ + publicKey?: string; + /** + * Gets or sets the ID of the user who last updated the item. + */ + updatedByUserId?: string; + /** + * Gets or sets the UTC date and time when last updated. + */ + utcUpdated?: string; +}; diff --git a/src/lib/api/merchant/models/sellerOperationalStateDto.ts b/src/lib/api/merchant/models/sellerOperationalStateDto.ts new file mode 100644 index 0000000..f66a6b1 --- /dev/null +++ b/src/lib/api/merchant/models/sellerOperationalStateDto.ts @@ -0,0 +1,38 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * The operational state of the seller can be view or changed using this DTO. + * This might include closing or opening, or restricting the types of orders that can be placed. + */ +export type sellerOperationalStateDto = { + /** + * Not Implemented: Only allow VIP orders to be placed for this seller (staff / special customers). + */ + allowVipOrders?: boolean; + /** + * Not Implemented: Allow orders to be placed for this seller. + */ + allowOrders?: boolean; + /** + * The seller is currently open for business. + */ + isOpen?: boolean; + /** + * Not Implemented: An optional reason for the change in operational state. + */ + reasonForChange?: string | null; + /** + * Not Implemented: If set, the current changes will be reverted when the next shift starts. + */ + resetOnNextShift?: boolean; + /** + * Not Implemented: If set, the current changes will be reverted when the first shift of the next working day starts. + */ + resetOnNextWorkingDay?: boolean; + /** + * Not Implemented: If set, the current changes will be reverted at the specified date and time. + */ + effectiveUntil?: string | null; +}; diff --git a/src/lib/api/merchant/models/sellerOperationalStateTriggerDto.ts b/src/lib/api/merchant/models/sellerOperationalStateTriggerDto.ts new file mode 100644 index 0000000..5e50b98 --- /dev/null +++ b/src/lib/api/merchant/models/sellerOperationalStateTriggerDto.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type sellerOperationalStateTriggerDto = { + effect?: triggerEffect; + readonly type?: "seller_operational_state" | null; + allowOrders: boolean; + allowVipOrders: boolean; + reasonForChange?: string | null; + resetOnNextShift?: boolean; + resetOnNextWorkingDay?: boolean; + effectiveUntil?: string | null; + utcCreated?: string; + managerUserId?: string; +}; diff --git a/src/lib/api/merchant/models/sellerPublicAggregateFullDto.ts b/src/lib/api/merchant/models/sellerPublicAggregateFullDto.ts new file mode 100644 index 0000000..bc93453 --- /dev/null +++ b/src/lib/api/merchant/models/sellerPublicAggregateFullDto.ts @@ -0,0 +1,22 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { categoryCompositeDto } from "./categoryCompositeDto"; +import type { optionsRevisionDto } from "./optionsRevisionDto"; +import type { productCompositeDto } from "./productCompositeDto"; +import type { sellerCompositeDto } from "./sellerCompositeDto"; +export type sellerPublicAggregateFullDto = { + /** + * The document type 'restaurant' or 'shop'. + */ + type?: string | null; + /** + * Identifier for the seller. + */ + id?: string; + seller: sellerCompositeDto; + products: Array | null; + options: Array | null; + categories: Array | null; +}; diff --git a/src/lib/api/merchant/models/sellerQueryRequestDto.ts b/src/lib/api/merchant/models/sellerQueryRequestDto.ts new file mode 100644 index 0000000..b2eb509 --- /dev/null +++ b/src/lib/api/merchant/models/sellerQueryRequestDto.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Request DTO for querying canonical sellers with various filter criteria. + */ +export type sellerQueryRequestDto = { + /** + * Number of records to skip for pagination. + */ + offset?: number; + /** + * Maximum number of sellers to return in a single query. + */ + limit?: number; +}; diff --git a/src/lib/api/merchant/models/sellerRevisionDto.ts b/src/lib/api/merchant/models/sellerRevisionDto.ts new file mode 100644 index 0000000..81cd245 --- /dev/null +++ b/src/lib/api/merchant/models/sellerRevisionDto.ts @@ -0,0 +1,59 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { addressDto } from "./addressDto"; +import type { gpsLocationDto } from "./gpsLocationDto"; +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { simpleContactDto } from "./simpleContactDto"; +/** + * Base class for seller data transfer objects, encapsulating common seller properties. + * Restaurants, farms, shops and other merchants inherit this class. + */ +export type sellerRevisionDto = { + /** + * Version number of the document. + */ + documentVersion?: number; + schedule?: scheduleDto; + address?: addressDto; + contactInfo?: simpleContactDto; + location?: gpsLocationDto; + /** + * A key value collection for storing additional information + */ + additional?: Record | null; + /** + * A list of image references. + */ + images?: Array | null; + /** + * Unique identifier of this revision. + */ + revisionId?: string; + /** + * The id of the document this is a revision of. + */ + sellerId?: string; + /** + * The user who created this revision. + */ + creatorId?: string; + /** + * UTC timestamp when the seller was created. + */ + utcCreated?: string; + /** + * Flag indicating whether the seller is published and visible to the public. + */ + isPublished?: boolean; + /** + * UTC timestamp when the seller was published. + */ + utcPublished?: string | null; + /** + * Unique identifier of the user who published the seller. + */ + publisherId?: string | null; +}; diff --git a/src/lib/api/merchant/models/sellerRevisionQueryRequestDto.ts b/src/lib/api/merchant/models/sellerRevisionQueryRequestDto.ts new file mode 100644 index 0000000..743adf3 --- /dev/null +++ b/src/lib/api/merchant/models/sellerRevisionQueryRequestDto.ts @@ -0,0 +1,49 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Request DTO for querying sellers with various filter criteria. + */ +export type sellerRevisionQueryRequestDto = { + /** + * Primary filter - unique identifier of the seller document to query. + */ + documentId?: string | null; + /** + * Free text search filter that matches against seller's searchable fields. + */ + textSearch?: string | null; + /** + * Filter by the seller's Base58 public key identifier. + */ + sellerKey?: string | null; + /** + * Number of records to skip for pagination. + */ + offset?: number; + /** + * Maximum number of records to return in a single query. + */ + limit?: number; + /** + * Filter sellers created on or after this UTC datetime. + */ + utcCreatedFrom?: string | null; + /** + * Filter sellers created on or before this UTC datetime. + */ + utcCreatedTo?: string | null; + /** + * Filter by publication status. If null, returns both published and unpublished sellers. + */ + isPublished?: boolean | null; + /** + * Filter sellers by the ID of the user who published them. + */ + publishedByUserId?: string | null; + /** + * Filter sellers by exact creation datetime in UTC. + */ + utcCreated?: string | null; +}; diff --git a/src/lib/api/merchant/models/sellerViewDto.ts b/src/lib/api/merchant/models/sellerViewDto.ts new file mode 100644 index 0000000..df84a53 --- /dev/null +++ b/src/lib/api/merchant/models/sellerViewDto.ts @@ -0,0 +1,48 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { addressDto } from "./addressDto"; +import type { gpsLocationDto } from "./gpsLocationDto"; +import type { imageReferenceDto } from "./imageReferenceDto"; +import type { iTriggerDto } from "./iTriggerDto"; +import type { localizedTextDto } from "./localizedTextDto"; +import type { scheduleDto } from "./scheduleDto"; +import type { simpleContactDto } from "./simpleContactDto"; +export type sellerViewDto = { + /** + * Version number of the document. + */ + documentVersion?: number; + schedule?: scheduleDto; + address?: addressDto; + contactInfo?: simpleContactDto; + location?: gpsLocationDto; + /** + * A key value collection for storing additional information + */ + additional?: Record | null; + /** + * A list of image references. + */ + images?: Array | null; + /** + * Unique identifier of this revision. + */ + revisionId?: string; + /** + * The id of the document this is a revision of. + */ + sellerId?: string; + /** + * UTC timestamp when the seller was created. + */ + utcCreated?: string; + title?: localizedTextDto; + description?: localizedTextDto; + tagLine?: localizedTextDto; + /** + * The promotion ids for this seller. + */ + availabilityTriggers?: Array | null; +}; diff --git a/src/lib/api/merchant/models/sessionIpResponseDto.ts b/src/lib/api/merchant/models/sessionIpResponseDto.ts new file mode 100644 index 0000000..cffd0a4 --- /dev/null +++ b/src/lib/api/merchant/models/sessionIpResponseDto.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Response DTO for fetching the client's IP. + */ +export type sessionIpResponseDto = { + /** + * Gets or sets the web client's IP address. + */ + clientIp: string | null; +}; diff --git a/src/lib/api/merchant/models/sessionStatus.ts b/src/lib/api/merchant/models/sessionStatus.ts new file mode 100644 index 0000000..2a75a4d --- /dev/null +++ b/src/lib/api/merchant/models/sessionStatus.ts @@ -0,0 +1,38 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Enum representing the status of a QR authentication session. + * + * **Enum Values:** + * + * - Pending: The session is pending authentication. + * - Authenticated: The session has been authenticated. + * - Used: The session has been used. + * - Expired: The session has expired. + * - Invalidated: The session has been invalidated. + * + */ +export enum sessionStatus { + /** + * (value: "Pending") The session is pending authentication. + */ + Pending = "Pending", + /** + * (value: "Authenticated") The session has been authenticated. + */ + Authenticated = "Authenticated", + /** + * (value: "Used") The session has been used. + */ + Used = "Used", + /** + * (value: "Expired") The session has expired. + */ + Expired = "Expired", + /** + * (value: "Invalidated") The session has been invalidated. + */ + Invalidated = "Invalidated", +} diff --git a/src/lib/api/merchant/models/sessionStatusDto.ts b/src/lib/api/merchant/models/sessionStatusDto.ts new file mode 100644 index 0000000..cbafc1c --- /dev/null +++ b/src/lib/api/merchant/models/sessionStatusDto.ts @@ -0,0 +1,23 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { sessionStatus } from "./sessionStatus"; +/** + * DTO for the session status. + */ +export type sessionStatusDto = { + /** + * Gets or sets the unique session identifier. + */ + sessionId: string | null; + status: sessionStatus; + /** + * Gets or sets the timestamp when the session was created. + */ + createdAt?: string; + /** + * Gets or sets the timestamp when the session expires. + */ + expiresAt?: string; +}; diff --git a/src/lib/api/merchant/models/signedAuthDocumentDto.ts b/src/lib/api/merchant/models/signedAuthDocumentDto.ts new file mode 100644 index 0000000..230fed9 --- /dev/null +++ b/src/lib/api/merchant/models/signedAuthDocumentDto.ts @@ -0,0 +1,16 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { authDocumentDto } from "./authDocumentDto"; +/** + * DTO for the authentication submission from the mobile app. + * It bundles the auth document with its corresponding signature. + */ +export type signedAuthDocumentDto = { + document: authDocumentDto; + /** + * Gets or sets the base64 encoded signature of the auth document. + */ + signature: string | null; +}; diff --git a/src/lib/api/merchant/models/simpleContactDto.ts b/src/lib/api/merchant/models/simpleContactDto.ts new file mode 100644 index 0000000..bf70bf0 --- /dev/null +++ b/src/lib/api/merchant/models/simpleContactDto.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type simpleContactDto = { + name?: string | null; + phone?: string | null; + email?: string | null; + notes?: string | null; + extra?: Record | null; +}; diff --git a/src/lib/api/merchant/models/startSessionResponseDto.ts b/src/lib/api/merchant/models/startSessionResponseDto.ts new file mode 100644 index 0000000..5370ab9 --- /dev/null +++ b/src/lib/api/merchant/models/startSessionResponseDto.ts @@ -0,0 +1,18 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Response DTO for starting a new session. + * Contains the one-time session ID and the client's IP address. + */ +export type startSessionResponseDto = { + /** + * Gets or sets the unique, unpredictable session identifier. + */ + sessionId: string | null; + /** + * Gets or sets the web client's IP address. + */ + clientIp: string | null; +}; diff --git a/src/lib/api/merchant/models/stopListTriggerDto.ts b/src/lib/api/merchant/models/stopListTriggerDto.ts new file mode 100644 index 0000000..a4b5ef1 --- /dev/null +++ b/src/lib/api/merchant/models/stopListTriggerDto.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type stopListTriggerDto = { + effect?: triggerEffect; + readonly type?: "stop_list" | null; + utcCreated?: string; + managerUserId?: string; +}; diff --git a/src/lib/api/merchant/models/systemSecurityDto.ts b/src/lib/api/merchant/models/systemSecurityDto.ts new file mode 100644 index 0000000..95df2be --- /dev/null +++ b/src/lib/api/merchant/models/systemSecurityDto.ts @@ -0,0 +1,23 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { rolePermissionsDto } from "./rolePermissionsDto"; +/** + * Represents the system security configuration, including the mappings between roles and permissions + * currently in use, as well as the complete set of available permissions and roles defined in the system. + */ +export type systemSecurityDto = { + /** + * The role-permission mappings that are currently active. + */ + inUse?: Array | null; + /** + * All available permissions in the system. + */ + permissions?: Array | null; + /** + * The currently defined roles in the system. + */ + roles?: Array | null; +}; diff --git a/src/lib/api/merchant/models/tag.ts b/src/lib/api/merchant/models/tag.ts new file mode 100644 index 0000000..2fe79ce --- /dev/null +++ b/src/lib/api/merchant/models/tag.ts @@ -0,0 +1,5 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type tag = Record; diff --git a/src/lib/api/merchant/models/textQueryRequestDto.ts b/src/lib/api/merchant/models/textQueryRequestDto.ts new file mode 100644 index 0000000..d10af65 --- /dev/null +++ b/src/lib/api/merchant/models/textQueryRequestDto.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type textQueryRequestDto = { + documentId?: string | null; + key?: string | null; + containsText?: string | null; + lang?: string | null; + offset?: number; + limit?: number; + utcCreatedFrom?: string | null; + utcCreatedTo?: string | null; + isPublished?: boolean | null; + publishedByUserId?: string | null; + utcCreated?: string | null; +}; diff --git a/src/lib/api/merchant/models/textRevisionDto.ts b/src/lib/api/merchant/models/textRevisionDto.ts new file mode 100644 index 0000000..a0d6eaf --- /dev/null +++ b/src/lib/api/merchant/models/textRevisionDto.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type textRevisionDto = { + documentId?: string; + key?: string | null; + lang?: string | null; + value?: string | null; + revisionId?: string; + creatorId?: string; + utcCreated?: string; + isPublished?: boolean; + utcPublished?: string | null; + publisherId?: string | null; + additional?: Record | null; +}; diff --git a/src/lib/api/merchant/models/timeRangeDto.ts b/src/lib/api/merchant/models/timeRangeDto.ts new file mode 100644 index 0000000..01daa3f --- /dev/null +++ b/src/lib/api/merchant/models/timeRangeDto.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Data transfer object for TimeRange. + */ +export type timeRangeDto = { + /** + * Gets or sets the start time. + */ + start?: string; + /** + * Gets or sets the end time. + */ + end?: string; +}; diff --git a/src/lib/api/merchant/models/timeTriggerDto.ts b/src/lib/api/merchant/models/timeTriggerDto.ts new file mode 100644 index 0000000..f5e0f77 --- /dev/null +++ b/src/lib/api/merchant/models/timeTriggerDto.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { triggerEffect } from "./triggerEffect"; +export type timeTriggerDto = { + effect?: triggerEffect; + readonly type?: "time" | null; + /** + * A time value in 24-hour format (HH:mm:ss.FFFFFFF). + */ + startTime: string; + /** + * A time value in 24-hour format (HH:mm:ss.FFFFFFF). + */ + endTime: string; +}; diff --git a/src/lib/api/merchant/models/triggerEffect.ts b/src/lib/api/merchant/models/triggerEffect.ts new file mode 100644 index 0000000..3bc1176 --- /dev/null +++ b/src/lib/api/merchant/models/triggerEffect.ts @@ -0,0 +1,31 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **None**: No effect. The trigger does not influence the document in any way. + * - 1 - **SetUnavailable**: The trigger affects availability of the document. + * - 2 - **SetInvisible**: The trigger affects visibility of the document. + * - 4 - **SetStopped**: The trigger can stop the document. + * + */ +export enum triggerEffect { + /** + * (value: 0) No effect. The trigger does not influence the document in any way. + */ + None = 0, + /** + * (value: 1) The trigger affects availability of the document. + */ + SetUnavailable = 1, + /** + * (value: 2) The trigger affects visibility of the document. + */ + SetInvisible = 2, + /** + * (value: 4) The trigger can stop the document. + */ + SetStopped = 4, +} diff --git a/src/lib/api/merchant/models/updatePermissionsRequest.ts b/src/lib/api/merchant/models/updatePermissionsRequest.ts new file mode 100644 index 0000000..fc57a3f --- /dev/null +++ b/src/lib/api/merchant/models/updatePermissionsRequest.ts @@ -0,0 +1,21 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Represents a request to update permissions by either adding or removing a specific permission for a given role. + */ +export type updatePermissionsRequest = { + /** + * Gets or sets the role for which the permission update is requested. + */ + role?: string; + /** + * Gets or sets the permission that is to be added or removed. + */ + permission?: string; + /** + * Gets or sets a value indicating whether the permission is to be added (true) or removed (false). + */ + isAdd?: boolean; +}; diff --git a/src/lib/api/merchant/models/userDto.ts b/src/lib/api/merchant/models/userDto.ts new file mode 100644 index 0000000..abc7c56 --- /dev/null +++ b/src/lib/api/merchant/models/userDto.ts @@ -0,0 +1,53 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { verifiedValueDto } from "./verifiedValueDto"; +/** + * Represents a user data transfer object (DTO) containing user details and associated metadata. + */ +export type userDto = { + /** + * Gets or sets the unique identifier for the user. + */ + id?: string; + /** + * Gets or sets the remote identifier for the user, typically used for external references. + */ + remoteId?: string | null; + /** + * Gets or sets the user's name. + */ + name?: string | null; + /** + * Gets or sets the URL of the user's avatar image. + */ + avatarUrl?: string | null; + /** + * Gets or sets the public key associated with the user, if applicable. + */ + publicKey?: string | null; + email?: verifiedValueDto; + phoneNumber?: verifiedValueDto; + /** + * Gets or sets the set of roles assigned to the user. + * Roles are generally set by the authority server. + */ + roles?: Array | null; + /** + * Gets or sets a value indicating whether the user has been verified. + */ + isVerified?: boolean; + /** + * Gets or sets the Url of the authority that manages the user, if applicable. + */ + authorityUrl?: string | null; + /** + * Gets or sets the UTC date and time when the user information was last updated. + */ + utcUpdated?: string; + /** + * Gets or sets a dictionary for storing additional key-value pairs related to the user. + */ + extraKeys?: Record | null; +}; diff --git a/src/lib/api/merchant/models/userQueryRequest.ts b/src/lib/api/merchant/models/userQueryRequest.ts new file mode 100644 index 0000000..d87182c --- /dev/null +++ b/src/lib/api/merchant/models/userQueryRequest.ts @@ -0,0 +1,30 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type userQueryRequest = { + /** + * Search for users where any searchable property contains this text. + */ + searchText?: string | null; + /** + * Search for users where the name contains this text. + */ + nameContains?: string | null; + /** + * Comma separated list of roles. The user must have all of these roles. + */ + hasAnyRole?: string | null; + /** + * Comma separated list of roles. The user must have any of these roles. + */ + hasAllRole?: string | null; + /** + * If not specified, defaults to 0. + */ + offset?: number; + /** + * If not specified, defaults to 20. + */ + limit?: number; +}; diff --git a/src/lib/api/merchant/models/verifiedValueDto.ts b/src/lib/api/merchant/models/verifiedValueDto.ts new file mode 100644 index 0000000..633d1b1 --- /dev/null +++ b/src/lib/api/merchant/models/verifiedValueDto.ts @@ -0,0 +1,21 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Represents a value that has been verified by a trusted source. + */ +export type verifiedValueDto = { + /** + * The value being trusted, such as a phone number or email address. + */ + value?: string | null; + /** + * When this document was last updated. + */ + utcUpdated?: string; + /** + * The verification status of this value. + */ + isVerified?: boolean; +}; diff --git a/src/lib/api/merchant/models/versionCheck.ts b/src/lib/api/merchant/models/versionCheck.ts new file mode 100644 index 0000000..06aaa2f --- /dev/null +++ b/src/lib/api/merchant/models/versionCheck.ts @@ -0,0 +1,26 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * **Enum Values:** + * + * - 0 - **Ok** + * - 100 - **Old** + * - 200 - **Incompatible** + * + */ +export enum versionCheck { + /** + * (value: 0) + */ + Ok = 0, + /** + * (value: 100) + */ + Old = 100, + /** + * (value: 200) + */ + Incompatible = 200, +} diff --git a/src/lib/api/merchant/open-api.json b/src/lib/api/merchant/open-api.json new file mode 100644 index 0000000..bdae5fc --- /dev/null +++ b/src/lib/api/merchant/open-api.json @@ -0,0 +1,11211 @@ +{ + "openapi": "3.0.1", + "info": { + "title": "Local Merchant Hub", + "version": "v0.0.0" + }, + "paths": { + "/mcp/message": { + "post": { + "tags": [ + "AI" + ], + "summary": "Serves MCP JSON‑RPC requests for the MCP SSE server", + "responses": { + "200": { + "description": "OK" + }, + "202": { + "description": "Accepted" + }, + "204": { + "description": "No Content" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/mcp/sse": { + "get": { + "tags": [ + "AI" + ], + "summary": "Serves SSE connections for the MCP SSE server", + "responses": { + "200": { + "description": "OK" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/auth/qr/session": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Create a new QR authentication session.", + "description": "This endpoint creates a new authentication session for QR-based authentication.\r\nIt generates a unique session ID and records the client's IP address.\r\nThe web client uses this information to generate a QR code that can be scanned by a mobile app.", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/startSessionResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/auth/qr/session/{sessionId}/ip": { + "get": { + "tags": [ + "Authentication" + ], + "summary": "Get the client IP address for a session.", + "description": "This endpoint is used by the mobile app after scanning a QR code.\r\nIt retrieves the client IP address associated with the session ID.\r\nThe mobile app uses this IP address when creating the authentication document.", + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sessionIpResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/auth/qr/session/{sessionId}/status": { + "get": { + "tags": [ + "Authentication" + ], + "summary": "Get the status of a QR authentication session.", + "description": "This endpoint allows the web client to poll for the status of an authentication session.\r\nIt returns the current state of the session (pending, authenticated, expired, or invalidated).\r\nThe web client uses this to detect when the mobile app completes authentication.", + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sessionStatusDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/auth/qr/session/{sessionId}/header": { + "get": { + "tags": [ + "Authentication" + ], + "summary": "Get the authentication header for a QR authentication session.", + "description": "This endpoint allows the web client to poll for the authentication header of a session.\r\nIt returns the X-Signed-Auth header value that can be used to authenticate requests.\r\nThe web client uses this to make authenticated requests after the mobile app completes authentication.", + "parameters": [ + { + "name": "sessionId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/authHeaderResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/auth/qr/authenticate": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Authenticate with a signed authentication document.", + "description": "This endpoint accepts a signed authentication document from the mobile app.\r\nIt verifies the signature, checks that the client IP matches, and validates the document's validity period.\r\nUpon successful verification, it marks the session as authenticated and returns a success result.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/signedAuthDocumentDto" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/authenticationResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/canonical": { + "post": { + "tags": [ + "Categories (Canonical)" + ], + "summary": "Create a canonical category entry.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createCategoryDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/canonical/{categoryId}": { + "get": { + "tags": [ + "Categories (Canonical)" + ], + "summary": "Retrieve a canonical category entry.", + "parameters": [ + { + "name": "categoryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + }, + "put": { + "tags": [ + "Categories (Canonical)" + ], + "summary": "Update a canonical category entry.", + "parameters": [ + { + "name": "categoryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createCategoryDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + }, + "delete": { + "tags": [ + "Categories (Canonical)" + ], + "summary": "Delete a canonical category entry.", + "parameters": [ + { + "name": "categoryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/canonical/query": { + "post": { + "tags": [ + "Categories (Canonical)" + ], + "summary": "Query canonical category data filtered by options.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/canonical/stop-list": { + "post": { + "tags": [ + "Categories (Canonical)" + ], + "summary": "Adds multiple categories to the 'stop list'.", + "description": "Items on the 'stop list' are not available for purchase.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryStopListDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + }, + "delete": { + "tags": [ + "Categories (Canonical)" + ], + "summary": "Removes multiple categories from the 'stop list'.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryStopListDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/canonical/stop-list/{sellerId}": { + "get": { + "tags": [ + "Categories (Canonical)" + ], + "summary": "Gets the list of stopped category ids for a specific seller.", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/revision/{categoryId}": { + "post": { + "tags": [ + "Categories (Revisions)" + ], + "summary": "Creates a revision of a category document.", + "parameters": [ + { + "name": "categoryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createCategoryRevisionDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/revision/published/{categoryId}": { + "get": { + "tags": [ + "Categories (Revisions)" + ], + "summary": "Get the currently published category", + "parameters": [ + { + "name": "categoryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryViewDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/revision/{revisionId}": { + "get": { + "tags": [ + "Categories (Revisions)" + ], + "summary": "Get a specific revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/revision/query": { + "post": { + "tags": [ + "Categories (Revisions)" + ], + "summary": "Query revisions filtered by options.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryRevisionQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/revision/{revisionId}/publish": { + "put": { + "tags": [ + "Categories (Revisions)" + ], + "summary": "Publish the specified revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/revision/{revisionId}/unpublish": { + "put": { + "tags": [ + "Categories (Revisions)" + ], + "summary": "Unpublish the specified revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/composite/{categoryId}": { + "get": { + "tags": [ + "Categories (Views)" + ], + "summary": "Get the published category composite view", + "description": "This view combines the canonical, revision and text models into a single view model.", + "parameters": [ + { + "name": "categoryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryCompositeDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/category/composite/query/by-canonical": { + "post": { + "tags": [ + "Categories (Views)" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryCompositeDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/category/composite/query/by-revision": { + "post": { + "tags": [ + "Categories (Views)" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryRevisionQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/categoryCompositeDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/delivery/courier-guest/link/{orderId}": { + "get": { + "tags": [ + "Deliveries" + ], + "summary": "Create a guest delivery link.", + "description": "This endpoint will create a guest delivery link for supplied order on the DSP-o application.\r\nThe link is usually converted to a QR code and scanned in by the prospective driver.\r\nThe 'link-code' contained in the url allows that driver to accept an order as a 'guest courier'", + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/delivery/price-estimation": { + "post": { + "tags": [ + "Deliveries" + ], + "summary": "Get price estimations for delivery.", + "description": "This endpoint returns price estimations for a delivery based on the provided locations and scheduled time.\r\nIt requires at least two locations (pickup and delivery) to calculate the price.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/priceEstimationRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/priceEstimationDto" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/delivery/driver-link/{orderId}": { + "get": { + "tags": [ + "Deliveries" + ], + "summary": "Get driver link for an order.", + "description": "This endpoint returns a driver link for the specified order. The link can be used by a driver to accept the order.", + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/user": { + "get": { + "tags": [ + "User" + ], + "summary": "Get the currently authenticated user", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/userDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/user/{userId}": { + "get": { + "tags": [ + "User" + ], + "summary": "Get a user by their ID", + "description": "You may only retrieve information about yourself or users you have permission to view. Admins can view all users.", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/userDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/user/permissions": { + "get": { + "tags": [ + "User" + ], + "summary": "Get user's current permissions", + "description": "This endpoint will return a list of roles and their associated permissions for the currently authenticated user.", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/rolePermissionsDto" + } + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/image/upload": { + "post": { + "tags": [ + "Images" + ], + "summary": "Uploads an asset to storage.", + "description": "This endpoint expects multipart/form-data with two keyed items:\r\n'json' = The JSON parameters of type 'ImageParametersDto'\r\n'image' = The image", + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/void" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/img/{digest}": { + "get": { + "tags": [ + "Images" + ], + "summary": "Download an image by its digest", + "description": "When supplied a valid base58 encoded digest, this endpoint will return the image associated with that id as a file download.\r\nThe response will be a file download with the correct content type.\r\nThe file name will be the digest with the correct extension.", + "parameters": [ + { + "name": "digest", + "in": "path", + "description": "This is a base58 encoded digest, a unique identifier for the image.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "image/webp": { + "schema": { + "type": "string", + "format": "byte" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/img/{digest}/{aspect}/{size}": { + "get": { + "tags": [ + "Images" + ], + "summary": "Download a resized image by digest", + "description": "When supplied a valid base58 encoded digest, this endpoint will return the image associated with that id as a file download.\r\nThe response will be a file download with the correct content type.\r\nThe file name will be the digest with the correct extension.", + "parameters": [ + { + "name": "digest", + "in": "path", + "description": "This is a base58 encoded digest, a unique identifier for the image.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "aspect", + "in": "path", + "description": "This must be set: [landscape, square, portrait]", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "size", + "in": "path", + "description": "This must be set: [XS, S, M, HD, FHD, QHD, UHD]", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "image/webp": { + "schema": { + "type": "string", + "format": "byte" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/oidc.json": { + "get": { + "tags": [ + "OIDC" + ], + "summary": "Returns OIDC information", + "description": "Returns OIDC information for the standard OIDC application client, this information is used to enable clients to connect to the correct OIDC endpoint.", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/oidcConnectResponseDto" + } + } + } + } + } + } + }, + "/oidc-{appType}.json": { + "get": { + "tags": [ + "OIDC" + ], + "summary": "Returns OIDC information by application type", + "description": "Returns OIDC information for the given application client type, this information is used to enable clients to connect to the correct OIDC endpoint.", + "parameters": [ + { + "name": "appType", + "in": "path", + "description": "Application type (eg: \"native\" would be native mobile apps).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/oidcConnectResponseDto" + } + } + } + } + } + } + }, + "/api/order/{orderId}": { + "get": { + "tags": [ + "Orders" + ], + "summary": "Retrieves a single order by its ID.", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "The order id", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orderViewDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/order/query": { + "post": { + "tags": [ + "Orders" + ], + "summary": "Query the system's orders.", + "requestBody": { + "description": "A dto containing the optional filters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orderQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/order/state": { + "put": { + "tags": [ + "Orders" + ], + "summary": "Change order state, and update estimated ready time.", + "requestBody": { + "description": "The requested change document", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orderStateChangeRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orderStateDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "deprecated": true, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/order/state/{orderId}": { + "get": { + "tags": [ + "Orders" + ], + "summary": "Get the current state of an order.", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "The order id", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orderStateDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/order/state-machine": { + "get": { + "tags": [ + "Orders" + ], + "summary": "Return UmlDotGraph for current implementation of order state machine.", + "responses": { + "200": { + "description": "OK", + "content": { + "text/vnd.graphviz": { + "schema": { + "type": "string" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/order/{orderId}/next-state": { + "post": { + "tags": [ + "Orders" + ], + "summary": "Gets the next state of an order.", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "The specified order id", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "description": "The current state of the order", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orderNextStatusDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orderStateDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/order/{orderId}/cancel": { + "post": { + "tags": [ + "Orders" + ], + "summary": "Cancel the specified order.", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "The specified order id", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/order": { + "post": { + "tags": [ + "Orders" + ], + "summary": "Create an order.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orderCreateDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orderDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/order/cancellation": { + "post": { + "tags": [ + "Orders" + ], + "summary": "Cancel/reject an order with a specific failure reason.", + "requestBody": { + "description": "The order failure request containing orderId and failure reason", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orderFailureRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orderStateDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/order/basket/calculate": { + "post": { + "tags": [ + "Orders (Basket)" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/basketDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/calculatedCheckoutDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/options/revision/{optionsId}": { + "post": { + "tags": [ + "Product Options (Revisions)" + ], + "summary": "Creates a revision of a product option set document.", + "parameters": [ + { + "name": "optionsId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createOptionsRevisionDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/optionsRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/options/revision": { + "post": { + "tags": [ + "Product Options (Revisions)" + ], + "summary": "Creates a new product option set document.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createOptionsRevisionDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/optionsRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/options/revision/published/{optionsId}": { + "get": { + "tags": [ + "Product Options (Revisions)" + ], + "summary": "Get the currently published product option set", + "parameters": [ + { + "name": "optionsId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/optionsViewDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/options/revision/{revisionId}": { + "get": { + "tags": [ + "Product Options (Revisions)" + ], + "summary": "Get a specific revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/optionsRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/options/revision/query": { + "post": { + "tags": [ + "Product Options (Revisions)" + ], + "summary": "Query filtered by options.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/optionsQueryDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/options/revision/{revisionId}/publish": { + "put": { + "tags": [ + "Product Options (Revisions)" + ], + "summary": "Publish the specified revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/options/revision/{revisionId}/unpublish": { + "put": { + "tags": [ + "Product Options (Revisions)" + ], + "summary": "Unpublish the specified revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/canonical/query": { + "post": { + "tags": [ + "Products (Canonical)" + ], + "summary": "Query canonical product data filtered by options.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/canonical": { + "post": { + "tags": [ + "Products (Canonical)" + ], + "summary": "Create a canonical product entry.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createProductDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/canonical/{productId}": { + "get": { + "tags": [ + "Products (Canonical)" + ], + "summary": "Retrieve a canonical product entry.", + "parameters": [ + { + "name": "productId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + }, + "put": { + "tags": [ + "Products (Canonical)" + ], + "summary": "Update a canonical product entry.", + "parameters": [ + { + "name": "productId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createProductDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + }, + "delete": { + "tags": [ + "Products (Canonical)" + ], + "summary": "Delete a canonical product entry.", + "parameters": [ + { + "name": "productId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/canonical/stop-list": { + "post": { + "tags": [ + "Products (Canonical)" + ], + "summary": "Adds multiple products to the 'stop list'.", + "description": "Items on the 'stop list' are not available for purchase.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productStopListDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + }, + "delete": { + "tags": [ + "Products (Canonical)" + ], + "summary": "Removes multiple products from the 'stop list'.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productStopListDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/canonical/stop-list/{sellerId}": { + "get": { + "tags": [ + "Products (Canonical)" + ], + "summary": "Gets the list of stopped product ids for a specific seller.", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/revision/{productId}": { + "post": { + "tags": [ + "Products (Revisions)" + ], + "summary": "Creates a revision of a product document.", + "parameters": [ + { + "name": "productId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createProductRevisionDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/revision/published/{productId}": { + "get": { + "tags": [ + "Products (Revisions)" + ], + "summary": "Get the currently published product", + "parameters": [ + { + "name": "productId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/revision/{revisionId}": { + "get": { + "tags": [ + "Products (Revisions)" + ], + "summary": "Get a specific revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/revision/query": { + "post": { + "tags": [ + "Products (Revisions)" + ], + "summary": "Query revisions filtered by options.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productRevisionQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/revision/{revisionId}/publish": { + "put": { + "tags": [ + "Products (Revisions)" + ], + "summary": "Publish the specified revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/revision/{revisionId}/unpublish": { + "put": { + "tags": [ + "Products (Revisions)" + ], + "summary": "Unpublish the specified revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/composite/{productId}": { + "get": { + "tags": [ + "Products (Views)" + ], + "summary": "Get the published product composite view", + "description": "This view combines the canonical, revision and text models into a single view model.", + "parameters": [ + { + "name": "productId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productCompositeDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/product/composite/query/by-canonical": { + "post": { + "tags": [ + "Products (Views)" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productCompositeDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/product/composite/query/by-revision": { + "post": { + "tags": [ + "Products (Views)" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productRevisionQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/productCompositeDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/promotion": { + "post": { + "tags": [ + "Promotions" + ], + "summary": "Create a promotion.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createPromotionDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/promotionViewDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/promotion/{promotionId}": { + "post": { + "tags": [ + "Promotions" + ], + "summary": "Retrieve a promotion.", + "parameters": [ + { + "name": "promotionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/promotionViewDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + }, + "put": { + "tags": [ + "Promotions" + ], + "summary": "Update a promotion.", + "parameters": [ + { + "name": "promotionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createPromotionDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + }, + "delete": { + "tags": [ + "Promotions" + ], + "summary": "Delete a promotion.", + "parameters": [ + { + "name": "promotionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/promotions/query": { + "post": { + "tags": [ + "Promotions" + ], + "summary": "Handles promotion query requests by filtering based on provided criteria.", + "requestBody": { + "description": "The query parameters for filtering promotions.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/promotionQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + } + } + }, + "/api/user/query": { + "post": { + "tags": [ + "User" + ], + "summary": "Query users", + "description": "This endpoint will return a list of users based on the query parameters provided.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/userQueryRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/security/permissions": { + "put": { + "tags": [ + "Security" + ], + "summary": "Updates the system's permissions for a given role.", + "description": "Permissions changes are stored as a form of 'audit' so that changes to the default permissions can be made safely.\r\nFor instance, if a site owner has removed a permission for a role, and the default permissions in the system are changed by developers, the site owner's changes will not be lost.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/updatePermissionsRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/security/system": { + "get": { + "tags": [ + "Security" + ], + "summary": "Lists the system's permissions and roles.", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/systemSecurityDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/canonical": { + "post": { + "tags": [ + "Sellers (Canonical)" + ], + "summary": "Create a canonical seller entry.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createSellerDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/canonical/{sellerKey}": { + "get": { + "tags": [ + "Sellers (Canonical)" + ], + "summary": "Get the currently published document by publicKey", + "parameters": [ + { + "name": "publicKey", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/canonical/{sellerId}": { + "get": { + "tags": [ + "Sellers (Canonical)" + ], + "summary": "Retrieve a canonical seller entry.", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + }, + "put": { + "tags": [ + "Sellers (Canonical)" + ], + "summary": "Update a canonical seller entry.", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createSellerDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + }, + "delete": { + "tags": [ + "Sellers (Canonical)" + ], + "summary": "Delete a canonical seller entry.", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/canonical/query": { + "post": { + "tags": [ + "Sellers (Canonical)" + ], + "summary": "Query canonical seller data filtered by options.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/canonical/open-state/{sellerId}": { + "put": { + "tags": [ + "Sellers (Canonical)" + ], + "summary": "Updates the open/closed state of a seller.", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerOperationalStateDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerOperationalStateDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + }, + "get": { + "tags": [ + "Sellers (Canonical)" + ], + "summary": "Gets the open/closed state of a seller.", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerOperationalStateDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/revision/{sellerId}": { + "post": { + "tags": [ + "Sellers (Revisions)" + ], + "summary": "Creates a revision of a seller document.", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/baseCreateSellerRevisionDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/restaurantRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/revision/published/{sellerId}": { + "get": { + "tags": [ + "Sellers (Revisions)" + ], + "summary": "Get the currently published seller", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerViewDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/revision/{revisionId}": { + "get": { + "tags": [ + "Sellers (Revisions)" + ], + "summary": "Get a specific revision by revisionId", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/revision/query": { + "post": { + "tags": [ + "Sellers (Revisions)" + ], + "summary": "Query revisions filtered by options.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerRevisionQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/revision/{revisionId}/publish": { + "put": { + "tags": [ + "Sellers (Revisions)" + ], + "summary": "Publish the specified revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/revision/{revisionId}/unpublish": { + "put": { + "tags": [ + "Sellers (Revisions)" + ], + "summary": "Unpublish the specified revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/composite": { + "get": { + "tags": [ + "Sellers (Views)" + ], + "summary": "Get the default published seller composite view", + "description": "This view combines the canonical, revision and text models into a single view model.", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerCompositeDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/composite/{sellerId}": { + "get": { + "tags": [ + "Sellers (Views)" + ], + "summary": "Get the published seller composite view", + "description": "This view combines the canonical, revision and text models into a single view model.", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerCompositeDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/composite/{sellerKey}": { + "get": { + "tags": [ + "Sellers (Views)" + ], + "summary": "Get the published seller composite view by PublicKey", + "description": "This view combines the canonical, revision and text models into a single view model.", + "parameters": [ + { + "name": "publicKey", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerCompositeDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/seller/aggregate/full": { + "get": { + "tags": [ + "Sellers (Views)" + ], + "summary": "Get the published seller aggregate full view", + "description": "This view combines the canonical, revision and text models into a single view model.", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerPublicAggregateFullDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/aggregate/full/{sellerId}": { + "get": { + "tags": [ + "Sellers (Views)" + ], + "summary": "Get the published seller aggregate full view", + "description": "This view combines the canonical, revision and text models into a single view model.", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerPublicAggregateFullDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/aggregate/full/{sellerId}/{utcUnixSeconds}": { + "get": { + "tags": [ + "Sellers (Views)" + ], + "summary": "Get the published seller aggregate full view at scheduled time.", + "description": "This view combines the canonical, revision and text models into a single view model.", + "parameters": [ + { + "name": "sellerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "utcUnixSeconds", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerPublicAggregateFullDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/seller/aggregate/full/{publicKey}": { + "get": { + "tags": [ + "Sellers (Views)" + ], + "summary": "Get the published seller aggregate full view by PublicKey.", + "description": "This view combines the canonical, revision and text models into a single view model.", + "parameters": [ + { + "name": "publicKey", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerPublicAggregateFullDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/seller/aggregate/full/{publicKey}/{utcUnixSeconds}": { + "get": { + "tags": [ + "Sellers (Views)" + ], + "summary": "Get the published seller aggregate full view by PublicKey at scheduled time.", + "description": "This view combines the canonical, revision and text models into a single view model.", + "parameters": [ + { + "name": "publicKey", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "utcUnixSeconds", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sellerPublicAggregateFullDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/events/orders/{orderId}": { + "get": { + "tags": [ + "Server Side Events" + ], + "summary": "Returns a specific order's event stream.", + "description": "Requires any form of public key authentication.", + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/events/orders": { + "get": { + "tags": [ + "Server Side Events" + ], + "summary": "Returns an order event stream", + "description": "Requires any form of public key authentication.", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/events/stream": { + "get": { + "tags": [ + "Server Side Events" + ], + "summary": "Opens a private event stream", + "description": "This endpoint will open a private event stream for the authenticated user.\r\nAll events that the user has permission to see will be sent to this stream.", + "parameters": [ + { + "name": "options", + "in": "query", + "description": "Options allow for different subscription types", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/events/stream/{userId}": { + "get": { + "tags": [ + "Server Side Events" + ], + "summary": "Opens a private event stream for a user", + "description": "Only users with the Admin role can open streams for other users.", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "options", + "in": "query", + "description": "Options allow for different subscription types", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/system/version": { + "get": { + "tags": [ + "System" + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/api/system/version/check": { + "get": { + "tags": [ + "System" + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/versionCheck" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + } + } + }, + "/api/test/apiKey/{keyName}": { + "post": { + "tags": [ + "Tests" + ], + "summary": "Returns an api access token for the given key name.", + "parameters": [ + { + "name": "keyName", + "in": "path", + "description": "The name of the key", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/test/dspTest": { + "post": { + "tags": [ + "Tests" + ], + "summary": "Test the connection to the DSP.", + "description": "This endpoint will test connectivity to the DSP by fetching the API user as seen by the remote system.", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/userDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/text/revision": { + "post": { + "tags": [ + "Translatable Text (Revisions)" + ], + "summary": "Creates a revision of a text document.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createTextRevisionDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/textRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/text/revision/published/{documentId}/{key}": { + "get": { + "tags": [ + "Translatable Text (Revisions)" + ], + "summary": "Get the currently published document", + "parameters": [ + { + "name": "documentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "key", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/textRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/text/revision/{revisionId}": { + "get": { + "tags": [ + "Translatable Text (Revisions)" + ], + "summary": "Get a specific revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/textRevisionDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/text/revision/query": { + "post": { + "tags": [ + "Translatable Text (Revisions)" + ], + "summary": "Query texts filtered by options.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/textQueryRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryResultDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/text/revision/{revisionId}/publish": { + "put": { + "tags": [ + "Translatable Text (Revisions)" + ], + "summary": "Publish the specified revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/text/revision/{revisionId}/unpublish": { + "put": { + "tags": [ + "Translatable Text (Revisions)" + ], + "summary": "Unpublish the specified revision", + "parameters": [ + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/verifications/verify": { + "post": { + "tags": [ + "Verifications" + ], + "summary": "Verify a public key using a phone number.", + "requestBody": { + "description": "The request document", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/humanVerificationRequestDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/humanVerificationStatusDto" + } + } + } + }, + "400": { + "description": "Bad Request" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/verifications/verify/key/{publicKey}": { + "get": { + "tags": [ + "Verifications" + ], + "summary": "Returns the verification status for a given public key.", + "parameters": [ + { + "name": "publicKey", + "in": "path", + "description": "The user's public key", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/humanVerificationStatusDto" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + } + }, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/api/verifications/verify/phone/{phoneNumber}": { + "get": { + "tags": [ + "Verifications" + ], + "summary": "No longer used. Use M:G1.Merchant.Hub.Web.Controllers.Api.Verifications.VerifyHumanEndpoint.HandlerPublicKey(G1.Common.Components.PublicKey,G1.Merchant.Hub.Interfaces.IConsumerVerificationService,System.Threading.CancellationToken) instead.", + "parameters": [ + { + "name": "phoneNumber", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/humanVerificationStatusDto" + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + } + }, + "deprecated": true, + "security": [ + { + "Bearer": [] + }, + { + "ApiKey": [] + }, + { + "QrSignedAuth": [] + } + ] + } + }, + "/assets/{contentId}": { + "get": { + "tags": [ + "Web" + ], + "summary": "Download an asset by contentId", + "description": "When supplied a valid base58 encoded contentId, this endpoint will return the asset associated with that id as a file download.\r\nThe response will be a file download with the correct content type.\r\nThe file name will be the contentId with the correct extension.", + "parameters": [ + { + "name": "contentId", + "in": "path", + "description": "This is a base58 encoded digest, a unique identifier for the content.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "byte" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/problemDetails" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "deprecated": true + } + }, + "/app-link": { + "get": { + "tags": [ + "Web" + ], + "summary": "Redirects a mobile user to the appropriate app store.", + "description": "On iOS, an immediate attempt is made using a deep link. If that fails, the user can click the manual links.", + "responses": { + "200": { + "description": "OK" + }, + "302": { + "description": "Found" + } + } + } + } + }, + "components": { + "schemas": { + "QueryResultDto": { + "type": "object", + "properties": { + "serverTimeUtc": { + "type": "string", + "format": "date-time" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/categoryDto" + } + } + }, + "additionalProperties": false, + "description": "The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed.\r\nIt is important to populate this field with the server's time at the beginning of the query execution." + }, + "QueryResultDto": { + "type": "object", + "properties": { + "serverTimeUtc": { + "type": "string", + "format": "date-time" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/categoryRevisionDto" + } + } + }, + "additionalProperties": false, + "description": "The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed.\r\nIt is important to populate this field with the server's time at the beginning of the query execution." + }, + "QueryResultDto": { + "type": "object", + "properties": { + "serverTimeUtc": { + "type": "string", + "format": "date-time" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/optionsRevisionDto" + } + } + }, + "additionalProperties": false, + "description": "The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed.\r\nIt is important to populate this field with the server's time at the beginning of the query execution." + }, + "QueryResultDto": { + "type": "object", + "properties": { + "serverTimeUtc": { + "type": "string", + "format": "date-time" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/orderViewDto" + } + } + }, + "additionalProperties": false, + "description": "The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed.\r\nIt is important to populate this field with the server's time at the beginning of the query execution." + }, + "QueryResultDto": { + "type": "object", + "properties": { + "serverTimeUtc": { + "type": "string", + "format": "date-time" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/productRevisionDto" + } + } + }, + "additionalProperties": false, + "description": "The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed.\r\nIt is important to populate this field with the server's time at the beginning of the query execution." + }, + "QueryResultDto": { + "type": "object", + "properties": { + "serverTimeUtc": { + "type": "string", + "format": "date-time" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/promotionViewDto" + } + } + }, + "additionalProperties": false, + "description": "The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed.\r\nIt is important to populate this field with the server's time at the beginning of the query execution." + }, + "QueryResultDto": { + "type": "object", + "properties": { + "serverTimeUtc": { + "type": "string", + "format": "date-time" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/sellerDto" + } + } + }, + "additionalProperties": false, + "description": "The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed.\r\nIt is important to populate this field with the server's time at the beginning of the query execution." + }, + "QueryResultDto": { + "type": "object", + "properties": { + "serverTimeUtc": { + "type": "string", + "format": "date-time" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/sellerRevisionDto" + } + } + }, + "additionalProperties": false, + "description": "The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed.\r\nIt is important to populate this field with the server's time at the beginning of the query execution." + }, + "QueryResultDto": { + "type": "object", + "properties": { + "serverTimeUtc": { + "type": "string", + "format": "date-time" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/textRevisionDto" + } + } + }, + "additionalProperties": false, + "description": "The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed.\r\nIt is important to populate this field with the server's time at the beginning of the query execution." + }, + "QueryResultDto": { + "type": "object", + "properties": { + "serverTimeUtc": { + "type": "string", + "format": "date-time" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/userDto" + } + } + }, + "additionalProperties": false, + "description": "The UTC server time is included in the response to allow the client to know (by the server's clock) when the query was performed.\r\nIt is important to populate this field with the server's time at the beginning of the query execution." + }, + "addressDto": { + "type": "object", + "properties": { + "line1": { + "type": "string", + "description": "Primary address line; required and defaults to an empty string.", + "nullable": true + }, + "line2": { + "type": "string", + "description": "Optional second address line for additional info.", + "nullable": true + }, + "line3": { + "type": "string", + "description": "Optional third address line.", + "nullable": true + }, + "floor": { + "type": "string", + "description": "Optional floor information (e.g., \"3\", \"roof\", \"ground floor\").", + "nullable": true + }, + "flat": { + "type": "string", + "description": "Optional flat or apartment number.", + "nullable": true + }, + "building": { + "type": "string", + "description": "Optional building identifier (name or number).", + "nullable": true + }, + "comment": { + "type": "string", + "description": "Optional comments for extra address details.", + "nullable": true + }, + "postCode": { + "type": "string", + "description": "Optional postal code.", + "nullable": true + }, + "region": { + "type": "string", + "description": "Optional region (e.g., state or province).", + "nullable": true + }, + "type": { + "$ref": "#/components/schemas/addressType" + } + }, + "additionalProperties": false + }, + "addressType": { + "enum": [ + 0, + 1, + 2, + 3, + 4 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **None**\r\n- 1 - **House**\r\n- 2 - **Apartment**\r\n- 3 - **Office**\r\n- 4 - **Other**\r\n", + "format": "int32", + "x-enum-varnames": [ + "None", + "House", + "Apartment", + "Office", + "Other" + ], + "x-enum-descriptions": [ + "(value: 0) ", + "(value: 1) ", + "(value: 2) ", + "(value: 3) ", + "(value: 4) " + ] + }, + "aspectType": { + "enum": [ + 0, + 10, + 20, + 30 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **None**\r\n- 10 - **Landscape**\r\n- 20 - **Square**\r\n- 30 - **Portrait**\r\n", + "format": "int32", + "x-enum-varnames": [ + "None", + "Landscape", + "Square", + "Portrait" + ], + "x-enum-descriptions": [ + "(value: 0) ", + "(value: 10) ", + "(value: 20) ", + "(value: 30) " + ] + }, + "assetCollectionDto": { + "type": "object", + "properties": { + "kind": { + "type": "string", + "description": "This is the kind of media being referenced.", + "nullable": true + }, + "digests": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of base58-encoded SHA-256 digests for the media assets.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "This Dto represents a reference to a list of stored media assets, such as an image or video.\r\nThe assets are referenced by hash digests, which are unique identifiers for the asset." + }, + "authDocumentDto": { + "required": [ + "clientIp", + "publicKey", + "sessionId" + ], + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Gets or sets the unique session identifier.", + "nullable": true + }, + "clientIp": { + "type": "string", + "description": "Gets or sets the client IP address fetched from the hub.", + "nullable": true + }, + "issuedAt": { + "type": "string", + "description": "Gets or sets the timestamp when the auth document is issued.", + "format": "date-time" + }, + "expiresAt": { + "type": "string", + "description": "Gets or sets the timestamp when the auth document expires.", + "format": "date-time" + }, + "publicKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "Gets or sets the mobile app's Ed25519 public key.", + "format": "base58", + "example": "GVM9GK9qx28cJFz33xkq9ixFpDc3ZdTwXmt2ranC5Pu4" + } + }, + "additionalProperties": false, + "description": "Represents the authentication document that the mobile app creates.\r\nIt is signed to prove the identity and includes session and timing details." + }, + "authHeaderResponseDto": { + "required": [ + "headerValue", + "publicKey", + "sessionId", + "utcExpires" + ], + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Gets or sets the unique session identifier.", + "nullable": true + }, + "headerValue": { + "type": "string", + "description": "Gets or sets the X-Signed-Auth header value.", + "nullable": true + }, + "publicKey": { + "type": "string", + "description": "Gets or sets the public key used for authentication.", + "nullable": true + }, + "utcExpires": { + "type": "string", + "description": "The UTC expiry date of the signed authorization header.", + "format": "date-time" + } + }, + "additionalProperties": false, + "description": "Response DTO for retrieving the authentication header for a session." + }, + "authenticationResultDto": { + "required": [ + "sessionId" + ], + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Gets or sets the session ID that was authenticated.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "DTO for the authentication result." + }, + "baseCreateSellerRevisionDto": { + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/createRestaurantRevisionDto" + }, + { + "$ref": "#/components/schemas/createSellerRevisionDto" + } + ], + "properties": { + "documentVersion": { + "type": "integer", + "description": "Version number of the document.", + "format": "int32" + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "address": { + "$ref": "#/components/schemas/addressDto" + }, + "contactInfo": { + "$ref": "#/components/schemas/simpleContactDto" + }, + "location": { + "$ref": "#/components/schemas/gpsLocationDto" + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "description": "A key value collection for storing additional information", + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "description": "A list of image references.", + "nullable": true + }, + "type": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Base class for seller data transfer objects, encapsulating common seller properties.\r\nRestaurants, farms, shops and other merchants inherit this class.", + "discriminator": { + "propertyName": "type", + "mapping": { + "restaurant": "#/components/schemas/createRestaurantRevisionDto", + "seller": "#/components/schemas/createSellerRevisionDto" + } + } + }, + "baseOfferDto": { + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/discountTotalOfferDto" + }, + { + "$ref": "#/components/schemas/discountProductOfferDto" + }, + { + "$ref": "#/components/schemas/freeDeliveryOfferDto" + }, + { + "$ref": "#/components/schemas/freeItemOfferDto" + }, + { + "$ref": "#/components/schemas/bundleDiscountOfferDto" + } + ], + "properties": { + "type": { + "type": "string", + "nullable": true, + "readOnly": true + } + }, + "additionalProperties": false, + "discriminator": { + "propertyName": "type", + "mapping": { + "discount_total": "#/components/schemas/discountTotalOfferDto", + "discount_product": "#/components/schemas/discountProductOfferDto", + "free_delivery": "#/components/schemas/freeDeliveryOfferDto", + "free_item": "#/components/schemas/freeItemOfferDto", + "bundle_discount": "#/components/schemas/bundleDiscountOfferDto" + } + } + }, + "baseTriggerDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "effect": { + "$ref": "#/components/schemas/triggerEffect" + } + }, + "additionalProperties": false + }, + "basketDto": { + "required": [ + "gpsLocation", + "sellerId" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Gets the unique identifier for this basket.", + "format": "uuid" + }, + "sellerId": { + "type": "string", + "description": "Gets the unique identifier of the seller.", + "format": "uuid" + }, + "scheduledFor": { + "type": "string", + "description": "When the order is scheduled for delivery or pickup, this property indicates the scheduled time.", + "format": "date-time" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/selectedProductDto" + }, + "description": "Gets the collection of selected products in this basket.", + "nullable": true + }, + "gpsLocation": { + "$ref": "#/components/schemas/gpsLocationDto" + }, + "isCommunityChangeEnabled": { + "type": "boolean", + "description": "Gets or sets whether community change is enabled for this basket." + }, + "dispatchType": { + "$ref": "#/components/schemas/dispatchMethodType" + }, + "selectedDeliveryPrice": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Optional: The customer has selected a delivery price that was on offer.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents a customer's basket containing selected products for checkout processing." + }, + "bundleDiscountOfferDto": { + "required": [ + "discountType", + "productIds", + "value" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "productIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "discountType": { + "$ref": "#/components/schemas/discountType" + }, + "value": { + "type": "number", + "format": "double" + } + }, + "additionalProperties": false + }, + "bundleTriggerDto": { + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "productIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + } + }, + "additionalProperties": false + }, + "calculatedCheckoutDto": { + "type": "object", + "properties": { + "isValid": { + "type": "boolean", + "description": "Must be set if the basket is to be considered valid." + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/calculatedProductDto" + }, + "description": "Gets or sets the collection of calculated products in this checkout.", + "nullable": true + }, + "itemSubTotal": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Gets or sets the subtotal of all items before applying discounts.", + "nullable": true + }, + "itemDiscountedSubTotal": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Gets or sets the subtotal of all items with any discounts applied.", + "nullable": true + }, + "tax": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Gets or sets the tax amount applied to this checkout, if any.", + "nullable": true + }, + "communityChange": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Gets or sets the community contribution amount, if any.", + "nullable": true + }, + "communityChangeIncluded": { + "type": "boolean", + "description": "The user selected to enable community change." + }, + "discount": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Returns the value of any discount applied at the order level.", + "nullable": true + }, + "delivery": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Returns the delivery fee, if any.", + "nullable": true + }, + "extras": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + } + }, + "description": "Gets or sets additional charges or fees associated with this checkout.", + "nullable": true + }, + "final": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Gets or sets the final total price of this checkout after all calculations.", + "nullable": true + }, + "activePromotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "Gets the collection of all active promotion IDs applied to this checkout.", + "nullable": true, + "readOnly": true + }, + "unavailableProducts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/productUnavailableDto" + }, + "description": "Gets or sets the list of unavailable products related to this checkout.", + "nullable": true + }, + "cashChangeHint1": { + "type": "integer", + "description": "When doing cash payments, this is the first hint for the amount of cash the customer has prepared for the order.", + "format": "int32", + "nullable": true + }, + "cashChangeHint2": { + "type": "integer", + "description": "When doing cash payments, this is the second hint for the amount of cash the customer has prepared for the order.", + "format": "int32", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents a calculated checkout with comprehensive pricing information for all items, including taxes, discounts, and delivery fees." + }, + "calculatedProductDto": { + "required": [ + "id", + "productId", + "subTotal" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Represents the unique 'line' identifier of the item in the checkout.", + "format": "uuid" + }, + "productId": { + "type": "string", + "description": "Gets the unique identifier of the product.", + "format": "uuid" + }, + "subTotal": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "This value will be null if the Final amount is not a discount.", + "nullable": true + }, + "discountedTotal": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "This value will be null if the Final amount is not a discount.", + "nullable": true + }, + "extras": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + } + }, + "description": "Gets or sets additional charges or fees associated with this product.", + "nullable": true + }, + "final": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Gets or sets the final price of this product after all calculations.", + "nullable": true + }, + "activePromotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "Gets or sets the collection of active promotion IDs applied to this product.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents a calculated product with pricing information, including subtotal, discounts, and final price." + }, + "categoryCompositeDto": { + "type": "object", + "properties": { + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/tag" + }, + "nullable": true + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "nullable": true + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "sortOrder": { + "type": "integer", + "format": "int32" + }, + "id": { + "type": "string", + "format": "uuid" + }, + "revisionId": { + "type": "string", + "format": "uuid" + }, + "promotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "isAvailable": { + "type": "boolean" + }, + "isStopListed": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "categoryDto": { + "type": "object", + "properties": { + "promotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "sellerId": { + "type": "string", + "format": "uuid" + }, + "availabilityTriggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/iTriggerDto" + }, + "nullable": true + }, + "id": { + "type": "string", + "format": "uuid" + }, + "updatedByUserId": { + "type": "string", + "format": "uuid" + }, + "utcUpdated": { + "type": "string", + "format": "date-time" + } + }, + "additionalProperties": false + }, + "categoryQueryRequestDto": { + "type": "object", + "properties": { + "categoryIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "sellerId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "offset": { + "type": "integer", + "format": "int32" + }, + "limit": { + "type": "integer", + "format": "int32" + } + }, + "additionalProperties": false + }, + "categoryRevisionDto": { + "type": "object", + "properties": { + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/tag" + }, + "nullable": true + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "nullable": true + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "sortOrder": { + "type": "integer", + "format": "int32" + }, + "revisionId": { + "type": "string", + "format": "uuid" + }, + "categoryId": { + "type": "string", + "format": "uuid" + }, + "creatorId": { + "type": "string", + "format": "uuid" + }, + "utcCreated": { + "type": "string", + "format": "date-time" + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "isPublished": { + "type": "boolean" + }, + "utcPublished": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "publishedByUserId": { + "type": "string", + "format": "uuid", + "nullable": true + } + }, + "additionalProperties": false + }, + "categoryRevisionQueryRequestDto": { + "type": "object", + "properties": { + "categoryId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "offset": { + "type": "integer", + "format": "int32" + }, + "limit": { + "type": "integer", + "format": "int32" + }, + "utcCreatedFrom": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "utcCreatedTo": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "isPublished": { + "type": "boolean", + "nullable": true + }, + "publishedByUserId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "utcCreated": { + "type": "string", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false + }, + "categoryStopListDto": { + "required": [ + "categoryIds" + ], + "type": "object", + "properties": { + "categoryIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + }, + "additionalProperties": false + }, + "categoryViewDto": { + "type": "object", + "properties": { + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/tag" + }, + "nullable": true + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "nullable": true + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "sortOrder": { + "type": "integer", + "format": "int32" + }, + "revisionId": { + "type": "string", + "format": "uuid" + }, + "categoryId": { + "type": "string", + "format": "uuid" + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + } + }, + "additionalProperties": false + }, + "checkoutOptionsDto": { + "type": "object", + "properties": { + "dispatchType": { + "$ref": "#/components/schemas/dispatchMethodType" + }, + "scheduledFor": { + "type": "string", + "description": "Gets or sets the scheduled date and time for the order.", + "format": "date-time", + "nullable": true + }, + "contact": { + "$ref": "#/components/schemas/simpleContactDto" + }, + "cashAmount": { + "type": "number", + "description": "Gets or sets the cash amount prepared for the order.", + "format": "double", + "nullable": true + }, + "deliveryLocation": { + "$ref": "#/components/schemas/deliveryLocationDto" + }, + "isCommunityChangeEnabled": { + "type": "boolean", + "description": "Gets or sets whether community change is enabled for this basket." + } + }, + "additionalProperties": false, + "description": "Data transfer object for restaurant checkout options" + }, + "commonOrderFailureResult": { + "enum": [ + 0, + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 1000 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **None**\r\n- 10 - **Cancelled**\r\n- 20 - **SystemError**\r\n- 30 - **CreationError**\r\n- 40 - **PaymentIssue**\r\n- 50 - **DeliveryIssue**\r\n- 60 - **LossOrDamage**\r\n- 70 - **Accident**\r\n- 80 - **StockIssue**\r\n- 1000 - **Other**\r\n", + "format": "int32", + "x-enum-varnames": [ + "None", + "Cancelled", + "SystemError", + "CreationError", + "PaymentIssue", + "DeliveryIssue", + "LossOrDamage", + "Accident", + "StockIssue", + "Other" + ], + "x-enum-descriptions": [ + "(value: 0) ", + "(value: 10) ", + "(value: 20) ", + "(value: 30) ", + "(value: 40) ", + "(value: 50) ", + "(value: 60) ", + "(value: 70) ", + "(value: 80) ", + "(value: 1000) " + ] + }, + "commonOrderStatus": { + "enum": [ + 0, + 5, + 10, + 15, + 20, + 22, + 25, + 30, + 35, + 40, + 45, + 1111 + ], + "type": "integer", + "description": "Test\n\n**Enum Values:**\r\n\r\n- 0 - **None**: The order is in an unknown state, usually awaiting confirmation from other services.\r\n- 5 - **Creating**: The order is being validated/saved/created\r\n- 10 - **Created**: The order has been confirmed by all services.\r\n- 15 - **PendingPayment**: The order is awaiting payment.\r\n- 20 - **Placed**: The order has been successfully placed by the customer.\r\n- 22 - **Seen**: The business has seen the order. This state might be skipped.\r\n- 25 - **Accepted**: The business has approved the order. This state might be skipped for unscheduled orders.\r\n- 30 - **Preparing**: The order is being prepared.\r\n- 35 - **ReadyForCollection**: The order is ready for collection by the consumer or courier depending on the obtaining type.\r\n- 40 - **InDelivery**: The order is being delivered.\r\n- 45 - **Ending**: The order is completed but the system finalizes all states\r\n- 1111 - **Ended**: The order has ended, either successfully or unsuccessfully.\r\n", + "format": "int32", + "x-enum-varnames": [ + "None", + "Creating", + "Created", + "PendingPayment", + "Placed", + "Seen", + "Accepted", + "Preparing", + "ReadyForCollection", + "InDelivery", + "Ending", + "Ended" + ], + "x-enum-descriptions": [ + "(value: 0) The order is in an unknown state, usually awaiting confirmation from other services.", + "(value: 5) The order is being validated/saved/created", + "(value: 10) The order has been confirmed by all services.", + "(value: 15) The order is awaiting payment.", + "(value: 20) The order has been successfully placed by the customer.", + "(value: 22) The business has seen the order. This state might be skipped.", + "(value: 25) The business has approved the order. This state might be skipped for unscheduled orders.", + "(value: 30) The order is being prepared.", + "(value: 35) The order is ready for collection by the consumer or courier depending on the obtaining type.", + "(value: 40) The order is being delivered.", + "(value: 45) The order is completed but the system finalizes all states", + "(value: 1111) The order has ended, either successfully or unsuccessfully." + ] + }, + "couponTriggerDto": { + "required": [ + "code" + ], + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "code": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + }, + "courierInfoDto": { + "type": "object", + "properties": { + "courierId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "name": { + "type": "string", + "nullable": true + }, + "phoneNumber": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Data transfer object containing courier information" + }, + "createCategoryDto": { + "type": "object", + "properties": { + "promotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "sellerId": { + "type": "string", + "format": "uuid" + }, + "availabilityTriggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/iTriggerDto" + }, + "nullable": true + } + }, + "additionalProperties": false + }, + "createCategoryRevisionDto": { + "type": "object", + "properties": { + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/tag" + }, + "nullable": true + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "nullable": true + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "sortOrder": { + "type": "integer", + "format": "int32" + } + }, + "additionalProperties": false + }, + "createOptionsRevisionDto": { + "type": "object", + "properties": { + "friendlyName": { + "type": "string", + "nullable": true + }, + "minRequired": { + "type": "integer", + "format": "int32" + }, + "maxLimit": { + "type": "integer", + "format": "int32" + }, + "availableFrom": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "A time value in 24-hour format (HH:mm:ss.FFFFFFF).", + "format": "time", + "nullable": true, + "example": "13:45:30" + }, + "availableTo": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "A time value in 24-hour format (HH:mm:ss.FFFFFFF).", + "format": "time", + "nullable": true, + "example": "13:45:30" + }, + "options": { + "type": "array", + "items": { + "$ref": "#/components/schemas/optionDto" + }, + "nullable": true + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + } + }, + "additionalProperties": false + }, + "createProductDto": { + "type": "object", + "properties": { + "sellerId": { + "type": "string", + "format": "uuid" + }, + "availabilityTriggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/iTriggerDto" + }, + "nullable": true + } + }, + "additionalProperties": false + }, + "createProductRevisionDto": { + "type": "object", + "properties": { + "price": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "nullable": true + }, + "optionsIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "categoryIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "sortOrder": { + "type": "integer", + "format": "int32" + }, + "assets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/assetCollectionDto" + }, + "nullable": true + }, + "isEnabled": { + "type": "boolean" + }, + "notAvailableReason": { + "type": "string", + "nullable": true + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/tag" + }, + "nullable": true + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "nullable": true + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + } + }, + "additionalProperties": false + }, + "createPromotionDto": { + "required": [ + "offer" + ], + "type": "object", + "properties": { + "triggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/baseTriggerDto" + }, + "nullable": true + }, + "offer": { + "$ref": "#/components/schemas/baseOfferDto" + } + }, + "additionalProperties": false + }, + "createRestaurantDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true + }, + "endpoint": { + "type": "string", + "description": "Endpoint URL for the seller.", + "nullable": true + }, + "promotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The promotion ids for this seller.", + "nullable": true + }, + "availabilityTriggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/iTriggerDto" + }, + "description": "The availability triggers.", + "nullable": true + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + } + }, + "additionalProperties": false, + "description": "Create a new restaurant." + }, + "createRestaurantRevisionDto": { + "type": "object", + "properties": { + "documentVersion": { + "type": "integer", + "description": "Version number of the document.", + "format": "int32" + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "address": { + "$ref": "#/components/schemas/addressDto" + }, + "contactInfo": { + "$ref": "#/components/schemas/simpleContactDto" + }, + "location": { + "$ref": "#/components/schemas/gpsLocationDto" + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "description": "A key value collection for storing additional information", + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "description": "A list of image references.", + "nullable": true + }, + "minimumOrder": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Optional minimum order amount required by the restaurant.", + "nullable": true + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Tags associated with the restaurant.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents a restaurant with seller details and associated tags." + }, + "createSellerDto": { + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/createRestaurantDto" + }, + { + "$ref": "#/components/schemas/createSellerDto" + }, + { + "$ref": "#/components/schemas/sellerDto" + }, + { + "$ref": "#/components/schemas/restaurantDto" + } + ], + "properties": { + "type": { + "type": "string", + "description": "The document type 'restaurant' or 'shop'.", + "nullable": true + }, + "name": { + "type": "string", + "nullable": true + }, + "endpoint": { + "type": "string", + "description": "Endpoint URL for the seller.", + "nullable": true + }, + "promotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The promotion ids for this seller.", + "nullable": true + }, + "availabilityTriggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/iTriggerDto" + }, + "description": "The availability triggers.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Base class for seller data transfer objects, encapsulating common seller properties.\r\nRestaurants, farms, shops and other merchants inherit this class.", + "discriminator": { + "propertyName": "type", + "mapping": { + "restaurant": "#/components/schemas/createRestaurantDto", + "seller": "#/components/schemas/createSellerDto", + "seller-view": "#/components/schemas/sellerDto", + "restaurant-view": "#/components/schemas/restaurantDto" + } + } + }, + "createSellerRevisionDto": { + "type": "object", + "properties": { + "documentVersion": { + "type": "integer", + "description": "Version number of the document.", + "format": "int32" + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "address": { + "$ref": "#/components/schemas/addressDto" + }, + "contactInfo": { + "$ref": "#/components/schemas/simpleContactDto" + }, + "location": { + "$ref": "#/components/schemas/gpsLocationDto" + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "description": "A key value collection for storing additional information", + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "description": "A list of image references.", + "nullable": true + } + }, + "additionalProperties": false + }, + "createTextRevisionDto": { + "type": "object", + "properties": { + "documentId": { + "type": "string", + "format": "uuid" + }, + "key": { + "type": "string", + "nullable": true + }, + "lang": { + "type": "string", + "nullable": true + }, + "value": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + }, + "customerGroupTriggerDto": { + "required": [ + "customerValue" + ], + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "customerValue": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + }, + "customerHistoryTriggerDto": { + "required": [ + "customerValue" + ], + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "customerValue": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + }, + "customerLoyaltyTriggerDto": { + "required": [ + "customerValue" + ], + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "customerValue": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + }, + "deliveryAddressDto": { + "type": "object", + "properties": { + "line1": { + "type": "string", + "nullable": true + }, + "line2": { + "type": "string", + "nullable": true + }, + "line3": { + "type": "string", + "nullable": true + }, + "building": { + "type": "string", + "nullable": true + }, + "floor": { + "type": "string", + "nullable": true + }, + "flat": { + "type": "string", + "nullable": true + }, + "postCode": { + "type": "string", + "nullable": true + }, + "comment": { + "type": "string", + "nullable": true + }, + "additionalInfo": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Data transfer object for delivery address information" + }, + "deliveryFailureResult": { + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **None**\r\n- 1 - **Cancelled**\r\n- 2 - **Exception**\r\n- 3 - **RouteIssue**\r\n- 4 - **WaypointFail**\r\n- 5 - **PricingIssue**\r\n- 6 - **NoCourier**\r\n- 7 - **Other**\r\n", + "format": "int32", + "x-enum-varnames": [ + "None", + "Cancelled", + "Exception", + "RouteIssue", + "WaypointFail", + "PricingIssue", + "NoCourier", + "Other" + ], + "x-enum-descriptions": [ + "(value: 0) ", + "(value: 1) ", + "(value: 2) ", + "(value: 3) ", + "(value: 4) ", + "(value: 5) ", + "(value: 6) ", + "(value: 7) " + ] + }, + "deliveryLocationDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Gets or sets the unique identifier for this delivery location.", + "format": "uuid" + }, + "address": { + "$ref": "#/components/schemas/deliveryAddressDto" + }, + "gpsLocation": { + "$ref": "#/components/schemas/gpsLocationDto" + }, + "isEnabled": { + "type": "boolean", + "description": "Gets or sets whether this delivery location is enabled." + }, + "instructions": { + "type": "string", + "description": "Gets or sets additional delivery instructions.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Data transfer object for delivery location information" + }, + "deliveryOrderStatus": { + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **None**\r\n- 1 - **Initializing**\r\n- 2 - **NeedsCourier**\r\n- 3 - **Ready**\r\n- 4 - **InProgress**\r\n- 5 - **Ended**\r\n", + "format": "int32", + "x-enum-varnames": [ + "None", + "Initializing", + "NeedsCourier", + "Ready", + "InProgress", + "Ended" + ], + "x-enum-descriptions": [ + "(value: 0) ", + "(value: 1) ", + "(value: 2) ", + "(value: 3) ", + "(value: 4) ", + "(value: 5) " + ] + }, + "deliveryStateDto": { + "type": "object", + "properties": { + "deliveryOrderStatus": { + "$ref": "#/components/schemas/deliveryOrderStatus" + }, + "deliveryFailureResult": { + "$ref": "#/components/schemas/deliveryFailureResult" + }, + "utcScheduled": { + "type": "string", + "description": "The scheduled start time", + "format": "date-time", + "nullable": true + }, + "utcStarted": { + "type": "string", + "description": "The actual start time", + "format": "date-time", + "nullable": true + }, + "utcEndedActual": { + "type": "string", + "description": "The actual end time", + "format": "date-time", + "nullable": true + }, + "etcSeconds": { + "type": "integer", + "description": "The estimated time of completion in seconds", + "format": "int32" + }, + "salePrice": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "nullable": true + }, + "courierInfo": { + "$ref": "#/components/schemas/courierInfoDto" + }, + "dispatchRequired": { + "type": "boolean", + "nullable": true + }, + "dspOrderId": { + "type": "string", + "format": "uuid", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Data transfer object for delivery information" + }, + "digitalEngagementTriggerDto": { + "required": [ + "action" + ], + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "action": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + }, + "discountProductOfferDto": { + "required": [ + "discountType", + "productIds", + "value" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "discountType": { + "$ref": "#/components/schemas/discountType" + }, + "value": { + "type": "number", + "format": "double" + }, + "productIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + } + }, + "additionalProperties": false + }, + "discountTotalOfferDto": { + "required": [ + "discountType", + "value" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "discountType": { + "$ref": "#/components/schemas/discountType" + }, + "value": { + "type": "number", + "format": "double" + } + }, + "additionalProperties": false + }, + "discountType": { + "enum": [ + 0, + 1, + 2 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **None**\r\n- 1 - **Fixed**: A fixed amount discount (e.g., $10 off).\r\n- 2 - **Percentage**: A percentage-based discount (e.g., 20% off).\r\n", + "format": "int32", + "x-enum-varnames": [ + "None", + "Fixed", + "Percentage" + ], + "x-enum-descriptions": [ + "(value: 0) ", + "(value: 1) A fixed amount discount (e.g., $10 off).", + "(value: 2) A percentage-based discount (e.g., 20% off)." + ] + }, + "dispatchMethodType": { + "enum": [ + 0, + 10, + 20 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **None**\r\n- 10 - **Pickup**\r\n- 20 - **Delivery**\r\n", + "format": "int32", + "x-enum-varnames": [ + "None", + "Pickup", + "Delivery" + ], + "x-enum-descriptions": [ + "(value: 0) ", + "(value: 10) ", + "(value: 20) " + ] + }, + "freeDeliveryOfferDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "minPurchaseAmount": { + "type": "number", + "format": "double", + "nullable": true + } + }, + "additionalProperties": false + }, + "freeItemOfferDto": { + "required": [ + "productIds", + "quantity" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "productIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "quantity": { + "type": "integer", + "format": "int32" + } + }, + "additionalProperties": false + }, + "gpsLocationDto": { + "type": "object", + "properties": { + "latitude": { + "type": "number", + "description": "Latitude is a geographic coordinate that measures how far north or south a location is from the equator,\r\nexpressed in degrees from -90 (South Pole) to 90 (North Pole).", + "format": "double" + }, + "longitude": { + "type": "number", + "description": "Longitude is a geographic coordinate that measures how far east or west a location is from the Prime Meridian,\r\nexpressed in degrees from -180 (West) to 180 (East).", + "format": "double" + } + }, + "additionalProperties": false, + "description": "Represents a GPS location with latitude and longitude coordinates." + }, + "holidayTriggerDto": { + "required": [ + "holiday" + ], + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "holiday": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + }, + "humanVerificationRequestDto": { + "type": "object", + "properties": { + "publicKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "The Public key being verified.", + "format": "base58", + "example": "GVM9GK9qx28cJFz33xkq9ixFpDc3ZdTwXmt2ranC5Pu4" + }, + "phoneNumber": { + "type": "string", + "description": "The phone number that was used to verify the public key.", + "nullable": true + }, + "state": { + "$ref": "#/components/schemas/phoneVerificationState" + } + }, + "additionalProperties": false, + "description": "DTO for Human verification of public key by phone number." + }, + "humanVerificationStatusDto": { + "type": "object", + "properties": { + "publicKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "The Public key that was verified.", + "format": "base58", + "example": "GVM9GK9qx28cJFz33xkq9ixFpDc3ZdTwXmt2ranC5Pu4" + }, + "phoneNumber": { + "type": "string", + "description": "The phone number used to verify the public key.", + "nullable": true + }, + "state": { + "$ref": "#/components/schemas/phoneVerificationState" + } + }, + "additionalProperties": false, + "description": "The status of a Human verification process." + }, + "iTriggerDto": { + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/timeTriggerDto" + }, + { + "$ref": "#/components/schemas/purchaseTriggerDto" + }, + { + "$ref": "#/components/schemas/managerOverrideTriggerDto" + }, + { + "$ref": "#/components/schemas/holidayTriggerDto" + }, + { + "$ref": "#/components/schemas/digitalEngagementTriggerDto" + }, + { + "$ref": "#/components/schemas/customerLoyaltyTriggerDto" + }, + { + "$ref": "#/components/schemas/customerHistoryTriggerDto" + }, + { + "$ref": "#/components/schemas/customerGroupTriggerDto" + }, + { + "$ref": "#/components/schemas/couponTriggerDto" + }, + { + "$ref": "#/components/schemas/bundleTriggerDto" + }, + { + "$ref": "#/components/schemas/sellerOperationalStateTriggerDto" + }, + { + "$ref": "#/components/schemas/stopListTriggerDto" + } + ], + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string" + } + }, + "additionalProperties": false, + "discriminator": { + "propertyName": "type", + "mapping": { + "time": "#/components/schemas/timeTriggerDto", + "purchase": "#/components/schemas/purchaseTriggerDto", + "manager_override": "#/components/schemas/managerOverrideTriggerDto", + "holiday": "#/components/schemas/holidayTriggerDto", + "digital_engagement": "#/components/schemas/digitalEngagementTriggerDto", + "customer_loyalty": "#/components/schemas/customerLoyaltyTriggerDto", + "customer_history": "#/components/schemas/customerHistoryTriggerDto", + "customer_group": "#/components/schemas/customerGroupTriggerDto", + "coupon": "#/components/schemas/couponTriggerDto", + "bundle": "#/components/schemas/bundleTriggerDto", + "seller_operational_state": "#/components/schemas/sellerOperationalStateTriggerDto", + "stop_list": "#/components/schemas/stopListTriggerDto" + } + } + }, + "imageReferenceDto": { + "required": [ + "aspects", + "digest", + "key" + ], + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The key refers to the particular image in a set of images.\r\neg: 'primary' might refer to the main image of a product.\r\n'alt' might refer to an alternate image.", + "nullable": true + }, + "digest": { + "type": "string", + "description": "A base58-encoded SHA-256 digest for the asset.\r\nThis is the digest (or hash) of the original image", + "nullable": true + }, + "aspects": { + "type": "array", + "items": { + "$ref": "#/components/schemas/aspectType" + }, + "description": "A list of 'aspects' available for this digest.\r\nIn the future this may include more than just 'ratios'.", + "nullable": true + } + }, + "additionalProperties": false + }, + "localizedTextDto": { + "type": "object", + "properties": { + "type": { + "type": "integer", + "format": "int32" + }, + "value": { + "type": "string", + "nullable": true + }, + "lang": { + "type": "string", + "nullable": true + }, + "revisionId": { + "type": "string", + "format": "uuid", + "nullable": true + } + }, + "additionalProperties": false + }, + "managerOverrideTriggerDto": { + "required": [ + "isAvailable" + ], + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "key": { + "type": "string", + "nullable": true + }, + "clearWhen": { + "type": "string", + "nullable": true + }, + "utcCreated": { + "type": "string", + "format": "date-time" + }, + "isAvailable": { + "type": "boolean" + }, + "managerUserId": { + "type": "string", + "format": "uuid" + } + }, + "additionalProperties": false + }, + "oidcConnectResponseDto": { + "type": "object", + "properties": { + "clientId": { + "type": "string", + "description": "Client identifier used for the OIDC connection.", + "nullable": true + }, + "authorityUrl": { + "type": "string", + "description": "Authority URL of the OIDC provider.\r\nThis is the URL that the client will connect to for authentication.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Data transfer object representing connection information for an OIDC client." + }, + "optionDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "price": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "nullable": true + }, + "isFixedPrice": { + "type": "boolean" + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + } + }, + "additionalProperties": false + }, + "optionsQueryDto": { + "type": "object", + "properties": { + "optionsId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "friendlyName": { + "type": "string", + "nullable": true + }, + "minRequired": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "maxLimit": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "availableFrom": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "A time value in 24-hour format (HH:mm:ss.FFFFFFF).", + "format": "time", + "nullable": true, + "example": "13:45:30" + }, + "availableTo": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "A time value in 24-hour format (HH:mm:ss.FFFFFFF).", + "format": "time", + "nullable": true, + "example": "13:45:30" + }, + "offset": { + "type": "integer", + "format": "int32" + }, + "limit": { + "type": "integer", + "format": "int32" + }, + "utcCreatedFrom": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "utcCreatedTo": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "isPublished": { + "type": "boolean", + "nullable": true + }, + "publishedByUserId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "utcCreated": { + "type": "string", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false + }, + "optionsRevisionDto": { + "type": "object", + "properties": { + "friendlyName": { + "type": "string", + "nullable": true + }, + "minRequired": { + "type": "integer", + "format": "int32" + }, + "maxLimit": { + "type": "integer", + "format": "int32" + }, + "availableFrom": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "A time value in 24-hour format (HH:mm:ss.FFFFFFF).", + "format": "time", + "nullable": true, + "example": "13:45:30" + }, + "availableTo": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "A time value in 24-hour format (HH:mm:ss.FFFFFFF).", + "format": "time", + "nullable": true, + "example": "13:45:30" + }, + "options": { + "type": "array", + "items": { + "$ref": "#/components/schemas/optionDto" + }, + "nullable": true + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + }, + "optionsId": { + "type": "string", + "format": "uuid" + }, + "revisionId": { + "type": "string", + "format": "uuid" + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "creatorId": { + "type": "string", + "format": "uuid" + }, + "utcCreated": { + "type": "string", + "format": "date-time" + }, + "isPublished": { + "type": "boolean" + }, + "utcPublished": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "publishedByUserId": { + "type": "string", + "format": "uuid", + "nullable": true + } + }, + "additionalProperties": false + }, + "optionsViewDto": { + "type": "object", + "properties": { + "friendlyName": { + "type": "string", + "nullable": true + }, + "minRequired": { + "type": "integer", + "format": "int32" + }, + "maxLimit": { + "type": "integer", + "format": "int32" + }, + "availableFrom": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "A time value in 24-hour format (HH:mm:ss.FFFFFFF).", + "format": "time", + "nullable": true, + "example": "13:45:30" + }, + "availableTo": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "A time value in 24-hour format (HH:mm:ss.FFFFFFF).", + "format": "time", + "nullable": true, + "example": "13:45:30" + }, + "options": { + "type": "array", + "items": { + "$ref": "#/components/schemas/optionDto" + }, + "nullable": true + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + }, + "optionsId": { + "type": "string", + "format": "uuid" + }, + "revisionId": { + "type": "string", + "format": "uuid" + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + } + }, + "additionalProperties": false + }, + "orderCreateDto": { + "type": "object", + "properties": { + "sellerId": { + "type": "string", + "format": "uuid" + }, + "consumerKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "The consumer's public key.", + "format": "base58", + "example": "GVM9GK9qx28cJFz33xkq9ixFpDc3ZdTwXmt2ranC5Pu4" + }, + "paymentType": { + "$ref": "#/components/schemas/paymentType" + }, + "options": { + "$ref": "#/components/schemas/checkoutOptionsDto" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/selectedProductDto" + }, + "description": "The items in this order.", + "nullable": true + }, + "comments": { + "type": "string", + "description": "Additional instructions or comments regarding the order.", + "nullable": true + }, + "dispatchRequired": { + "type": "boolean" + }, + "agreedPrice": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "nullable": true + }, + "agreedDeliveryPrice": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "nullable": true + }, + "deliveryEstSeconds": { + "type": "integer", + "format": "int32" + } + }, + "additionalProperties": false + }, + "orderDto": { + "type": "object", + "properties": { + "sellerId": { + "type": "string", + "format": "uuid" + }, + "consumerKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "The consumer's public key.", + "format": "base58", + "example": "GVM9GK9qx28cJFz33xkq9ixFpDc3ZdTwXmt2ranC5Pu4" + }, + "paymentType": { + "$ref": "#/components/schemas/paymentType" + }, + "options": { + "$ref": "#/components/schemas/checkoutOptionsDto" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/selectedProductDto" + }, + "description": "The items in this order.", + "nullable": true + }, + "comments": { + "type": "string", + "description": "Additional instructions or comments regarding the order.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Data transfer object for common order information." + }, + "orderFailureRequestDto": { + "type": "object", + "properties": { + "orderId": { + "type": "string", + "description": "Unique identifier of the order to be cancelled.", + "format": "uuid" + }, + "failureResult": { + "$ref": "#/components/schemas/commonOrderFailureResult" + }, + "reason": { + "type": "string", + "description": "Optional additional reason or notes about the cancellation.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Request DTO for cancelling/rejecting an order with a specific failure reason." + }, + "orderNextStatusDto": { + "type": "object", + "properties": { + "orderStatus": { + "$ref": "#/components/schemas/commonOrderStatus" + }, + "expectedCompleted": { + "type": "string", + "description": "The expected completion date and time of the order.", + "format": "date-time", + "nullable": true + }, + "dispatchRequired": { + "type": "boolean", + "description": "Indicates whether the order requires dispatching via the engine.", + "nullable": true + } + }, + "additionalProperties": false + }, + "orderQueryRequestDto": { + "type": "object", + "properties": { + "textSearch": { + "type": "string", + "description": "Text search filter for orders.", + "nullable": true + }, + "orderCode": { + "type": "string", + "description": "Order code filter.", + "nullable": true + }, + "sellerKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "Filter by the seller's public key.", + "format": "base58", + "nullable": true, + "example": "GVM9GK9qx28cJFz33xkq9ixFpDc3ZdTwXmt2ranC5Pu4" + }, + "consumerKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "Filter by the consumer's public key.", + "format": "base58", + "nullable": true, + "example": "GVM9GK9qx28cJFz33xkq9ixFpDc3ZdTwXmt2ranC5Pu4" + }, + "offset": { + "type": "integer", + "description": "Pagination offset; defaults to 0.", + "format": "int32" + }, + "limit": { + "type": "integer", + "description": "Limit for number of orders to return; defaults to 20.", + "format": "int32" + }, + "utcCreatedFrom": { + "type": "string", + "description": "UTC date filter for orders created on or after this date.", + "format": "date-time", + "nullable": true + }, + "utcCreatedTo": { + "type": "string", + "description": "UTC date filter for orders created on or before this date.", + "format": "date-time", + "nullable": true + }, + "utcUpdatedFrom": { + "type": "string", + "description": "UTC date filter for orders updated on or after this date.", + "format": "date-time", + "nullable": true + }, + "utcUpdatedTo": { + "type": "string", + "description": "UTC date filter for orders updated on or before this date.", + "format": "date-time", + "nullable": true + }, + "activeOrders": { + "type": "boolean", + "description": "Filter to include active orders in the results.", + "nullable": true + }, + "completedOrders": { + "type": "boolean", + "description": "Filter to include completed orders in the results.", + "nullable": true + }, + "cancelledOrders": { + "type": "boolean", + "description": "Filter to include cancelled orders in the results.", + "nullable": true + }, + "statusAny": { + "type": "array", + "items": { + "$ref": "#/components/schemas/commonOrderStatus" + }, + "description": "Results will match to any of the provided order statuses.", + "nullable": true + }, + "failureAny": { + "type": "array", + "items": { + "$ref": "#/components/schemas/commonOrderFailureResult" + }, + "description": "Array of order failure results to filter orders by any matching failure type.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Data transfer object for querying orders using various filters." + }, + "orderStateChangeRequestDto": { + "type": "object", + "properties": { + "orderId": { + "type": "string", + "description": "Unique identifier of the order.", + "format": "uuid" + }, + "orderTrigger": { + "$ref": "#/components/schemas/orderTriggerDto" + }, + "failureResult": { + "$ref": "#/components/schemas/commonOrderFailureResult" + }, + "expectedReady": { + "type": "string", + "description": "Optional expected ready time for the order.", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Request DTO for changing the state of an order." + }, + "orderStateDto": { + "type": "object", + "properties": { + "orderStatus": { + "$ref": "#/components/schemas/commonOrderStatus" + }, + "orderStatusTimes": { + "type": "object", + "additionalProperties": { + "type": "string", + "format": "date-time" + }, + "description": "A key value store of timestamps indicating when each status was reached.\r\nThe key is the integer value of the 'CommonOrderStatus'.", + "nullable": true + }, + "failureResult": { + "$ref": "#/components/schemas/commonOrderFailureResult" + }, + "utcScheduled": { + "type": "string", + "description": "The scheduled start time", + "format": "date-time", + "nullable": true + }, + "utcStarted": { + "type": "string", + "description": "The actual start time", + "format": "date-time", + "nullable": true + }, + "utcEndedActual": { + "type": "string", + "description": "The actual end time", + "format": "date-time", + "nullable": true + }, + "preparationState": { + "$ref": "#/components/schemas/preparationStateDto" + }, + "deliveryState": { + "$ref": "#/components/schemas/deliveryStateDto" + }, + "failureExplain": { + "type": "string", + "description": "Optional: Readable explanation as to the failure result.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents the current state of an order." + }, + "orderTriggerDto": { + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "type": "integer", + "description": "DTO representation of order state triggers\n\n**Enum Values:**\r\n\r\n- 0 - **ConfirmCreation**\r\n- 1 - **PaymentReceived**\r\n- 2 - **PlaceOrder**\r\n- 3 - **AcceptOrder**\r\n- 4 - **PrepareOrder**\r\n- 5 - **Prepared**\r\n- 6 - **OrderCollected**\r\n- 7 - **CompleteOrder**\r\n- 8 - **Cancel**\r\n", + "format": "int32", + "x-enum-varnames": [ + "ConfirmCreation", + "PaymentReceived", + "PlaceOrder", + "AcceptOrder", + "PrepareOrder", + "Prepared", + "OrderCollected", + "CompleteOrder", + "Cancel" + ], + "x-enum-descriptions": [ + "(value: 0) ", + "(value: 1) ", + "(value: 2) ", + "(value: 3) ", + "(value: 4) ", + "(value: 5) ", + "(value: 6) ", + "(value: 7) ", + "(value: 8) " + ] + }, + "orderViewDto": { + "required": [ + "orderState" + ], + "type": "object", + "properties": { + "sellerId": { + "type": "string", + "format": "uuid" + }, + "consumerKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "The consumer's public key.", + "format": "base58", + "example": "GVM9GK9qx28cJFz33xkq9ixFpDc3ZdTwXmt2ranC5Pu4" + }, + "paymentType": { + "$ref": "#/components/schemas/paymentType" + }, + "options": { + "$ref": "#/components/schemas/checkoutOptionsDto" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/selectedProductDto" + }, + "description": "The items in this order.", + "nullable": true + }, + "comments": { + "type": "string", + "description": "Additional instructions or comments regarding the order.", + "nullable": true + }, + "id": { + "type": "string", + "description": "Unique identifier for the order.", + "format": "uuid" + }, + "orderState": { + "$ref": "#/components/schemas/orderStateDto" + }, + "orderCode": { + "type": "string", + "description": "A unique code (identifier) that is publicly visible and can be used to reference the order.", + "nullable": true + }, + "utcCreated": { + "type": "string", + "description": "Timestamp (UTC) when the order was created.", + "format": "date-time" + }, + "utcUpdated": { + "type": "string", + "description": "Timestamp (UTC) when the order was last updated.", + "format": "date-time" + }, + "isActive": { + "type": "boolean", + "description": "Indicates whether the order is active." + }, + "isFailed": { + "type": "boolean", + "description": "Indicates whether the order has failed." + }, + "prices": { + "$ref": "#/components/schemas/calculatedCheckoutDto" + } + }, + "additionalProperties": false, + "description": "Represents an order with checkout options, calculated totals, items, products, and product options.\r\nInherits from CreateOrderDto to include standard order properties." + }, + "paymentType": { + "enum": [ + 0, + 10, + 20 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **None**\r\n- 10 - **Postpaid**\r\n- 20 - **Prepaid**\r\n", + "format": "int32", + "x-enum-varnames": [ + "None", + "Postpaid", + "Prepaid" + ], + "x-enum-descriptions": [ + "(value: 0) ", + "(value: 10) ", + "(value: 20) " + ] + }, + "phoneVerificationState": { + "enum": [ + 0, + 1, + 2 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **Verified**\r\n- 1 - **Blocked**\r\n- 2 - **NotVerified**\r\n", + "format": "int32", + "x-enum-varnames": [ + "Verified", + "Blocked", + "NotVerified" + ], + "x-enum-descriptions": [ + "(value: 0) ", + "(value: 1) ", + "(value: 2) " + ] + }, + "preparationStateDto": { + "type": "object", + "properties": { + "utcScheduled": { + "type": "string", + "description": "The scheduled start time", + "format": "date-time", + "nullable": true + }, + "utcStarted": { + "type": "string", + "description": "The actual start time", + "format": "date-time", + "nullable": true + }, + "utcEndedActual": { + "type": "string", + "description": "The actual end time", + "format": "date-time", + "nullable": true + }, + "etcSeconds": { + "type": "integer", + "description": "The estimated time of completion in seconds", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Data transfer object for order preparation information" + }, + "priceEstimationDto": { + "type": "object", + "properties": { + "price": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Estimated price for the delivery.", + "nullable": true + }, + "originalPrice": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Original price before any adjustments or discounts.", + "nullable": true + }, + "distanceMetres": { + "type": "integer", + "description": "Total distance of the delivery route in meters.", + "format": "int32" + }, + "secondsEstimated": { + "type": "integer", + "description": "The estimated amount of time in seconds the delivery could take.", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Data transfer object containing price estimate information." + }, + "priceEstimationRequestDto": { + "type": "object", + "properties": { + "utcScheduledFor": { + "type": "string", + "description": "UTC timestamp when the delivery is scheduled for.", + "format": "date-time" + }, + "locations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/gpsLocationDto" + }, + "description": "List of GPS locations defining the delivery route.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Request DTO for estimating delivery prices" + }, + "problemDetails": { + "type": "object", + "properties": { + "type": { + "type": "string", + "nullable": true + }, + "title": { + "type": "string", + "nullable": true + }, + "status": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "detail": { + "type": "string", + "nullable": true + }, + "instance": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": {} + }, + "productCompositeDto": { + "type": "object", + "properties": { + "price": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "nullable": true + }, + "optionsIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "categoryIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "sortOrder": { + "type": "integer", + "format": "int32" + }, + "assets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/assetCollectionDto" + }, + "nullable": true + }, + "isEnabled": { + "type": "boolean" + }, + "notAvailableReason": { + "type": "string", + "nullable": true + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/tag" + }, + "nullable": true + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "nullable": true + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "id": { + "type": "string", + "format": "uuid" + }, + "revisionId": { + "type": "string", + "format": "uuid" + }, + "promotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "isVisible": { + "type": "boolean" + }, + "isAvailable": { + "type": "boolean" + }, + "isStopListed": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "productDto": { + "type": "object", + "properties": { + "availabilityTriggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/iTriggerDto" + }, + "nullable": true + }, + "id": { + "type": "string", + "format": "uuid" + }, + "sellerId": { + "type": "string", + "format": "uuid" + }, + "updatedByUserId": { + "type": "string", + "format": "uuid" + }, + "utcUpdated": { + "type": "string", + "format": "date-time" + }, + "promotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + } + }, + "additionalProperties": false + }, + "productQueryRequestDto": { + "type": "object", + "properties": { + "offset": { + "type": "integer", + "format": "int32" + }, + "limit": { + "type": "integer", + "format": "int32" + }, + "sellerId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "productIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + } + }, + "additionalProperties": false + }, + "productRevisionDto": { + "type": "object", + "properties": { + "price": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "nullable": true + }, + "optionsIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "categoryIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "sortOrder": { + "type": "integer", + "format": "int32" + }, + "assets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/assetCollectionDto" + }, + "nullable": true + }, + "isEnabled": { + "type": "boolean" + }, + "notAvailableReason": { + "type": "string", + "nullable": true + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/tag" + }, + "nullable": true + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "nullable": true + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "revisionId": { + "type": "string", + "format": "uuid" + }, + "productId": { + "type": "string", + "format": "uuid" + }, + "sellerId": { + "type": "string", + "format": "uuid" + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "creatorId": { + "type": "string", + "format": "uuid" + }, + "utcCreated": { + "type": "string", + "format": "date-time" + }, + "isPublished": { + "type": "boolean" + }, + "utcPublished": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "publishedByUserId": { + "type": "string", + "format": "uuid", + "nullable": true + } + }, + "additionalProperties": false + }, + "productRevisionQueryRequestDto": { + "type": "object", + "properties": { + "productId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "offset": { + "type": "integer", + "format": "int32" + }, + "limit": { + "type": "integer", + "format": "int32" + }, + "utcCreatedFrom": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "utcCreatedTo": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "isPublished": { + "type": "boolean", + "nullable": true + }, + "publishedByUserId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "utcCreated": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "categoryIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + } + }, + "additionalProperties": false + }, + "productStopListDto": { + "required": [ + "productIds" + ], + "type": "object", + "properties": { + "productIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + }, + "additionalProperties": false + }, + "productUnavailableDto": { + "type": "object", + "properties": { + "productId": { + "type": "string", + "description": "Gets or sets the unique identifier of the unavailable product.", + "format": "uuid" + }, + "reason": { + "$ref": "#/components/schemas/productUnavailableReason" + } + }, + "additionalProperties": false, + "description": "Represents a product that is unavailable during checkout, including the reason." + }, + "productUnavailableReason": { + "enum": [ + 0, + 10, + 20, + 30, + 40, + 50 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **None**: Unknown reason.\r\n- 10 - **NotFound**: The product is not available for the selected delivery time.\r\n- 20 - **NotAvailable**: Unavailable product.\r\n- 30 - **NotInStock**: Currently out of stock or unavailable.\r\n- 40 - **NotInAvailabilityTime**: The product is not available at the time of ordering.\r\n- 50 - **OptionsUnavailable**: Some of the product's options are not available.\r\n", + "format": "int32", + "x-enum-varnames": [ + "None", + "NotFound", + "NotAvailable", + "NotInStock", + "NotInAvailabilityTime", + "OptionsUnavailable" + ], + "x-enum-descriptions": [ + "(value: 0) Unknown reason.", + "(value: 10) The product is not available for the selected delivery time.", + "(value: 20) Unavailable product.", + "(value: 30) Currently out of stock or unavailable.", + "(value: 40) The product is not available at the time of ordering.", + "(value: 50) Some of the product's options are not available." + ] + }, + "promotionQueryRequestDto": { + "type": "object", + "properties": { + "offset": { + "type": "integer", + "format": "int32" + }, + "limit": { + "type": "integer", + "format": "int32" + }, + "ids": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "nullable": true + }, + "updatedByUserId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "utcCreatedFrom": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "utcCreatedTo": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "utcUpdatedFrom": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "utcUpdatedTo": { + "type": "string", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false + }, + "promotionViewDto": { + "required": [ + "offer" + ], + "type": "object", + "properties": { + "triggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/baseTriggerDto" + }, + "nullable": true + }, + "offer": { + "$ref": "#/components/schemas/baseOfferDto" + }, + "id": { + "type": "string", + "format": "uuid" + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "updatedByUserId": { + "type": "string", + "format": "uuid" + }, + "utcCreated": { + "type": "string", + "format": "date-time" + }, + "utcUpdated": { + "type": "string", + "format": "date-time" + } + }, + "additionalProperties": false + }, + "purchaseTriggerDto": { + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "minPurchase": { + "type": "number", + "format": "double", + "nullable": true + }, + "minQuantity": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "minGroupSize": { + "type": "integer", + "format": "int32", + "nullable": true + } + }, + "additionalProperties": false + }, + "restaurantDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true + }, + "endpoint": { + "type": "string", + "description": "Endpoint URL for the seller.", + "nullable": true + }, + "promotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The promotion ids for this seller.", + "nullable": true + }, + "availabilityTriggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/iTriggerDto" + }, + "description": "The availability triggers.", + "nullable": true + }, + "id": { + "type": "string", + "description": "Identifier for the seller.", + "format": "uuid" + }, + "publicKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "Base58 ED25519 public key for this seller.", + "format": "base58", + "example": "GVM9GK9qx28cJFz33xkq9ixFpDc3ZdTwXmt2ranC5Pu4" + }, + "updatedByUserId": { + "type": "string", + "description": "Gets or sets the ID of the user who last updated the item.", + "format": "uuid" + }, + "utcUpdated": { + "type": "string", + "description": "Gets or sets the UTC date and time when last updated.", + "format": "date-time" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + } + }, + "additionalProperties": false + }, + "restaurantRevisionDto": { + "type": "object", + "properties": { + "documentVersion": { + "type": "integer", + "description": "Version number of the document.", + "format": "int32" + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "address": { + "$ref": "#/components/schemas/addressDto" + }, + "contactInfo": { + "$ref": "#/components/schemas/simpleContactDto" + }, + "location": { + "$ref": "#/components/schemas/gpsLocationDto" + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "description": "A key value collection for storing additional information", + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "description": "A list of image references.", + "nullable": true + }, + "minimumOrder": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "Currency code ISO 4217" + }, + "value": { + "type": "number", + "format": "decimal" + } + }, + "description": "Optional minimum order amount required by the restaurant.", + "nullable": true + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Tags associated with the restaurant.", + "nullable": true + }, + "revisionId": { + "type": "string", + "description": "Unique identifier of the restaurant (local to this system).", + "format": "uuid" + }, + "sellerId": { + "type": "string", + "description": "The document id for this revision.", + "format": "uuid" + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "tagLine": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "creatorId": { + "type": "string", + "description": "The user who created this revision.", + "format": "uuid" + }, + "utcCreated": { + "type": "string", + "description": "UTC timestamp when the seller was created.", + "format": "date-time" + }, + "isPublished": { + "type": "boolean", + "description": "Flag indicating whether the seller is published and visible to the public." + }, + "utcPublished": { + "type": "string", + "description": "UTC timestamp when the seller was published.", + "format": "date-time", + "nullable": true + }, + "publisherId": { + "type": "string", + "description": "Unique identifier of the user who published the seller.", + "format": "uuid", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents a restaurant with seller details and associated tags." + }, + "rolePermissionsDto": { + "type": "object", + "properties": { + "role": { + "type": "string", + "description": "Role name.", + "example": "admin" + }, + "permissions": { + "type": "array", + "items": { + "type": "string", + "description": "Permissions are case-insensitive.", + "example": "order:create" + }, + "description": "Collection of permissions linked to the role.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents an association between a role and its permissions." + }, + "scheduleDto": { + "type": "object", + "properties": { + "regularHours": { + "type": "object", + "properties": { + "Sunday": { + "type": "array", + "items": { + "$ref": "#/components/schemas/timeRangeDto" + } + }, + "Monday": { + "type": "array", + "items": { + "$ref": "#/components/schemas/timeRangeDto" + } + }, + "Tuesday": { + "type": "array", + "items": { + "$ref": "#/components/schemas/timeRangeDto" + } + }, + "Wednesday": { + "type": "array", + "items": { + "$ref": "#/components/schemas/timeRangeDto" + } + }, + "Thursday": { + "type": "array", + "items": { + "$ref": "#/components/schemas/timeRangeDto" + } + }, + "Friday": { + "type": "array", + "items": { + "$ref": "#/components/schemas/timeRangeDto" + } + }, + "Saturday": { + "type": "array", + "items": { + "$ref": "#/components/schemas/timeRangeDto" + } + } + }, + "additionalProperties": false, + "description": "Gets or sets the regular hours for each day of the week.\r\nKeys are integers representing days of the week (0 = Sunday, 1 = Monday, etc.).", + "nullable": true + }, + "exceptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/scheduleExceptionDto" + }, + "description": "Gets or sets the list of schedule exceptions.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Data transfer object for Schedule." + }, + "scheduleExceptionDto": { + "type": "object", + "properties": { + "date": { + "type": "string", + "description": "Gets or sets the date of the exception (format: yyyy-MM-dd).", + "format": "date" + }, + "overrideHours": { + "type": "array", + "items": { + "$ref": "#/components/schemas/timeRangeDto" + }, + "description": "Gets or sets the override time ranges for this date.\r\nEmpty array means the location is closed on this date.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Data transfer object for ScheduleException." + }, + "selectedOptionDto": { + "required": [ + "quantity" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Gets the unique identifier for the selected option.", + "format": "uuid" + }, + "setId": { + "type": "string", + "description": "Gets the unique identifier for the set this option belongs to.", + "format": "uuid" + }, + "quantity": { + "type": "number", + "description": "Gets the quantity of this option.", + "format": "double" + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + } + }, + "additionalProperties": false, + "description": "Represents the details of a selected option for a product, such as toppings, sauces, or other customizations." + }, + "selectedProductDto": { + "required": [ + "options", + "productId", + "quantity" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Gets the unique identifier for this selected product.", + "format": "uuid" + }, + "productId": { + "type": "string", + "description": "Gets the unique identifier of the product.", + "format": "uuid" + }, + "quantity": { + "type": "number", + "description": "Gets the quantity of this product. Decimal is used to represent fractional quantities.", + "format": "double" + }, + "options": { + "type": "array", + "items": { + "$ref": "#/components/schemas/selectedOptionDto" + }, + "description": "Gets the collection of selected options for this product.", + "nullable": true + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "comments": { + "type": "string", + "description": "Additional instructions or comments regarding the product.", + "nullable": true + }, + "documentId": { + "type": "string", + "format": "uuid", + "readOnly": true + } + }, + "additionalProperties": false, + "description": "Represents a selected product in a checkout, such as a menu item with its selected options and quantity." + }, + "sellerCompositeDto": { + "type": "object", + "properties": { + "documentVersion": { + "type": "integer", + "description": "Version number of the document.", + "format": "int32" + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "address": { + "$ref": "#/components/schemas/addressDto" + }, + "contactInfo": { + "$ref": "#/components/schemas/simpleContactDto" + }, + "location": { + "$ref": "#/components/schemas/gpsLocationDto" + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "description": "A key value collection for storing additional information", + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "description": "A list of image references.", + "nullable": true + }, + "id": { + "type": "string", + "description": "Identifier for the seller.", + "format": "uuid" + }, + "revisionId": { + "type": "string", + "description": "Current published revision id.", + "format": "uuid", + "nullable": true + }, + "publicKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "Base58 ED25519 public key for this seller.", + "format": "base58", + "example": "GVM9GK9qx28cJFz33xkq9ixFpDc3ZdTwXmt2ranC5Pu4" + }, + "endpoint": { + "type": "string", + "description": "The endpoint URL for the seller.\r\nThis is the origin API endpoint for the seller.", + "nullable": true + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "tagLine": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "isVisible": { + "type": "boolean", + "description": "Is the seller visible?" + }, + "isAvailable": { + "type": "boolean", + "description": "Indicates if the seller is currently available" + }, + "promotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "A list of promotion identifiers.", + "nullable": true + }, + "documentId": { + "type": "string", + "format": "uuid", + "readOnly": true + } + }, + "additionalProperties": false + }, + "sellerDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The document type 'restaurant' or 'shop'.", + "nullable": true + }, + "name": { + "type": "string", + "nullable": true + }, + "endpoint": { + "type": "string", + "description": "Endpoint URL for the seller.", + "nullable": true + }, + "promotionIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "The promotion ids for this seller.", + "nullable": true + }, + "availabilityTriggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/iTriggerDto" + }, + "description": "The availability triggers.", + "nullable": true + }, + "id": { + "type": "string", + "description": "Identifier for the seller.", + "format": "uuid" + }, + "publicKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "Base58 ED25519 public key for this seller.", + "format": "base58", + "example": "GVM9GK9qx28cJFz33xkq9ixFpDc3ZdTwXmt2ranC5Pu4" + }, + "updatedByUserId": { + "type": "string", + "description": "Gets or sets the ID of the user who last updated the item.", + "format": "uuid" + }, + "utcUpdated": { + "type": "string", + "description": "Gets or sets the UTC date and time when last updated.", + "format": "date-time" + } + }, + "additionalProperties": false + }, + "sellerOperationalStateDto": { + "type": "object", + "properties": { + "allowVipOrders": { + "type": "boolean", + "description": "Not Implemented: Only allow VIP orders to be placed for this seller (staff / special customers)." + }, + "allowOrders": { + "type": "boolean", + "description": "Not Implemented: Allow orders to be placed for this seller." + }, + "isOpen": { + "type": "boolean", + "description": "The seller is currently open for business." + }, + "reasonForChange": { + "type": "string", + "description": "Not Implemented: An optional reason for the change in operational state.", + "nullable": true + }, + "resetOnNextShift": { + "type": "boolean", + "description": "Not Implemented: If set, the current changes will be reverted when the next shift starts." + }, + "resetOnNextWorkingDay": { + "type": "boolean", + "description": "Not Implemented: If set, the current changes will be reverted when the first shift of the next working day starts." + }, + "effectiveUntil": { + "type": "string", + "description": "Not Implemented: If set, the current changes will be reverted at the specified date and time.", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false, + "description": "The operational state of the seller can be view or changed using this DTO.\r\nThis might include closing or opening, or restricting the types of orders that can be placed." + }, + "sellerOperationalStateTriggerDto": { + "required": [ + "allowOrders", + "allowVipOrders" + ], + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "allowOrders": { + "type": "boolean" + }, + "allowVipOrders": { + "type": "boolean" + }, + "reasonForChange": { + "type": "string", + "nullable": true + }, + "resetOnNextShift": { + "type": "boolean" + }, + "resetOnNextWorkingDay": { + "type": "boolean" + }, + "effectiveUntil": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "utcCreated": { + "type": "string", + "format": "date-time" + }, + "managerUserId": { + "type": "string", + "format": "uuid" + } + }, + "additionalProperties": false + }, + "sellerPublicAggregateFullDto": { + "required": [ + "categories", + "options", + "products", + "seller" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The document type 'restaurant' or 'shop'.", + "nullable": true + }, + "id": { + "type": "string", + "description": "Identifier for the seller.", + "format": "uuid" + }, + "seller": { + "$ref": "#/components/schemas/sellerCompositeDto" + }, + "products": { + "type": "array", + "items": { + "$ref": "#/components/schemas/productCompositeDto" + }, + "nullable": true + }, + "options": { + "type": "array", + "items": { + "$ref": "#/components/schemas/optionsRevisionDto" + }, + "nullable": true + }, + "categories": { + "type": "array", + "items": { + "$ref": "#/components/schemas/categoryCompositeDto" + }, + "nullable": true + } + }, + "additionalProperties": false + }, + "sellerQueryRequestDto": { + "type": "object", + "properties": { + "offset": { + "type": "integer", + "description": "Number of records to skip for pagination.", + "format": "int32", + "example": 0 + }, + "limit": { + "type": "integer", + "description": "Maximum number of sellers to return in a single query.", + "format": "int32", + "example": 20 + } + }, + "additionalProperties": false, + "description": "Request DTO for querying canonical sellers with various filter criteria." + }, + "sellerRevisionDto": { + "type": "object", + "properties": { + "documentVersion": { + "type": "integer", + "description": "Version number of the document.", + "format": "int32" + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "address": { + "$ref": "#/components/schemas/addressDto" + }, + "contactInfo": { + "$ref": "#/components/schemas/simpleContactDto" + }, + "location": { + "$ref": "#/components/schemas/gpsLocationDto" + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "description": "A key value collection for storing additional information", + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "description": "A list of image references.", + "nullable": true + }, + "revisionId": { + "type": "string", + "description": "Unique identifier of this revision.", + "format": "uuid" + }, + "sellerId": { + "type": "string", + "description": "The id of the document this is a revision of.", + "format": "uuid" + }, + "creatorId": { + "type": "string", + "description": "The user who created this revision.", + "format": "uuid" + }, + "utcCreated": { + "type": "string", + "description": "UTC timestamp when the seller was created.", + "format": "date-time" + }, + "isPublished": { + "type": "boolean", + "description": "Flag indicating whether the seller is published and visible to the public." + }, + "utcPublished": { + "type": "string", + "description": "UTC timestamp when the seller was published.", + "format": "date-time", + "nullable": true + }, + "publisherId": { + "type": "string", + "description": "Unique identifier of the user who published the seller.", + "format": "uuid", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Base class for seller data transfer objects, encapsulating common seller properties.\r\nRestaurants, farms, shops and other merchants inherit this class." + }, + "sellerRevisionQueryRequestDto": { + "type": "object", + "properties": { + "documentId": { + "type": "string", + "description": "Primary filter - unique identifier of the seller document to query.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "textSearch": { + "type": "string", + "description": "Free text search filter that matches against seller's searchable fields.", + "nullable": true, + "example": "coffee shop downtown" + }, + "sellerKey": { + "pattern": "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$", + "type": "string", + "description": "Filter by the seller's Base58 public key identifier.", + "format": "base58", + "nullable": true, + "example": "25Lsvw66SYEKpMiuWYRGT6D2f394DVcZQSdzs4WY4bTE" + }, + "offset": { + "type": "integer", + "description": "Number of records to skip for pagination.", + "format": "int32", + "example": 0 + }, + "limit": { + "type": "integer", + "description": "Maximum number of records to return in a single query.", + "format": "int32", + "example": 20 + }, + "utcCreatedFrom": { + "type": "string", + "description": "Filter sellers created on or after this UTC datetime.", + "format": "date-time", + "nullable": true, + "example": "2025-03-22T00:00:00Z" + }, + "utcCreatedTo": { + "type": "string", + "description": "Filter sellers created on or before this UTC datetime.", + "format": "date-time", + "nullable": true, + "example": "2025-03-22T23:59:59Z" + }, + "isPublished": { + "type": "boolean", + "description": "Filter by publication status. If null, returns both published and unpublished sellers.", + "nullable": true, + "example": true + }, + "publishedByUserId": { + "type": "string", + "description": "Filter sellers by the ID of the user who published them.", + "format": "uuid", + "nullable": true, + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "utcCreated": { + "type": "string", + "description": "Filter sellers by exact creation datetime in UTC.", + "format": "date-time", + "nullable": true, + "example": "2025-03-22T07:12:37Z" + } + }, + "additionalProperties": false, + "description": "Request DTO for querying sellers with various filter criteria." + }, + "sellerViewDto": { + "type": "object", + "properties": { + "documentVersion": { + "type": "integer", + "description": "Version number of the document.", + "format": "int32" + }, + "schedule": { + "$ref": "#/components/schemas/scheduleDto" + }, + "address": { + "$ref": "#/components/schemas/addressDto" + }, + "contactInfo": { + "$ref": "#/components/schemas/simpleContactDto" + }, + "location": { + "$ref": "#/components/schemas/gpsLocationDto" + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "description": "A key value collection for storing additional information", + "nullable": true + }, + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/imageReferenceDto" + }, + "description": "A list of image references.", + "nullable": true + }, + "revisionId": { + "type": "string", + "description": "Unique identifier of this revision.", + "format": "uuid" + }, + "sellerId": { + "type": "string", + "description": "The id of the document this is a revision of.", + "format": "uuid" + }, + "utcCreated": { + "type": "string", + "description": "UTC timestamp when the seller was created.", + "format": "date-time" + }, + "title": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "description": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "tagLine": { + "$ref": "#/components/schemas/localizedTextDto" + }, + "availabilityTriggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/iTriggerDto" + }, + "description": "The promotion ids for this seller.", + "nullable": true + } + }, + "additionalProperties": false + }, + "sessionIpResponseDto": { + "required": [ + "clientIp" + ], + "type": "object", + "properties": { + "clientIp": { + "type": "string", + "description": "Gets or sets the web client's IP address.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Response DTO for fetching the client's IP." + }, + "sessionStatus": { + "enum": [ + "Pending", + "Authenticated", + "Used", + "Expired", + "Invalidated" + ], + "type": "string", + "description": "Enum representing the status of a QR authentication session.\n\n**Enum Values:**\r\n\r\n- Pending: The session is pending authentication.\r\n- Authenticated: The session has been authenticated.\r\n- Used: The session has been used.\r\n- Expired: The session has expired.\r\n- Invalidated: The session has been invalidated.\r\n", + "x-enum-varnames": [ + "Pending", + "Authenticated", + "Used", + "Expired", + "Invalidated" + ], + "x-enum-descriptions": [ + "(value: \"Pending\") The session is pending authentication.", + "(value: \"Authenticated\") The session has been authenticated.", + "(value: \"Used\") The session has been used.", + "(value: \"Expired\") The session has expired.", + "(value: \"Invalidated\") The session has been invalidated." + ] + }, + "sessionStatusDto": { + "required": [ + "sessionId", + "status" + ], + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Gets or sets the unique session identifier.", + "nullable": true + }, + "status": { + "$ref": "#/components/schemas/sessionStatus" + }, + "createdAt": { + "type": "string", + "description": "Gets or sets the timestamp when the session was created.", + "format": "date-time" + }, + "expiresAt": { + "type": "string", + "description": "Gets or sets the timestamp when the session expires.", + "format": "date-time" + } + }, + "additionalProperties": false, + "description": "DTO for the session status." + }, + "signedAuthDocumentDto": { + "required": [ + "document", + "signature" + ], + "type": "object", + "properties": { + "document": { + "$ref": "#/components/schemas/authDocumentDto" + }, + "signature": { + "type": "string", + "description": "Gets or sets the base64 encoded signature of the auth document.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "DTO for the authentication submission from the mobile app.\r\nIt bundles the auth document with its corresponding signature." + }, + "simpleContactDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true + }, + "phone": { + "type": "string", + "nullable": true + }, + "email": { + "type": "string", + "nullable": true + }, + "notes": { + "type": "string", + "nullable": true + }, + "extra": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true + } + }, + "additionalProperties": false + }, + "startSessionResponseDto": { + "required": [ + "clientIp", + "sessionId" + ], + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Gets or sets the unique, unpredictable session identifier.", + "nullable": true + }, + "clientIp": { + "type": "string", + "description": "Gets or sets the web client's IP address.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Response DTO for starting a new session.\r\nContains the one-time session ID and the client's IP address." + }, + "stopListTriggerDto": { + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "utcCreated": { + "type": "string", + "format": "date-time" + }, + "managerUserId": { + "type": "string", + "format": "uuid" + } + }, + "additionalProperties": false + }, + "systemSecurityDto": { + "type": "object", + "properties": { + "inUse": { + "type": "array", + "items": { + "$ref": "#/components/schemas/rolePermissionsDto" + }, + "description": "The role-permission mappings that are currently active.", + "nullable": true + }, + "permissions": { + "type": "array", + "items": { + "type": "string", + "description": "Permissions are case-insensitive.", + "example": "order:create" + }, + "description": "All available permissions in the system.", + "nullable": true + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "description": "Roles are case-insensitive.", + "example": "admin" + }, + "description": "The currently defined roles in the system.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents the system security configuration, including the mappings between roles and permissions\r\ncurrently in use, as well as the complete set of available permissions and roles defined in the system." + }, + "tag": { + "type": "object", + "additionalProperties": false + }, + "textQueryRequestDto": { + "type": "object", + "properties": { + "documentId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "key": { + "type": "string", + "nullable": true + }, + "containsText": { + "type": "string", + "nullable": true + }, + "lang": { + "type": "string", + "nullable": true + }, + "offset": { + "type": "integer", + "format": "int32" + }, + "limit": { + "type": "integer", + "format": "int32" + }, + "utcCreatedFrom": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "utcCreatedTo": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "isPublished": { + "type": "boolean", + "nullable": true + }, + "publishedByUserId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "utcCreated": { + "type": "string", + "format": "date-time", + "nullable": true + } + }, + "additionalProperties": false + }, + "textRevisionDto": { + "type": "object", + "properties": { + "documentId": { + "type": "string", + "format": "uuid" + }, + "key": { + "type": "string", + "nullable": true + }, + "lang": { + "type": "string", + "nullable": true + }, + "value": { + "type": "string", + "nullable": true + }, + "revisionId": { + "type": "string", + "format": "uuid" + }, + "creatorId": { + "type": "string", + "format": "uuid" + }, + "utcCreated": { + "type": "string", + "format": "date-time" + }, + "isPublished": { + "type": "boolean" + }, + "utcPublished": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "publisherId": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "additional": { + "type": "object", + "additionalProperties": {}, + "nullable": true + } + }, + "additionalProperties": false + }, + "timeRangeDto": { + "type": "object", + "properties": { + "start": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "Gets or sets the start time.", + "format": "time", + "example": "13:45:30" + }, + "end": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "Gets or sets the end time.", + "format": "time", + "example": "13:45:30" + } + }, + "additionalProperties": false, + "description": "Data transfer object for TimeRange." + }, + "timeTriggerDto": { + "required": [ + "endTime", + "startTime" + ], + "type": "object", + "properties": { + "effect": { + "$ref": "#/components/schemas/triggerEffect" + }, + "type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "startTime": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "A time value in 24-hour format (HH:mm:ss.FFFFFFF).", + "format": "time", + "example": "13:45:30" + }, + "endTime": { + "pattern": "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d{1,7})?$", + "type": "string", + "description": "A time value in 24-hour format (HH:mm:ss.FFFFFFF).", + "format": "time", + "example": "13:45:30" + } + }, + "additionalProperties": false + }, + "triggerEffect": { + "enum": [ + 0, + 1, + 2, + 4 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **None**: No effect. The trigger does not influence the document in any way.\r\n- 1 - **SetUnavailable**: The trigger affects availability of the document.\r\n- 2 - **SetInvisible**: The trigger affects visibility of the document.\r\n- 4 - **SetStopped**: The trigger can stop the document.\r\n", + "format": "int32", + "x-enum-varnames": [ + "None", + "SetUnavailable", + "SetInvisible", + "SetStopped" + ], + "x-enum-descriptions": [ + "(value: 0) No effect. The trigger does not influence the document in any way.", + "(value: 1) The trigger affects availability of the document.", + "(value: 2) The trigger affects visibility of the document.", + "(value: 4) The trigger can stop the document." + ] + }, + "updatePermissionsRequest": { + "type": "object", + "properties": { + "role": { + "type": "string", + "description": "Gets or sets the role for which the permission update is requested.", + "example": "admin" + }, + "permission": { + "type": "string", + "description": "Gets or sets the permission that is to be added or removed.", + "example": "order:create" + }, + "isAdd": { + "type": "boolean", + "description": "Gets or sets a value indicating whether the permission is to be added (true) or removed (false)." + } + }, + "additionalProperties": false, + "description": "Represents a request to update permissions by either adding or removing a specific permission for a given role." + }, + "userDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Gets or sets the unique identifier for the user.", + "format": "uuid" + }, + "remoteId": { + "type": "string", + "description": "Gets or sets the remote identifier for the user, typically used for external references.", + "nullable": true + }, + "name": { + "type": "string", + "description": "Gets or sets the user's name.", + "nullable": true + }, + "avatarUrl": { + "type": "string", + "description": "Gets or sets the URL of the user's avatar image.", + "nullable": true + }, + "publicKey": { + "type": "string", + "description": "Gets or sets the public key associated with the user, if applicable.", + "nullable": true + }, + "email": { + "$ref": "#/components/schemas/verifiedValueDto" + }, + "phoneNumber": { + "$ref": "#/components/schemas/verifiedValueDto" + }, + "roles": { + "uniqueItems": true, + "type": "array", + "items": { + "type": "string" + }, + "description": "Gets or sets the set of roles assigned to the user.\r\nRoles are generally set by the authority server.", + "nullable": true + }, + "isVerified": { + "type": "boolean", + "description": "Gets or sets a value indicating whether the user has been verified." + }, + "authorityUrl": { + "type": "string", + "description": "Gets or sets the Url of the authority that manages the user, if applicable.", + "nullable": true + }, + "utcUpdated": { + "type": "string", + "description": "Gets or sets the UTC date and time when the user information was last updated.", + "format": "date-time" + }, + "extraKeys": { + "type": "object", + "additionalProperties": {}, + "description": "Gets or sets a dictionary for storing additional key-value pairs related to the user.", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represents a user data transfer object (DTO) containing user details and associated metadata." + }, + "userQueryRequest": { + "type": "object", + "properties": { + "searchText": { + "type": "string", + "description": "Search for users where any searchable property contains this text.", + "nullable": true + }, + "nameContains": { + "type": "string", + "description": "Search for users where the name contains this text.", + "nullable": true + }, + "hasAnyRole": { + "type": "string", + "description": "Comma separated list of roles. The user must have all of these roles.", + "nullable": true + }, + "hasAllRole": { + "type": "string", + "description": "Comma separated list of roles. The user must have any of these roles.", + "nullable": true + }, + "offset": { + "type": "integer", + "description": "If not specified, defaults to 0.", + "format": "int32" + }, + "limit": { + "type": "integer", + "description": "If not specified, defaults to 20.", + "format": "int32" + } + }, + "additionalProperties": false + }, + "verifiedValueDto": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "The value being trusted, such as a phone number or email address.", + "nullable": true + }, + "utcUpdated": { + "type": "string", + "description": "When this document was last updated.", + "format": "date-time" + }, + "isVerified": { + "type": "boolean", + "description": "The verification status of this value." + } + }, + "additionalProperties": false, + "description": "Represents a value that has been verified by a trusted source." + }, + "versionCheck": { + "enum": [ + 0, + 100, + 200 + ], + "type": "integer", + "description": "**Enum Values:**\r\n\r\n- 0 - **Ok**\r\n- 100 - **Old**\r\n- 200 - **Incompatible**\r\n", + "format": "int32", + "x-enum-varnames": [ + "Ok", + "Old", + "Incompatible" + ], + "x-enum-descriptions": [ + "(value: 0) ", + "(value: 100) ", + "(value: 200) " + ] + }, + "void": { + "type": "object", + "additionalProperties": false + } + }, + "securitySchemes": { + "Bearer": { + "type": "http", + "description": "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"", + "scheme": "bearer", + "bearerFormat": "JWT" + }, + "ApiKey": { + "type": "apiKey", + "description": "API key needed to access the endpoints.", + "name": "x-api-key", + "in": "header" + }, + "QrSignedAuth": { + "type": "apiKey", + "description": "QR signed authentication header. Format: ':'", + "name": "X-Signed-Auth", + "in": "header" + } + } + } +} \ No newline at end of file diff --git a/src/lib/api/merchant/services/AiService.ts b/src/lib/api/merchant/services/AiService.ts new file mode 100644 index 0000000..a8d0dcb --- /dev/null +++ b/src/lib/api/merchant/services/AiService.ts @@ -0,0 +1,31 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class AiService { + /** + * Serves MCP JSON‑RPC requests for the MCP SSE server + * @returns any OK + * @throws ApiError + */ + public static postMcpMessage(): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/mcp/message", + }); + } + /** + * Serves SSE connections for the MCP SSE server + * @returns any OK + * @throws ApiError + */ + public static getMcpSse(): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/mcp/sse", + }); + } +} diff --git a/src/lib/api/merchant/services/AuthenticationService.ts b/src/lib/api/merchant/services/AuthenticationService.ts new file mode 100644 index 0000000..dd1e135 --- /dev/null +++ b/src/lib/api/merchant/services/AuthenticationService.ts @@ -0,0 +1,132 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { authenticationResultDto } from "../models/authenticationResultDto"; +import type { authHeaderResponseDto } from "../models/authHeaderResponseDto"; +import type { sessionIpResponseDto } from "../models/sessionIpResponseDto"; +import type { sessionStatusDto } from "../models/sessionStatusDto"; +import type { signedAuthDocumentDto } from "../models/signedAuthDocumentDto"; +import type { startSessionResponseDto } from "../models/startSessionResponseDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class AuthenticationService { + /** + * Create a new QR authentication session. + * This endpoint creates a new authentication session for QR-based authentication. + * It generates a unique session ID and records the client's IP address. + * The web client uses this information to generate a QR code that can be scanned by a mobile app. + * @returns startSessionResponseDto OK + * @throws ApiError + */ + public static postApiAuthQrSession(): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/auth/qr/session", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Get the client IP address for a session. + * This endpoint is used by the mobile app after scanning a QR code. + * It retrieves the client IP address associated with the session ID. + * The mobile app uses this IP address when creating the authentication document. + * @returns sessionIpResponseDto OK + * @throws ApiError + */ + public static getApiAuthQrSessionIp({ + sessionId, + }: { + sessionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/auth/qr/session/{sessionId}/ip", + path: { + sessionId: sessionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the status of a QR authentication session. + * This endpoint allows the web client to poll for the status of an authentication session. + * It returns the current state of the session (pending, authenticated, expired, or invalidated). + * The web client uses this to detect when the mobile app completes authentication. + * @returns sessionStatusDto OK + * @throws ApiError + */ + public static getApiAuthQrSessionStatus({ + sessionId, + }: { + sessionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/auth/qr/session/{sessionId}/status", + path: { + sessionId: sessionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the authentication header for a QR authentication session. + * This endpoint allows the web client to poll for the authentication header of a session. + * It returns the X-Signed-Auth header value that can be used to authenticate requests. + * The web client uses this to make authenticated requests after the mobile app completes authentication. + * @returns authHeaderResponseDto OK + * @throws ApiError + */ + public static getApiAuthQrSessionHeader({ + sessionId, + }: { + sessionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/auth/qr/session/{sessionId}/header", + path: { + sessionId: sessionId, + }, + errors: { + 400: `Bad Request`, + 403: `Forbidden`, + 404: `Not Found`, + }, + }); + } + /** + * Authenticate with a signed authentication document. + * This endpoint accepts a signed authentication document from the mobile app. + * It verifies the signature, checks that the client IP matches, and validates the document's validity period. + * Upon successful verification, it marks the session as authenticated and returns a success result. + * @returns authenticationResultDto OK + * @throws ApiError + */ + public static postApiAuthQrAuthenticate({ + requestBody, + }: { + requestBody?: signedAuthDocumentDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/auth/qr/authenticate", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/CategoriesCanonicalService.ts b/src/lib/api/merchant/services/CategoriesCanonicalService.ts new file mode 100644 index 0000000..0f9f590 --- /dev/null +++ b/src/lib/api/merchant/services/CategoriesCanonicalService.ts @@ -0,0 +1,188 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { categoryDto } from "../models/categoryDto"; +import type { categoryQueryRequestDto } from "../models/categoryQueryRequestDto"; +import type { categoryStopListDto } from "../models/categoryStopListDto"; +import type { createCategoryDto } from "../models/createCategoryDto"; +import type { QueryResultDto_CategoryDto_ } from "../models/QueryResultDto_CategoryDto_"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class CategoriesCanonicalService { + /** + * Create a canonical category entry. + * @returns categoryDto OK + * @throws ApiError + */ + public static postApiCategoryCanonical({ + requestBody, + }: { + requestBody: createCategoryDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/category/canonical", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Retrieve a canonical category entry. + * @returns categoryDto OK + * @throws ApiError + */ + public static getApiCategoryCanonical({ + categoryId, + }: { + categoryId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/category/canonical/{categoryId}", + path: { + categoryId: categoryId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Update a canonical category entry. + * @returns any OK + * @throws ApiError + */ + public static putApiCategoryCanonical({ + categoryId, + requestBody, + }: { + categoryId: string; + requestBody: createCategoryDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/category/canonical/{categoryId}", + path: { + categoryId: categoryId, + }, + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Delete a canonical category entry. + * @returns any OK + * @throws ApiError + */ + public static deleteApiCategoryCanonical({ + categoryId, + }: { + categoryId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "DELETE", + url: "/api/category/canonical/{categoryId}", + path: { + categoryId: categoryId, + }, + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Query canonical category data filtered by options. + * @returns QueryResultDto_CategoryDto_ OK + * @throws ApiError + */ + public static postApiCategoryCanonicalQuery({ + requestBody, + }: { + requestBody: categoryQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/category/canonical/query", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Adds multiple categories to the 'stop list'. + * Items on the 'stop list' are not available for purchase. + * @returns any OK + * @throws ApiError + */ + public static postApiCategoryCanonicalStopList({ + requestBody, + }: { + requestBody: categoryStopListDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/category/canonical/stop-list", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Removes multiple categories from the 'stop list'. + * @returns any OK + * @throws ApiError + */ + public static deleteApiCategoryCanonicalStopList({ + requestBody, + }: { + requestBody: categoryStopListDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "DELETE", + url: "/api/category/canonical/stop-list", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Gets the list of stopped category ids for a specific seller. + * @returns string OK + * @throws ApiError + */ + public static getApiCategoryCanonicalStopList({ + sellerId, + }: { + sellerId: string; + }): CancelablePromise> { + return __request(OpenAPI, { + method: "GET", + url: "/api/category/canonical/stop-list/{sellerId}", + path: { + sellerId: sellerId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/CategoriesRevisionsService.ts b/src/lib/api/merchant/services/CategoriesRevisionsService.ts new file mode 100644 index 0000000..e38d396 --- /dev/null +++ b/src/lib/api/merchant/services/CategoriesRevisionsService.ts @@ -0,0 +1,148 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { categoryRevisionDto } from "../models/categoryRevisionDto"; +import type { categoryRevisionQueryRequestDto } from "../models/categoryRevisionQueryRequestDto"; +import type { categoryViewDto } from "../models/categoryViewDto"; +import type { createCategoryRevisionDto } from "../models/createCategoryRevisionDto"; +import type { QueryResultDto_CategoryRevisionDto_ } from "../models/QueryResultDto_CategoryRevisionDto_"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class CategoriesRevisionsService { + /** + * Creates a revision of a category document. + * @returns categoryRevisionDto OK + * @throws ApiError + */ + public static postApiCategoryRevision({ + categoryId, + requestBody, + }: { + categoryId: string; + requestBody: createCategoryRevisionDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/category/revision/{categoryId}", + path: { + categoryId: categoryId, + }, + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the currently published category + * @returns categoryViewDto OK + * @throws ApiError + */ + public static getApiCategoryRevisionPublished({ + categoryId, + }: { + categoryId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/category/revision/published/{categoryId}", + path: { + categoryId: categoryId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get a specific revision + * @returns categoryRevisionDto OK + * @throws ApiError + */ + public static getApiCategoryRevision({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/category/revision/{revisionId}", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Query revisions filtered by options. + * @returns QueryResultDto_CategoryRevisionDto_ OK + * @throws ApiError + */ + public static postApiCategoryRevisionQuery({ + requestBody, + }: { + requestBody: categoryRevisionQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/category/revision/query", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Publish the specified revision + * @returns any OK + * @throws ApiError + */ + public static putApiCategoryRevisionPublish({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/category/revision/{revisionId}/publish", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Unpublish the specified revision + * @returns any OK + * @throws ApiError + */ + public static putApiCategoryRevisionUnpublish({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/category/revision/{revisionId}/unpublish", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/CategoriesViewsService.ts b/src/lib/api/merchant/services/CategoriesViewsService.ts new file mode 100644 index 0000000..19cfcae --- /dev/null +++ b/src/lib/api/merchant/services/CategoriesViewsService.ts @@ -0,0 +1,75 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { categoryCompositeDto } from "../models/categoryCompositeDto"; +import type { categoryQueryRequestDto } from "../models/categoryQueryRequestDto"; +import type { categoryRevisionQueryRequestDto } from "../models/categoryRevisionQueryRequestDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class CategoriesViewsService { + /** + * Get the published category composite view + * This view combines the canonical, revision and text models into a single view model. + * @returns categoryCompositeDto OK + * @throws ApiError + */ + public static getApiCategoryComposite({ + categoryId, + }: { + categoryId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/category/composite/{categoryId}", + path: { + categoryId: categoryId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * @returns categoryCompositeDto OK + * @throws ApiError + */ + public static postApiCategoryCompositeQueryByCanonical({ + requestBody, + }: { + requestBody: categoryQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/category/composite/query/by-canonical", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * @returns categoryCompositeDto OK + * @throws ApiError + */ + public static postApiCategoryCompositeQueryByRevision({ + requestBody, + }: { + requestBody: categoryRevisionQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/category/composite/query/by-revision", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/DeliveriesService.ts b/src/lib/api/merchant/services/DeliveriesService.ts new file mode 100644 index 0000000..c758a08 --- /dev/null +++ b/src/lib/api/merchant/services/DeliveriesService.ts @@ -0,0 +1,82 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { priceEstimationDto } from "../models/priceEstimationDto"; +import type { priceEstimationRequestDto } from "../models/priceEstimationRequestDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class DeliveriesService { + /** + * Create a guest delivery link. + * This endpoint will create a guest delivery link for supplied order on the DSP-o application. + * The link is usually converted to a QR code and scanned in by the prospective driver. + * The 'link-code' contained in the url allows that driver to accept an order as a 'guest courier' + * @returns string OK + * @throws ApiError + */ + public static getApiDeliveryCourierGuestLink({ + orderId, + }: { + orderId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/delivery/courier-guest/link/{orderId}", + path: { + orderId: orderId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get price estimations for delivery. + * This endpoint returns price estimations for a delivery based on the provided locations and scheduled time. + * It requires at least two locations (pickup and delivery) to calculate the price. + * @returns priceEstimationDto OK + * @throws ApiError + */ + public static postApiDeliveryPriceEstimation({ + requestBody, + }: { + requestBody: priceEstimationRequestDto; + }): CancelablePromise> { + return __request(OpenAPI, { + method: "POST", + url: "/api/delivery/price-estimation", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Get driver link for an order. + * This endpoint returns a driver link for the specified order. The link can be used by a driver to accept the order. + * @returns string OK + * @throws ApiError + */ + public static getApiDeliveryDriverLink({ + orderId, + }: { + orderId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/delivery/driver-link/{orderId}", + path: { + orderId: orderId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + 500: `Internal Server Error`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/ImagesService.ts b/src/lib/api/merchant/services/ImagesService.ts new file mode 100644 index 0000000..b5758a8 --- /dev/null +++ b/src/lib/api/merchant/services/ImagesService.ts @@ -0,0 +1,101 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class ImagesService { + /** + * Uploads an asset to storage. + * This endpoint expects multipart/form-data with two keyed items: + * 'json' = The JSON parameters of type 'ImageParametersDto' + * 'image' = The image + * @returns any OK + * @throws ApiError + */ + public static postApiImageUpload({ + formData, + }: { + formData: any; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/image/upload", + formData: formData, + mediaType: "multipart/form-data", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Download an image by its digest + * When supplied a valid base58 encoded digest, this endpoint will return the image associated with that id as a file download. + * The response will be a file download with the correct content type. + * The file name will be the digest with the correct extension. + * @returns string OK + * @throws ApiError + */ + public static getImg({ + digest, + }: { + /** + * This is a base58 encoded digest, a unique identifier for the image. + */ + digest: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/img/{digest}", + path: { + digest: digest, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Download a resized image by digest + * When supplied a valid base58 encoded digest, this endpoint will return the image associated with that id as a file download. + * The response will be a file download with the correct content type. + * The file name will be the digest with the correct extension. + * @returns string OK + * @throws ApiError + */ + public static getImg1({ + digest, + aspect, + size, + }: { + /** + * This is a base58 encoded digest, a unique identifier for the image. + */ + digest: string; + /** + * This must be set: [landscape, square, portrait] + */ + aspect: string; + /** + * This must be set: [XS, S, M, HD, FHD, QHD, UHD] + */ + size: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/img/{digest}/{aspect}/{size}", + path: { + digest: digest, + aspect: aspect, + size: size, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/OidcService.ts b/src/lib/api/merchant/services/OidcService.ts new file mode 100644 index 0000000..c7409af --- /dev/null +++ b/src/lib/api/merchant/services/OidcService.ts @@ -0,0 +1,44 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { oidcConnectResponseDto } from "../models/oidcConnectResponseDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class OidcService { + /** + * Returns OIDC information + * Returns OIDC information for the standard OIDC application client, this information is used to enable clients to connect to the correct OIDC endpoint. + * @returns oidcConnectResponseDto OK + * @throws ApiError + */ + public static getOidcJson(): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/oidc.json", + }); + } + /** + * Returns OIDC information by application type + * Returns OIDC information for the given application client type, this information is used to enable clients to connect to the correct OIDC endpoint. + * @returns oidcConnectResponseDto OK + * @throws ApiError + */ + public static getOidcJson1({ + appType, + }: { + /** + * Application type (eg: "native" would be native mobile apps). + */ + appType: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/oidc-{appType}.json", + path: { + appType: appType, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/OrdersBasketService.ts b/src/lib/api/merchant/services/OrdersBasketService.ts new file mode 100644 index 0000000..5870e4f --- /dev/null +++ b/src/lib/api/merchant/services/OrdersBasketService.ts @@ -0,0 +1,31 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { basketDto } from "../models/basketDto"; +import type { calculatedCheckoutDto } from "../models/calculatedCheckoutDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class OrdersBasketService { + /** + * @returns calculatedCheckoutDto OK + * @throws ApiError + */ + public static postApiOrderBasketCalculate({ + requestBody, + }: { + requestBody: basketDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/order/basket/calculate", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/OrdersService.ts b/src/lib/api/merchant/services/OrdersService.ts new file mode 100644 index 0000000..13327c2 --- /dev/null +++ b/src/lib/api/merchant/services/OrdersService.ts @@ -0,0 +1,228 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { orderCreateDto } from "../models/orderCreateDto"; +import type { orderDto } from "../models/orderDto"; +import type { orderFailureRequestDto } from "../models/orderFailureRequestDto"; +import type { orderNextStatusDto } from "../models/orderNextStatusDto"; +import type { orderQueryRequestDto } from "../models/orderQueryRequestDto"; +import type { orderStateChangeRequestDto } from "../models/orderStateChangeRequestDto"; +import type { orderStateDto } from "../models/orderStateDto"; +import type { orderViewDto } from "../models/orderViewDto"; +import type { QueryResultDto_OrderViewDto_ } from "../models/QueryResultDto_OrderViewDto_"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class OrdersService { + /** + * Retrieves a single order by its ID. + * @returns orderViewDto OK + * @throws ApiError + */ + public static getApiOrder({ + orderId, + }: { + /** + * The order id + */ + orderId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/order/{orderId}", + path: { + orderId: orderId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Query the system's orders. + * @returns QueryResultDto_OrderViewDto_ OK + * @throws ApiError + */ + public static postApiOrderQuery({ + requestBody, + }: { + /** + * A dto containing the optional filters + */ + requestBody: orderQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/order/query", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * @deprecated + * Change order state, and update estimated ready time. + * @returns orderStateDto OK + * @throws ApiError + */ + public static putApiOrderState({ + requestBody, + }: { + /** + * The requested change document + */ + requestBody: orderStateChangeRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/order/state", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Get the current state of an order. + * @returns orderStateDto OK + * @throws ApiError + */ + public static getApiOrderState({ + orderId, + }: { + /** + * The order id + */ + orderId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/order/state/{orderId}", + path: { + orderId: orderId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Return UmlDotGraph for current implementation of order state machine. + * @returns string OK + * @throws ApiError + */ + public static getApiOrderStateMachine(): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/order/state-machine", + }); + } + /** + * Gets the next state of an order. + * @returns orderStateDto OK + * @throws ApiError + */ + public static postApiOrderNextState({ + orderId, + requestBody, + }: { + /** + * The specified order id + */ + orderId: string; + /** + * The current state of the order + */ + requestBody: orderNextStatusDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/order/{orderId}/next-state", + path: { + orderId: orderId, + }, + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Cancel the specified order. + * @returns void + * @throws ApiError + */ + public static postApiOrderCancel({ + orderId, + }: { + /** + * The specified order id + */ + orderId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/order/{orderId}/cancel", + path: { + orderId: orderId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Create an order. + * @returns orderDto OK + * @throws ApiError + */ + public static postApiOrder({ + requestBody, + }: { + requestBody: orderCreateDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/order", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Cancel/reject an order with a specific failure reason. + * @returns orderStateDto OK + * @throws ApiError + */ + public static postApiOrderCancellation({ + requestBody, + }: { + /** + * The order failure request containing orderId and failure reason + */ + requestBody: orderFailureRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/order/cancellation", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/ProductOptionsRevisionsService.ts b/src/lib/api/merchant/services/ProductOptionsRevisionsService.ts new file mode 100644 index 0000000..08e09a6 --- /dev/null +++ b/src/lib/api/merchant/services/ProductOptionsRevisionsService.ts @@ -0,0 +1,169 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { createOptionsRevisionDto } from "../models/createOptionsRevisionDto"; +import type { optionsQueryDto } from "../models/optionsQueryDto"; +import type { optionsRevisionDto } from "../models/optionsRevisionDto"; +import type { optionsViewDto } from "../models/optionsViewDto"; +import type { QueryResultDto_OptionsRevisionDto_ } from "../models/QueryResultDto_OptionsRevisionDto_"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class ProductOptionsRevisionsService { + /** + * Creates a revision of a product option set document. + * @returns optionsRevisionDto OK + * @throws ApiError + */ + public static postApiProductOptionsRevision({ + optionsId, + requestBody, + }: { + optionsId: string; + requestBody: createOptionsRevisionDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/product/options/revision/{optionsId}", + path: { + optionsId: optionsId, + }, + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Creates a new product option set document. + * @returns optionsRevisionDto OK + * @throws ApiError + */ + public static postApiProductOptionsRevision1({ + requestBody, + }: { + requestBody: createOptionsRevisionDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/product/options/revision", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the currently published product option set + * @returns optionsViewDto OK + * @throws ApiError + */ + public static getApiProductOptionsRevisionPublished({ + optionsId, + }: { + optionsId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/product/options/revision/published/{optionsId}", + path: { + optionsId: optionsId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get a specific revision + * @returns optionsRevisionDto OK + * @throws ApiError + */ + public static getApiProductOptionsRevision({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/product/options/revision/{revisionId}", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Query filtered by options. + * @returns QueryResultDto_OptionsRevisionDto_ OK + * @throws ApiError + */ + public static postApiProductOptionsRevisionQuery({ + requestBody, + }: { + requestBody: optionsQueryDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/product/options/revision/query", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Publish the specified revision + * @returns any OK + * @throws ApiError + */ + public static putApiProductOptionsRevisionPublish({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/product/options/revision/{revisionId}/publish", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Unpublish the specified revision + * @returns any OK + * @throws ApiError + */ + public static putApiProductOptionsRevisionUnpublish({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/product/options/revision/{revisionId}/unpublish", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/ProductsCanonicalService.ts b/src/lib/api/merchant/services/ProductsCanonicalService.ts new file mode 100644 index 0000000..1d30a42 --- /dev/null +++ b/src/lib/api/merchant/services/ProductsCanonicalService.ts @@ -0,0 +1,188 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { createProductDto } from "../models/createProductDto"; +import type { productDto } from "../models/productDto"; +import type { productQueryRequestDto } from "../models/productQueryRequestDto"; +import type { productStopListDto } from "../models/productStopListDto"; +import type { QueryResultDto_ProductRevisionDto_ } from "../models/QueryResultDto_ProductRevisionDto_"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class ProductsCanonicalService { + /** + * Query canonical product data filtered by options. + * @returns QueryResultDto_ProductRevisionDto_ OK + * @throws ApiError + */ + public static postApiProductCanonicalQuery({ + requestBody, + }: { + requestBody: productQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/product/canonical/query", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Create a canonical product entry. + * @returns productDto OK + * @throws ApiError + */ + public static postApiProductCanonical({ + requestBody, + }: { + requestBody: createProductDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/product/canonical", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Retrieve a canonical product entry. + * @returns productDto OK + * @throws ApiError + */ + public static getApiProductCanonical({ + productId, + }: { + productId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/product/canonical/{productId}", + path: { + productId: productId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Update a canonical product entry. + * @returns any OK + * @throws ApiError + */ + public static putApiProductCanonical({ + productId, + requestBody, + }: { + productId: string; + requestBody: createProductDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/product/canonical/{productId}", + path: { + productId: productId, + }, + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Delete a canonical product entry. + * @returns any OK + * @throws ApiError + */ + public static deleteApiProductCanonical({ + productId, + }: { + productId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "DELETE", + url: "/api/product/canonical/{productId}", + path: { + productId: productId, + }, + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Adds multiple products to the 'stop list'. + * Items on the 'stop list' are not available for purchase. + * @returns any OK + * @throws ApiError + */ + public static postApiProductCanonicalStopList({ + requestBody, + }: { + requestBody: productStopListDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/product/canonical/stop-list", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Removes multiple products from the 'stop list'. + * @returns any OK + * @throws ApiError + */ + public static deleteApiProductCanonicalStopList({ + requestBody, + }: { + requestBody: productStopListDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "DELETE", + url: "/api/product/canonical/stop-list", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Gets the list of stopped product ids for a specific seller. + * @returns string OK + * @throws ApiError + */ + public static getApiProductCanonicalStopList({ + sellerId, + }: { + sellerId: string; + }): CancelablePromise> { + return __request(OpenAPI, { + method: "GET", + url: "/api/product/canonical/stop-list/{sellerId}", + path: { + sellerId: sellerId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/ProductsRevisionsService.ts b/src/lib/api/merchant/services/ProductsRevisionsService.ts new file mode 100644 index 0000000..f8fad24 --- /dev/null +++ b/src/lib/api/merchant/services/ProductsRevisionsService.ts @@ -0,0 +1,147 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { createProductRevisionDto } from "../models/createProductRevisionDto"; +import type { productRevisionDto } from "../models/productRevisionDto"; +import type { productRevisionQueryRequestDto } from "../models/productRevisionQueryRequestDto"; +import type { QueryResultDto_ProductRevisionDto_ } from "../models/QueryResultDto_ProductRevisionDto_"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class ProductsRevisionsService { + /** + * Creates a revision of a product document. + * @returns productRevisionDto OK + * @throws ApiError + */ + public static postApiProductRevision({ + productId, + requestBody, + }: { + productId: string; + requestBody: createProductRevisionDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/product/revision/{productId}", + path: { + productId: productId, + }, + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the currently published product + * @returns productRevisionDto OK + * @throws ApiError + */ + public static getApiProductRevisionPublished({ + productId, + }: { + productId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/product/revision/published/{productId}", + path: { + productId: productId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get a specific revision + * @returns productRevisionDto OK + * @throws ApiError + */ + public static getApiProductRevision({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/product/revision/{revisionId}", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Query revisions filtered by options. + * @returns QueryResultDto_ProductRevisionDto_ OK + * @throws ApiError + */ + public static postApiProductRevisionQuery({ + requestBody, + }: { + requestBody: productRevisionQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/product/revision/query", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Publish the specified revision + * @returns any OK + * @throws ApiError + */ + public static putApiProductRevisionPublish({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/product/revision/{revisionId}/publish", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Unpublish the specified revision + * @returns any OK + * @throws ApiError + */ + public static putApiProductRevisionUnpublish({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/product/revision/{revisionId}/unpublish", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/ProductsViewsService.ts b/src/lib/api/merchant/services/ProductsViewsService.ts new file mode 100644 index 0000000..3121941 --- /dev/null +++ b/src/lib/api/merchant/services/ProductsViewsService.ts @@ -0,0 +1,75 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { productCompositeDto } from "../models/productCompositeDto"; +import type { productQueryRequestDto } from "../models/productQueryRequestDto"; +import type { productRevisionQueryRequestDto } from "../models/productRevisionQueryRequestDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class ProductsViewsService { + /** + * Get the published product composite view + * This view combines the canonical, revision and text models into a single view model. + * @returns productCompositeDto OK + * @throws ApiError + */ + public static getApiProductComposite({ + productId, + }: { + productId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/product/composite/{productId}", + path: { + productId: productId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * @returns productCompositeDto OK + * @throws ApiError + */ + public static postApiProductCompositeQueryByCanonical({ + requestBody, + }: { + requestBody: productQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/product/composite/query/by-canonical", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * @returns productCompositeDto OK + * @throws ApiError + */ + public static postApiProductCompositeQueryByRevision({ + requestBody, + }: { + requestBody: productRevisionQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/product/composite/query/by-revision", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/PromotionsService.ts b/src/lib/api/merchant/services/PromotionsService.ts new file mode 100644 index 0000000..c3af9d8 --- /dev/null +++ b/src/lib/api/merchant/services/PromotionsService.ts @@ -0,0 +1,125 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { createPromotionDto } from "../models/createPromotionDto"; +import type { promotionQueryRequestDto } from "../models/promotionQueryRequestDto"; +import type { promotionViewDto } from "../models/promotionViewDto"; +import type { QueryResultDto_PromotionViewDto_ } from "../models/QueryResultDto_PromotionViewDto_"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class PromotionsService { + /** + * Create a promotion. + * @returns promotionViewDto OK + * @throws ApiError + */ + public static postApiPromotion({ + requestBody, + }: { + requestBody: createPromotionDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/promotion", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Retrieve a promotion. + * @returns promotionViewDto OK + * @throws ApiError + */ + public static postApiPromotion1({ + promotionId, + }: { + promotionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/promotion/{promotionId}", + path: { + promotionId: promotionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Update a promotion. + * @returns any OK + * @throws ApiError + */ + public static putApiPromotion({ + promotionId, + requestBody, + }: { + promotionId: string; + requestBody: createPromotionDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/promotion/{promotionId}", + path: { + promotionId: promotionId, + }, + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Delete a promotion. + * @returns any OK + * @throws ApiError + */ + public static deleteApiPromotion({ + promotionId, + }: { + promotionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "DELETE", + url: "/api/promotion/{promotionId}", + path: { + promotionId: promotionId, + }, + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Handles promotion query requests by filtering based on provided criteria. + * @returns QueryResultDto_PromotionViewDto_ OK + * @throws ApiError + */ + public static postApiPromotionsQuery({ + requestBody, + }: { + /** + * The query parameters for filtering promotions. + */ + requestBody: promotionQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/promotions/query", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/SecurityService.ts b/src/lib/api/merchant/services/SecurityService.ts new file mode 100644 index 0000000..f335ce6 --- /dev/null +++ b/src/lib/api/merchant/services/SecurityService.ts @@ -0,0 +1,47 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { systemSecurityDto } from "../models/systemSecurityDto"; +import type { updatePermissionsRequest } from "../models/updatePermissionsRequest"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class SecurityService { + /** + * Updates the system's permissions for a given role. + * Permissions changes are stored as a form of 'audit' so that changes to the default permissions can be made safely. + * For instance, if a site owner has removed a permission for a role, and the default permissions in the system are changed by developers, the site owner's changes will not be lost. + * @returns any OK + * @throws ApiError + */ + public static putApiSecurityPermissions({ + requestBody, + }: { + requestBody: updatePermissionsRequest; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/security/permissions", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Lists the system's permissions and roles. + * @returns systemSecurityDto OK + * @throws ApiError + */ + public static getApiSecuritySystem(): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/security/system", + errors: { + 400: `Bad Request`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/SellersCanonicalService.ts b/src/lib/api/merchant/services/SellersCanonicalService.ts new file mode 100644 index 0000000..dc31839 --- /dev/null +++ b/src/lib/api/merchant/services/SellersCanonicalService.ts @@ -0,0 +1,193 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { createSellerDto } from "../models/createSellerDto"; +import type { QueryResultDto_SellerDto_ } from "../models/QueryResultDto_SellerDto_"; +import type { sellerDto } from "../models/sellerDto"; +import type { sellerOperationalStateDto } from "../models/sellerOperationalStateDto"; +import type { sellerQueryRequestDto } from "../models/sellerQueryRequestDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class SellersCanonicalService { + /** + * Create a canonical seller entry. + * @returns sellerDto OK + * @throws ApiError + */ + public static postApiSellerCanonical({ + requestBody, + }: { + requestBody: createSellerDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/seller/canonical", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Get the currently published document by publicKey + * @returns sellerDto OK + * @throws ApiError + */ + public static getApiSellerCanonical({ + publicKey, + }: { + publicKey: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/canonical/{sellerKey}", + query: { + publicKey: publicKey, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Retrieve a canonical seller entry. + * @returns sellerDto OK + * @throws ApiError + */ + public static getApiSellerCanonical1({ + sellerId, + }: { + sellerId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/canonical/{sellerId}", + path: { + sellerId: sellerId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Update a canonical seller entry. + * @returns any OK + * @throws ApiError + */ + public static putApiSellerCanonical({ + sellerId, + requestBody, + }: { + sellerId: string; + requestBody: createSellerDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/seller/canonical/{sellerId}", + path: { + sellerId: sellerId, + }, + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Delete a canonical seller entry. + * @returns any OK + * @throws ApiError + */ + public static deleteApiSellerCanonical({ + sellerId, + }: { + sellerId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "DELETE", + url: "/api/seller/canonical/{sellerId}", + path: { + sellerId: sellerId, + }, + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Query canonical seller data filtered by options. + * @returns QueryResultDto_SellerDto_ OK + * @throws ApiError + */ + public static postApiSellerCanonicalQuery({ + requestBody, + }: { + requestBody: sellerQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/seller/canonical/query", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Updates the open/closed state of a seller. + * @returns sellerOperationalStateDto OK + * @throws ApiError + */ + public static putApiSellerCanonicalOpenState({ + sellerId, + requestBody, + }: { + sellerId: string; + requestBody: sellerOperationalStateDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/seller/canonical/open-state/{sellerId}", + path: { + sellerId: sellerId, + }, + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Gets the open/closed state of a seller. + * @returns sellerOperationalStateDto OK + * @throws ApiError + */ + public static getApiSellerCanonicalOpenState({ + sellerId, + }: { + sellerId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/canonical/open-state/{sellerId}", + path: { + sellerId: sellerId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/SellersRevisionsService.ts b/src/lib/api/merchant/services/SellersRevisionsService.ts new file mode 100644 index 0000000..47177a9 --- /dev/null +++ b/src/lib/api/merchant/services/SellersRevisionsService.ts @@ -0,0 +1,149 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { baseCreateSellerRevisionDto } from "../models/baseCreateSellerRevisionDto"; +import type { QueryResultDto_SellerRevisionDto_ } from "../models/QueryResultDto_SellerRevisionDto_"; +import type { restaurantRevisionDto } from "../models/restaurantRevisionDto"; +import type { sellerRevisionDto } from "../models/sellerRevisionDto"; +import type { sellerRevisionQueryRequestDto } from "../models/sellerRevisionQueryRequestDto"; +import type { sellerViewDto } from "../models/sellerViewDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class SellersRevisionsService { + /** + * Creates a revision of a seller document. + * @returns restaurantRevisionDto OK + * @throws ApiError + */ + public static postApiSellerRevision({ + sellerId, + requestBody, + }: { + sellerId: string; + requestBody: baseCreateSellerRevisionDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/seller/revision/{sellerId}", + path: { + sellerId: sellerId, + }, + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the currently published seller + * @returns sellerViewDto OK + * @throws ApiError + */ + public static getApiSellerRevisionPublished({ + sellerId, + }: { + sellerId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/revision/published/{sellerId}", + path: { + sellerId: sellerId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get a specific revision by revisionId + * @returns sellerRevisionDto OK + * @throws ApiError + */ + public static getApiSellerRevision({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/revision/{revisionId}", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Query revisions filtered by options. + * @returns QueryResultDto_SellerRevisionDto_ OK + * @throws ApiError + */ + public static postApiSellerRevisionQuery({ + requestBody, + }: { + requestBody: sellerRevisionQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/seller/revision/query", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Publish the specified revision + * @returns any OK + * @throws ApiError + */ + public static putApiSellerRevisionPublish({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/seller/revision/{revisionId}/publish", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Unpublish the specified revision + * @returns any OK + * @throws ApiError + */ + public static putApiSellerRevisionUnpublish({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/seller/revision/{revisionId}/unpublish", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/SellersViewsService.ts b/src/lib/api/merchant/services/SellersViewsService.ts new file mode 100644 index 0000000..35267a6 --- /dev/null +++ b/src/lib/api/merchant/services/SellersViewsService.ts @@ -0,0 +1,187 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { sellerCompositeDto } from "../models/sellerCompositeDto"; +import type { sellerPublicAggregateFullDto } from "../models/sellerPublicAggregateFullDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class SellersViewsService { + /** + * Get the default published seller composite view + * This view combines the canonical, revision and text models into a single view model. + * @returns sellerCompositeDto OK + * @throws ApiError + */ + public static getApiSellerComposite(): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/composite", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the published seller composite view + * This view combines the canonical, revision and text models into a single view model. + * @returns sellerCompositeDto OK + * @throws ApiError + */ + public static getApiSellerComposite1({ + sellerId, + }: { + sellerId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/composite/{sellerId}", + path: { + sellerId: sellerId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the published seller composite view by PublicKey + * This view combines the canonical, revision and text models into a single view model. + * @returns sellerCompositeDto OK + * @throws ApiError + */ + public static getApiSellerComposite2({ + publicKey, + }: { + publicKey: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/composite/{sellerKey}", + query: { + publicKey: publicKey, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the published seller aggregate full view + * This view combines the canonical, revision and text models into a single view model. + * @returns sellerPublicAggregateFullDto OK + * @throws ApiError + */ + public static getApiSellerAggregateFull(): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/aggregate/full", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the published seller aggregate full view + * This view combines the canonical, revision and text models into a single view model. + * @returns sellerPublicAggregateFullDto OK + * @throws ApiError + */ + public static getApiSellerAggregateFull1({ + sellerId, + }: { + sellerId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/aggregate/full/{sellerId}", + path: { + sellerId: sellerId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the published seller aggregate full view at scheduled time. + * This view combines the canonical, revision and text models into a single view model. + * @returns sellerPublicAggregateFullDto OK + * @throws ApiError + */ + public static getApiSellerAggregateFull2({ + sellerId, + utcUnixSeconds, + }: { + sellerId: string; + utcUnixSeconds: number; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/aggregate/full/{sellerId}/{utcUnixSeconds}", + path: { + sellerId: sellerId, + utcUnixSeconds: utcUnixSeconds, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the published seller aggregate full view by PublicKey. + * This view combines the canonical, revision and text models into a single view model. + * @returns sellerPublicAggregateFullDto OK + * @throws ApiError + */ + public static getApiSellerAggregateFull3({ + publicKey, + }: { + publicKey: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/aggregate/full/{publicKey}", + path: { + publicKey: publicKey, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the published seller aggregate full view by PublicKey at scheduled time. + * This view combines the canonical, revision and text models into a single view model. + * @returns sellerPublicAggregateFullDto OK + * @throws ApiError + */ + public static getApiSellerAggregateFull4({ + publicKey, + utcUnixSeconds, + }: { + publicKey: string; + utcUnixSeconds: number; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/seller/aggregate/full/{publicKey}/{utcUnixSeconds}", + path: { + publicKey: publicKey, + utcUnixSeconds: utcUnixSeconds, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/ServerSideEventsService.ts b/src/lib/api/merchant/services/ServerSideEventsService.ts new file mode 100644 index 0000000..3e00390 --- /dev/null +++ b/src/lib/api/merchant/services/ServerSideEventsService.ts @@ -0,0 +1,107 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class ServerSideEventsService { + /** + * Returns a specific order's event stream. + * Requires any form of public key authentication. + * @returns any OK + * @throws ApiError + */ + public static getEventsOrders({ + orderId, + }: { + orderId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/events/orders/{orderId}", + path: { + orderId: orderId, + }, + errors: { + 400: `Bad Request`, + 403: `Forbidden`, + 404: `Not Found`, + }, + }); + } + /** + * Returns an order event stream + * Requires any form of public key authentication. + * @returns any OK + * @throws ApiError + */ + public static getEventsOrders1(): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/events/orders", + errors: { + 400: `Bad Request`, + 403: `Forbidden`, + 404: `Not Found`, + }, + }); + } + /** + * Opens a private event stream + * This endpoint will open a private event stream for the authenticated user. + * All events that the user has permission to see will be sent to this stream. + * @returns any OK + * @throws ApiError + */ + public static getEventsStream({ + options, + }: { + /** + * Options allow for different subscription types + */ + options?: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/events/stream", + query: { + options: options, + }, + errors: { + 401: `Unauthorized`, + }, + }); + } + /** + * Opens a private event stream for a user + * Only users with the Admin role can open streams for other users. + * @returns any OK + * @throws ApiError + */ + public static getEventsStream1({ + userId, + options, + }: { + userId: string; + /** + * Options allow for different subscription types + */ + options?: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/events/stream/{userId}", + path: { + userId: userId, + }, + query: { + options: options, + }, + errors: { + 401: `Unauthorized`, + 403: `Forbidden`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/SystemService.ts b/src/lib/api/merchant/services/SystemService.ts new file mode 100644 index 0000000..a0c48e5 --- /dev/null +++ b/src/lib/api/merchant/services/SystemService.ts @@ -0,0 +1,33 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { versionCheck } from "../models/versionCheck"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class SystemService { + /** + * @returns string OK + * @throws ApiError + */ + public static getApiSystemVersion(): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/system/version", + }); + } + /** + * @returns versionCheck OK + * @throws ApiError + */ + public static getApiSystemVersionCheck(): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/system/version/check", + errors: { + 400: `Bad Request`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/TestsService.ts b/src/lib/api/merchant/services/TestsService.ts new file mode 100644 index 0000000..5c0e62f --- /dev/null +++ b/src/lib/api/merchant/services/TestsService.ts @@ -0,0 +1,51 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { userDto } from "../models/userDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class TestsService { + /** + * Returns an api access token for the given key name. + * @returns string OK + * @throws ApiError + */ + public static postApiTestApiKey({ + keyName, + }: { + /** + * The name of the key + */ + keyName: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/test/apiKey/{keyName}", + path: { + keyName: keyName, + }, + errors: { + 400: `Bad Request`, + 500: `Internal Server Error`, + }, + }); + } + /** + * Test the connection to the DSP. + * This endpoint will test connectivity to the DSP by fetching the API user as seen by the remote system. + * @returns userDto OK + * @throws ApiError + */ + public static postApiTestDspTest(): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/test/dspTest", + errors: { + 400: `Bad Request`, + 500: `Internal Server Error`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/TranslatableTextRevisionsService.ts b/src/lib/api/merchant/services/TranslatableTextRevisionsService.ts new file mode 100644 index 0000000..1b96090 --- /dev/null +++ b/src/lib/api/merchant/services/TranslatableTextRevisionsService.ts @@ -0,0 +1,145 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { createTextRevisionDto } from "../models/createTextRevisionDto"; +import type { QueryResultDto_TextRevisionDto_ } from "../models/QueryResultDto_TextRevisionDto_"; +import type { textQueryRequestDto } from "../models/textQueryRequestDto"; +import type { textRevisionDto } from "../models/textRevisionDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class TranslatableTextRevisionsService { + /** + * Creates a revision of a text document. + * @returns textRevisionDto OK + * @throws ApiError + */ + public static postApiTextRevision({ + requestBody, + }: { + requestBody: createTextRevisionDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/text/revision", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get the currently published document + * @returns textRevisionDto OK + * @throws ApiError + */ + public static getApiTextRevisionPublished({ + documentId, + key, + }: { + documentId: string; + key: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/text/revision/published/{documentId}/{key}", + path: { + documentId: documentId, + key: key, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get a specific revision + * @returns textRevisionDto OK + * @throws ApiError + */ + public static getApiTextRevision({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/text/revision/{revisionId}", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Query texts filtered by options. + * @returns QueryResultDto_TextRevisionDto_ OK + * @throws ApiError + */ + public static postApiTextRevisionQuery({ + requestBody, + }: { + requestBody: textQueryRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/text/revision/query", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Publish the specified revision + * @returns any OK + * @throws ApiError + */ + public static putApiTextRevisionPublish({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/text/revision/{revisionId}/publish", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Unpublish the specified revision + * @returns any OK + * @throws ApiError + */ + public static putApiTextRevisionUnpublish({ + revisionId, + }: { + revisionId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "PUT", + url: "/api/text/revision/{revisionId}/unpublish", + path: { + revisionId: revisionId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/UserService.ts b/src/lib/api/merchant/services/UserService.ts new file mode 100644 index 0000000..c75c84d --- /dev/null +++ b/src/lib/api/merchant/services/UserService.ts @@ -0,0 +1,90 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { QueryResultDto_UserDto_ } from "../models/QueryResultDto_UserDto_"; +import type { rolePermissionsDto } from "../models/rolePermissionsDto"; +import type { userDto } from "../models/userDto"; +import type { userQueryRequest } from "../models/userQueryRequest"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class UserService { + /** + * Get the currently authenticated user + * @returns userDto OK + * @throws ApiError + */ + public static getApiUser(): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/user", + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Get a user by their ID + * You may only retrieve information about yourself or users you have permission to view. Admins can view all users. + * @returns userDto OK + * @throws ApiError + */ + public static getApiUser1({ + userId, + }: { + userId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/user/{userId}", + path: { + userId: userId, + }, + errors: { + 400: `Bad Request`, + 403: `Forbidden`, + 404: `Not Found`, + }, + }); + } + /** + * Get user's current permissions + * This endpoint will return a list of roles and their associated permissions for the currently authenticated user. + * @returns rolePermissionsDto OK + * @throws ApiError + */ + public static getApiUserPermissions(): CancelablePromise< + Array + > { + return __request(OpenAPI, { + method: "GET", + url: "/api/user/permissions", + errors: { + 404: `Not Found`, + }, + }); + } + /** + * Query users + * This endpoint will return a list of users based on the query parameters provided. + * @returns QueryResultDto_UserDto_ OK + * @throws ApiError + */ + public static postApiUserQuery({ + requestBody, + }: { + requestBody: userQueryRequest; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/user/query", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/VerificationsService.ts b/src/lib/api/merchant/services/VerificationsService.ts new file mode 100644 index 0000000..b771204 --- /dev/null +++ b/src/lib/api/merchant/services/VerificationsService.ts @@ -0,0 +1,82 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { humanVerificationRequestDto } from "../models/humanVerificationRequestDto"; +import type { humanVerificationStatusDto } from "../models/humanVerificationStatusDto"; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class VerificationsService { + /** + * Verify a public key using a phone number. + * @returns humanVerificationStatusDto OK + * @throws ApiError + */ + public static postApiVerificationsVerify({ + requestBody, + }: { + /** + * The request document + */ + requestBody: humanVerificationRequestDto; + }): CancelablePromise { + return __request(OpenAPI, { + method: "POST", + url: "/api/verifications/verify", + body: requestBody, + mediaType: "application/json", + errors: { + 400: `Bad Request`, + }, + }); + } + /** + * Returns the verification status for a given public key. + * @returns humanVerificationStatusDto OK + * @throws ApiError + */ + public static getApiVerificationsVerifyKey({ + publicKey, + }: { + /** + * The user's public key + */ + publicKey: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/verifications/verify/key/{publicKey}", + path: { + publicKey: publicKey, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * @deprecated + * No longer used. Use M:G1.Merchant.Hub.Web.Controllers.Api.Verifications.VerifyHumanEndpoint.HandlerPublicKey(G1.Common.Components.PublicKey,G1.Merchant.Hub.Interfaces.IConsumerVerificationService,System.Threading.CancellationToken) instead. + * @returns humanVerificationStatusDto OK + * @throws ApiError + */ + public static getApiVerificationsVerifyPhone({ + phoneNumber, + }: { + phoneNumber: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/api/verifications/verify/phone/{phoneNumber}", + path: { + phoneNumber: phoneNumber, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } +} diff --git a/src/lib/api/merchant/services/WebService.ts b/src/lib/api/merchant/services/WebService.ts new file mode 100644 index 0000000..6c54f24 --- /dev/null +++ b/src/lib/api/merchant/services/WebService.ts @@ -0,0 +1,53 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; +export class WebService { + /** + * @deprecated + * Download an asset by contentId + * When supplied a valid base58 encoded contentId, this endpoint will return the asset associated with that id as a file download. + * The response will be a file download with the correct content type. + * The file name will be the contentId with the correct extension. + * @returns string OK + * @throws ApiError + */ + public static getAssets({ + contentId, + }: { + /** + * This is a base58 encoded digest, a unique identifier for the content. + */ + contentId: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/assets/{contentId}", + path: { + contentId: contentId, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** + * Redirects a mobile user to the appropriate app store. + * On iOS, an immediate attempt is made using a deep link. If that fails, the user can click the manual links. + * @returns any OK + * @throws ApiError + */ + public static getAppLink(): CancelablePromise { + return __request(OpenAPI, { + method: "GET", + url: "/app-link", + errors: { + 302: `Found`, + }, + }); + } +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..eee8f45 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,24 @@ +// React is used implicitly by JSX +import ReactDOM from "react-dom/client"; +import "@styles/global.css"; +import { Root } from "@app/root"; + +// Wait for DOM to be ready +document.addEventListener("DOMContentLoaded", () => { + const rootElement = document.getElementById("root"); + + if (!rootElement) { + console.error("Root element not found!"); + return; + } + + try { + const root = ReactDOM.createRoot(rootElement); + + root.render(); + + console.log("React application successfully mounted"); + } catch (error) { + console.error("Failed to render React application:", error); + } +}); diff --git a/src/routes/index.jsx b/src/routes/index.jsx new file mode 100644 index 0000000..ef7936a --- /dev/null +++ b/src/routes/index.jsx @@ -0,0 +1,97 @@ +import React from "react"; +import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom"; +import App from "@/App"; +import { ProtectedRoute, useAuth } from "@features/auth"; +import { ComponentDemo, EditPosition } from "@/components"; + +// Simple login page component +const LoginPage = () => { + const { isAuthenticated, signinRedirect } = useAuth(); + + // Redirect to main app if already authenticated + if (isAuthenticated) { + return ; + } + + return ( +
+
+

Merchant Operator App

+

+ Please log in to access the application +

+ +
+
+ ); +}; + +// Callback page for handling authentication redirects +const CallbackPage = () => { + const { isLoading, isAuthenticated, error } = useAuth(); + + if (isLoading) { + return ( +
+
+
+ ); + } + + if (error) { + return ( +
+
+
Authentication Error
+
{error.message}
+ +
+
+ ); + } + + // Redirect to main app if authentication was successful + return ; +}; + +// Main router component +export const AppRouter = () => { + return ( + + + } /> + } /> + } /> + + console.log("Saved:", data)} + onCancel={() => window.history.back()} + /> + + } + /> + + + + } + /> + + + ); +}; diff --git a/src/shared/lib/api-url.ts b/src/shared/lib/api-url.ts new file mode 100644 index 0000000..e030986 --- /dev/null +++ b/src/shared/lib/api-url.ts @@ -0,0 +1,81 @@ +/** + * Utility functions for API URL handling + */ + +/** + * Get the API URL from configuration or auto-detect it + * @returns The API URL without trailing slash + */ +export function getApiUrl(): string { + console.log("[API-URL] Getting API URL"); + + // Get the API URL from window.appConfig or environment variables + let apiUrl = window.appConfig?.apiUrl || import.meta.env.CLIENT_API_URL; + console.log(`[API-URL] Initial API URL value: ${apiUrl}`); + + // Auto-detect API URL if set to 'DETECT' + if (typeof apiUrl === "string" && apiUrl.toUpperCase() === "DETECT") { + console.log("[API-URL] Auto-detection triggered: apiUrl is 'DETECT'"); + + try { + const url = new URL(window.location.href); + console.log(`[API-URL] Current window.location: ${window.location.href}`); + + const pathSegments = url.pathname.split("/").filter(Boolean); + console.log(`[API-URL] Path segments: ${JSON.stringify(pathSegments)}`); + + const basePath = pathSegments.length > 0 ? `/${pathSegments[0]}/` : "/"; + console.log(`[API-URL] Base path: ${basePath}`); + + apiUrl = `${url.origin}${basePath}`; + console.log(`[API-URL] Detected API URL: ${apiUrl}`); + } catch (error) { + console.error( + "[API-URL] FATAL ERROR: Failed to auto-detect API URL:", + error, + ); + throw new Error("Failed to auto-detect API URL"); + } + } else { + console.log( + `[API-URL] No auto-detection needed: apiUrl is not 'DETECT' (value: ${apiUrl})`, + ); + } + + if (!apiUrl) { + const errorMsg = + "API URL is not defined in window.appConfig.apiUrl or environment variables"; + console.error(`[API-URL] FATAL ERROR: ${errorMsg}`); + throw new Error(errorMsg); + } + + try { + // For API URLs, we should NOT have a trailing slash + // This is different from normalizeUrl which adds a trailing slash + const apiUrlWithoutTrailingSlash = apiUrl.endsWith("/") + ? apiUrl.slice(0, -1) + : apiUrl; + console.log( + `[API-URL] API URL without trailing slash: ${apiUrlWithoutTrailingSlash}`, + ); + return apiUrlWithoutTrailingSlash; + } catch (error) { + console.error(`[API-URL] Error normalizing API URL: ${apiUrl}`, error); + // Return the original URL if normalization fails + return apiUrl; + } +} + +// Singleton instance of the API URL +let apiUrlInstance: string | null = null; + +/** + * Get the API URL (singleton pattern) + * @returns The API URL without trailing slash + */ +export function getApiUrlSingleton(): string { + if (!apiUrlInstance) { + apiUrlInstance = getApiUrl(); + } + return apiUrlInstance; +} diff --git a/src/shared/lib/api/apiService.ts b/src/shared/lib/api/apiService.ts new file mode 100644 index 0000000..9092b6e --- /dev/null +++ b/src/shared/lib/api/apiService.ts @@ -0,0 +1,90 @@ +import { useAuth } from "@domains/auth"; +import { ApiRequestOptions, ApiResponse, ApiService } from "./types"; + +// Custom hook for making authenticated API requests +export const useApiService = (): ApiService => { + const { user, isAuthenticated } = useAuth(); + + // Note: This is a simplified version that doesn't handle tokens + // In a real application, you would need to implement proper token handling + + // Base fetch function with authentication + const fetchWithAuth = async ( + url: string, + options: ApiRequestOptions = {}, + ): Promise> => { + // No token expiration check or refresh in this simplified version + + // Set up headers with authentication + const headers: Record = { + ...options.headers, + "Content-Type": "application/json", + }; + + // In a real application, you would add the authorization header here + // For now, we're just checking if the user is authenticated + if (!isAuthenticated) { + console.warn( + "User is not authenticated. Request may fail if authentication is required.", + ); + } + + // Make the request + const response = (await fetch(url, { + ...options, + headers, + })) as ApiResponse; + + // Handle unauthorized errors + if (response.status === 401) { + console.error("Authentication error: Unauthorized request"); + // In a real application, you might want to redirect to login page + // or trigger a login flow here + } + + return response; + }; + + // Helper methods for common HTTP methods + const get = ( + url: string, + options: ApiRequestOptions = {}, + ): Promise> => + fetchWithAuth(url, { ...options, method: "GET" }); + + const post = ( + url: string, + data?: any, + options: ApiRequestOptions = {}, + ): Promise> => + fetchWithAuth(url, { + ...options, + method: "POST", + body: JSON.stringify(data), + }); + + const put = ( + url: string, + data?: any, + options: ApiRequestOptions = {}, + ): Promise> => + fetchWithAuth(url, { + ...options, + method: "PUT", + body: JSON.stringify(data), + }); + + const del = ( + url: string, + options: ApiRequestOptions = {}, + ): Promise> => + fetchWithAuth(url, { ...options, method: "DELETE" }); + + return { + fetchWithAuth, + get, + post, + put, + delete: del, + }; +}; diff --git a/src/shared/lib/api/index.ts b/src/shared/lib/api/index.ts new file mode 100644 index 0000000..9243c9a --- /dev/null +++ b/src/shared/lib/api/index.ts @@ -0,0 +1,3 @@ +// Export API types and services +export * from "./types"; +export * from "./apiService"; diff --git a/src/shared/lib/api/types.ts b/src/shared/lib/api/types.ts new file mode 100644 index 0000000..d3bc57a --- /dev/null +++ b/src/shared/lib/api/types.ts @@ -0,0 +1,37 @@ +// API Request Options +export interface ApiRequestOptions { + headers?: Record; + method?: string; + body?: any; +} + +// API Response Type +export interface ApiResponse extends Response { + json(): Promise; +} + +// API Service Interface +export interface ApiService { + fetchWithAuth: ( + url: string, + options?: ApiRequestOptions, + ) => Promise>; + get: ( + url: string, + options?: ApiRequestOptions, + ) => Promise>; + post: ( + url: string, + data?: any, + options?: ApiRequestOptions, + ) => Promise>; + put: ( + url: string, + data?: any, + options?: ApiRequestOptions, + ) => Promise>; + delete: ( + url: string, + options?: ApiRequestOptions, + ) => Promise>; +} diff --git a/src/shared/lib/cn.ts b/src/shared/lib/cn.ts new file mode 100644 index 0000000..e6a3427 --- /dev/null +++ b/src/shared/lib/cn.ts @@ -0,0 +1,11 @@ +import { clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +/** + * Combines multiple class names and resolves Tailwind CSS conflicts + * @param {...string} inputs - Class names to combine + * @returns {string} - Merged class names with conflicts resolved + */ +export function cn(...inputs) { + return twMerge(clsx(inputs)); +} diff --git a/src/shared/lib/config.ts b/src/shared/lib/config.ts new file mode 100644 index 0000000..6e28da5 --- /dev/null +++ b/src/shared/lib/config.ts @@ -0,0 +1,16 @@ +/** + * Get the base path for the application + * @returns The base path + */ +export const getBasePath = (): string => + window.appConfig?.basePath || import.meta.env.VITE_BASE_PATH || ""; + +/** + * Get an asset path with the base path prepended + * @param path The asset path + * @returns The asset path with the base path prepended + */ +export const getAssetPath = (path: string): string => { + const basePath = getBasePath(); + return `${basePath}${path.startsWith("/") ? path : `/${path}`}`; +}; diff --git a/src/shared/lib/diagnostics.ts b/src/shared/lib/diagnostics.ts new file mode 100644 index 0000000..0c9d0cc --- /dev/null +++ b/src/shared/lib/diagnostics.ts @@ -0,0 +1,50 @@ +/** + * Utility functions for diagnosing environment and configuration issues + */ + +/** + * Checks if the CLIENT_API_URL environment variable is properly set + * and logs diagnostic information to the console + */ +export const checkApiUrlConfig = () => { + console.log("=== API URL Configuration Diagnostics ==="); + + // Check if window.appConfig exists and has apiUrl + const apiUrl = window.appConfig?.apiUrl; + console.log(`window.appConfig.apiUrl: ${apiUrl || "NOT DEFINED"}`); + + // For backward compatibility, also check import.meta.env + const metaApiUrl = import.meta.env.CLIENT_API_URL; + console.log( + `import.meta.env.CLIENT_API_URL: ${metaApiUrl || "NOT DEFINED"} (legacy)`, + ); + + // Check if we're in development or production mode + console.log(`Environment mode: ${import.meta.env.MODE}`); + + // Log all window.appConfig properties (without exposing sensitive values) + console.log("All window.appConfig properties:"); + if (window.appConfig) { + Object.keys(window.appConfig).forEach((key) => { + const value = window.appConfig?.[key]; + // Don't log actual values of potentially sensitive information + if ( + key.toLowerCase().includes("key") || + key.toLowerCase().includes("secret") || + key.toLowerCase().includes("password") || + key.toLowerCase().includes("token") + ) { + console.log(` ${key}: [REDACTED]`); + } else { + console.log(` ${key}: ${value || "NOT DEFINED"}`); + } + }); + } else { + console.log(" window.appConfig is not defined!"); + } + + console.log("======================================="); + + // Return the API URL for convenience + return apiUrl || metaApiUrl; +}; diff --git a/src/shared/lib/fonts.ts b/src/shared/lib/fonts.ts new file mode 100644 index 0000000..edb53d3 --- /dev/null +++ b/src/shared/lib/fonts.ts @@ -0,0 +1,30 @@ +/** + * Font utility functions and constants + */ + +// Font weight constants for Inter font +export const FONT_WEIGHTS = { + light: 300, + regular: 400, + medium: 500, + semiBold: 600, + bold: 700, +}; + +// Font family constants +export const FONT_FAMILIES = { + sans: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif', + mono: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace', +}; + +/** + * Creates a font style string with the specified weight + * @param {number} weight - Font weight (use FONT_WEIGHTS constants) + * @returns {string} CSS font style string + */ +export const getFontStyle = (weight = FONT_WEIGHTS.regular) => { + return ` + font-family: ${FONT_FAMILIES.sans}; + font-weight: ${weight}; + `; +}; diff --git a/src/shared/lib/index.ts b/src/shared/lib/index.ts new file mode 100644 index 0000000..3f3cf39 --- /dev/null +++ b/src/shared/lib/index.ts @@ -0,0 +1,6 @@ +// Export utility functions +export { cn } from "./cn"; + +// Export existing utilities +export * from "./config"; +export * from "./fonts"; diff --git a/src/shared/lib/url-utils.ts b/src/shared/lib/url-utils.ts new file mode 100644 index 0000000..925b719 --- /dev/null +++ b/src/shared/lib/url-utils.ts @@ -0,0 +1,150 @@ +/** + * Utility functions for URL handling + */ + +/** + * Safely joins URL parts, handling slashes correctly + * @param base The base URL + * @param paths Additional path segments to append + * @returns A properly formatted URL + */ +export function joinUrl(base: string, ...paths: string[]): string { + try { + // Handle empty base case + if (!base) { + return ""; + } + + // Ensure base has a trailing slash for URL constructor + const baseWithTrailingSlash = base.endsWith("/") ? base : `${base}/`; + + // Create a URL object from the base + const url = new URL(baseWithTrailingSlash); + + // Join all path segments, removing leading and trailing slashes + const pathSegments = paths + .filter(Boolean) // Filter out empty segments + .map((path) => path.replace(/^\/|\/$/g, "")); // Remove leading and trailing slashes + + // If we have path segments, append them to the pathname + if (pathSegments.length > 0) { + // Get the base pathname without trailing slash + const basePathname = url.pathname.replace(/\/$/, ""); + + // Join all paths with a single slash + url.pathname = `${basePathname}/${pathSegments.join("/")}`; + } + + return url.toString(); + } catch (error) { + console.error( + `Error joining URL parts (${base}, ${paths.join(", ")}):`, + error, + ); + // Fallback to simple string concatenation + return [ + base.replace(/\/$/, ""), + ...paths.map((p) => p.replace(/^\/|\/$/g, "")), + ] + .filter(Boolean) + .join("/"); + } +} + +/** + * Creates a properly formatted hash URL + * @param base The base URL (usually window.location.origin) + * @param basePath Optional base path + * @param hashPath The hash path (without the # symbol) + * @returns A properly formatted URL with hash + */ +export function createHashUrl( + base: string, + basePath: string | undefined, + hashPath: string, +): string { + try { + // Ensure base has a trailing slash for URL constructor + const baseWithTrailingSlash = base.endsWith("/") ? base : `${base}/`; + + // Create a URL object from the base + const url = new URL(baseWithTrailingSlash); + + // Add the base path if it exists + if (basePath) { + // Remove leading and trailing slashes from basePath + const cleanBasePath = basePath.replace(/^\/|\/$/g, ""); + if (cleanBasePath) { + // Ensure the pathname ends with a slash before adding the hash + url.pathname = `/${cleanBasePath}/`; + } + } else { + // If no base path, ensure the pathname is at least '/' + url.pathname = url.pathname.endsWith("/") + ? url.pathname + : `${url.pathname}/`; + } + + // Add the hash path + // Remove leading slash from hashPath if it exists + const cleanHashPath = hashPath.replace(/^\//, ""); + // Always include a leading slash after the hash symbol + + // Remove /#/ + if (cleanHashPath === "/" || cleanHashPath === "") url.hash = ""; + else { + url.hash = cleanHashPath ? `#/${cleanHashPath}` : "#/"; + } + + return url.toString(); + } catch (error) { + console.error( + `Error creating hash URL (${base}, ${basePath}, ${hashPath}):`, + error, + ); + // Fallback to simple string concatenation + const cleanBase = base.replace(/\/$/, ""); + const cleanBasePath = basePath + ? `/${basePath.replace(/^\/|\/$/g, "")}/` + : "/"; + const cleanHashPath = hashPath.replace(/^\//, ""); + return `${cleanBase}${cleanBasePath}#/${cleanHashPath}`; + } +} + +/** + * Normalizes a URL by ensuring if it has a subpath, then it has a trailing slash + * @param url The URL to normalize + * @returns The normalized URL with a trailing slash + */ +export function normalizeUrl(url: string): string { + try { + const urlObj = new URL(url); + + if (urlObj.pathname === "/") { + return urlObj.toString(); + } + + return urlObj.toString().endsWith("/") + ? urlObj.toString() + : `${urlObj.toString()}/`; + + } catch (error) { + console.error(`Error normalizing URL (${url}):`, error); + // Fallback to simple string handling if URL parsing fails + return url.endsWith("/") ? url : `${url}/`; + } +} + +/** + * Cleans up the current URL by removing query parameters and hash fragments + */ +export function cleanupUrl(): void { + if (window.history && window.history.replaceState) { + const url = new URL(window.location.href); + // Keep only the origin and pathname + const cleanUrl = `${url.origin}${url.pathname}`; + window.history.replaceState({}, document.title, cleanUrl); + console.log("URL cleaned up:", cleanUrl); + } +} diff --git a/src/shared/types/global.d.ts b/src/shared/types/global.d.ts new file mode 100644 index 0000000..4263a18 --- /dev/null +++ b/src/shared/types/global.d.ts @@ -0,0 +1,45 @@ +// Global type declarations + +// Extend Window interface to include appConfig and ENV +interface Window { + appConfig?: { + apiUrl?: string; + basePath?: string; + appName?: string; + debug?: boolean; + mapTileEndpoint?: string; + mapTileApiKey?: string; + oidcAuthority?: string; + oidcClientId?: string; + [key: string]: string | boolean | undefined; + }; + + // Runtime environment variables (legacy) + ENV?: { + [key: string]: string; + }; +} + +// Declare environment variables +interface ImportMetaEnv { + // Legacy variables + CLIENT_API_URL?: string; + + // CLIENT_ environment variables + CLIENT__BASE_PATH?: string; + CLIENT__API_URL?: string; + CLIENT__APP_NAME?: string; + CLIENT__DEBUG?: string; + CLIENT__OIDC_AUTHORITY?: string; + CLIENT__OIDC_CLIENT_ID?: string; + CLIENT__MAP_TILE_ENDPOINT?: string; + CLIENT__MAP_TILE_API_KEY?: string; + + // Allow any other environment variables + [key: string]: string | undefined; +} + +// Extend ImportMeta interface +interface ImportMeta { + env: ImportMetaEnv; +} diff --git a/src/shared/ui/Button.tsx b/src/shared/ui/Button.tsx new file mode 100644 index 0000000..c0582cf --- /dev/null +++ b/src/shared/ui/Button.tsx @@ -0,0 +1,57 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; +import { cn } from "@shared/lib/cn"; + +interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ( + + ); + }, +); + +Button.displayName = "Button"; + +export default Button; +export { buttonVariants }; diff --git a/src/shared/ui/Card.tsx b/src/shared/ui/Card.tsx new file mode 100644 index 0000000..2119055 --- /dev/null +++ b/src/shared/ui/Card.tsx @@ -0,0 +1,85 @@ +import React from "react"; +import { cn } from "@shared/lib/cn"; + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +Card.displayName = "Card"; + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardHeader.displayName = "CardHeader"; + +const CardTitle = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardTitle.displayName = "CardTitle"; + +const CardDescription = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardDescription.displayName = "CardDescription"; + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardContent.displayName = "CardContent"; + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardFooter.displayName = "CardFooter"; + +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardDescription, + CardContent, +}; diff --git a/src/shared/ui/Dialog.tsx b/src/shared/ui/Dialog.tsx new file mode 100644 index 0000000..93ed72f --- /dev/null +++ b/src/shared/ui/Dialog.tsx @@ -0,0 +1,122 @@ +import * as React from "react"; +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { X } from "lucide-react"; + +import { cn } from "@shared/lib/cn"; + +const Dialog = DialogPrimitive.Root; + +const DialogTrigger = DialogPrimitive.Trigger; + +const DialogPortal = DialogPrimitive.Portal; + +const DialogClose = DialogPrimitive.Close; + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +DialogContent.displayName = DialogPrimitive.Content.displayName; + +const DialogHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +DialogHeader.displayName = "DialogHeader"; + +const DialogFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +DialogFooter.displayName = "DialogFooter"; + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogTitle.displayName = DialogPrimitive.Title.displayName; + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogDescription.displayName = DialogPrimitive.Description.displayName; + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +}; diff --git a/src/shared/ui/ImageUpload.tsx b/src/shared/ui/ImageUpload.tsx new file mode 100644 index 0000000..60e5ae4 --- /dev/null +++ b/src/shared/ui/ImageUpload.tsx @@ -0,0 +1,164 @@ +"use client"; + +import { useState, useRef } from "react"; +import { ExternalLink, Upload, Trash2, X } from "react-feather"; +import Button from "./Button"; + +export default function ImageUpload({ + onImageChange, + maxSize = 5, // in MB + acceptedTypes = ["image/jpeg", "image/png", "image/jpg"], + className = "", +}) { + const [image, setImage] = useState(null); + const [previewUrl, setPreviewUrl] = useState(""); + const [error, setError] = useState(""); + const fileInputRef = useRef(null); + + const handleImageUpload = (e: React.ChangeEvent) => { + const files = e.target.files; + if (!files || files.length === 0) return; + const file = files[0]; + + // Validate file type + if (!acceptedTypes.includes(file.type)) { + setError( + `Please upload a valid file type: ${acceptedTypes.map((type) => type.split("/")[1]).join(", ")}`, + ); + return; + } + + // Validate file size + if (file.size > maxSize * 1024 * 1024) { + setError(`Image size should be less than ${maxSize}MB`); + return; + } + + setError(""); + setImage(file); + + // Create preview URL + const reader = new FileReader(); + reader.onloadend = () => { + if (typeof reader.result === "string") { + setPreviewUrl(reader.result); + if (onImageChange) { + onImageChange(file, reader.result); + } + } + }; + reader.readAsDataURL(file); + }; + + const removeImage = (e: React.MouseEvent) => { + e.stopPropagation(); + setImage(null); + setPreviewUrl(""); + if (fileInputRef.current) { + fileInputRef.current.value = ""; + } + if (onImageChange) { + onImageChange(null, null); + } + }; + + const triggerFileInput = () => { + if (fileInputRef.current) { + fileInputRef.current.click(); + } + }; + + return ( +
+ {/* Hidden file input */} + + + {/* Image upload area */} +
+ {previewUrl ? ( + <> + Preview +
+
+ + +
+
+ + ) : ( +
+ + + Click to upload an image + +
+ )} +
+ + {/* Error message */} + {error &&
{error}
} + + {/* Image details if uploaded */} + {image && ( +
+
+
+
+ Thumbnail +
+
+

{image.name}

+

+ {(image.size / 1024).toFixed(1)} KB •{" "} + {new Date().toLocaleDateString()} +

+
+
+ +
+
+ )} +
+ ); +} diff --git a/src/shared/ui/Input.tsx b/src/shared/ui/Input.tsx new file mode 100644 index 0000000..b328aa9 --- /dev/null +++ b/src/shared/ui/Input.tsx @@ -0,0 +1,8 @@ +export default function Input({ className = "", ...props }) { + return ( + + ); +} diff --git a/src/shared/ui/Layout/Header.tsx b/src/shared/ui/Layout/Header.tsx new file mode 100644 index 0000000..5ce0d2e --- /dev/null +++ b/src/shared/ui/Layout/Header.tsx @@ -0,0 +1,40 @@ +import React from "react"; +import { useAuth } from "@domains/auth"; + +export const Header: React.FC = () => { + const { user, logout } = useAuth(); + + const handleLogout = async () => { + try { + await logout(); + } catch (error) { + console.error("Logout failed:", error); + } + }; + + return ( +
+
Merchant Operator
+ +
+ {user && ( + <> +
+ Logged in as + + {user.name || user.email} + +
+ + + + )} +
+
+ ); +}; diff --git a/src/shared/ui/Layout/MainLayout.tsx b/src/shared/ui/Layout/MainLayout.tsx new file mode 100644 index 0000000..d59e193 --- /dev/null +++ b/src/shared/ui/Layout/MainLayout.tsx @@ -0,0 +1,25 @@ +import React, { ReactNode } from "react"; +import { Header } from "./Header"; +import { Sidebar } from "./Sidebar"; + +interface MainLayoutProps { + children: ReactNode; +} + +export const MainLayout: React.FC = ({ children }) => { + return ( +
+ {/* Sidebar */} + + + {/* Main content */} +
+ {/* Header */} +
+ + {/* Page content */} +
{children}
+
+
+ ); +}; diff --git a/src/shared/ui/Layout/Sidebar.tsx b/src/shared/ui/Layout/Sidebar.tsx new file mode 100644 index 0000000..c191bd4 --- /dev/null +++ b/src/shared/ui/Layout/Sidebar.tsx @@ -0,0 +1,62 @@ +import React from "react"; +import { Link, useLocation } from "react-router-dom"; + +interface NavItemProps { + to: string; + label: string; + icon?: string; + active?: boolean; +} + +const NavItem: React.FC = ({ to, label, icon, active }) => { + return ( + + {icon && {icon}} + {label} + + ); +}; + +export const Sidebar: React.FC = () => { + const location = useLocation(); + const currentPath = location.pathname; + + const navItems = [ + { to: "/", label: "Dashboard", icon: "📊" } + ]; + + return ( + + ); +}; diff --git a/src/shared/ui/Layout/index.ts b/src/shared/ui/Layout/index.ts new file mode 100644 index 0000000..557a4a6 --- /dev/null +++ b/src/shared/ui/Layout/index.ts @@ -0,0 +1,3 @@ +export { MainLayout } from "./MainLayout"; +export { Header } from "./Header"; +export { Sidebar } from "./Sidebar"; diff --git a/src/shared/ui/Switch.tsx b/src/shared/ui/Switch.tsx new file mode 100644 index 0000000..116bfe4 --- /dev/null +++ b/src/shared/ui/Switch.tsx @@ -0,0 +1,43 @@ +"use client"; + +import { useState } from "react"; + +export default function Switch({ id, className = "", ...props }) { + const [checked, setChecked] = useState(false); + + const handleChange = (e) => { + setChecked(e.target.checked); + if (props.onChange) { + props.onChange(e); + } + }; + + return ( +
+ + +
+ ); +} diff --git a/src/shared/ui/Tabs.tsx b/src/shared/ui/Tabs.tsx new file mode 100644 index 0000000..40726ad --- /dev/null +++ b/src/shared/ui/Tabs.tsx @@ -0,0 +1,71 @@ +"use client"; + +import { createContext, useContext, useState } from "react"; + +const TabsContext = createContext<{ + value: string; + onValueChange: (value: string) => void; +}>({ + value: "", + onValueChange: () => {}, +}); + +export function Tabs({ + defaultValue, + value, + onValueChange, + children, + className = "", + ...props +}) { + const [tabValue, setTabValue] = useState(defaultValue || ""); + + const contextValue = { + value: value !== undefined ? value : tabValue, + onValueChange: onValueChange || setTabValue, + }; + + return ( + +
+ {children} +
+
+ ); +} + +export function TabsList({ children, className = "", ...props }) { + return ( +
+ {children} +
+ ); +} + +export function TabsTrigger({ + value, + active, + children, + className = "", + ...props +}) { + const { value: selectedValue, onValueChange } = useContext(TabsContext); + const isActive = active !== undefined ? active : selectedValue === value; + + return ( + + ); +} diff --git a/src/shared/ui/Textarea.tsx b/src/shared/ui/Textarea.tsx new file mode 100644 index 0000000..680127d --- /dev/null +++ b/src/shared/ui/Textarea.tsx @@ -0,0 +1,8 @@ +export default function Textarea({ className = "", ...props }) { + return ( +