diff --git a/common/build.gradle.kts b/common/build.gradle.kts index db6c3ef..5cc5585 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -19,7 +19,7 @@ dependencies { api("io.jsonwebtoken:jjwt-impl:0.12.3") api("io.jsonwebtoken:jjwt-jackson:0.12.3") - api("org.springframework.boot:spring-boot-starter-web") + compileOnly("org.springframework:spring-web") compileOnly("org.projectlombok:lombok") annotationProcessor("org.projectlombok:lombok") diff --git a/docker-compose.yml b/docker-compose.yml index b24e7c7..d44a2d6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,19 @@ name: is-coursework services: + frontend: + build: + context: ./domains-frontend + dockerfile: Dockerfile + container_name: frontend + ports: + - "3000:3000" + depends_on: + - api-gateway + - exdns + networks: + - domain-registrar-network + api-gateway: build: context: . diff --git a/domains-frontend/.dockerignore b/domains-frontend/.dockerignore new file mode 100644 index 0000000..62b26e1 --- /dev/null +++ b/domains-frontend/.dockerignore @@ -0,0 +1,4 @@ +node_modules +dist +.git +*.md diff --git a/domains-frontend/.prettierignore b/domains-frontend/.prettierignore new file mode 100644 index 0000000..ac66857 --- /dev/null +++ b/domains-frontend/.prettierignore @@ -0,0 +1,4 @@ +# Lock files +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/domains-frontend/.prettierrc b/domains-frontend/.prettierrc new file mode 100644 index 0000000..0a72520 --- /dev/null +++ b/domains-frontend/.prettierrc @@ -0,0 +1,6 @@ +{ + "trailingComma": "es5", + "tabWidth": 2, + "semi": true, + "singleQuote": true +} diff --git a/domains-frontend/Dockerfile b/domains-frontend/Dockerfile new file mode 100644 index 0000000..8314398 --- /dev/null +++ b/domains-frontend/Dockerfile @@ -0,0 +1,18 @@ +FROM node:20-alpine AS build +WORKDIR /app + +RUN corepack enable && corepack prepare pnpm@latest --activate + +COPY package.json pnpm-lock.yaml ./ +RUN pnpm install --frozen-lockfile + +COPY . . +RUN pnpm build + +FROM nginx:alpine +COPY --from=build /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 3000 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/domains-frontend/nginx.conf b/domains-frontend/nginx.conf new file mode 100644 index 0000000..9486ff5 --- /dev/null +++ b/domains-frontend/nginx.conf @@ -0,0 +1,25 @@ +server { + listen 3000; + server_name localhost; + + root /usr/share/nginx/html; + index index.html; + + location /api/ { + proxy_pass http://api-gateway:8080/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /exdns/ { + proxy_pass http://exdns:8000/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + location / { + try_files $uri $uri/ /index.html; + } +} diff --git a/domains-frontend/orval.config.ts b/domains-frontend/orval.config.ts new file mode 100644 index 0000000..b6db5e1 --- /dev/null +++ b/domains-frontend/orval.config.ts @@ -0,0 +1,48 @@ +import { defineConfig } from 'orval'; + +export default defineConfig({ + auth: { + // input: 'src/api/specs/auth-openapi.json', + input: 'http://localhost:8080/api/auth/v3/api-docs', + output: { + client: 'axios-functions', + target: 'src/api/services/auth.ts', + schemas: 'src/api/models/auth', + override: { + mutator: { + path: './src/api/apiClient.ts', + name: 'customInstance', + }, + }, + }, + }, + domainOrder: { + // input: 'src/api/specs/domain-order-openapi.json', + input: 'http://localhost:8080/api/domains/v3/api-docs', + output: { + client: 'axios-functions', + target: 'src/api/services/domain-order.ts', + schemas: 'src/api/models/domain-order', + override: { + mutator: { + path: './src/api/apiClientDomains.ts', + name: 'customInstance', + }, + }, + }, + }, + exdns: { + input: 'src/api/specs/exdns.json', + output: { + client: 'axios-functions', + target: 'src/api/services/exdns.ts', + schemas: 'src/api/models/exdns', + override: { + mutator: { + path: './src/api/apiClientExdns.ts', + name: 'customInstance', + }, + }, + }, + }, +}); diff --git a/domains-frontend/package.json b/domains-frontend/package.json new file mode 100644 index 0000000..e7d9edb --- /dev/null +++ b/domains-frontend/package.json @@ -0,0 +1,40 @@ +{ + "name": "domains-frontend", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "build": "rsbuild build", + "dev": "rsbuild dev --open", + "format": "prettier --write .", + "preview": "rsbuild preview", + "genapi": "orval --config orval.config.ts" + }, + "dependencies": { + "@chakra-ui/react": "^3.30.0", + "@emotion/react": "^11.14.0", + "@fontsource-variable/jost": "^5.2.8", + "@fontsource/golos-text": "^5.2.8", + "@simplewebauthn/browser": "^13.2.2", + "axios": "^1.13.2", + "dayjs": "^1.11.19", + "lucide-react": "^0.562.0", + "mobx": "^6.15.0", + "mobx-react-lite": "^4.1.1", + "next-themes": "^0.4.6", + "react": "^19.2.3", + "react-dom": "^19.2.3", + "react-hook-form": "^7.70.0", + "react-icons": "^5.5.0", + "react-router": "^7.12.0" + }, + "devDependencies": { + "@rsbuild/core": "^1.7.1", + "@rsbuild/plugin-react": "^1.4.2", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "orval": "^7.17.2", + "prettier": "^3.7.3", + "typescript": "^5.9.3" + } +} diff --git a/domains-frontend/pnpm-lock.yaml b/domains-frontend/pnpm-lock.yaml new file mode 100644 index 0000000..2377d13 --- /dev/null +++ b/domains-frontend/pnpm-lock.yaml @@ -0,0 +1,4976 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@chakra-ui/react': + specifier: ^3.30.0 + version: 3.30.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@emotion/react': + specifier: ^11.14.0 + version: 11.14.0(@types/react@19.2.7)(react@19.2.3) + '@fontsource-variable/jost': + specifier: ^5.2.8 + version: 5.2.8 + '@fontsource/golos-text': + specifier: ^5.2.8 + version: 5.2.8 + '@simplewebauthn/browser': + specifier: ^13.2.2 + version: 13.2.2 + axios: + specifier: ^1.13.2 + version: 1.13.2 + dayjs: + specifier: ^1.11.19 + version: 1.11.19 + lucide-react: + specifier: ^0.562.0 + version: 0.562.0(react@19.2.3) + mobx: + specifier: ^6.15.0 + version: 6.15.0 + mobx-react-lite: + specifier: ^4.1.1 + version: 4.1.1(mobx@6.15.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: + specifier: ^19.2.3 + version: 19.2.3 + react-dom: + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) + react-hook-form: + specifier: ^7.70.0 + version: 7.70.0(react@19.2.3) + react-icons: + specifier: ^5.5.0 + version: 5.5.0(react@19.2.3) + react-router: + specifier: ^7.12.0 + version: 7.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + devDependencies: + '@rsbuild/core': + specifier: ^1.7.1 + version: 1.7.2 + '@rsbuild/plugin-react': + specifier: ^1.4.2 + version: 1.4.2(@rsbuild/core@1.7.2) + '@types/react': + specifier: ^19.2.7 + version: 19.2.7 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.7) + orval: + specifier: ^7.17.2 + version: 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + prettier: + specifier: ^3.7.3 + version: 3.7.4 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + +packages: + + '@apidevtools/json-schema-ref-parser@14.0.1': + resolution: {integrity: sha512-Oc96zvmxx1fqoSEdUmfmvvb59/KDOnUoJ7s2t7bISyAn0XEz57LCCw8k2Y4Pf3mwKaZLMciESALORLgfe2frCw==} + engines: {node: '>= 16'} + + '@apidevtools/openapi-schemas@2.1.0': + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + + '@apidevtools/swagger-methods@3.0.2': + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + + '@apidevtools/swagger-parser@12.1.0': + resolution: {integrity: sha512-e5mJoswsnAX0jG+J09xHFYQXb/bUc5S3pLpMxUuRUA2H8T2kni3yEoyz2R3Dltw5f4A6j6rPNMpWTK+iVDFlng==} + peerDependencies: + openapi-types: '>=7' + + '@ark-ui/react@5.30.0': + resolution: {integrity: sha512-MIWgj6uWTuG42DGaXUQARObvuQJymm+/1wsdGEDrIHtSv0a2PFQO4svwMvMFwfFbL1jVkJzzBU6JDAH0xKbvyw==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@asyncapi/specs@6.10.0': + resolution: {integrity: sha512-vB5oKLsdrLUORIZ5BXortZTlVyGWWMC1Nud/0LtgxQ3Yn2738HigAD6EVqScvpPsDUI/bcLVsYEXN4dtXQHVng==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@chakra-ui/react@3.30.0': + resolution: {integrity: sha512-eIRRAilqY4f2zN8GWRnjcciBYsvy3GZDOmzGD9xk596LBxCTNCJaivdBiHCcgNlqA3y1wMyM1jepy2b2vQC4QA==} + peerDependencies: + '@emotion/react': '>=11' + react: '>=18' + react-dom: '>=18' + + '@commander-js/extra-typings@14.0.0': + resolution: {integrity: sha512-hIn0ncNaJRLkZrxBIp5AsW/eXEHNKYQBh0aPdoUqNgD+Io3NIykQqpKFyKcuasZhicGaEZJX/JBSIkZ4e5x8Dg==} + peerDependencies: + commander: ~14.0.0 + + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@fontsource-variable/jost@5.2.8': + resolution: {integrity: sha512-+VDDHpbhgZ9A8KeHb7/LUMRR1LILVKIscNhVRSDzn3tFXoi1mFA/OhO8CZL/u2OujoGjZANjOdUZIgaxclxyjw==} + + '@fontsource/golos-text@5.2.8': + resolution: {integrity: sha512-8aJxXaRDbZVh97RBmL1nzUUI5K5KuG0b7LC/p5Q204/OF6IdpSeXTD6nxHwqrfLQXLr6hEO5c+y2rHqkHnuu2g==} + + '@gerrit0/mini-shiki@3.21.0': + resolution: {integrity: sha512-9PrsT5DjZA+w3lur/aOIx3FlDeHdyCEFlv9U+fmsVyjPZh61G5SYURQ/1ebe2U63KbDmI2V8IhIUegWb8hjOyg==} + + '@ibm-cloud/openapi-ruleset-utilities@1.9.0': + resolution: {integrity: sha512-AoFbSarOqFBYH+1TZ9Ahkm2IWYSi5v0pBk88fpV+5b3qGJukypX8PwvCWADjuyIccKg48/F73a6hTTkBzDQ2UA==} + engines: {node: '>=16.0.0'} + + '@ibm-cloud/openapi-ruleset@1.33.5': + resolution: {integrity: sha512-oT8USsTulFAA8FiBN0lA2rJqQI2lIt+HP2pdakGQXo3EviL2vqJTgpSCRwjl6mLJL158f1BVcdQUOEFGxomK3w==} + engines: {node: '>=16.0.0'} + + '@internationalized/date@3.10.0': + resolution: {integrity: sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==} + + '@internationalized/number@3.6.5': + resolution: {integrity: sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jsep-plugin/assignment@1.3.0': + resolution: {integrity: sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/regex@1.0.4': + resolution: {integrity: sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/ternary@1.1.4': + resolution: {integrity: sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@module-federation/error-codes@0.22.0': + resolution: {integrity: sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==} + + '@module-federation/runtime-core@0.22.0': + resolution: {integrity: sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==} + + '@module-federation/runtime-tools@0.22.0': + resolution: {integrity: sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==} + + '@module-federation/runtime@0.22.0': + resolution: {integrity: sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==} + + '@module-federation/sdk@0.22.0': + resolution: {integrity: sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==} + + '@module-federation/webpack-bundler-runtime@0.22.0': + resolution: {integrity: sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==} + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@orval/angular@7.17.2': + resolution: {integrity: sha512-+WBILd8KJD/I8eyX2eyTmzhyY+oTvbCTV25YoF2/UzWaBIq0reIhe5i2J2vUBXFnhZDLfwJYn70v341y7NSPlQ==} + + '@orval/axios@7.17.2': + resolution: {integrity: sha512-9wNxnEtNSI4S22V5ta4f5jaFAfrJ5PEcQwALP6ogsBxT0lUhzHWhRGWaopA2SJLW8eCGfPVo4fF/x/2i9ecG8w==} + + '@orval/core@7.17.2': + resolution: {integrity: sha512-7kv7JgC6Va9hE/OiYTaJEU52Uy52y8Ill26QZufgP9yeMT60h3yiycF//LSQp83P+fGzcS9PLuCS4uRPmrMtgA==} + + '@orval/fetch@7.17.2': + resolution: {integrity: sha512-gBgk4POAacKs4c7VKCQPTkdLWvxF2s1p/EBKT1N6h2QKUxZcO7MbV141FQXFghFGFYgpuNiUTlox4BbSeCVrXw==} + + '@orval/hono@7.17.2': + resolution: {integrity: sha512-YSTDYPysnD5LyugRKGSU4kZEMgK0HeLeZ7r1X/4u6U5FrRdhmjf+gjnCseBR61yKwS/8BLMogIe7qw8uOs83Hg==} + + '@orval/mcp@7.17.2': + resolution: {integrity: sha512-7aJcZMSh2ZPHdcgz0JdilVTLcaMbPeEHJgpJTvSUZembgQvBwJYfalaaROfBmRH9nSfHP11DYmsuG5kTIfd3JA==} + + '@orval/mock@7.17.2': + resolution: {integrity: sha512-otVzA/yR2lKQJRSIeVyuh+tl/uE/EJQ82oJg9Zu11S70QzxMTCg/IEe8fbTeE3APtoujhACB6aZ/qqbmK29ugw==} + + '@orval/query@7.17.2': + resolution: {integrity: sha512-dbD3U6CuRBYszMQOlitO4MryLnrlZIHwjNGsree0l5WO25e9QrfEMPxFU9wVaLnP/w10ODMBsBIBNUmy5ifXxQ==} + + '@orval/swr@7.17.2': + resolution: {integrity: sha512-BWN7E41JEfr2qVFi+sNwPH3jXJgL4BiIAJTqZraZW0S89EmI4kU2yh3YveNmeopXai7mssaiiAlE8qe4wFcWnw==} + + '@orval/zod@7.17.2': + resolution: {integrity: sha512-Zf2sAQAGZ99VzummF4/Tq5pbXe6qR+w37XmLX5bMokshT8lEuV9goT4gftW4AWGY3Azrp/Syj3fdbSBthN/KPw==} + + '@pandacss/is-valid-prop@1.8.0': + resolution: {integrity: sha512-ni3nGvk7K7OwvS5QWljnPgLaNhfcqFJnCYQxyEgUBXcAd/hEbwMhXjfuL/VFczWPERJITJdi1FB/giau3pF+DQ==} + + '@rsbuild/core@1.7.2': + resolution: {integrity: sha512-VAFO6cM+cyg2ntxNW6g3tB2Jc5J5mpLjLluvm7VtW2uceNzyUlVv41o66Yp1t1ikxd3ljtqegViXem62JqzveA==} + engines: {node: '>=18.12.0'} + hasBin: true + + '@rsbuild/plugin-react@1.4.2': + resolution: {integrity: sha512-2rJb5mOuqVof2aDq4SbB1E65+0n1vjhAADipC88jvZRNuTOulg79fh7R4tsCiBMI4VWq46gSpwekiK8G5bq6jg==} + peerDependencies: + '@rsbuild/core': 1.x + + '@rspack/binding-darwin-arm64@1.7.1': + resolution: {integrity: sha512-3C0w0kfCHfgOH+AP/Dx1bm/b3AR/or5CmU22Abevek0m95ndU3iT902eLcm9JNiMQnDQLBQbolfj5P591t0oPg==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.7.1': + resolution: {integrity: sha512-HTrBpdw2gWwcpJ3c8h4JF8B1YRNvrFT+K620ycttrlu/HvI4/U770BBJ/ej36R/hdh59JvMCGe+w49FyXv6rzg==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.7.1': + resolution: {integrity: sha512-BX9yAPCO0WBFyOzKl9bSXT/cH27nnOJp02smIQMxfv7RNfwGkJg5GgakYcuYG+9U1HEFitBSzmwS2+dxDcAxlg==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.7.1': + resolution: {integrity: sha512-maBX19XyiVkxzh/NA79ALetCobc4zUyoWkWLeCGyW5xKzhPVFatJp+qCiHqHkqUZcgRo+1i5ihoZ2bXmelIeZg==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.7.1': + resolution: {integrity: sha512-8KJAeBLiWcN7zEc9aaS7LRJPZVtZuQU8mCsn+fRhdQDSc+a9FcTN8b6Lw29z8cejwbU6Gxr/8wk5XGexMWFaZA==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.7.1': + resolution: {integrity: sha512-Gn9x5vhKRELvSoZ3ZjquY8eWtCXur0OsYnZ2/ump8mofM6IDaL7Qqu3Hf4Kud31PDH0tfz0jWf9piX32HHPmgg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-wasm32-wasi@1.7.1': + resolution: {integrity: sha512-2r9M5iVchmsFkp3sz7A5YnMm2TfpkB71LK3AoaRWKMfvf5oFky0GSGISYd2TCBASO+X2Qskaq+B24Szo8zH5FA==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.7.1': + resolution: {integrity: sha512-/WIHp982yqqqAuiz2WLtf1ofo9d1lHDGZJ7flxFllb1iMgnUeSRyX6stxEi11K3Rg6pQa7FdCZGKX/engyj2bw==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.7.1': + resolution: {integrity: sha512-Kpela29n+kDGGsss6q/3qTd6n9VW7TOQaiA7t1YLdCCl8qqcdKlz/vWjFMd2MqgcSGC/16PvChE4sgpUvryfCQ==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.7.1': + resolution: {integrity: sha512-B/y4MWqP2Xeto1/HV0qtZNOMPSLrEVOqi2b7JSIXG/bhlf+3IAkDzEEoHs+ZikLR4C8hMaS0pVJsDGKFmGzC9A==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.7.1': + resolution: {integrity: sha512-qVTV1/UWpMSZktvK5A8+HolgR1Qf0nYR3Gg4Vax5x3/BcHDpwGZ0fbdFRUirGVWH/XwxZ81zoI6F2SZq7xbX+w==} + + '@rspack/core@1.7.1': + resolution: {integrity: sha512-kRxfY8RRa6nU3/viDvAIP6CRpx+0rfXFRonPL0pHBx8u6HhV7m9rLEyaN6MWsLgNIAWkleFGb7tdo4ux2ljRJQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.1.0': + resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} + + '@rspack/plugin-react-refresh@1.6.0': + resolution: {integrity: sha512-OO53gkrte/Ty4iRXxxM6lkwPGxsSsupFKdrPFnjwFIYrPvFLjeolAl5cTx+FzO5hYygJiGnw7iEKTmD+ptxqDA==} + peerDependencies: + react-refresh: '>=0.10.0 <1.0.0' + webpack-hot-middleware: 2.x + peerDependenciesMeta: + webpack-hot-middleware: + optional: true + + '@shikijs/engine-oniguruma@3.21.0': + resolution: {integrity: sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==} + + '@shikijs/langs@3.21.0': + resolution: {integrity: sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==} + + '@shikijs/themes@3.21.0': + resolution: {integrity: sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==} + + '@shikijs/types@3.21.0': + resolution: {integrity: sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@simplewebauthn/browser@13.2.2': + resolution: {integrity: sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==} + + '@stoplight/better-ajv-errors@1.0.3': + resolution: {integrity: sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==} + engines: {node: ^12.20 || >= 14.13} + peerDependencies: + ajv: '>=8' + + '@stoplight/json-ref-readers@1.2.2': + resolution: {integrity: sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ==} + engines: {node: '>=8.3.0'} + + '@stoplight/json-ref-resolver@3.1.6': + resolution: {integrity: sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A==} + engines: {node: '>=8.3.0'} + + '@stoplight/json@3.21.7': + resolution: {integrity: sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A==} + engines: {node: '>=8.3.0'} + + '@stoplight/ordered-object-literal@1.0.5': + resolution: {integrity: sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==} + engines: {node: '>=8'} + + '@stoplight/path@1.3.2': + resolution: {integrity: sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==} + engines: {node: '>=8'} + + '@stoplight/spectral-core@1.20.0': + resolution: {integrity: sha512-5hBP81nCC1zn1hJXL/uxPNRKNcB+/pEIHgCjPRpl/w/qy9yC9ver04tw1W0l/PMiv0UeB5dYgozXVQ4j5a6QQQ==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/spectral-formats@1.8.2': + resolution: {integrity: sha512-c06HB+rOKfe7tuxg0IdKDEA5XnjL2vrn/m/OVIIxtINtBzphZrOgtRn7epQ5bQF5SWp84Ue7UJWaGgDwVngMFw==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/spectral-functions@1.10.1': + resolution: {integrity: sha512-obu8ZfoHxELOapfGsCJixKZXZcffjg+lSoNuttpmUFuDzVLT3VmH8QkPXfOGOL5Pz80BR35ClNAToDkdnYIURg==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/spectral-parsers@1.0.5': + resolution: {integrity: sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/spectral-ref-resolver@1.0.5': + resolution: {integrity: sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/spectral-rulesets@1.22.0': + resolution: {integrity: sha512-l2EY2jiKKLsvnPfGy+pXC0LeGsbJzcQP5G/AojHgf+cwN//VYxW1Wvv4WKFx/CLmLxc42mJYF2juwWofjWYNIQ==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/spectral-runtime@1.1.4': + resolution: {integrity: sha512-YHbhX3dqW0do6DhiPSgSGQzr6yQLlWybhKwWx0cqxjMwxej3TqLv3BXMfIUYFKKUqIwH4Q2mV8rrMM8qD2N0rQ==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/types@13.20.0': + resolution: {integrity: sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==} + engines: {node: ^12.20 || >=14.13} + + '@stoplight/types@13.6.0': + resolution: {integrity: sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ==} + engines: {node: ^12.20 || >=14.13} + + '@stoplight/types@14.1.1': + resolution: {integrity: sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==} + engines: {node: ^12.20 || >=14.13} + + '@stoplight/yaml-ast-parser@0.0.50': + resolution: {integrity: sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ==} + + '@stoplight/yaml@4.3.0': + resolution: {integrity: sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==} + engines: {node: '>=10.8'} + + '@swc/helpers@0.5.18': + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/es-aggregate-error@1.0.6': + resolution: {integrity: sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@25.0.5': + resolution: {integrity: sha512-FuLxeLuSVOqHPxSN1fkcD8DLU21gAP7nCKqGRJ/FglbCUBs0NYN6TpHcdmyLeh8C0KwGIaZQJSv+OYG+KZz+Gw==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.7': + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/urijs@1.19.26': + resolution: {integrity: sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg==} + + '@zag-js/accordion@1.31.1': + resolution: {integrity: sha512-3sGi4EZpGBz/O1IVkk9dzzWzP5vVVOj4Li6C+jHOnrgaWPouA/mBTP5L9HEL8qtFsECFZwpNo486eqiCmeHoGw==} + + '@zag-js/anatomy@1.31.1': + resolution: {integrity: sha512-BhIhf3Q0tRA0Jugd7AJfUBzeAb/iATBsw7KyYThMGcPWmrWssL7KWr5AB6RufzGKU7+DCb1QEhlqd4NSOJaYxQ==} + + '@zag-js/angle-slider@1.31.1': + resolution: {integrity: sha512-SfWrgnM0zMLX82rsIJOqWk430UnPA17UFGcDqMDRwXy1Wx4yptmx0aFAsSXnRnw4Ee7WaulF2RWBli6O6iYRCA==} + + '@zag-js/aria-hidden@1.31.1': + resolution: {integrity: sha512-SoNt4S2LkHNWPglQczWN0E5vAV15MT1GoK9MksZzbkMhl+pkDTdLytpXsQ1IgalC1YUng0XNps/Wt6P3uDuzTA==} + + '@zag-js/async-list@1.31.1': + resolution: {integrity: sha512-BDZEmr4KKh3JASgkXouOwoTWRS1UPE3gdZYZ7Sk7SJ1i8+Pk6zUQ4FnxaoF/cSAdCXyjSSr92Kns2bTk/QuNkQ==} + + '@zag-js/auto-resize@1.31.1': + resolution: {integrity: sha512-qzWHibjBekSmFweG+EWY8g0lRzKtok7o9XtQ+JFlOu3s6x4D02z2YDzjDdfSLmS7j0NxISnwQkinWiDAZEYHog==} + + '@zag-js/avatar@1.31.1': + resolution: {integrity: sha512-Grosi2hRn4wfDYlPd8l+d4GCIFMsoj6ZFqii+1k14AqTDiCUJ/J0jCvOrRHkvkpEqektjuSD7e/GCX+yawqkuQ==} + + '@zag-js/bottom-sheet@1.31.1': + resolution: {integrity: sha512-ZBbIpYyZX2zQeqW36aODVi9/I4J3zS1XmIHUjeXmfmf6TlQUA1ydgYl7ipREfmCzNWX2LEA5ZnPJQw0UBcrB8w==} + + '@zag-js/carousel@1.31.1': + resolution: {integrity: sha512-228Ol86G/lg8crcomy5cALkUYdOHCHcvJnSOQzeUj80JNjlELzrjBpaAj4lx8dZocfwou2Sg4NyZJ+mISSc+Dg==} + + '@zag-js/checkbox@1.31.1': + resolution: {integrity: sha512-oLS8bqhimckLl6coCNmKPPUmB8wIbVhtkpLwLPLgz4vhhUe7gnpB5dea14Ow2JTBnmug8bMh/bJDtuPa9qQuTw==} + + '@zag-js/clipboard@1.31.1': + resolution: {integrity: sha512-pv/gOmD9DMg+YmSMjahyd5oSp7/v9K0uQ3att6fPeaNMjB42b3tnY1S1GNVy5Ltf/qHDab6WVwlEN+1zKHXaYw==} + + '@zag-js/collapsible@1.31.1': + resolution: {integrity: sha512-eCC5G6bBZUwF8z2XULQXUNRxqte9I2Sv+WJ2brycPn1a68uYD76RzFBmLQ2er95VbshUdeo8nRuX8MooAFuYzg==} + + '@zag-js/collection@1.31.1': + resolution: {integrity: sha512-ecpfyfCj8Y0/GUPuHYsLxexIrx10VuR3Wd0H+lamcki3lYgQxZrpLRFMwgTqmI/m7t3zhm5QeEvMUJ1H14YMLA==} + + '@zag-js/color-picker@1.31.1': + resolution: {integrity: sha512-AWNZth49iEDxqh1DBZNSKpfEM/FF+MjL5bgUHVctnHdkpFsZLynJorWQQ4hNXNDFEc/I5w10KSxVCcO6tsPGFw==} + + '@zag-js/color-utils@1.31.1': + resolution: {integrity: sha512-HdjTRU8C0tO6hK+PBVlu8iQH1MJaAnJAEdq2FcD97mq0PiPhrSj6iOftnrvPsE4CRieVFjnJWOvaubWFc4VmHA==} + + '@zag-js/combobox@1.31.1': + resolution: {integrity: sha512-IT0getSAGzngdRL20iX/iAh2d7DzVoMDDppOsOFBG2owKAgLpj8uLvUhy+lcrm6N8yxYOya89D6Aef7V5KdwlQ==} + + '@zag-js/core@1.31.1': + resolution: {integrity: sha512-RaMJeqtjxG6k7iFD3WQnlyFJVT3yfQN+pJygAHH37GsMtiNzQQJOoesjb0LV9T27jwMXeNUzrh3MSDr1/0yVcQ==} + + '@zag-js/date-picker@1.31.1': + resolution: {integrity: sha512-AOWN/IskGidVQt5g+uE9cILqJBTclE6OG1GC9WSWuyP/y4F+PdP/781SgYpYCZg/6pMGbL01PFKKb7xOOCeZAg==} + peerDependencies: + '@internationalized/date': '>=3.0.0' + + '@zag-js/date-utils@1.31.1': + resolution: {integrity: sha512-+Aq9g/rqLeiRmnazgdZMc59gAxqxbw3GGy8AngrtNipgRtMhPlzGa3S4Qsq1yau6OKaHZ13uckUS+MhLNbBY+Q==} + peerDependencies: + '@internationalized/date': '>=3.0.0' + + '@zag-js/dialog@1.31.1': + resolution: {integrity: sha512-iaWlYQ6TYoVjM/X5+UZVZzKiMboE50GnEzGUpbhbeRNRiLqSu5dODSFzior1G4kde/ns5eN+BTf/Tm6AT4N2og==} + + '@zag-js/dismissable@1.31.1': + resolution: {integrity: sha512-jCdJwQmEkG6PlrN13fUk2l7ZclSu54FZwmT4xOtQpEbaiAiESm5KI5oyFh5jDPY47Goa28UJkEjWXVgKXKWb0g==} + + '@zag-js/dom-query@1.31.1': + resolution: {integrity: sha512-2tCZLwSfoXm62gwl0neiAN6u5VnzUhy5wHtKbX+klqGFatnca3Bm++H9+4PHMrwUWRbPg3H5N151lKFEOQhBfQ==} + + '@zag-js/editable@1.31.1': + resolution: {integrity: sha512-JMICHw4/x0YqDy/n+I+TeaXlFbTA0j9w3UqOWMwUFQ+dAsq4JLXeqZDXu19MQN6yaTFdOpG1EFw4FEVTsu+d3Q==} + + '@zag-js/file-upload@1.31.1': + resolution: {integrity: sha512-cp7qMiXKrIcTfDamOz9wlnJLeBF8gucTI7Y+iKaP+hiIW+OG254GElfQiqXNDad3HUmD+Dt8Tx6uAzL/mw3sbQ==} + + '@zag-js/file-utils@1.31.1': + resolution: {integrity: sha512-MDDz52IdPh/mPUYrqUXvh7qDckJHs+mt5gjfx0N89qh2JNXuRU14zPotOKTzIKM4o+HFZkAT6BAfMpr9CX/0ug==} + + '@zag-js/floating-panel@1.31.1': + resolution: {integrity: sha512-Pjgd/wjdglZ90dtq/LC4o5sc6w0m+RehhPmJcIzq9T+E/Xrb6qrhf06QhxB9LwSj4DG/gIv87gmD2qF1VH7cRQ==} + + '@zag-js/focus-trap@1.31.1': + resolution: {integrity: sha512-omgUhAz1r81pYAujqYIIavdTKJzDRExioSiqhnx/xq10a6Q/xavMFflq8w7edMc9JHkTOnr9E5qh9abCVJjhpQ==} + + '@zag-js/focus-visible@1.31.1': + resolution: {integrity: sha512-GC59A3yd7tj8aKhzvhrM+CEZZraXm5y/SpfIjz1J7kGV6eeXbUtjkbe75g99Ve8iJYfQVQlAj2GyN3oniHc5Zw==} + + '@zag-js/highlight-word@1.31.1': + resolution: {integrity: sha512-nQw7t8LgWXW+6Z5E/p6T+OST0DDXp35mrFCzrkJL54aVTZ3GuLyIP2p0/HGQr2hE/KKLbZEs5i6UcXF84tiI4g==} + + '@zag-js/hover-card@1.31.1': + resolution: {integrity: sha512-R74kz2wPgGwB3jKQeD91kdtlvVKpffWBJHqw8yCBd95GXGVmhym+BPoCToJzcqiemP8+0EtSuVPU9IHaSuJnSg==} + + '@zag-js/i18n-utils@1.31.1': + resolution: {integrity: sha512-SARkFuo1+Q0WcNv4jqvxp5hjCOqu/gBa7p6BTh7v5Bo00QhKRM/bCvVt0EB6V+h2oejrZfkwZ0MwbpQiL6L2aQ==} + + '@zag-js/image-cropper@1.31.1': + resolution: {integrity: sha512-hFuy4I3jIJ/iyJsnfbLX1l/cJtN42j7lwhw8TeWVX8Y+hHxFPMSKx7AQirt/hALUbyy7QsQgAd5IslpsYq1Nlg==} + + '@zag-js/interact-outside@1.31.1': + resolution: {integrity: sha512-oxBAlBqcatlxGUmhwUCRYTADIBrVoyxM1YrFzR1R8jhvVR/QCaxoLAyKwcA3mWXlZ8+NlXb7n5ELE11BZb/rEg==} + + '@zag-js/json-tree-utils@1.31.1': + resolution: {integrity: sha512-wrNek2UBE69FWpo2f0E2MxiboBS+Uop79LeQU2jNDujA1o3x6b1Lp2r7Fl1sfnUWMdKVVQb44oqfIj2g3CTEmQ==} + + '@zag-js/listbox@1.31.1': + resolution: {integrity: sha512-LcTIr4I9eN4MR1nSRfQfseWgj4ybOXXAY2o5dBpEBL67dnCSX3swNb/4LQO+ebj077BViQb66pBb1KSoeHGkEQ==} + + '@zag-js/live-region@1.31.1': + resolution: {integrity: sha512-RBx8jk1dgvkEUuFs77SBZn0WwvEkeZgVawVu6XUAy4ENfhP0D/qkvwNk+Els8InKmr1gWKajD7sh+g8M40Ex6A==} + + '@zag-js/marquee@1.31.1': + resolution: {integrity: sha512-Rt7+zy7CDOxXm0PqaTcmuWxcrZOPOpZY4T6IxOZk4ZcOXJQ2v7CkF3EK0pdI9PyI6Zpk/YIwQkENjidT55db0A==} + + '@zag-js/menu@1.31.1': + resolution: {integrity: sha512-eJPRM8tlauRTsAoJXchDBzMzL2RhXYSHmHak2IJCDMApCV51p0MqGYP8Er3DbMSQTPUFuTq779uUIarDqW+zmA==} + + '@zag-js/navigation-menu@1.31.1': + resolution: {integrity: sha512-xS4aynqmB9NYicPbEW8lPPakAfDfSgIDL1pRVSD6f1+VXkHD6LgNn6jUNDNbFt65mGhLpA2IczbvLCxv0g/ISQ==} + + '@zag-js/number-input@1.31.1': + resolution: {integrity: sha512-vn+BXEZ2/g2CMIFFyjjye/SbCeW3I/rlszL8EyBmhMcuA1l51OX2WKry6HeQNiU41uMyFg2rb1pb5KVw1gJsCg==} + + '@zag-js/pagination@1.31.1': + resolution: {integrity: sha512-icW6FNzIKNz7iXU+prlQWpMFJedDrhmCKzzI39SY+dv5g1Gnrlc0b44PxvNl5PWFLSkB5KBT/R1WCqd8Kh4cCA==} + + '@zag-js/password-input@1.31.1': + resolution: {integrity: sha512-AivOeNO14a39xhxVMB2TVmIjmQ89OwVz0+2IjX3JjLS2Pmia+gg9xnVd2kBIcKfnqUN4MBnzmk7t46YWJMQVVQ==} + + '@zag-js/pin-input@1.31.1': + resolution: {integrity: sha512-k3ESoX5ve5sbWBLTCPYAzgLjRU7mVNEUiqAOhRgazOcBGV5wjGh398zWb1jr0FMxPnoAMrXDN/CQwJTmJcMKrg==} + + '@zag-js/popover@1.31.1': + resolution: {integrity: sha512-uCFJP3DFBkEBAre6lgGLw2xWS2ZIuT/DLeajIXb+8BmC9KCF0wY4c9qojx9F3rGMJQxcGl+WUoXENkOvkTaVhQ==} + + '@zag-js/popper@1.31.1': + resolution: {integrity: sha512-wLXcEqzn9MK1rGbsgnDH26o5ZWqR4oeb6ZepKKy0gcuJl/1S5/dr1VBvxJNMZlf9d6etvYklG5LRnIVkXCbrjA==} + + '@zag-js/presence@1.31.1': + resolution: {integrity: sha512-tv+WsBnA0abIlDuEfZMh0lRPF4cMs6kWJosNkGBwzeXnGds+KXjzpL2KDtwDgbJgN3sI0xHPMYjRy2v3ZamcDA==} + + '@zag-js/progress@1.31.1': + resolution: {integrity: sha512-f9lIDHCRcFAG14LVEKOAPTdqPzphwIIraC6fTr9AwmNlYI6/qFDkz3jOlYVSyk5VsJAIFM/777x/CdqjliiOqg==} + + '@zag-js/qr-code@1.31.1': + resolution: {integrity: sha512-Rxh+HF12SgUp5rvTelp1qyLK3xkn37h2fT/L4eBQ0f8OUEo8wfowEbs36+1i61d6UuH7PJt4q/07eIf6vNVevA==} + + '@zag-js/radio-group@1.31.1': + resolution: {integrity: sha512-OfKIdEtSG0EuHM+cFVqcR+04yzZmcDRgG3j0QhoJsyS1my63ZHbwC2HNAtfPFh4U4sJx9yUexwSzPGZ6pOzIdw==} + + '@zag-js/rating-group@1.31.1': + resolution: {integrity: sha512-BkQUglKm4a+KXYPACYvIvBJSuEyzV0YQqjjiucwJ5UiOlK72C66VBvyGN+DqJRDnkU1K5azt6E1Ja5ANk3fgsg==} + + '@zag-js/react@1.31.1': + resolution: {integrity: sha512-a7uYH+tcw1UYbcovyVBzlh6X8KztK/b1+s8sMs4Srhd24M+hZMetV94Z0bM1Km5aNAnoS4gkH3gtJjH0OphquQ==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@zag-js/rect-utils@1.31.1': + resolution: {integrity: sha512-lBFheAnz8+3aGDFjqlkw0Iew/F03lFjiIf26hkkcFSZu0ltNZUMG/X3XLHUnHxdfbdBguc8ons6mr2MkVvisng==} + + '@zag-js/remove-scroll@1.31.1': + resolution: {integrity: sha512-gVVJuFKaCjo652RmajYmkjXKgjJWLQ5ZhZLTaLUKWM1mAarvlqnLui8jrHEHLxqpfsjQylfdhJKkWmyF8NAgTA==} + + '@zag-js/scroll-area@1.31.1': + resolution: {integrity: sha512-GBXd1K3U0AHwWlJaqAMKQMZyeoxuBO6XYrVgdvzgiftQbJrZs5fuYOFyDvPLDWHTLYxaHso44/f+9EmAUAiytw==} + + '@zag-js/scroll-snap@1.31.1': + resolution: {integrity: sha512-YWsfhcQqiffu2X9HuB0fMnEQAu6rEOfGcvQYinvB6pjWPOvIJGxGMi/dYyy21XQDNJ9K1IcWRIo/yuaajoJyQQ==} + + '@zag-js/select@1.31.1': + resolution: {integrity: sha512-vKWb8BiRY83Y3HkDNnimf6cr1yvzJh1HwZlzXFz0y47zEvlikQaf+r96obR78RgTtMjNTTV15tTXdc1/WFoYkw==} + + '@zag-js/signature-pad@1.31.1': + resolution: {integrity: sha512-bz3WtLuIZoLrJDKcdS7fPAdD/Qi9wKiKACl5cu+ftv9zg8w+qqYNLtjH9HxeUFbCtQRKqcdXjO/UZ8iL07hgsQ==} + + '@zag-js/slider@1.31.1': + resolution: {integrity: sha512-FILbLTMd3BnyclZ28+ippfyqzYPGK60qZapxtTERmWDC75Okf8AFnTCQf84Y8jRmBKCS1yhjF+IOtkFAENeB6w==} + + '@zag-js/splitter@1.31.1': + resolution: {integrity: sha512-7SGBT2/xKsOzeSQEg+Otn1XV3RHrAz3jTySjBRKoEmdxubhfREqbKotbGVG65aTve11fQnmJ3Oyt3GJOeraxLA==} + + '@zag-js/steps@1.31.1': + resolution: {integrity: sha512-KsBH38V3tH9/q8CDgx4sUSXLYwFdcp1crZy8hTIcN0RUiZ55PmqYKkN2znzBjTbaCW9yhP8kXsbuo2s8OIU5lQ==} + + '@zag-js/store@1.31.1': + resolution: {integrity: sha512-d5ZTRciTuXOGQ3nML15kQLaTiR1wJPxT1Fu1nN659X6Rl8DPtubYaRCZ3RCk9Kyiyg2z5HxeVqDswaDvGbM9Rg==} + + '@zag-js/switch@1.31.1': + resolution: {integrity: sha512-Jii3OSqSa9sQux+hvSRvp9dirzUF09+PAjrLjCQs+BT08EZ0XqeGvVzM0Wqf9LFy07HdLZntai3IUaXLF6byBw==} + + '@zag-js/tabs@1.31.1': + resolution: {integrity: sha512-QBq4ngpBNMNEI7Wuaq8llwHOqgcVbNHHEDC5zHg60Bf7MY5ltP8wSq6Kldu0zZRVwrLzanYoMELDUyf9H0vtnw==} + + '@zag-js/tags-input@1.31.1': + resolution: {integrity: sha512-V4lJe/aMIs7WVoXYfszU6E3iARLLRQFMiycu76/slb8NWJiLrkSIaMQ4FAe2pqkodgCWXA83tuaeAZRq7ouTFg==} + + '@zag-js/timer@1.31.1': + resolution: {integrity: sha512-bXfeSbneWGOBKlD5dYq06T8CSY9Ky+qb1yIfJAFsRF4n34mpUYRdtfwpNQYyddGpkLD7oH4VibajeZXB7HaL0g==} + + '@zag-js/toast@1.31.1': + resolution: {integrity: sha512-MueHEei9ol3H6tWBruLxF7yEUpV3vsJ8brTQVRRtPr/6pqBs5kGzfL4YskhQ2tiwO6egay8YrkbaS3xJfpKt4w==} + + '@zag-js/toggle-group@1.31.1': + resolution: {integrity: sha512-Mojc7mex01/gvwXfrUIIThzT7HOktZoMge9rrb6+P7rQX7ulyNXYPjQrW2tay+t54GOJ3xODo9dU7PpRzXeHbw==} + + '@zag-js/toggle@1.31.1': + resolution: {integrity: sha512-HbFBuGfdyYkNvOp3cEB8Civ4E92finT4u3e4LKysB4/LboqKA0cJvFhSnHyThbROONTx06W/3CxwoSFR4o8IhA==} + + '@zag-js/tooltip@1.31.1': + resolution: {integrity: sha512-pWEU5XhEPpnyl2VLrGJlyjj7+p+X0UX3Fld+WGhc/hCaWiuW2ZzD/ewDRhSOZu4/TzAO3axrPqG1YhW4fhogKQ==} + + '@zag-js/tour@1.31.1': + resolution: {integrity: sha512-ZmcAevXxoENHmHG0xwdIt1oCLe2/DW1CEBFPr7YuGKc+FU3QbBVZMzcBHrJCe0nkKXhUKzHOHM78bOHD/gM76w==} + + '@zag-js/tree-view@1.31.1': + resolution: {integrity: sha512-Q+VSQz7X1XR8gT7ICWXlQOJIvzTWw/9BlF7B073UpEgAKRFlD11FmERka5y/BYqj8uE0vazcbSEA3Vc2dgCMJA==} + + '@zag-js/types@1.31.1': + resolution: {integrity: sha512-mKw5DoeBjFykfUHv3ifCRjcogFTqp0aCCsmqQMfnf+J/mg2aXpAx76AXT1PYXAVVhxdP6qGXNd0mOQZDVrIlSQ==} + + '@zag-js/utils@1.31.1': + resolution: {integrity: sha512-KLm0pmOtf4ydALbaVLboL7W98TDVxwVVLvSuvtRgV53XTjlsVopTRA5/Xmzq2NhWujDZAXv7bRV603NDgDcjSw==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-errors@3.0.0: + resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} + peerDependencies: + ajv: ^8.0.1 + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + core-js@3.47.0: + resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dependency-graph@0.11.0: + resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} + engines: {node: '>= 0.6.0'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-aggregate-error@1.0.14: + resolution: {integrity: sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-memoize@2.5.2: + resolution: {integrity: sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + inflected@2.1.0: + resolution: {integrity: sha512-hAEKNxvHf2Iq3H60oMBHkB4wl5jn3TPF3+fXek/sRwAB5gP9xWs4r7aweSF95f99HFoz69pnZTcu8f0SIHV18w==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsep@1.4.0: + resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==} + engines: {node: '>= 10.16.0'} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + jsonc-parser@2.2.1: + resolution: {integrity: sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jsonpath-plus@10.3.0: + resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} + engines: {node: '>=18.0.0'} + hasBin: true + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + jsonschema@1.5.0: + resolution: {integrity: sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.isempty@4.4.0: + resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} + + lodash.omitby@4.6.0: + resolution: {integrity: sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ==} + + lodash.topath@4.5.2: + resolution: {integrity: sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.uniqby@4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + + lodash.uniqwith@4.5.0: + resolution: {integrity: sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + + lucide-react@0.562.0: + resolution: {integrity: sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@6.2.0: + resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + mobx-react-lite@4.1.1: + resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx@6.15.0: + resolution: {integrity: sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + + nimma@0.2.3: + resolution: {integrity: sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA==} + engines: {node: ^12.20 || >=14.13} + + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + openapi3-ts@4.5.0: + resolution: {integrity: sha512-jaL+HgTq2Gj5jRcfdutgRGLosCy/hT8sQf6VOy+P+g36cZOjI1iukdPnijC+4CmeRzg/jEllJUboEic2FhxhtQ==} + + orval@7.17.2: + resolution: {integrity: sha512-6+drCVVWNukdX+ytFPOC2UJ51gv0kGAPch7cTQYxO7VsGwdZ1DiZhYozdGehwu6QeVvAszPhPlh4uLq53k0x+w==} + engines: {node: '>=22.18.0'} + hasBin: true + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + perfect-freehand@1.2.2: + resolution: {integrity: sha512-eh31l019WICQ03pkF3FSzHxB8n07ItqIQ++G5UV8JX0zVOXzgTGCqnRR0jJ2h9U8/2uW4W4mtGJELt9kEV0CFQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pony-cause@1.1.1: + resolution: {integrity: sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g==} + engines: {node: '>=12.0.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + engines: {node: '>=14'} + hasBin: true + + proxy-compare@3.0.1: + resolution: {integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + proxy-memoize@3.0.1: + resolution: {integrity: sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@19.2.3: + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} + peerDependencies: + react: ^19.2.3 + + react-hook-form@7.70.0: + resolution: {integrity: sha512-COOMajS4FI3Wuwrs3GPpi/Jeef/5W1DRR84Yl5/ShlT3dKVFUfoGiEZ/QE6Uw8P4T2/CLJdcTVYKvWBMQTEpvw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-icons@5.5.0: + resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} + peerDependencies: + react: '*' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + + react-router@7.12.0: + resolution: {integrity: sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@1.1.1: + resolution: {integrity: sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + simple-eval@1.0.1: + resolution: {integrity: sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ==} + engines: {node: '>=12'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tsconfck@2.1.2: + resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedoc-plugin-coverage@4.0.2: + resolution: {integrity: sha512-mfn0e7NCqB8x2PfvhXrtmd7KWlsNf1+B2N9y8gR/jexXBLrXl/0e+b2HdG5HaTXGi7i0t2pyQY2VRmq7gtdEHQ==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.28.x + + typedoc-plugin-markdown@4.9.0: + resolution: {integrity: sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.28.x + + typedoc@0.28.15: + resolution: {integrity: sha512-mw2/2vTL7MlT+BVo43lOsufkkd2CJO4zeOSuWQQsiXoV2VuEn7f6IZp2jsUDPmBMABpgR0R5jlcJ2OGEFYmkyg==} + engines: {node: '>= 18', pnpm: '>= 10'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + + urijs@1.19.11: + resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + validator@13.15.26: + resolution: {integrity: sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==} + engines: {node: '>= 0.10'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@apidevtools/json-schema-ref-parser@14.0.1': + dependencies: + '@types/json-schema': 7.0.15 + js-yaml: 4.1.1 + + '@apidevtools/openapi-schemas@2.1.0': {} + + '@apidevtools/swagger-methods@3.0.2': {} + + '@apidevtools/swagger-parser@12.1.0(openapi-types@12.1.3)': + dependencies: + '@apidevtools/json-schema-ref-parser': 14.0.1 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + + '@ark-ui/react@5.30.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@internationalized/date': 3.10.0 + '@zag-js/accordion': 1.31.1 + '@zag-js/anatomy': 1.31.1 + '@zag-js/angle-slider': 1.31.1 + '@zag-js/async-list': 1.31.1 + '@zag-js/auto-resize': 1.31.1 + '@zag-js/avatar': 1.31.1 + '@zag-js/bottom-sheet': 1.31.1 + '@zag-js/carousel': 1.31.1 + '@zag-js/checkbox': 1.31.1 + '@zag-js/clipboard': 1.31.1 + '@zag-js/collapsible': 1.31.1 + '@zag-js/collection': 1.31.1 + '@zag-js/color-picker': 1.31.1 + '@zag-js/color-utils': 1.31.1 + '@zag-js/combobox': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/date-picker': 1.31.1(@internationalized/date@3.10.0) + '@zag-js/date-utils': 1.31.1(@internationalized/date@3.10.0) + '@zag-js/dialog': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/editable': 1.31.1 + '@zag-js/file-upload': 1.31.1 + '@zag-js/file-utils': 1.31.1 + '@zag-js/floating-panel': 1.31.1 + '@zag-js/focus-trap': 1.31.1 + '@zag-js/highlight-word': 1.31.1 + '@zag-js/hover-card': 1.31.1 + '@zag-js/i18n-utils': 1.31.1 + '@zag-js/image-cropper': 1.31.1 + '@zag-js/json-tree-utils': 1.31.1 + '@zag-js/listbox': 1.31.1 + '@zag-js/marquee': 1.31.1 + '@zag-js/menu': 1.31.1 + '@zag-js/navigation-menu': 1.31.1 + '@zag-js/number-input': 1.31.1 + '@zag-js/pagination': 1.31.1 + '@zag-js/password-input': 1.31.1 + '@zag-js/pin-input': 1.31.1 + '@zag-js/popover': 1.31.1 + '@zag-js/presence': 1.31.1 + '@zag-js/progress': 1.31.1 + '@zag-js/qr-code': 1.31.1 + '@zag-js/radio-group': 1.31.1 + '@zag-js/rating-group': 1.31.1 + '@zag-js/react': 1.31.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@zag-js/scroll-area': 1.31.1 + '@zag-js/select': 1.31.1 + '@zag-js/signature-pad': 1.31.1 + '@zag-js/slider': 1.31.1 + '@zag-js/splitter': 1.31.1 + '@zag-js/steps': 1.31.1 + '@zag-js/switch': 1.31.1 + '@zag-js/tabs': 1.31.1 + '@zag-js/tags-input': 1.31.1 + '@zag-js/timer': 1.31.1 + '@zag-js/toast': 1.31.1 + '@zag-js/toggle': 1.31.1 + '@zag-js/toggle-group': 1.31.1 + '@zag-js/tooltip': 1.31.1 + '@zag-js/tour': 1.31.1 + '@zag-js/tree-view': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@asyncapi/specs@6.10.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/runtime@7.28.4': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@chakra-ui/react@3.30.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@ark-ui/react': 5.30.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@emotion/is-prop-valid': 1.4.0 + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.3) + '@emotion/utils': 1.4.2 + '@pandacss/is-valid-prop': 1.8.0 + csstype: 3.2.3 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@commander-js/extra-typings@14.0.0(commander@14.0.2)': + dependencies: + commander: 14.0.2 + + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/runtime': 7.28.4 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3)': + dependencies: + '@babel/runtime': 7.28.4 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.3) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.7 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.2.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.3)': + dependencies: + react: 19.2.3 + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@exodus/schemasafe@1.3.0': {} + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@fontsource-variable/jost@5.2.8': {} + + '@fontsource/golos-text@5.2.8': {} + + '@gerrit0/mini-shiki@3.21.0': + dependencies: + '@shikijs/engine-oniguruma': 3.21.0 + '@shikijs/langs': 3.21.0 + '@shikijs/themes': 3.21.0 + '@shikijs/types': 3.21.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@ibm-cloud/openapi-ruleset-utilities@1.9.0': {} + + '@ibm-cloud/openapi-ruleset@1.33.5': + dependencies: + '@ibm-cloud/openapi-ruleset-utilities': 1.9.0 + '@stoplight/spectral-formats': 1.8.2 + '@stoplight/spectral-functions': 1.10.1 + '@stoplight/spectral-rulesets': 1.22.0 + chalk: 4.1.2 + inflected: 2.1.0 + jsonschema: 1.5.0 + lodash: 4.17.21 + loglevel: 1.9.2 + loglevel-plugin-prefix: 0.8.4 + minimatch: 6.2.0 + validator: 13.15.26 + transitivePeerDependencies: + - encoding + + '@internationalized/date@3.10.0': + dependencies: + '@swc/helpers': 0.5.18 + + '@internationalized/number@3.6.5': + dependencies: + '@swc/helpers': 0.5.18 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jsep-plugin/assignment@1.3.0(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + + '@jsep-plugin/regex@1.0.4(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + + '@jsep-plugin/ternary@1.1.4(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + + '@module-federation/error-codes@0.22.0': {} + + '@module-federation/runtime-core@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/runtime-tools@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/webpack-bundler-runtime': 0.22.0 + + '@module-federation/runtime@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/runtime-core': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/sdk@0.22.0': {} + + '@module-federation/webpack-bundler-runtime@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@orval/angular@7.17.2(openapi-types@12.1.3)(typescript@5.9.3)': + dependencies: + '@orval/core': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + '@orval/axios@7.17.2(openapi-types@12.1.3)(typescript@5.9.3)': + dependencies: + '@orval/core': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + '@orval/core@7.17.2(openapi-types@12.1.3)(typescript@5.9.3)': + dependencies: + '@apidevtools/swagger-parser': 12.1.0(openapi-types@12.1.3) + '@ibm-cloud/openapi-ruleset': 1.33.5 + '@stoplight/spectral-core': 1.20.0 + acorn: 8.15.0 + chalk: 4.1.2 + compare-versions: 6.1.1 + debug: 4.4.3 + esbuild: 0.25.12 + esutils: 2.0.3 + fs-extra: 11.3.3 + globby: 11.1.0 + lodash.isempty: 4.4.0 + lodash.uniq: 4.5.0 + lodash.uniqby: 4.7.0 + lodash.uniqwith: 4.5.0 + micromatch: 4.0.8 + openapi3-ts: 4.5.0 + swagger2openapi: 7.0.8 + typedoc: 0.28.15(typescript@5.9.3) + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + '@orval/fetch@7.17.2(openapi-types@12.1.3)(typescript@5.9.3)': + dependencies: + '@orval/core': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + openapi3-ts: 4.5.0 + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + '@orval/hono@7.17.2(openapi-types@12.1.3)(typescript@5.9.3)': + dependencies: + '@orval/core': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/zod': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + fs-extra: 11.3.3 + lodash.uniq: 4.5.0 + openapi3-ts: 4.5.0 + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + '@orval/mcp@7.17.2(openapi-types@12.1.3)(typescript@5.9.3)': + dependencies: + '@orval/core': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/fetch': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/zod': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + openapi3-ts: 4.5.0 + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + '@orval/mock@7.17.2(openapi-types@12.1.3)(typescript@5.9.3)': + dependencies: + '@orval/core': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + openapi3-ts: 4.5.0 + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + '@orval/query@7.17.2(openapi-types@12.1.3)(typescript@5.9.3)': + dependencies: + '@orval/core': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/fetch': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + chalk: 4.1.2 + lodash.omitby: 4.6.0 + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + '@orval/swr@7.17.2(openapi-types@12.1.3)(typescript@5.9.3)': + dependencies: + '@orval/core': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/fetch': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + '@orval/zod@7.17.2(openapi-types@12.1.3)(typescript@5.9.3)': + dependencies: + '@orval/core': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + lodash.uniq: 4.5.0 + openapi3-ts: 4.5.0 + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + '@pandacss/is-valid-prop@1.8.0': {} + + '@rsbuild/core@1.7.2': + dependencies: + '@rspack/core': 1.7.1(@swc/helpers@0.5.18) + '@rspack/lite-tapable': 1.1.0 + '@swc/helpers': 0.5.18 + core-js: 3.47.0 + jiti: 2.6.1 + + '@rsbuild/plugin-react@1.4.2(@rsbuild/core@1.7.2)': + dependencies: + '@rsbuild/core': 1.7.2 + '@rspack/plugin-react-refresh': 1.6.0(react-refresh@0.18.0) + react-refresh: 0.18.0 + transitivePeerDependencies: + - webpack-hot-middleware + + '@rspack/binding-darwin-arm64@1.7.1': + optional: true + + '@rspack/binding-darwin-x64@1.7.1': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.7.1': + optional: true + + '@rspack/binding-linux-arm64-musl@1.7.1': + optional: true + + '@rspack/binding-linux-x64-gnu@1.7.1': + optional: true + + '@rspack/binding-linux-x64-musl@1.7.1': + optional: true + + '@rspack/binding-wasm32-wasi@1.7.1': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.7.1': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.7.1': + optional: true + + '@rspack/binding-win32-x64-msvc@1.7.1': + optional: true + + '@rspack/binding@1.7.1': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.7.1 + '@rspack/binding-darwin-x64': 1.7.1 + '@rspack/binding-linux-arm64-gnu': 1.7.1 + '@rspack/binding-linux-arm64-musl': 1.7.1 + '@rspack/binding-linux-x64-gnu': 1.7.1 + '@rspack/binding-linux-x64-musl': 1.7.1 + '@rspack/binding-wasm32-wasi': 1.7.1 + '@rspack/binding-win32-arm64-msvc': 1.7.1 + '@rspack/binding-win32-ia32-msvc': 1.7.1 + '@rspack/binding-win32-x64-msvc': 1.7.1 + + '@rspack/core@1.7.1(@swc/helpers@0.5.18)': + dependencies: + '@module-federation/runtime-tools': 0.22.0 + '@rspack/binding': 1.7.1 + '@rspack/lite-tapable': 1.1.0 + optionalDependencies: + '@swc/helpers': 0.5.18 + + '@rspack/lite-tapable@1.1.0': {} + + '@rspack/plugin-react-refresh@1.6.0(react-refresh@0.18.0)': + dependencies: + error-stack-parser: 2.1.4 + html-entities: 2.6.0 + react-refresh: 0.18.0 + + '@shikijs/engine-oniguruma@3.21.0': + dependencies: + '@shikijs/types': 3.21.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.21.0': + dependencies: + '@shikijs/types': 3.21.0 + + '@shikijs/themes@3.21.0': + dependencies: + '@shikijs/types': 3.21.0 + + '@shikijs/types@3.21.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@simplewebauthn/browser@13.2.2': {} + + '@stoplight/better-ajv-errors@1.0.3(ajv@8.17.1)': + dependencies: + ajv: 8.17.1 + jsonpointer: 5.0.1 + leven: 3.1.0 + + '@stoplight/json-ref-readers@1.2.2': + dependencies: + node-fetch: 2.7.0 + tslib: 1.14.1 + transitivePeerDependencies: + - encoding + + '@stoplight/json-ref-resolver@3.1.6': + dependencies: + '@stoplight/json': 3.21.7 + '@stoplight/path': 1.3.2 + '@stoplight/types': 13.6.0 + '@types/urijs': 1.19.26 + dependency-graph: 0.11.0 + fast-memoize: 2.5.2 + immer: 9.0.21 + lodash: 4.17.21 + tslib: 2.8.1 + urijs: 1.19.11 + + '@stoplight/json@3.21.7': + dependencies: + '@stoplight/ordered-object-literal': 1.0.5 + '@stoplight/path': 1.3.2 + '@stoplight/types': 13.6.0 + jsonc-parser: 2.2.1 + lodash: 4.17.21 + safe-stable-stringify: 1.1.1 + + '@stoplight/ordered-object-literal@1.0.5': {} + + '@stoplight/path@1.3.2': {} + + '@stoplight/spectral-core@1.20.0': + dependencies: + '@stoplight/better-ajv-errors': 1.0.3(ajv@8.17.1) + '@stoplight/json': 3.21.7 + '@stoplight/path': 1.3.2 + '@stoplight/spectral-parsers': 1.0.5 + '@stoplight/spectral-ref-resolver': 1.0.5 + '@stoplight/spectral-runtime': 1.1.4 + '@stoplight/types': 13.6.0 + '@types/es-aggregate-error': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-errors: 3.0.0(ajv@8.17.1) + ajv-formats: 2.1.1(ajv@8.17.1) + es-aggregate-error: 1.0.14 + jsonpath-plus: 10.3.0 + lodash: 4.17.21 + lodash.topath: 4.5.2 + minimatch: 3.1.2 + nimma: 0.2.3 + pony-cause: 1.1.1 + simple-eval: 1.0.1 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-formats@1.8.2': + dependencies: + '@stoplight/json': 3.21.7 + '@stoplight/spectral-core': 1.20.0 + '@types/json-schema': 7.0.15 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-functions@1.10.1': + dependencies: + '@stoplight/better-ajv-errors': 1.0.3(ajv@8.17.1) + '@stoplight/json': 3.21.7 + '@stoplight/spectral-core': 1.20.0 + '@stoplight/spectral-formats': 1.8.2 + '@stoplight/spectral-runtime': 1.1.4 + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) + ajv-errors: 3.0.0(ajv@8.17.1) + ajv-formats: 2.1.1(ajv@8.17.1) + lodash: 4.17.21 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-parsers@1.0.5': + dependencies: + '@stoplight/json': 3.21.7 + '@stoplight/types': 14.1.1 + '@stoplight/yaml': 4.3.0 + tslib: 2.8.1 + + '@stoplight/spectral-ref-resolver@1.0.5': + dependencies: + '@stoplight/json-ref-readers': 1.2.2 + '@stoplight/json-ref-resolver': 3.1.6 + '@stoplight/spectral-runtime': 1.1.4 + dependency-graph: 0.11.0 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-rulesets@1.22.0': + dependencies: + '@asyncapi/specs': 6.10.0 + '@stoplight/better-ajv-errors': 1.0.3(ajv@8.17.1) + '@stoplight/json': 3.21.7 + '@stoplight/spectral-core': 1.20.0 + '@stoplight/spectral-formats': 1.8.2 + '@stoplight/spectral-functions': 1.10.1 + '@stoplight/spectral-runtime': 1.1.4 + '@stoplight/types': 13.20.0 + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + json-schema-traverse: 1.0.0 + leven: 3.1.0 + lodash: 4.17.21 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-runtime@1.1.4': + dependencies: + '@stoplight/json': 3.21.7 + '@stoplight/path': 1.3.2 + '@stoplight/types': 13.6.0 + abort-controller: 3.0.0 + lodash: 4.17.21 + node-fetch: 2.7.0 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@stoplight/types@13.20.0': + dependencies: + '@types/json-schema': 7.0.15 + utility-types: 3.11.0 + + '@stoplight/types@13.6.0': + dependencies: + '@types/json-schema': 7.0.15 + utility-types: 3.11.0 + + '@stoplight/types@14.1.1': + dependencies: + '@types/json-schema': 7.0.15 + utility-types: 3.11.0 + + '@stoplight/yaml-ast-parser@0.0.50': {} + + '@stoplight/yaml@4.3.0': + dependencies: + '@stoplight/ordered-object-literal': 1.0.5 + '@stoplight/types': 14.1.1 + '@stoplight/yaml-ast-parser': 0.0.50 + tslib: 2.8.1 + + '@swc/helpers@0.5.18': + dependencies: + tslib: 2.8.1 + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/es-aggregate-error@1.0.6': + dependencies: + '@types/node': 25.0.5 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/node@25.0.5': + dependencies: + undici-types: 7.16.0 + + '@types/parse-json@4.0.2': {} + + '@types/react-dom@19.2.3(@types/react@19.2.7)': + dependencies: + '@types/react': 19.2.7 + + '@types/react@19.2.7': + dependencies: + csstype: 3.2.3 + + '@types/unist@3.0.3': {} + + '@types/urijs@1.19.26': {} + + '@zag-js/accordion@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/anatomy@1.31.1': {} + + '@zag-js/angle-slider@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/rect-utils': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/aria-hidden@1.31.1': + dependencies: + '@zag-js/dom-query': 1.31.1 + + '@zag-js/async-list@1.31.1': + dependencies: + '@zag-js/core': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/auto-resize@1.31.1': + dependencies: + '@zag-js/dom-query': 1.31.1 + + '@zag-js/avatar@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/bottom-sheet@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/aria-hidden': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-trap': 1.31.1 + '@zag-js/remove-scroll': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/carousel@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/scroll-snap': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/checkbox@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-visible': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/clipboard@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/collapsible@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/collection@1.31.1': + dependencies: + '@zag-js/utils': 1.31.1 + + '@zag-js/color-picker@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/color-utils': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/color-utils@1.31.1': + dependencies: + '@zag-js/utils': 1.31.1 + + '@zag-js/combobox@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/aria-hidden': 1.31.1 + '@zag-js/collection': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/core@1.31.1': + dependencies: + '@zag-js/dom-query': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/date-picker@1.31.1(@internationalized/date@3.10.0)': + dependencies: + '@internationalized/date': 3.10.0 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/date-utils': 1.31.1(@internationalized/date@3.10.0) + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/live-region': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/date-utils@1.31.1(@internationalized/date@3.10.0)': + dependencies: + '@internationalized/date': 3.10.0 + + '@zag-js/dialog@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/aria-hidden': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-trap': 1.31.1 + '@zag-js/remove-scroll': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/dismissable@1.31.1': + dependencies: + '@zag-js/dom-query': 1.31.1 + '@zag-js/interact-outside': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/dom-query@1.31.1': + dependencies: + '@zag-js/types': 1.31.1 + + '@zag-js/editable@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/interact-outside': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/file-upload@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/file-utils': 1.31.1 + '@zag-js/i18n-utils': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/file-utils@1.31.1': + dependencies: + '@zag-js/i18n-utils': 1.31.1 + + '@zag-js/floating-panel@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/rect-utils': 1.31.1 + '@zag-js/store': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/focus-trap@1.31.1': + dependencies: + '@zag-js/dom-query': 1.31.1 + + '@zag-js/focus-visible@1.31.1': + dependencies: + '@zag-js/dom-query': 1.31.1 + + '@zag-js/highlight-word@1.31.1': {} + + '@zag-js/hover-card@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/i18n-utils@1.31.1': + dependencies: + '@zag-js/dom-query': 1.31.1 + + '@zag-js/image-cropper@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/interact-outside@1.31.1': + dependencies: + '@zag-js/dom-query': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/json-tree-utils@1.31.1': {} + + '@zag-js/listbox@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/collection': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-visible': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/live-region@1.31.1': {} + + '@zag-js/marquee@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/menu@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/rect-utils': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/navigation-menu@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/number-input@1.31.1': + dependencies: + '@internationalized/number': 3.6.5 + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/pagination@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/password-input@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/pin-input@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/popover@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/aria-hidden': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-trap': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/remove-scroll': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/popper@1.31.1': + dependencies: + '@floating-ui/dom': 1.7.4 + '@zag-js/dom-query': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/presence@1.31.1': + dependencies: + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + + '@zag-js/progress@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/qr-code@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + proxy-memoize: 3.0.1 + uqr: 0.1.2 + + '@zag-js/radio-group@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-visible': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/rating-group@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/react@1.31.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@zag-js/core': 1.31.1 + '@zag-js/store': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@zag-js/rect-utils@1.31.1': {} + + '@zag-js/remove-scroll@1.31.1': + dependencies: + '@zag-js/dom-query': 1.31.1 + + '@zag-js/scroll-area@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/scroll-snap@1.31.1': + dependencies: + '@zag-js/dom-query': 1.31.1 + + '@zag-js/select@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/collection': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/signature-pad@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + perfect-freehand: 1.2.2 + + '@zag-js/slider@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/splitter@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/steps@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/store@1.31.1': + dependencies: + proxy-compare: 3.0.1 + + '@zag-js/switch@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-visible': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/tabs@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/tags-input@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/auto-resize': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/interact-outside': 1.31.1 + '@zag-js/live-region': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/timer@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/toast@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/toggle-group@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/toggle@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/tooltip@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-visible': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/tour@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dismissable': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/focus-trap': 1.31.1 + '@zag-js/interact-outside': 1.31.1 + '@zag-js/popper': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/tree-view@1.31.1': + dependencies: + '@zag-js/anatomy': 1.31.1 + '@zag-js/collection': 1.31.1 + '@zag-js/core': 1.31.1 + '@zag-js/dom-query': 1.31.1 + '@zag-js/types': 1.31.1 + '@zag-js/utils': 1.31.1 + + '@zag-js/types@1.31.1': + dependencies: + csstype: 3.2.3 + + '@zag-js/utils@1.31.1': {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn@8.15.0: {} + + ajv-draft-04@1.0.0(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-errors@3.0.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-union@2.1.0: {} + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + astring@1.9.0: {} + + async-function@1.0.0: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios@1.13.2: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.28.4 + cosmiconfig: 7.1.0 + resolve: 1.22.11 + + balanced-match@1.0.2: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + call-me-maybe@1.0.2: {} + + callsites@3.1.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@14.0.2: {} + + compare-versions@6.1.1: {} + + concat-map@0.0.1: {} + + convert-source-map@1.9.0: {} + + cookie@1.1.1: {} + + core-js@3.47.0: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dayjs@1.11.19: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + dependency-graph@0.11.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + emoji-regex@8.0.0: {} + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@4.5.0: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + + es-abstract@1.24.1: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-aggregate-error@1.0.14: + dependencies: + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + function-bind: 1.1.2 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + set-function-name: 2.0.2 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + es6-promise@3.3.1: {} + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + esutils@2.0.3: {} + + event-target-shim@5.0.1: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-memoize@2.5.2: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@3.1.0: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-root@1.1.0: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + follow-redirects@1.15.11: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fs-extra@11.3.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + 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 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + html-entities@2.6.0: {} + + http2-client@1.3.5: {} + + human-signals@2.1.0: {} + + ignore@5.3.2: {} + + immer@9.0.21: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + inflected@2.1.0: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + jiti@2.6.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsep@1.4.0: {} + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + jsonc-parser@2.2.1: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonpath-plus@10.3.0: + dependencies: + '@jsep-plugin/assignment': 1.3.0(jsep@1.4.0) + '@jsep-plugin/regex': 1.0.4(jsep@1.4.0) + jsep: 1.4.0 + + jsonpointer@5.0.1: {} + + jsonschema@1.5.0: {} + + leven@3.1.0: {} + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.isempty@4.4.0: {} + + lodash.omitby@4.6.0: {} + + lodash.topath@4.5.2: {} + + lodash.uniq@4.5.0: {} + + lodash.uniqby@4.7.0: {} + + lodash.uniqwith@4.5.0: {} + + lodash@4.17.21: {} + + loglevel-plugin-prefix@0.8.4: {} + + loglevel@1.9.2: {} + + lucide-react@0.562.0(react@19.2.3): + dependencies: + react: 19.2.3 + + lunr@2.3.9: {} + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + math-intrinsics@1.1.0: {} + + mdurl@2.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@6.2.0: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + mobx-react-lite@4.1.1(mobx@6.15.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + mobx: 6.15.0 + react: 19.2.3 + use-sync-external-store: 1.6.0(react@19.2.3) + optionalDependencies: + react-dom: 19.2.3(react@19.2.3) + + mobx@6.15.0: {} + + ms@2.1.3: {} + + next-themes@0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + nimma@0.2.3: + dependencies: + '@jsep-plugin/regex': 1.0.4(jsep@1.4.0) + '@jsep-plugin/ternary': 1.1.4(jsep@1.4.0) + astring: 1.9.0 + jsep: 1.4.0 + optionalDependencies: + jsonpath-plus: 10.3.0 + lodash.topath: 4.5.2 + + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.2 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.7.2 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.2 + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + openapi-types@12.1.3: {} + + openapi3-ts@4.5.0: + dependencies: + yaml: 2.8.2 + + orval@7.17.2(openapi-types@12.1.3)(typescript@5.9.3): + dependencies: + '@apidevtools/swagger-parser': 12.1.0(openapi-types@12.1.3) + '@commander-js/extra-typings': 14.0.0(commander@14.0.2) + '@orval/angular': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/axios': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/core': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/fetch': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/hono': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/mcp': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/mock': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/query': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/swr': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + '@orval/zod': 7.17.2(openapi-types@12.1.3)(typescript@5.9.3) + chalk: 4.1.2 + chokidar: 4.0.3 + commander: 14.0.2 + enquirer: 2.4.1 + execa: 5.1.1 + find-up: 5.0.0 + fs-extra: 11.3.3 + jiti: 2.6.1 + js-yaml: 4.1.1 + lodash.uniq: 4.5.0 + openapi3-ts: 4.5.0 + string-argv: 0.3.2 + tsconfck: 2.1.2(typescript@5.9.3) + typedoc: 0.28.15(typescript@5.9.3) + typedoc-plugin-coverage: 4.0.2(typedoc@0.28.15(typescript@5.9.3)) + typedoc-plugin-markdown: 4.9.0(typedoc@0.28.15(typescript@5.9.3)) + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + perfect-freehand@1.2.2: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pony-cause@1.1.1: {} + + possible-typed-array-names@1.1.0: {} + + prettier@3.7.4: {} + + proxy-compare@3.0.1: {} + + proxy-from-env@1.1.0: {} + + proxy-memoize@3.0.1: + dependencies: + proxy-compare: 3.0.1 + + punycode.js@2.3.1: {} + + queue-microtask@1.2.3: {} + + react-dom@19.2.3(react@19.2.3): + dependencies: + react: 19.2.3 + scheduler: 0.27.0 + + react-hook-form@7.70.0(react@19.2.3): + dependencies: + react: 19.2.3 + + react-icons@5.5.0(react@19.2.3): + dependencies: + react: 19.2.3 + + react-is@16.13.1: {} + + react-refresh@0.18.0: {} + + react-router@7.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + cookie: 1.1.1 + react: 19.2.3 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.2.3(react@19.2.3) + + react@19.2.3: {} + + readdirp@4.1.2: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + reftools@1.1.9: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@1.1.1: {} + + scheduler@0.27.0: {} + + set-cookie-parser@2.7.2: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + simple-eval@1.0.1: + dependencies: + jsep: 1.4.0 + + slash@3.0.0: {} + + source-map@0.5.7: {} + + stackframe@1.3.4: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-final-newline@2.0.0: {} + + stylis@4.2.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + tsconfck@2.1.2(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typedoc-plugin-coverage@4.0.2(typedoc@0.28.15(typescript@5.9.3)): + dependencies: + typedoc: 0.28.15(typescript@5.9.3) + + typedoc-plugin-markdown@4.9.0(typedoc@0.28.15(typescript@5.9.3)): + dependencies: + typedoc: 0.28.15(typescript@5.9.3) + + typedoc@0.28.15(typescript@5.9.3): + dependencies: + '@gerrit0/mini-shiki': 3.21.0 + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + typescript: 5.9.3 + yaml: 2.8.2 + + typescript@5.9.3: {} + + uc.micro@2.1.0: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@7.16.0: {} + + universalify@2.0.1: {} + + uqr@0.1.2: {} + + urijs@1.19.11: {} + + use-sync-external-store@1.6.0(react@19.2.3): + dependencies: + react: 19.2.3 + + utility-types@3.11.0: {} + + validator@13.15.26: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + y18n@5.0.8: {} + + yaml@1.10.2: {} + + yaml@2.8.2: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} diff --git a/domains-frontend/public/favicon.png b/domains-frontend/public/favicon.png new file mode 100644 index 0000000..af06119 Binary files /dev/null and b/domains-frontend/public/favicon.png differ diff --git a/domains-frontend/rsbuild.config.ts b/domains-frontend/rsbuild.config.ts new file mode 100644 index 0000000..12da9ff --- /dev/null +++ b/domains-frontend/rsbuild.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from '@rsbuild/core'; +import { pluginReact } from '@rsbuild/plugin-react'; + +// Docs: https://rsbuild.rs/config/ +export default defineConfig({ + plugins: [pluginReact()], + html: { + title: 'Хрофорс Домены', + }, +}); diff --git a/domains-frontend/src/App.tsx b/domains-frontend/src/App.tsx new file mode 100644 index 0000000..2634c74 --- /dev/null +++ b/domains-frontend/src/App.tsx @@ -0,0 +1,8 @@ +import { BrowserRouter } from 'react-router'; +import router from './router'; + +const App = () => { + return {router()}; +}; + +export default App; diff --git a/domains-frontend/src/api/Constants.ts b/domains-frontend/src/api/Constants.ts new file mode 100644 index 0000000..cc89095 --- /dev/null +++ b/domains-frontend/src/api/Constants.ts @@ -0,0 +1,4 @@ +export const AUTH_URL = '/api/auth'; +export const DOMAIN_ORDER_URL = '/api/domains'; +export const EXDNS_URL = '/exdns'; +export const EXDNS_TOKEN = 'changeme'; \ No newline at end of file diff --git a/domains-frontend/src/api/apiClient.ts b/domains-frontend/src/api/apiClient.ts new file mode 100644 index 0000000..f30687f --- /dev/null +++ b/domains-frontend/src/api/apiClient.ts @@ -0,0 +1,109 @@ +import Axios, { type AxiosRequestConfig } from 'axios'; +import { getAccessToken, getRefreshToken, setTokens } from '~/utils/authTokens'; +import { AUTH_URL } from './Constants'; + +const AUTH_HEADER = 'Authorization'; + +export const AXIOS_INSTANCE = Axios.create({ + baseURL: AUTH_URL, +}); + +const refreshClient = Axios.create({ + baseURL: AUTH_URL, +}); + +const isRefreshRequest = (url?: string) => url?.includes('/auth/refresh'); + +const applyAccessToken = (config: AxiosRequestConfig, accessToken?: string) => { + if (!accessToken) return; + if (isRefreshRequest(config.url)) return; + + const headers = config.headers ?? {}; + if ( + typeof (headers as { set?: (k: string, v: string) => void }).set === + 'function' + ) { + (headers as { set: (k: string, v: string) => void }).set( + AUTH_HEADER, + `Bearer ${accessToken}` + ); + } else { + (headers as Record)[AUTH_HEADER] = `Bearer ${accessToken}`; + } + config.headers = headers; +}; + +const refreshAccessToken = async () => { + const refreshToken = getRefreshToken(); + if (!refreshToken) { + return null; + } + + const { data } = await refreshClient.post('/auth/refresh', { + refreshToken, + }); + + const accessToken = data?.data?.accessToken; + const nextRefreshToken = data?.data?.refreshToken ?? refreshToken; + + if (!accessToken) { + return null; + } + + setTokens({ access: accessToken, refresh: nextRefreshToken }); + + return accessToken; +}; + +AXIOS_INSTANCE.interceptors.request.use((config) => { + applyAccessToken(config, getAccessToken()); + return config; +}); + +let refreshPromise: Promise | null = null; + +AXIOS_INSTANCE.interceptors.response.use( + (response) => response, + async (error) => { + const status = error?.response?.status; + const originalConfig = error?.config as + | (AxiosRequestConfig & { _retry?: boolean }) + | undefined; + + if (!originalConfig || status !== 403 || originalConfig._retry) { + return Promise.reject(error); + } + + if (isRefreshRequest(originalConfig.url)) { + return Promise.reject(error); + } + + originalConfig._retry = true; + + if (!refreshPromise) { + refreshPromise = refreshAccessToken().finally(() => { + refreshPromise = null; + }); + } + + const accessToken = await refreshPromise; + if (!accessToken) { + return Promise.reject(error); + } + + applyAccessToken(originalConfig, accessToken); + return AXIOS_INSTANCE(originalConfig); + } +); + +export const customInstance = ( + config: AxiosRequestConfig, + options?: AxiosRequestConfig +): Promise => { + const promise = AXIOS_INSTANCE({ + ...config, + ...options, + }).then(({ data }) => data); + + return promise; +}; diff --git a/domains-frontend/src/api/apiClientDomains.ts b/domains-frontend/src/api/apiClientDomains.ts new file mode 100644 index 0000000..b8df4d1 --- /dev/null +++ b/domains-frontend/src/api/apiClientDomains.ts @@ -0,0 +1,109 @@ +import Axios, { type AxiosRequestConfig } from 'axios'; +import { getAccessToken, getRefreshToken, setTokens } from '~/utils/authTokens'; +import { DOMAIN_ORDER_URL } from './Constants'; + +const AUTH_HEADER = 'Authorization'; + +export const AXIOS_INSTANCE = Axios.create({ + baseURL: DOMAIN_ORDER_URL, +}); + +const refreshClient = Axios.create({ + baseURL: DOMAIN_ORDER_URL, +}); + +const isRefreshRequest = (url?: string) => url?.includes('/auth/refresh'); + +const applyAccessToken = (config: AxiosRequestConfig, accessToken?: string) => { + if (!accessToken) return; + if (isRefreshRequest(config.url)) return; + + const headers = config.headers ?? {}; + if ( + typeof (headers as { set?: (k: string, v: string) => void }).set === + 'function' + ) { + (headers as { set: (k: string, v: string) => void }).set( + AUTH_HEADER, + `Bearer ${accessToken}` + ); + } else { + (headers as Record)[AUTH_HEADER] = `Bearer ${accessToken}`; + } + config.headers = headers; +}; + +const refreshAccessToken = async () => { + const refreshToken = getRefreshToken(); + if (!refreshToken) { + return null; + } + + const { data } = await refreshClient.post('/auth/refresh', { + refreshToken, + }); + + const accessToken = data?.data?.accessToken; + const nextRefreshToken = data?.data?.refreshToken ?? refreshToken; + + if (!accessToken) { + return null; + } + + setTokens({ access: accessToken, refresh: nextRefreshToken }); + + return accessToken; +}; + +AXIOS_INSTANCE.interceptors.request.use((config) => { + applyAccessToken(config, getAccessToken()); + return config; +}); + +let refreshPromise: Promise | null = null; + +AXIOS_INSTANCE.interceptors.response.use( + (response) => response, + async (error) => { + const status = error?.response?.status; + const originalConfig = error?.config as + | (AxiosRequestConfig & { _retry?: boolean }) + | undefined; + + if (!originalConfig || status !== 403 || originalConfig._retry) { + return Promise.reject(error); + } + + if (isRefreshRequest(originalConfig.url)) { + return Promise.reject(error); + } + + originalConfig._retry = true; + + if (!refreshPromise) { + refreshPromise = refreshAccessToken().finally(() => { + refreshPromise = null; + }); + } + + const accessToken = await refreshPromise; + if (!accessToken) { + return Promise.reject(error); + } + + applyAccessToken(originalConfig, accessToken); + return AXIOS_INSTANCE(originalConfig); + } +); + +export const customInstance = ( + config: AxiosRequestConfig, + options?: AxiosRequestConfig +): Promise => { + const promise = AXIOS_INSTANCE({ + ...config, + ...options, + }).then(({ data }) => data); + + return promise; +}; diff --git a/domains-frontend/src/api/apiClientExdns.ts b/domains-frontend/src/api/apiClientExdns.ts new file mode 100644 index 0000000..5eac4dc --- /dev/null +++ b/domains-frontend/src/api/apiClientExdns.ts @@ -0,0 +1,43 @@ +import Axios, { type AxiosRequestConfig } from 'axios'; +import { EXDNS_TOKEN, EXDNS_URL } from './Constants'; + +const AUTH_HEADER = 'authentication'; + +export const AXIOS_INSTANCE = Axios.create({ + baseURL: EXDNS_URL, +}); + +const applyToken = (config: AxiosRequestConfig) => { + if (!EXDNS_TOKEN) return; + + const headers = config.headers ?? {}; + if ( + typeof (headers as { set?: (k: string, v: string) => void }).set === + 'function' + ) { + (headers as { set: (k: string, v: string) => void }).set( + AUTH_HEADER, + `Bearer ${EXDNS_TOKEN}` + ); + } else { + (headers as Record)[AUTH_HEADER] = `Bearer ${EXDNS_TOKEN}`; + } + config.headers = headers; +}; + +AXIOS_INSTANCE.interceptors.request.use((config) => { + applyToken(config); + return config; +}); + +export const customInstance = ( + config: AxiosRequestConfig, + options?: AxiosRequestConfig +): Promise => { + const promise = AXIOS_INSTANCE({ + ...config, + ...options, + }).then(({ data }) => data); + + return promise; +}; diff --git a/domains-frontend/src/api/models/DomainQuery.ts b/domains-frontend/src/api/models/DomainQuery.ts new file mode 100644 index 0000000..9cd2f28 --- /dev/null +++ b/domains-frontend/src/api/models/DomainQuery.ts @@ -0,0 +1,5 @@ +export interface DomainQuery { + fqdn: string; + price: number; + free: boolean; +} diff --git a/domains-frontend/src/api/models/auth/apiError.ts b/domains-frontend/src/api/models/auth/apiError.ts new file mode 100644 index 0000000..7e7c317 --- /dev/null +++ b/domains-frontend/src/api/models/auth/apiError.ts @@ -0,0 +1,13 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { ApiErrorDetails } from './apiErrorDetails'; + +export interface ApiError { + code?: string; + message?: string; + details?: ApiErrorDetails; +} diff --git a/domains-frontend/src/api/models/auth/apiErrorDetails.ts b/domains-frontend/src/api/models/auth/apiErrorDetails.ts new file mode 100644 index 0000000..2cf3c49 --- /dev/null +++ b/domains-frontend/src/api/models/auth/apiErrorDetails.ts @@ -0,0 +1,8 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type ApiErrorDetails = { [key: string]: { [key: string]: unknown } }; diff --git a/domains-frontend/src/api/models/auth/apiResponseBoolean.ts b/domains-frontend/src/api/models/auth/apiResponseBoolean.ts new file mode 100644 index 0000000..7a7542d --- /dev/null +++ b/domains-frontend/src/api/models/auth/apiResponseBoolean.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { ApiError } from './apiError'; + +export interface ApiResponseBoolean { + success?: boolean; + data?: boolean; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/auth/apiResponseLoginResponse.ts b/domains-frontend/src/api/models/auth/apiResponseLoginResponse.ts new file mode 100644 index 0000000..3cfed91 --- /dev/null +++ b/domains-frontend/src/api/models/auth/apiResponseLoginResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { LoginResponse } from './loginResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseLoginResponse { + success?: boolean; + data?: LoginResponse; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/auth/apiResponseString.ts b/domains-frontend/src/api/models/auth/apiResponseString.ts new file mode 100644 index 0000000..5a47115 --- /dev/null +++ b/domains-frontend/src/api/models/auth/apiResponseString.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { ApiError } from './apiError'; + +export interface ApiResponseString { + success?: boolean; + data?: string; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/auth/apiResponseTwoFactorSetupResponse.ts b/domains-frontend/src/api/models/auth/apiResponseTwoFactorSetupResponse.ts new file mode 100644 index 0000000..647c7bf --- /dev/null +++ b/domains-frontend/src/api/models/auth/apiResponseTwoFactorSetupResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { TwoFactorSetupResponse } from './twoFactorSetupResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseTwoFactorSetupResponse { + success?: boolean; + data?: TwoFactorSetupResponse; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/auth/apiResponseUserResponse.ts b/domains-frontend/src/api/models/auth/apiResponseUserResponse.ts new file mode 100644 index 0000000..54a4b65 --- /dev/null +++ b/domains-frontend/src/api/models/auth/apiResponseUserResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { UserResponse } from './userResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseUserResponse { + success?: boolean; + data?: UserResponse; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/auth/enable2FAWithSecretRequest.ts b/domains-frontend/src/api/models/auth/enable2FAWithSecretRequest.ts new file mode 100644 index 0000000..2bc24aa --- /dev/null +++ b/domains-frontend/src/api/models/auth/enable2FAWithSecretRequest.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface Enable2FAWithSecretRequest { + secret: string; + /** @pattern ^\d{6}$ */ + code: string; +} diff --git a/domains-frontend/src/api/models/auth/getAuthVerifyEmailParams.ts b/domains-frontend/src/api/models/auth/getAuthVerifyEmailParams.ts new file mode 100644 index 0000000..31ae68d --- /dev/null +++ b/domains-frontend/src/api/models/auth/getAuthVerifyEmailParams.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Auth Service API + * OpenAPI spec version: 1.0.0 + */ + +export type GetAuthVerifyEmailParams = { + token: string; +}; diff --git a/domains-frontend/src/api/models/auth/index.ts b/domains-frontend/src/api/models/auth/index.ts new file mode 100644 index 0000000..d2db66a --- /dev/null +++ b/domains-frontend/src/api/models/auth/index.ts @@ -0,0 +1,25 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export * from './apiError'; +export * from './apiErrorDetails'; +export * from './apiResponseBoolean'; +export * from './apiResponseLoginResponse'; +export * from './apiResponseString'; +export * from './apiResponseTwoFactorSetupResponse'; +export * from './apiResponseUserResponse'; +export * from './enable2FAWithSecretRequest'; +export * from './getAuthVerifyEmailParams'; +export * from './loginRequest'; +export * from './loginResponse'; +export * from './postAuthResendVerificationParams'; +export * from './refreshTokenRequest'; +export * from './registerRequest'; +export * from './resendVerificationEmailParams'; +export * from './twoFactorSetupResponse'; +export * from './userResponse'; +export * from './verifyEmailParams'; diff --git a/domains-frontend/src/api/models/auth/loginRequest.ts b/domains-frontend/src/api/models/auth/loginRequest.ts new file mode 100644 index 0000000..76a7c2c --- /dev/null +++ b/domains-frontend/src/api/models/auth/loginRequest.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface LoginRequest { + email: string; + password: string; + totpCode?: string; +} diff --git a/domains-frontend/src/api/models/auth/loginResponse.ts b/domains-frontend/src/api/models/auth/loginResponse.ts new file mode 100644 index 0000000..903e99b --- /dev/null +++ b/domains-frontend/src/api/models/auth/loginResponse.ts @@ -0,0 +1,13 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface LoginResponse { + userId?: string; + accessToken?: string; + refreshToken?: string; + email?: string; +} diff --git a/domains-frontend/src/api/models/auth/postAuthResendVerificationParams.ts b/domains-frontend/src/api/models/auth/postAuthResendVerificationParams.ts new file mode 100644 index 0000000..e442f7d --- /dev/null +++ b/domains-frontend/src/api/models/auth/postAuthResendVerificationParams.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Auth Service API + * OpenAPI spec version: 1.0.0 + */ + +export type PostAuthResendVerificationParams = { + email: string; +}; diff --git a/domains-frontend/src/api/models/auth/refreshTokenRequest.ts b/domains-frontend/src/api/models/auth/refreshTokenRequest.ts new file mode 100644 index 0000000..1998bb8 --- /dev/null +++ b/domains-frontend/src/api/models/auth/refreshTokenRequest.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface RefreshTokenRequest { + refreshToken: string; +} diff --git a/domains-frontend/src/api/models/auth/registerRequest.ts b/domains-frontend/src/api/models/auth/registerRequest.ts new file mode 100644 index 0000000..1b06c09 --- /dev/null +++ b/domains-frontend/src/api/models/auth/registerRequest.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface RegisterRequest { + email: string; + /** + * @minLength 8 + * @maxLength 2147483647 + */ + password: string; +} diff --git a/domains-frontend/src/api/models/auth/resendVerificationEmailParams.ts b/domains-frontend/src/api/models/auth/resendVerificationEmailParams.ts new file mode 100644 index 0000000..e4d93cb --- /dev/null +++ b/domains-frontend/src/api/models/auth/resendVerificationEmailParams.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type ResendVerificationEmailParams = { + email: string; +}; diff --git a/domains-frontend/src/api/models/auth/twoFactorSetupResponse.ts b/domains-frontend/src/api/models/auth/twoFactorSetupResponse.ts new file mode 100644 index 0000000..ce1b390 --- /dev/null +++ b/domains-frontend/src/api/models/auth/twoFactorSetupResponse.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface TwoFactorSetupResponse { + secret?: string; + qrCodeUrl?: string; + manualEntryKey?: string; +} diff --git a/domains-frontend/src/api/models/auth/userResponse.ts b/domains-frontend/src/api/models/auth/userResponse.ts new file mode 100644 index 0000000..c1aa932 --- /dev/null +++ b/domains-frontend/src/api/models/auth/userResponse.ts @@ -0,0 +1,13 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface UserResponse { + id?: string; + email?: string; + createdAt?: string; + updatedAt?: string; +} diff --git a/domains-frontend/src/api/models/auth/verifyEmailParams.ts b/domains-frontend/src/api/models/auth/verifyEmailParams.ts new file mode 100644 index 0000000..c874c9a --- /dev/null +++ b/domains-frontend/src/api/models/auth/verifyEmailParams.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type VerifyEmailParams = { + token: string; +}; diff --git a/domains-frontend/src/api/models/domain-order/addCartItemRequest.ts b/domains-frontend/src/api/models/domain-order/addCartItemRequest.ts new file mode 100644 index 0000000..1a7b5b1 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/addCartItemRequest.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { AddCartItemRequestAction } from './addCartItemRequestAction'; +import type { AddCartItemRequestTerm } from './addCartItemRequestTerm'; + +export interface AddCartItemRequest { + action: AddCartItemRequestAction; + term: AddCartItemRequestTerm; + fqdn: string; + price: number; +} diff --git a/domains-frontend/src/api/models/domain-order/addCartItemRequestAction.ts b/domains-frontend/src/api/models/domain-order/addCartItemRequestAction.ts new file mode 100644 index 0000000..d927fd4 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/addCartItemRequestAction.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type AddCartItemRequestAction = + (typeof AddCartItemRequestAction)[keyof typeof AddCartItemRequestAction]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const AddCartItemRequestAction = { + register: 'register', + renew: 'renew', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/addCartItemRequestTerm.ts b/domains-frontend/src/api/models/domain-order/addCartItemRequestTerm.ts new file mode 100644 index 0000000..fee623b --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/addCartItemRequestTerm.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type AddCartItemRequestTerm = + (typeof AddCartItemRequestTerm)[keyof typeof AddCartItemRequestTerm]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const AddCartItemRequestTerm = { + monthly: 'monthly', + yearly: 'yearly', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/apiError.ts b/domains-frontend/src/api/models/domain-order/apiError.ts new file mode 100644 index 0000000..7e7c317 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiError.ts @@ -0,0 +1,13 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { ApiErrorDetails } from './apiErrorDetails'; + +export interface ApiError { + code?: string; + message?: string; + details?: ApiErrorDetails; +} diff --git a/domains-frontend/src/api/models/domain-order/apiErrorDetails.ts b/domains-frontend/src/api/models/domain-order/apiErrorDetails.ts new file mode 100644 index 0000000..2cf3c49 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiErrorDetails.ts @@ -0,0 +1,8 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type ApiErrorDetails = { [key: string]: { [key: string]: unknown } }; diff --git a/domains-frontend/src/api/models/domain-order/apiResponseCartItemResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponseCartItemResponse.ts new file mode 100644 index 0000000..607d999 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseCartItemResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { CartItemResponse } from './cartItemResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseCartItemResponse { + success?: boolean; + data?: CartItemResponse; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseCartResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponseCartResponse.ts new file mode 100644 index 0000000..50d9df7 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseCartResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { CartResponse } from './cartResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseCartResponse { + success?: boolean; + data?: CartResponse; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseDnsRecordResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponseDnsRecordResponse.ts new file mode 100644 index 0000000..88b2cd6 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseDnsRecordResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { DnsRecordResponse } from './dnsRecordResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseDnsRecordResponse { + success?: boolean; + data?: DnsRecordResponse; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseDomainExpiryAlertResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponseDomainExpiryAlertResponse.ts new file mode 100644 index 0000000..1bfd1cf --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseDomainExpiryAlertResponse.ts @@ -0,0 +1,17 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ +import type { DomainExpiryAlertResponse } from './domainExpiryAlertResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseDomainExpiryAlertResponse { + success?: boolean; + data?: DomainExpiryAlertResponse; + /** @nullable */ + message?: string | null; + /** @nullable */ + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseDomainResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponseDomainResponse.ts new file mode 100644 index 0000000..253799c --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseDomainResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { DomainResponse } from './domainResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseDomainResponse { + success?: boolean; + data?: DomainResponse; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseListDnsRecordResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponseListDnsRecordResponse.ts new file mode 100644 index 0000000..bff9172 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseListDnsRecordResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { DnsRecordResponse } from './dnsRecordResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseListDnsRecordResponse { + success?: boolean; + data?: DnsRecordResponse[]; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseListDomainSearchResult.ts b/domains-frontend/src/api/models/domain-order/apiResponseListDomainSearchResult.ts new file mode 100644 index 0000000..00946da --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseListDomainSearchResult.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { DomainSearchResult } from './domainSearchResult'; +import type { ApiError } from './apiError'; + +export interface ApiResponseListDomainSearchResult { + success?: boolean; + data?: DomainSearchResult[]; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseMonitoringDashboardResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponseMonitoringDashboardResponse.ts new file mode 100644 index 0000000..f48c2b3 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseMonitoringDashboardResponse.ts @@ -0,0 +1,17 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ +import type { MonitoringDashboardResponse } from './monitoringDashboardResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseMonitoringDashboardResponse { + success?: boolean; + data?: MonitoringDashboardResponse; + /** @nullable */ + message?: string | null; + /** @nullable */ + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseNotificationPreferencesResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponseNotificationPreferencesResponse.ts new file mode 100644 index 0000000..a4fc5b2 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseNotificationPreferencesResponse.ts @@ -0,0 +1,17 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ +import type { NotificationPreferencesResponse } from './notificationPreferencesResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseNotificationPreferencesResponse { + success?: boolean; + data?: NotificationPreferencesResponse; + /** @nullable */ + message?: string | null; + /** @nullable */ + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseNsDelegationResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponseNsDelegationResponse.ts new file mode 100644 index 0000000..15fe093 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseNsDelegationResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { NsDelegationResponse } from './nsDelegationResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseNsDelegationResponse { + success?: boolean; + data?: NsDelegationResponse; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseOrderResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponseOrderResponse.ts new file mode 100644 index 0000000..a02c50b --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseOrderResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { OrderResponse } from './orderResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponseOrderResponse { + success?: boolean; + data?: OrderResponse; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponsePageDomainExpiryMonitoringResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponsePageDomainExpiryMonitoringResponse.ts new file mode 100644 index 0000000..e1f40ae --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponsePageDomainExpiryMonitoringResponse.ts @@ -0,0 +1,17 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ +import type { PageDomainExpiryMonitoringResponse } from './pageDomainExpiryMonitoringResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponsePageDomainExpiryMonitoringResponse { + success?: boolean; + data?: PageDomainExpiryMonitoringResponse; + /** @nullable */ + message?: string | null; + /** @nullable */ + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponsePageDomainResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponsePageDomainResponse.ts new file mode 100644 index 0000000..92f5534 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponsePageDomainResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { PageDomainResponse } from './pageDomainResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponsePageDomainResponse { + success?: boolean; + data?: PageDomainResponse; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponsePageOrderResponse.ts b/domains-frontend/src/api/models/domain-order/apiResponsePageOrderResponse.ts new file mode 100644 index 0000000..e80dba5 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponsePageOrderResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { PageOrderResponse } from './pageOrderResponse'; +import type { ApiError } from './apiError'; + +export interface ApiResponsePageOrderResponse { + success?: boolean; + data?: PageOrderResponse; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponsePageZone.ts b/domains-frontend/src/api/models/domain-order/apiResponsePageZone.ts new file mode 100644 index 0000000..bbec91c --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponsePageZone.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { PageZone } from './pageZone'; +import type { ApiError } from './apiError'; + +export interface ApiResponsePageZone { + success?: boolean; + data?: PageZone; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseString.ts b/domains-frontend/src/api/models/domain-order/apiResponseString.ts new file mode 100644 index 0000000..5a47115 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseString.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { ApiError } from './apiError'; + +export interface ApiResponseString { + success?: boolean; + data?: string; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseVoid.ts b/domains-frontend/src/api/models/domain-order/apiResponseVoid.ts new file mode 100644 index 0000000..8c8bf0e --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseVoid.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { ApiResponseVoidData } from './apiResponseVoidData'; +import type { ApiError } from './apiError'; + +export interface ApiResponseVoid { + success?: boolean; + data?: ApiResponseVoidData; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/apiResponseVoidData.ts b/domains-frontend/src/api/models/domain-order/apiResponseVoidData.ts new file mode 100644 index 0000000..2ddf191 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseVoidData.ts @@ -0,0 +1,8 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type ApiResponseVoidData = { [key: string]: unknown }; diff --git a/domains-frontend/src/api/models/domain-order/apiResponseZone.ts b/domains-frontend/src/api/models/domain-order/apiResponseZone.ts new file mode 100644 index 0000000..d4500ed --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/apiResponseZone.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { Zone } from './zone'; +import type { ApiError } from './apiError'; + +export interface ApiResponseZone { + success?: boolean; + data?: Zone; + message?: string; + error?: ApiError; +} diff --git a/domains-frontend/src/api/models/domain-order/cartItemResponse.ts b/domains-frontend/src/api/models/domain-order/cartItemResponse.ts new file mode 100644 index 0000000..0807ec0 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/cartItemResponse.ts @@ -0,0 +1,18 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { CartItemResponseAction } from './cartItemResponseAction'; +import type { CartItemResponseTerm } from './cartItemResponseTerm'; + +export interface CartItemResponse { + id?: string; + action?: CartItemResponseAction; + term?: CartItemResponseTerm; + fqdn?: string; + price?: number; + createdAt?: string; + updatedAt?: string; +} diff --git a/domains-frontend/src/api/models/domain-order/cartItemResponseAction.ts b/domains-frontend/src/api/models/domain-order/cartItemResponseAction.ts new file mode 100644 index 0000000..d1497c3 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/cartItemResponseAction.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type CartItemResponseAction = + (typeof CartItemResponseAction)[keyof typeof CartItemResponseAction]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const CartItemResponseAction = { + register: 'register', + renew: 'renew', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/cartItemResponseTerm.ts b/domains-frontend/src/api/models/domain-order/cartItemResponseTerm.ts new file mode 100644 index 0000000..84a16cc --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/cartItemResponseTerm.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type CartItemResponseTerm = + (typeof CartItemResponseTerm)[keyof typeof CartItemResponseTerm]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const CartItemResponseTerm = { + monthly: 'monthly', + yearly: 'yearly', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/cartResponse.ts b/domains-frontend/src/api/models/domain-order/cartResponse.ts new file mode 100644 index 0000000..6b63ac2 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/cartResponse.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { CartItemResponse } from './cartItemResponse'; + +export interface CartResponse { + id?: string; + userId?: string; + items?: CartItemResponse[]; + createdAt?: string; + updatedAt?: string; +} diff --git a/domains-frontend/src/api/models/domain-order/createARecordRequest.ts b/domains-frontend/src/api/models/domain-order/createARecordRequest.ts new file mode 100644 index 0000000..76fa31b --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/createARecordRequest.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface CreateARecordRequest { + domainId: string; + name: string; + /** @pattern ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ */ + ipv4Address: string; + ttl: number; +} diff --git a/domains-frontend/src/api/models/domain-order/createAaaaRecordRequest.ts b/domains-frontend/src/api/models/domain-order/createAaaaRecordRequest.ts new file mode 100644 index 0000000..ae0ac9a --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/createAaaaRecordRequest.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface CreateAaaaRecordRequest { + domainId: string; + name: string; + /** @pattern ^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::1$|^::$ */ + ipv6Address: string; + ttl: number; +} diff --git a/domains-frontend/src/api/models/domain-order/createCaaRecordRequest.ts b/domains-frontend/src/api/models/domain-order/createCaaRecordRequest.ts new file mode 100644 index 0000000..d6ad4b5 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/createCaaRecordRequest.ts @@ -0,0 +1,17 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface CreateCaaRecordRequest { + domainId: string; + name: string; + /** @pattern ^[0-9]$ */ + flags: string; + /** @pattern ^(issue|issuewild|iodef)$ */ + tag: string; + value: string; + ttl: number; +} diff --git a/domains-frontend/src/api/models/domain-order/createCnameRecordRequest.ts b/domains-frontend/src/api/models/domain-order/createCnameRecordRequest.ts new file mode 100644 index 0000000..7ff93ed --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/createCnameRecordRequest.ts @@ -0,0 +1,13 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface CreateCnameRecordRequest { + domainId: string; + name: string; + canonicalName: string; + ttl: number; +} diff --git a/domains-frontend/src/api/models/domain-order/createDomainRequest.ts b/domains-frontend/src/api/models/domain-order/createDomainRequest.ts new file mode 100644 index 0000000..4324565 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/createDomainRequest.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface CreateDomainRequest { + fqdn: string; + zoneId: string; + expiresAt: string; +} diff --git a/domains-frontend/src/api/models/domain-order/createMxRecordRequest.ts b/domains-frontend/src/api/models/domain-order/createMxRecordRequest.ts new file mode 100644 index 0000000..09b2ed6 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/createMxRecordRequest.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface CreateMxRecordRequest { + domainId: string; + name: string; + mailExchange: string; + /** @minimum 0 */ + priority: number; + ttl: number; +} diff --git a/domains-frontend/src/api/models/domain-order/createOrderRequest.ts b/domains-frontend/src/api/models/domain-order/createOrderRequest.ts new file mode 100644 index 0000000..f42bb47 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/createOrderRequest.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface CreateOrderRequest { + cartItemIds: string[]; +} diff --git a/domains-frontend/src/api/models/domain-order/createSrvRecordRequest.ts b/domains-frontend/src/api/models/domain-order/createSrvRecordRequest.ts new file mode 100644 index 0000000..122107a --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/createSrvRecordRequest.ts @@ -0,0 +1,25 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface CreateSrvRecordRequest { + domainId: string; + serviceName: string; + target: string; + /** @minimum 0 */ + priority: number; + /** + * @minimum 0 + * @maximum 65535 + */ + weight: number; + /** + * @minimum 1 + * @maximum 65535 + */ + port: number; + ttl: number; +} diff --git a/domains-frontend/src/api/models/domain-order/createTxtRecordRequest.ts b/domains-frontend/src/api/models/domain-order/createTxtRecordRequest.ts new file mode 100644 index 0000000..b2e97a3 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/createTxtRecordRequest.ts @@ -0,0 +1,13 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface CreateTxtRecordRequest { + domainId: string; + name: string; + textValue: string; + ttl: number; +} diff --git a/domains-frontend/src/api/models/domain-order/createZoneRequest.ts b/domains-frontend/src/api/models/domain-order/createZoneRequest.ts new file mode 100644 index 0000000..d4d4582 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/createZoneRequest.ts @@ -0,0 +1,11 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface CreateZoneRequest { + name: string; + price: number; +} diff --git a/domains-frontend/src/api/models/domain-order/dnsRecordResponse.ts b/domains-frontend/src/api/models/domain-order/dnsRecordResponse.ts new file mode 100644 index 0000000..6f4a351 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/dnsRecordResponse.ts @@ -0,0 +1,20 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface DnsRecordResponse { + id?: string; + domainId?: string; + recordType?: string; + name?: string; + value?: string; + ttl?: number; + priority?: number; + weight?: number; + port?: number; + flags?: string; + tag?: string; +} diff --git a/domains-frontend/src/api/models/domain-order/domainExpiryAlertResponse.ts b/domains-frontend/src/api/models/domain-order/domainExpiryAlertResponse.ts new file mode 100644 index 0000000..0b8daed --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/domainExpiryAlertResponse.ts @@ -0,0 +1,11 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ +import type { ExpiryAlertPreference } from './expiryAlertPreference'; + +export interface DomainExpiryAlertResponse { + alerts?: ExpiryAlertPreference[]; +} diff --git a/domains-frontend/src/api/models/domain-order/domainExpiryMonitoringResponse.ts b/domains-frontend/src/api/models/domain-order/domainExpiryMonitoringResponse.ts new file mode 100644 index 0000000..b94d588 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/domainExpiryMonitoringResponse.ts @@ -0,0 +1,18 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ + +export interface DomainExpiryMonitoringResponse { + domainId?: string; + fqdn?: string; + expiresAt?: string; + /** @nullable */ + activatedAt?: string | null; + daysUntilExpiry?: number; + alertSent?: boolean; + /** @nullable */ + lastAlertSentAt?: string | null; +} diff --git a/domains-frontend/src/api/models/domain-order/domainResponse.ts b/domains-frontend/src/api/models/domain-order/domainResponse.ts new file mode 100644 index 0000000..af24df8 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/domainResponse.ts @@ -0,0 +1,17 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface DomainResponse { + id?: string; + fqdn?: string; + zoneId?: string; + zoneName?: string; + activatedAt?: string; + expiresAt?: string; + createdAt?: string; + updatedAt?: string; +} diff --git a/domains-frontend/src/api/models/domain-order/domainSearchResult.ts b/domains-frontend/src/api/models/domain-order/domainSearchResult.ts new file mode 100644 index 0000000..6f2c398 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/domainSearchResult.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface DomainSearchResult { + fqdn?: string; + free?: boolean; + price?: number; +} diff --git a/domains-frontend/src/api/models/domain-order/expiryAlertPreference.ts b/domains-frontend/src/api/models/domain-order/expiryAlertPreference.ts new file mode 100644 index 0000000..2b36667 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/expiryAlertPreference.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ + +export interface ExpiryAlertPreference { + id?: string; + daysBefore?: number; + enabled?: boolean; +} diff --git a/domains-frontend/src/api/models/domain-order/getAllDomainsParams.ts b/domains-frontend/src/api/models/domain-order/getAllDomainsParams.ts new file mode 100644 index 0000000..adba2e1 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/getAllDomainsParams.ts @@ -0,0 +1,11 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { Pageable } from './pageable'; + +export type GetAllDomainsParams = { + pageable: Pageable; +}; diff --git a/domains-frontend/src/api/models/domain-order/getAllZonesParams.ts b/domains-frontend/src/api/models/domain-order/getAllZonesParams.ts new file mode 100644 index 0000000..0428fea --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/getAllZonesParams.ts @@ -0,0 +1,11 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { Pageable } from './pageable'; + +export type GetAllZonesParams = { + pageable: Pageable; +}; diff --git a/domains-frontend/src/api/models/domain-order/getDomainsParams.ts b/domains-frontend/src/api/models/domain-order/getDomainsParams.ts new file mode 100644 index 0000000..1d81410 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/getDomainsParams.ts @@ -0,0 +1,18 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Domain Order Service API + * OpenAPI spec version: 1.0.0 + */ + +export type GetDomainsParams = { + /** + * @minimum 0 + */ + page?: number; + /** + * @minimum 1 + */ + size?: number; + sort?: string[]; +}; diff --git a/domains-frontend/src/api/models/domain-order/getDomainsSearchParams.ts b/domains-frontend/src/api/models/domain-order/getDomainsSearchParams.ts new file mode 100644 index 0000000..0d3a1bd --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/getDomainsSearchParams.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Domain Order Service API + * OpenAPI spec version: 1.0.0 + */ + +export type GetDomainsSearchParams = { + query: string; +}; diff --git a/domains-frontend/src/api/models/domain-order/getNotificationsExpiryMonitoringDomainsParams.ts b/domains-frontend/src/api/models/domain-order/getNotificationsExpiryMonitoringDomainsParams.ts new file mode 100644 index 0000000..e055989 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/getNotificationsExpiryMonitoringDomainsParams.ts @@ -0,0 +1,18 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ + +export type GetNotificationsExpiryMonitoringDomainsParams = { + /** + * @minimum 0 + */ + page?: number; + /** + * @minimum 1 + */ + size?: number; + sort?: string[]; +}; diff --git a/domains-frontend/src/api/models/domain-order/getOrdersParams.ts b/domains-frontend/src/api/models/domain-order/getOrdersParams.ts new file mode 100644 index 0000000..754e025 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/getOrdersParams.ts @@ -0,0 +1,11 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { Pageable } from './pageable'; + +export type GetOrdersParams = { + pageable: Pageable; +}; diff --git a/domains-frontend/src/api/models/domain-order/getZonesParams.ts b/domains-frontend/src/api/models/domain-order/getZonesParams.ts new file mode 100644 index 0000000..069e97a --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/getZonesParams.ts @@ -0,0 +1,18 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Domain Order Service API + * OpenAPI spec version: 1.0.0 + */ + +export type GetZonesParams = { + /** + * @minimum 0 + */ + page?: number; + /** + * @minimum 1 + */ + size?: number; + sort?: string[]; +}; diff --git a/domains-frontend/src/api/models/domain-order/index.ts b/domains-frontend/src/api/models/domain-order/index.ts new file mode 100644 index 0000000..9a253b8 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/index.ts @@ -0,0 +1,91 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export * from './addCartItemRequest'; +export * from './addCartItemRequestAction'; +export * from './addCartItemRequestTerm'; +export * from './apiError'; +export * from './apiErrorDetails'; +export * from './apiResponseCartItemResponse'; +export * from './apiResponseCartResponse'; +export * from './apiResponseDnsRecordResponse'; +export * from './apiResponseDomainExpiryAlertResponse'; +export * from './apiResponseDomainResponse'; +export * from './apiResponseListDnsRecordResponse'; +export * from './apiResponseListDomainSearchResult'; +export * from './apiResponseMonitoringDashboardResponse'; +export * from './apiResponseNotificationPreferencesResponse'; +export * from './apiResponseNsDelegationResponse'; +export * from './apiResponseOrderResponse'; +export * from './apiResponsePageDomainExpiryMonitoringResponse'; +export * from './apiResponsePageDomainResponse'; +export * from './apiResponsePageOrderResponse'; +export * from './apiResponsePageZone'; +export * from './apiResponseString'; +export * from './apiResponseVoid'; +export * from './apiResponseVoidData'; +export * from './apiResponseZone'; +export * from './cartItemResponse'; +export * from './cartItemResponseAction'; +export * from './cartItemResponseTerm'; +export * from './cartResponse'; +export * from './createARecordRequest'; +export * from './createAaaaRecordRequest'; +export * from './createCaaRecordRequest'; +export * from './createCnameRecordRequest'; +export * from './createDomainRequest'; +export * from './createMxRecordRequest'; +export * from './createOrderRequest'; +export * from './createSrvRecordRequest'; +export * from './createTxtRecordRequest'; +export * from './createZoneRequest'; +export * from './dnsRecordResponse'; +export * from './domainExpiryAlertResponse'; +export * from './domainExpiryMonitoringResponse'; +export * from './domainResponse'; +export * from './domainSearchResult'; +export * from './expiryAlertPreference'; +export * from './getAllDomainsParams'; +export * from './getAllZonesParams'; +export * from './getDomainsParams'; +export * from './getDomainsSearchParams'; +export * from './getNotificationsExpiryMonitoringDomainsParams'; +export * from './getOrdersParams'; +export * from './getZonesParams'; +export * from './itemAction'; +export * from './itemTerm'; +export * from './monitoringDashboardResponse'; +export * from './notificationPreferencesResponse'; +export * from './notificationType'; +export * from './nsDelegationRequest'; +export * from './nsDelegationResponse'; +export * from './orderItemResponse'; +export * from './orderItemResponseAction'; +export * from './orderItemResponseTerm'; +export * from './orderResponse'; +export * from './orderResponseStatus'; +export * from './orderStatus'; +export * from './pageDomainExpiryMonitoringResponse'; +export * from './pageDomainResponse'; +export * from './pageOrderResponse'; +export * from './pageZone'; +export * from './pageable'; +export * from './pageableObject'; +export * from './putOrdersIdStatusParams'; +export * from './searchDomainsParams'; +export * from './sendNotificationRequest'; +export * from './sendNotificationRequestParameters'; +export * from './sortObject'; +export * from './updateDnsRecordRequest'; +export * from './updateDomainRequest'; +export * from './updateExpiryAlertsRequest'; +export * from './updateNotificationPreferencesRequest'; +export * from './updateOrderStatusParams'; +export * from './updateOrderStatusStatus'; +export * from './updateZoneRequest'; +export * from './userIdHeaderParameter'; +export * from './zone'; diff --git a/domains-frontend/src/api/models/domain-order/itemAction.ts b/domains-frontend/src/api/models/domain-order/itemAction.ts new file mode 100644 index 0000000..0f9d66f --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/itemAction.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Domain Order Service API + * OpenAPI spec version: 1.0.0 + */ + +export type ItemAction = (typeof ItemAction)[keyof typeof ItemAction]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const ItemAction = { + register: 'register', + renew: 'renew', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/itemTerm.ts b/domains-frontend/src/api/models/domain-order/itemTerm.ts new file mode 100644 index 0000000..f35331f --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/itemTerm.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Domain Order Service API + * OpenAPI spec version: 1.0.0 + */ + +export type ItemTerm = (typeof ItemTerm)[keyof typeof ItemTerm]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const ItemTerm = { + monthly: 'monthly', + yearly: 'yearly', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/monitoringDashboardResponse.ts b/domains-frontend/src/api/models/domain-order/monitoringDashboardResponse.ts new file mode 100644 index 0000000..4a79480 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/monitoringDashboardResponse.ts @@ -0,0 +1,16 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ + +export interface MonitoringDashboardResponse { + domainsExpiringIn30Days?: number; + domainsExpiringIn14Days?: number; + domainsExpiringIn7Days?: number; + domainsExpiringIn3Days?: number; + domainsExpiringIn1Day?: number; + expiredDomains?: number; + totalActiveDomains?: number; +} diff --git a/domains-frontend/src/api/models/domain-order/notificationPreferencesResponse.ts b/domains-frontend/src/api/models/domain-order/notificationPreferencesResponse.ts new file mode 100644 index 0000000..034926a --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/notificationPreferencesResponse.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ +import type { ExpiryAlertPreference } from './expiryAlertPreference'; + +export interface NotificationPreferencesResponse { + expiryAlerts?: ExpiryAlertPreference[]; + orderNotificationsEnabled?: boolean; + paymentNotificationsEnabled?: boolean; + domainActivationNotificationsEnabled?: boolean; +} diff --git a/domains-frontend/src/api/models/domain-order/notificationType.ts b/domains-frontend/src/api/models/domain-order/notificationType.ts new file mode 100644 index 0000000..c4b7cb7 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/notificationType.ts @@ -0,0 +1,18 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ + +export type NotificationType = + (typeof NotificationType)[keyof typeof NotificationType]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const NotificationType = { + ORDER_CREATED: 'ORDER_CREATED', + PAYMENT_APPROVED: 'PAYMENT_APPROVED', + DOMAIN_ACTIVATED: 'DOMAIN_ACTIVATED', + DOMAIN_EXPIRING_SOON: 'DOMAIN_EXPIRING_SOON', + DOMAIN_EXPIRED: 'DOMAIN_EXPIRED', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/nsDelegationRequest.ts b/domains-frontend/src/api/models/domain-order/nsDelegationRequest.ts new file mode 100644 index 0000000..fffb910 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/nsDelegationRequest.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface NsDelegationRequest { + /** + * @minItems 1 + * @maxItems 10 + */ + nsServers: string[]; +} diff --git a/domains-frontend/src/api/models/domain-order/nsDelegationResponse.ts b/domains-frontend/src/api/models/domain-order/nsDelegationResponse.ts new file mode 100644 index 0000000..a2b8e3f --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/nsDelegationResponse.ts @@ -0,0 +1,12 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface NsDelegationResponse { + domainId?: string; + isDelegated?: boolean; + nsServers?: string[]; +} diff --git a/domains-frontend/src/api/models/domain-order/orderItemResponse.ts b/domains-frontend/src/api/models/domain-order/orderItemResponse.ts new file mode 100644 index 0000000..e721d77 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/orderItemResponse.ts @@ -0,0 +1,17 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { OrderItemResponseAction } from './orderItemResponseAction'; +import type { OrderItemResponseTerm } from './orderItemResponseTerm'; + +export interface OrderItemResponse { + id?: string; + action?: OrderItemResponseAction; + term?: OrderItemResponseTerm; + domainId?: string; + createdAt?: string; + updatedAt?: string; +} diff --git a/domains-frontend/src/api/models/domain-order/orderItemResponseAction.ts b/domains-frontend/src/api/models/domain-order/orderItemResponseAction.ts new file mode 100644 index 0000000..f47fe41 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/orderItemResponseAction.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type OrderItemResponseAction = + (typeof OrderItemResponseAction)[keyof typeof OrderItemResponseAction]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const OrderItemResponseAction = { + register: 'register', + renew: 'renew', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/orderItemResponseTerm.ts b/domains-frontend/src/api/models/domain-order/orderItemResponseTerm.ts new file mode 100644 index 0000000..42d714c --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/orderItemResponseTerm.ts @@ -0,0 +1,15 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type OrderItemResponseTerm = + (typeof OrderItemResponseTerm)[keyof typeof OrderItemResponseTerm]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const OrderItemResponseTerm = { + monthly: 'monthly', + yearly: 'yearly', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/orderResponse.ts b/domains-frontend/src/api/models/domain-order/orderResponse.ts new file mode 100644 index 0000000..de9a94a --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/orderResponse.ts @@ -0,0 +1,19 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { OrderResponseStatus } from './orderResponseStatus'; +import type { OrderItemResponse } from './orderItemResponse'; + +export interface OrderResponse { + id?: string; + userId?: string; + status?: OrderResponseStatus; + totalAmount?: number; + items?: OrderItemResponse[]; + createdAt?: string; + paidAt?: string; + updatedAt?: string; +} diff --git a/domains-frontend/src/api/models/domain-order/orderResponseStatus.ts b/domains-frontend/src/api/models/domain-order/orderResponseStatus.ts new file mode 100644 index 0000000..91b0578 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/orderResponseStatus.ts @@ -0,0 +1,18 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type OrderResponseStatus = + (typeof OrderResponseStatus)[keyof typeof OrderResponseStatus]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const OrderResponseStatus = { + created: 'created', + pending_payment: 'pending_payment', + paid: 'paid', + cancelled: 'cancelled', + failed: 'failed', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/orderStatus.ts b/domains-frontend/src/api/models/domain-order/orderStatus.ts new file mode 100644 index 0000000..5c0e309 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/orderStatus.ts @@ -0,0 +1,17 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Domain Order Service API + * OpenAPI spec version: 1.0.0 + */ + +export type OrderStatus = (typeof OrderStatus)[keyof typeof OrderStatus]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const OrderStatus = { + created: 'created', + pending_payment: 'pending_payment', + paid: 'paid', + cancelled: 'cancelled', + failed: 'failed', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/pageDomainExpiryMonitoringResponse.ts b/domains-frontend/src/api/models/domain-order/pageDomainExpiryMonitoringResponse.ts new file mode 100644 index 0000000..741e934 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/pageDomainExpiryMonitoringResponse.ts @@ -0,0 +1,19 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ +import type { DomainExpiryMonitoringResponse } from './domainExpiryMonitoringResponse'; + +export interface PageDomainExpiryMonitoringResponse { + content?: DomainExpiryMonitoringResponse[]; + totalElements?: number; + totalPages?: number; + size?: number; + number?: number; + first?: boolean; + last?: boolean; + numberOfElements?: number; + empty?: boolean; +} diff --git a/domains-frontend/src/api/models/domain-order/pageDomainResponse.ts b/domains-frontend/src/api/models/domain-order/pageDomainResponse.ts new file mode 100644 index 0000000..38c8356 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/pageDomainResponse.ts @@ -0,0 +1,23 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { DomainResponse } from './domainResponse'; +import type { SortObject } from './sortObject'; +import type { PageableObject } from './pageableObject'; + +export interface PageDomainResponse { + totalPages?: number; + totalElements?: number; + first?: boolean; + size?: number; + content?: DomainResponse[]; + number?: number; + sort?: SortObject[]; + numberOfElements?: number; + pageable?: PageableObject; + last?: boolean; + empty?: boolean; +} diff --git a/domains-frontend/src/api/models/domain-order/pageOrderResponse.ts b/domains-frontend/src/api/models/domain-order/pageOrderResponse.ts new file mode 100644 index 0000000..2349179 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/pageOrderResponse.ts @@ -0,0 +1,23 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { OrderResponse } from './orderResponse'; +import type { SortObject } from './sortObject'; +import type { PageableObject } from './pageableObject'; + +export interface PageOrderResponse { + totalPages?: number; + totalElements?: number; + first?: boolean; + size?: number; + content?: OrderResponse[]; + number?: number; + sort?: SortObject[]; + numberOfElements?: number; + pageable?: PageableObject; + last?: boolean; + empty?: boolean; +} diff --git a/domains-frontend/src/api/models/domain-order/pageZone.ts b/domains-frontend/src/api/models/domain-order/pageZone.ts new file mode 100644 index 0000000..5ae9915 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/pageZone.ts @@ -0,0 +1,23 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { Zone } from './zone'; +import type { SortObject } from './sortObject'; +import type { PageableObject } from './pageableObject'; + +export interface PageZone { + totalPages?: number; + totalElements?: number; + first?: boolean; + size?: number; + content?: Zone[]; + number?: number; + sort?: SortObject[]; + numberOfElements?: number; + pageable?: PageableObject; + last?: boolean; + empty?: boolean; +} diff --git a/domains-frontend/src/api/models/domain-order/pageable.ts b/domains-frontend/src/api/models/domain-order/pageable.ts new file mode 100644 index 0000000..c374db0 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/pageable.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface Pageable { + /** @minimum 0 */ + page?: number; + /** @minimum 1 */ + size?: number; + sort?: string[]; +} diff --git a/domains-frontend/src/api/models/domain-order/pageableObject.ts b/domains-frontend/src/api/models/domain-order/pageableObject.ts new file mode 100644 index 0000000..8fad0b6 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/pageableObject.ts @@ -0,0 +1,16 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { SortObject } from './sortObject'; + +export interface PageableObject { + offset?: number; + sort?: SortObject[]; + pageNumber?: number; + pageSize?: number; + paged?: boolean; + unpaged?: boolean; +} diff --git a/domains-frontend/src/api/models/domain-order/putOrdersIdStatusParams.ts b/domains-frontend/src/api/models/domain-order/putOrdersIdStatusParams.ts new file mode 100644 index 0000000..120adac --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/putOrdersIdStatusParams.ts @@ -0,0 +1,11 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Domain Order Service API + * OpenAPI spec version: 1.0.0 + */ +import type { OrderStatus } from './orderStatus'; + +export type PutOrdersIdStatusParams = { + status: OrderStatus; +}; diff --git a/domains-frontend/src/api/models/domain-order/searchDomainsParams.ts b/domains-frontend/src/api/models/domain-order/searchDomainsParams.ts new file mode 100644 index 0000000..e934bb1 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/searchDomainsParams.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type SearchDomainsParams = { + query: string; +}; diff --git a/domains-frontend/src/api/models/domain-order/sendNotificationRequest.ts b/domains-frontend/src/api/models/domain-order/sendNotificationRequest.ts new file mode 100644 index 0000000..92ca464 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/sendNotificationRequest.ts @@ -0,0 +1,19 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ +import type { NotificationType } from './notificationType'; +import type { SendNotificationRequestParameters } from './sendNotificationRequestParameters'; + +export interface SendNotificationRequest { + userId: string; + type: NotificationType; + /** @nullable */ + subject?: string | null; + /** @nullable */ + template?: string | null; + /** @nullable */ + parameters?: SendNotificationRequestParameters; +} diff --git a/domains-frontend/src/api/models/domain-order/sendNotificationRequestParameters.ts b/domains-frontend/src/api/models/domain-order/sendNotificationRequestParameters.ts new file mode 100644 index 0000000..8b74969 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/sendNotificationRequestParameters.ts @@ -0,0 +1,13 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ + +/** + * @nullable + */ +export type SendNotificationRequestParameters = { + [key: string]: unknown; +} | null; diff --git a/domains-frontend/src/api/models/domain-order/sortObject.ts b/domains-frontend/src/api/models/domain-order/sortObject.ts new file mode 100644 index 0000000..ae915c9 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/sortObject.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface SortObject { + direction?: string; + nullHandling?: string; + ascending?: boolean; + property?: string; + ignoreCase?: boolean; +} diff --git a/domains-frontend/src/api/models/domain-order/updateDnsRecordRequest.ts b/domains-frontend/src/api/models/domain-order/updateDnsRecordRequest.ts new file mode 100644 index 0000000..e2a2650 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/updateDnsRecordRequest.ts @@ -0,0 +1,16 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface UpdateDnsRecordRequest { + value: string; + ttl: number; + priority?: number; + weight?: number; + port?: number; + flags?: string; + tag?: string; +} diff --git a/domains-frontend/src/api/models/domain-order/updateDomainRequest.ts b/domains-frontend/src/api/models/domain-order/updateDomainRequest.ts new file mode 100644 index 0000000..ccdc8aa --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/updateDomainRequest.ts @@ -0,0 +1,11 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface UpdateDomainRequest { + expiresAt?: string; + activatedAt?: string; +} diff --git a/domains-frontend/src/api/models/domain-order/updateExpiryAlertsRequest.ts b/domains-frontend/src/api/models/domain-order/updateExpiryAlertsRequest.ts new file mode 100644 index 0000000..c548bbf --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/updateExpiryAlertsRequest.ts @@ -0,0 +1,11 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ +import type { ExpiryAlertPreference } from './expiryAlertPreference'; + +export interface UpdateExpiryAlertsRequest { + alerts?: ExpiryAlertPreference[]; +} diff --git a/domains-frontend/src/api/models/domain-order/updateNotificationPreferencesRequest.ts b/domains-frontend/src/api/models/domain-order/updateNotificationPreferencesRequest.ts new file mode 100644 index 0000000..db34bfc --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/updateNotificationPreferencesRequest.ts @@ -0,0 +1,17 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ +import type { ExpiryAlertPreference } from './expiryAlertPreference'; + +export interface UpdateNotificationPreferencesRequest { + expiryAlerts?: ExpiryAlertPreference[]; + /** @nullable */ + orderNotificationsEnabled?: boolean | null; + /** @nullable */ + paymentNotificationsEnabled?: boolean | null; + /** @nullable */ + domainActivationNotificationsEnabled?: boolean | null; +} diff --git a/domains-frontend/src/api/models/domain-order/updateOrderStatusParams.ts b/domains-frontend/src/api/models/domain-order/updateOrderStatusParams.ts new file mode 100644 index 0000000..2af3747 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/updateOrderStatusParams.ts @@ -0,0 +1,11 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { UpdateOrderStatusStatus } from './updateOrderStatusStatus'; + +export type UpdateOrderStatusParams = { + status: UpdateOrderStatusStatus; +}; diff --git a/domains-frontend/src/api/models/domain-order/updateOrderStatusStatus.ts b/domains-frontend/src/api/models/domain-order/updateOrderStatusStatus.ts new file mode 100644 index 0000000..d7198eb --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/updateOrderStatusStatus.ts @@ -0,0 +1,18 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export type UpdateOrderStatusStatus = + (typeof UpdateOrderStatusStatus)[keyof typeof UpdateOrderStatusStatus]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const UpdateOrderStatusStatus = { + created: 'created', + pending_payment: 'pending_payment', + paid: 'paid', + cancelled: 'cancelled', + failed: 'failed', +} as const; diff --git a/domains-frontend/src/api/models/domain-order/updateZoneRequest.ts b/domains-frontend/src/api/models/domain-order/updateZoneRequest.ts new file mode 100644 index 0000000..7cb67e7 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/updateZoneRequest.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface UpdateZoneRequest { + price?: number; +} diff --git a/domains-frontend/src/api/models/domain-order/userIdHeaderParameter.ts b/domains-frontend/src/api/models/domain-order/userIdHeaderParameter.ts new file mode 100644 index 0000000..c431fc9 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/userIdHeaderParameter.ts @@ -0,0 +1,8 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Notification Service API + * OpenAPI spec version: 1.0.0 + */ + +export type UserIdHeaderParameter = string; diff --git a/domains-frontend/src/api/models/domain-order/zone.ts b/domains-frontend/src/api/models/domain-order/zone.ts new file mode 100644 index 0000000..cc1b653 --- /dev/null +++ b/domains-frontend/src/api/models/domain-order/zone.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ + +export interface Zone { + id?: string; + name?: string; + price?: number; + createdAt?: string; + updatedAt?: string; +} diff --git a/domains-frontend/src/api/models/exdns/deleteZonesDomain200.ts b/domains-frontend/src/api/models/exdns/deleteZonesDomain200.ts new file mode 100644 index 0000000..7a44dc0 --- /dev/null +++ b/domains-frontend/src/api/models/exdns/deleteZonesDomain200.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Exdns HTTP API + * OpenAPI spec version: 0.1.0 + */ + +export type DeleteZonesDomain200 = { + status?: string; +}; diff --git a/domains-frontend/src/api/models/exdns/error.ts b/domains-frontend/src/api/models/exdns/error.ts new file mode 100644 index 0000000..fdc0505 --- /dev/null +++ b/domains-frontend/src/api/models/exdns/error.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Exdns HTTP API + * OpenAPI spec version: 0.1.0 + */ + +export interface Error { + error?: string; +} diff --git a/domains-frontend/src/api/models/exdns/index.ts b/domains-frontend/src/api/models/exdns/index.ts new file mode 100644 index 0000000..1c978cd --- /dev/null +++ b/domains-frontend/src/api/models/exdns/index.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Exdns HTTP API + * OpenAPI spec version: 0.1.0 + */ + +export * from './deleteZonesDomain200'; +export * from './error'; +export * from './postZonesDomain201'; +export * from './putZonesDomain200'; +export * from './record'; +export * from './recordType'; +export * from './zone'; diff --git a/domains-frontend/src/api/models/exdns/postZonesDomain201.ts b/domains-frontend/src/api/models/exdns/postZonesDomain201.ts new file mode 100644 index 0000000..6c3f442 --- /dev/null +++ b/domains-frontend/src/api/models/exdns/postZonesDomain201.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Exdns HTTP API + * OpenAPI spec version: 0.1.0 + */ + +export type PostZonesDomain201 = { + status?: string; +}; diff --git a/domains-frontend/src/api/models/exdns/putZonesDomain200.ts b/domains-frontend/src/api/models/exdns/putZonesDomain200.ts new file mode 100644 index 0000000..8742319 --- /dev/null +++ b/domains-frontend/src/api/models/exdns/putZonesDomain200.ts @@ -0,0 +1,10 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Exdns HTTP API + * OpenAPI spec version: 0.1.0 + */ + +export type PutZonesDomain200 = { + status?: string; +}; diff --git a/domains-frontend/src/api/models/exdns/record.ts b/domains-frontend/src/api/models/exdns/record.ts new file mode 100644 index 0000000..9dc15c4 --- /dev/null +++ b/domains-frontend/src/api/models/exdns/record.ts @@ -0,0 +1,14 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Exdns HTTP API + * OpenAPI spec version: 0.1.0 + */ +import type { RecordType } from './recordType'; + +export interface Record { + name: string; + type: RecordType; + ttl: number; + data: unknown; +} diff --git a/domains-frontend/src/api/models/exdns/recordType.ts b/domains-frontend/src/api/models/exdns/recordType.ts new file mode 100644 index 0000000..27e5694 --- /dev/null +++ b/domains-frontend/src/api/models/exdns/recordType.ts @@ -0,0 +1,20 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Exdns HTTP API + * OpenAPI spec version: 0.1.0 + */ + +export type RecordType = (typeof RecordType)[keyof typeof RecordType]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const RecordType = { + A: 'A', + AAAA: 'AAAA', + NS: 'NS', + PTR: 'PTR', + MX: 'MX', + TXT: 'TXT', + SOA: 'SOA', + CNAME: 'CNAME', +} as const; diff --git a/domains-frontend/src/api/models/exdns/zone.ts b/domains-frontend/src/api/models/exdns/zone.ts new file mode 100644 index 0000000..3bf916a --- /dev/null +++ b/domains-frontend/src/api/models/exdns/zone.ts @@ -0,0 +1,13 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Exdns HTTP API + * OpenAPI spec version: 0.1.0 + */ +import type { Record } from './record'; + +export interface Zone { + name: string; + version: number; + records: Record[]; +} diff --git a/domains-frontend/src/api/services/auth.ts b/domains-frontend/src/api/services/auth.ts new file mode 100644 index 0000000..473a7c9 --- /dev/null +++ b/domains-frontend/src/api/services/auth.ts @@ -0,0 +1,203 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { + ApiResponseBoolean, + ApiResponseLoginResponse, + ApiResponseString, + ApiResponseTwoFactorSetupResponse, + ApiResponseUserResponse, + Enable2FAWithSecretRequest, + LoginRequest, + RefreshTokenRequest, + RegisterRequest, + ResendVerificationEmailParams, + VerifyEmailParams, +} from '../models/auth'; + +import { customInstance } from '../apiClient'; +type SecondParameter unknown> = Parameters[1]; + +export const resendVerificationEmail = ( + params: ResendVerificationEmailParams, + options?: SecondParameter> +) => { + return customInstance( + { url: `/auth/resend-verification`, method: 'POST', params }, + options + ); +}; + +export const register = ( + registerRequest: RegisterRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/auth/register`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: registerRequest, + }, + options + ); +}; + +export const refreshToken = ( + refreshTokenRequest: RefreshTokenRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/auth/refresh`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: refreshTokenRequest, + }, + options + ); +}; + +export const login = ( + loginRequest: LoginRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/auth/login`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: loginRequest, + }, + options + ); +}; + +export const enable2FA = ( + enable2FAWithSecretRequest: Enable2FAWithSecretRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/auth/2fa/enable`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: enable2FAWithSecretRequest, + }, + options + ); +}; + +export const disable2FA = ( + options?: SecondParameter> +) => { + return customInstance( + { url: `/auth/2fa/disable`, method: 'POST' }, + options + ); +}; + +export const getUserById = ( + id: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/users/${id}`, method: 'GET' }, + options + ); +}; + +export const getUserEmail = ( + id: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/users/${id}/email`, method: 'GET' }, + options + ); +}; + +export const getCurrentUser = ( + options?: SecondParameter> +) => { + return customInstance( + { url: `/users/me`, method: 'GET' }, + options + ); +}; + +export const verifyEmail = ( + params: VerifyEmailParams, + options?: SecondParameter> +) => { + return customInstance( + { url: `/auth/verify-email`, method: 'GET', params }, + options + ); +}; + +export const health = ( + options?: SecondParameter> +) => { + return customInstance( + { url: `/auth/health`, method: 'GET' }, + options + ); +}; + +export const get2FAStatus = ( + options?: SecondParameter> +) => { + return customInstance( + { url: `/auth/2fa/status`, method: 'GET' }, + options + ); +}; + +export const generateSetup = ( + options?: SecondParameter< + typeof customInstance + > +) => { + return customInstance( + { url: `/auth/2fa/setup`, method: 'GET' }, + options + ); +}; + +export type ResendVerificationEmailResult = NonNullable< + Awaited> +>; +export type RegisterResult = NonNullable>>; +export type RefreshTokenResult = NonNullable< + Awaited> +>; +export type LoginResult = NonNullable>>; +export type Enable2FAResult = NonNullable< + Awaited> +>; +export type Disable2FAResult = NonNullable< + Awaited> +>; +export type GetUserByIdResult = NonNullable< + Awaited> +>; +export type GetUserEmailResult = NonNullable< + Awaited> +>; +export type GetCurrentUserResult = NonNullable< + Awaited> +>; +export type VerifyEmailResult = NonNullable< + Awaited> +>; +export type HealthResult = NonNullable>>; +export type Get2FAStatusResult = NonNullable< + Awaited> +>; +export type GenerateSetupResult = NonNullable< + Awaited> +>; diff --git a/domains-frontend/src/api/services/domain-order.ts b/domains-frontend/src/api/services/domain-order.ts new file mode 100644 index 0000000..64bfef6 --- /dev/null +++ b/domains-frontend/src/api/services/domain-order.ts @@ -0,0 +1,631 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * OpenAPI definition + * OpenAPI spec version: v0 + */ +import type { + AddCartItemRequest, + ApiResponseCartItemResponse, + ApiResponseCartResponse, + ApiResponseDnsRecordResponse, + ApiResponseDomainResponse, + ApiResponseListDnsRecordResponse, + ApiResponseListDomainSearchResult, + ApiResponseNsDelegationResponse, + ApiResponseOrderResponse, + ApiResponsePageDomainResponse, + ApiResponsePageOrderResponse, + ApiResponsePageZone, + ApiResponseString, + ApiResponseVoid, + ApiResponseZone, + CreateARecordRequest, + CreateAaaaRecordRequest, + CreateCaaRecordRequest, + CreateCnameRecordRequest, + CreateDomainRequest, + CreateMxRecordRequest, + CreateOrderRequest, + CreateSrvRecordRequest, + CreateTxtRecordRequest, + CreateZoneRequest, + GetAllDomainsParams, + GetAllZonesParams, + GetOrdersParams, + NsDelegationRequest, + SearchDomainsParams, + UpdateDnsRecordRequest, + UpdateDomainRequest, + UpdateOrderStatusParams, + UpdateZoneRequest, +} from '../models/domain-order'; + +import { customInstance } from '../apiClientDomains'; +type SecondParameter unknown> = Parameters[1]; + +export const getZoneById = ( + id: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/zones/${id}`, method: 'GET' }, + options + ); +}; + +export const updateZone = ( + id: string, + updateZoneRequest: UpdateZoneRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/zones/${id}`, + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + data: updateZoneRequest, + }, + options + ); +}; + +export const deleteZone = ( + id: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/zones/${id}`, method: 'DELETE' }, + options + ); +}; + +export const updateOrderStatus = ( + id: string, + params: UpdateOrderStatusParams, + options?: SecondParameter> +) => { + return customInstance( + { url: `/orders/${id}/status`, method: 'PUT', params }, + options + ); +}; + +export const getDomainById = ( + id: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/domains/${id}`, method: 'GET' }, + options + ); +}; + +export const updateDomain = ( + id: string, + updateDomainRequest: UpdateDomainRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/domains/${id}`, + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + data: updateDomainRequest, + }, + options + ); +}; + +export const deleteDomain = ( + id: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/domains/${id}`, method: 'DELETE' }, + options + ); +}; + +export const getRecordById = ( + recordId: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/dns/records/${recordId}`, method: 'GET' }, + options + ); +}; + +export const updateRecord = ( + recordId: string, + updateDnsRecordRequest: UpdateDnsRecordRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/dns/records/${recordId}`, + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + data: updateDnsRecordRequest, + }, + options + ); +}; + +export const deleteRecord = ( + recordId: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/dns/records/${recordId}`, method: 'DELETE' }, + options + ); +}; + +export const getDelegation = ( + domainId: string, + options?: SecondParameter< + typeof customInstance + > +) => { + return customInstance( + { url: `/dns/delegation/domain/${domainId}`, method: 'GET' }, + options + ); +}; + +export const setDelegation = ( + domainId: string, + nsDelegationRequest: NsDelegationRequest, + options?: SecondParameter< + typeof customInstance + > +) => { + return customInstance( + { + url: `/dns/delegation/domain/${domainId}`, + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + data: nsDelegationRequest, + }, + options + ); +}; + +export const removeDelegation = ( + domainId: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/dns/delegation/domain/${domainId}`, method: 'DELETE' }, + options + ); +}; + +export const getAllZones = ( + params: GetAllZonesParams, + options?: SecondParameter> +) => { + return customInstance( + { url: `/zones`, method: 'GET', params }, + options + ); +}; + +export const createZone = ( + createZoneRequest: CreateZoneRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/zones`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: createZoneRequest, + }, + options + ); +}; + +export const getOrders = ( + params: GetOrdersParams, + options?: SecondParameter> +) => { + return customInstance( + { url: `/orders`, method: 'GET', params }, + options + ); +}; + +export const createOrder = ( + createOrderRequest: CreateOrderRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/orders`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: createOrderRequest, + }, + options + ); +}; + +export const cancelOrder = ( + id: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/orders/${id}/cancel`, method: 'POST' }, + options + ); +}; + +export const getAllDomains = ( + params: GetAllDomainsParams, + options?: SecondParameter< + typeof customInstance + > +) => { + return customInstance( + { url: `/domains`, method: 'GET', params }, + options + ); +}; + +export const createDomain = ( + createDomainRequest: CreateDomainRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/domains`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: createDomainRequest, + }, + options + ); +}; + +export const activateDomain = ( + id: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/domains/${id}/activate`, method: 'POST' }, + options + ); +}; + +export const createTxtRecord = ( + createTxtRecordRequest: CreateTxtRecordRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/dns/records/txt`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: createTxtRecordRequest, + }, + options + ); +}; + +export const createSrvRecord = ( + createSrvRecordRequest: CreateSrvRecordRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/dns/records/srv`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: createSrvRecordRequest, + }, + options + ); +}; + +export const createMxRecord = ( + createMxRecordRequest: CreateMxRecordRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/dns/records/mx`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: createMxRecordRequest, + }, + options + ); +}; + +export const createCnameRecord = ( + createCnameRecordRequest: CreateCnameRecordRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/dns/records/cname`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: createCnameRecordRequest, + }, + options + ); +}; + +export const createCaaRecord = ( + createCaaRecordRequest: CreateCaaRecordRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/dns/records/caa`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: createCaaRecordRequest, + }, + options + ); +}; + +export const createAaaaRecord = ( + createAaaaRecordRequest: CreateAaaaRecordRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/dns/records/aaaa`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: createAaaaRecordRequest, + }, + options + ); +}; + +export const createARecord = ( + createARecordRequest: CreateARecordRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/dns/records/a`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: createARecordRequest, + }, + options + ); +}; + +export const addItem = ( + addCartItemRequest: AddCartItemRequest, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/cart/items`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: addCartItemRequest, + }, + options + ); +}; + +export const getZoneByName = ( + name: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/zones/name/${name}`, method: 'GET' }, + options + ); +}; + +export const getOrderById = ( + id: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/orders/${id}`, method: 'GET' }, + options + ); +}; + +export const searchDomains = ( + params: SearchDomainsParams, + options?: SecondParameter< + typeof customInstance + > +) => { + return customInstance( + { url: `/domains/search`, method: 'GET', params }, + options + ); +}; + +export const getDomainByFqdn = ( + fqdn: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/domains/fqdn/${fqdn}`, method: 'GET' }, + options + ); +}; + +export const health = ( + options?: SecondParameter> +) => { + return customInstance( + { url: `/dns/records/health`, method: 'GET' }, + options + ); +}; + +export const getRecordsByDomain = ( + domainId: string, + options?: SecondParameter< + typeof customInstance + > +) => { + return customInstance( + { url: `/dns/records/domain/${domainId}`, method: 'GET' }, + options + ); +}; + +export const health1 = ( + options?: SecondParameter> +) => { + return customInstance( + { url: `/dns/delegation/health`, method: 'GET' }, + options + ); +}; + +export const getCart = ( + options?: SecondParameter> +) => { + return customInstance( + { url: `/cart`, method: 'GET' }, + options + ); +}; + +export const clearCart = ( + options?: SecondParameter> +) => { + return customInstance( + { url: `/cart`, method: 'DELETE' }, + options + ); +}; + +export const removeItem = ( + itemId: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/cart/items/${itemId}`, method: 'DELETE' }, + options + ); +}; + +export type GetZoneByIdResult = NonNullable< + Awaited> +>; +export type UpdateZoneResult = NonNullable< + Awaited> +>; +export type DeleteZoneResult = NonNullable< + Awaited> +>; +export type UpdateOrderStatusResult = NonNullable< + Awaited> +>; +export type GetDomainByIdResult = NonNullable< + Awaited> +>; +export type UpdateDomainResult = NonNullable< + Awaited> +>; +export type DeleteDomainResult = NonNullable< + Awaited> +>; +export type GetRecordByIdResult = NonNullable< + Awaited> +>; +export type UpdateRecordResult = NonNullable< + Awaited> +>; +export type DeleteRecordResult = NonNullable< + Awaited> +>; +export type GetDelegationResult = NonNullable< + Awaited> +>; +export type SetDelegationResult = NonNullable< + Awaited> +>; +export type RemoveDelegationResult = NonNullable< + Awaited> +>; +export type GetAllZonesResult = NonNullable< + Awaited> +>; +export type CreateZoneResult = NonNullable< + Awaited> +>; +export type GetOrdersResult = NonNullable< + Awaited> +>; +export type CreateOrderResult = NonNullable< + Awaited> +>; +export type CancelOrderResult = NonNullable< + Awaited> +>; +export type GetAllDomainsResult = NonNullable< + Awaited> +>; +export type CreateDomainResult = NonNullable< + Awaited> +>; +export type ActivateDomainResult = NonNullable< + Awaited> +>; +export type CreateTxtRecordResult = NonNullable< + Awaited> +>; +export type CreateSrvRecordResult = NonNullable< + Awaited> +>; +export type CreateMxRecordResult = NonNullable< + Awaited> +>; +export type CreateCnameRecordResult = NonNullable< + Awaited> +>; +export type CreateCaaRecordResult = NonNullable< + Awaited> +>; +export type CreateAaaaRecordResult = NonNullable< + Awaited> +>; +export type CreateARecordResult = NonNullable< + Awaited> +>; +export type AddItemResult = NonNullable>>; +export type GetZoneByNameResult = NonNullable< + Awaited> +>; +export type GetOrderByIdResult = NonNullable< + Awaited> +>; +export type SearchDomainsResult = NonNullable< + Awaited> +>; +export type GetDomainByFqdnResult = NonNullable< + Awaited> +>; +export type HealthResult = NonNullable>>; +export type GetRecordsByDomainResult = NonNullable< + Awaited> +>; +export type Health1Result = NonNullable>>; +export type GetCartResult = NonNullable>>; +export type ClearCartResult = NonNullable< + Awaited> +>; +export type RemoveItemResult = NonNullable< + Awaited> +>; diff --git a/domains-frontend/src/api/services/exdns.ts b/domains-frontend/src/api/services/exdns.ts new file mode 100644 index 0000000..ba08f15 --- /dev/null +++ b/domains-frontend/src/api/services/exdns.ts @@ -0,0 +1,92 @@ +/** + * Generated by orval v7.17.2 🍺 + * Do not edit manually. + * Exdns HTTP API + * OpenAPI spec version: 0.1.0 + */ +import type { + DeleteZonesDomain200, + PostZonesDomain201, + PutZonesDomain200, + Zone, +} from '../models/exdns'; + +import { customInstance } from '../apiClientExdns'; +type SecondParameter unknown> = Parameters[1]; + +/** + * @summary Get zone + */ +export const getZonesDomain = ( + domain: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/zones/${domain}`, method: 'GET' }, + options + ); +}; + +/** + * @summary Create zone + */ +export const postZonesDomain = ( + domain: string, + zone: Zone, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/zones/${domain}`, + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + data: zone, + }, + options + ); +}; + +/** + * @summary Update zone + */ +export const putZonesDomain = ( + domain: string, + zone: Zone, + options?: SecondParameter> +) => { + return customInstance( + { + url: `/zones/${domain}`, + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + data: zone, + }, + options + ); +}; + +/** + * @summary Delete zone + */ +export const deleteZonesDomain = ( + domain: string, + options?: SecondParameter> +) => { + return customInstance( + { url: `/zones/${domain}`, method: 'DELETE' }, + options + ); +}; + +export type GetZonesDomainResult = NonNullable< + Awaited> +>; +export type PostZonesDomainResult = NonNullable< + Awaited> +>; +export type PutZonesDomainResult = NonNullable< + Awaited> +>; +export type DeleteZonesDomainResult = NonNullable< + Awaited> +>; diff --git a/domains-frontend/src/api/specs/exdns.json b/domains-frontend/src/api/specs/exdns.json new file mode 100644 index 0000000..b98db6d --- /dev/null +++ b/domains-frontend/src/api/specs/exdns.json @@ -0,0 +1,244 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "Exdns HTTP API", + "version": "0.1.0" + }, + "servers": [ + { + "url": "http://localhost:8080" + } + ], + "components": { + "securitySchemes": { + "bearerAuth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + } + }, + "schemas": { + "Zone": { + "type": "object", + "required": ["name", "version", "records"], + "properties": { + "name": { "type": "string" }, + "version": { "type": "integer" }, + "records": { + "type": "array", + "items": { "$ref": "#/components/schemas/Record" } + } + } + }, + "Record": { + "type": "object", + "required": ["name", "type", "ttl", "data"], + "properties": { + "name": { "type": "string" }, + "type": { + "type": "string", + "enum": ["A", "AAAA", "NS", "PTR", "MX", "TXT", "SOA", "CNAME"] + }, + "ttl": { "type": "integer" }, + "data": {} + } + }, + "Error": { + "type": "object", + "properties": { + "error": { "type": "string" } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "paths": { + "/zones/{domain}": { + "get": { + "summary": "Get zone", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { "type": "string" } + } + ], + "responses": { + "200": { + "description": "Zone data", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Zone" } + } + } + }, + "404": { + "description": "Zone not found", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Error" } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Error" } + } + } + } + } + }, + "post": { + "summary": "Create zone", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { "type": "string" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Zone" } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "status": { "type": "string" } } + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Error" } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Error" } + } + } + } + } + }, + "put": { + "summary": "Update zone", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { "type": "string" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Zone" } + } + } + }, + "responses": { + "200": { + "description": "Updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "status": { "type": "string" } } + } + } + } + }, + "404": { + "description": "Zone not found", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Error" } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Error" } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Error" } + } + } + } + } + }, + "delete": { + "summary": "Delete zone", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { "type": "string" } + } + ], + "responses": { + "200": { + "description": "Deleted", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "status": { "type": "string" } } + } + } + } + }, + "404": { + "description": "Zone not found", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Error" } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Error" } + } + } + } + } + } + } + } +} diff --git a/domains-frontend/src/assets/bg.png b/domains-frontend/src/assets/bg.png new file mode 100644 index 0000000..7596e31 Binary files /dev/null and b/domains-frontend/src/assets/bg.png differ diff --git a/domains-frontend/src/assets/bg.webp b/domains-frontend/src/assets/bg.webp new file mode 100644 index 0000000..231b1ef Binary files /dev/null and b/domains-frontend/src/assets/bg.webp differ diff --git a/domains-frontend/src/common/atoms.ts b/domains-frontend/src/common/atoms.ts new file mode 100644 index 0000000..4593bda --- /dev/null +++ b/domains-frontend/src/common/atoms.ts @@ -0,0 +1,2 @@ +export const $ok = Symbol('Ok'); +export const $error = Symbol('Error'); diff --git a/domains-frontend/src/components/AppLink.tsx b/domains-frontend/src/components/AppLink.tsx new file mode 100644 index 0000000..a9f44a4 --- /dev/null +++ b/domains-frontend/src/components/AppLink.tsx @@ -0,0 +1,22 @@ +import { Link } from '@chakra-ui/react'; +import React, { type MouseEvent, type ReactNode } from 'react'; +import { useNavigate, type NavigateOptions } from 'react-router'; + +type Props = { + children: ReactNode; + to: string; + options?: NavigateOptions; +}; + +const AppLink = (props: Props) => { + const navigate = useNavigate(); + const handleClick = (e: MouseEvent) => { + e.preventDefault(); + + navigate(props.to, props.options); + }; + + return {props.children}; +}; + +export default AppLink; diff --git a/domains-frontend/src/components/DateText.tsx b/domains-frontend/src/components/DateText.tsx new file mode 100644 index 0000000..30afb5b --- /dev/null +++ b/domains-frontend/src/components/DateText.tsx @@ -0,0 +1,23 @@ +import { Text } from '@chakra-ui/react'; +import type { Dayjs } from 'dayjs'; +import dayjs from 'dayjs'; +import React, { type JSX } from 'react'; + +type Props = { + children: string | Date | Dayjs; + as?: string | (() => JSX.Element); +}; + +const DateText = (props: Props) => { + const date = dayjs(props.children); + const format = dayjs().year() === date.year() ? 'DD MMMM' : 'DD MMM YYYY'; + const dateText = date.locale('ru').format(format); + + if (props.as) { + return React.createElement(props.as, null, dateText); + } + + return {dateText}; +}; + +export default DateText; diff --git a/domains-frontend/src/components/admin/zones/CreateZoneDialog.tsx b/domains-frontend/src/components/admin/zones/CreateZoneDialog.tsx new file mode 100644 index 0000000..534526e --- /dev/null +++ b/domains-frontend/src/components/admin/zones/CreateZoneDialog.tsx @@ -0,0 +1,122 @@ +import { Button, Field, Input, Stack, Text } from '@chakra-ui/react'; +import { + DialogBackdrop, + DialogBody, + DialogCloseTrigger, + DialogContent, + DialogFooter, + DialogHeader, + DialogPositioner, + DialogRoot, + DialogTitle, + DialogTrigger, +} from '@chakra-ui/react'; +import { useState, type FormEvent } from 'react'; +import { createZone } from '~/api/services/domain-order'; + +type Props = { + onCreated?: () => void | Promise; +}; + +const CreateZoneDialog = ({ onCreated }: Props) => { + const [isCreating, setIsCreating] = useState(false); + const [createError, setCreateError] = useState(''); + const [zoneName, setZoneName] = useState(''); + const [zonePrice, setZonePrice] = useState(''); + + const handleCreateZone = async (event: FormEvent) => { + event.preventDefault(); + const name = zoneName.trim(); + const price = Number(zonePrice); + + if (!name || Number.isNaN(price)) { + setCreateError('Введие корректное имя и(или) цену.'); + return; + } + + setIsCreating(true); + setCreateError(''); + + try { + await createZone({ name, price }); + setZoneName(''); + setZonePrice(''); + if (onCreated) { + await onCreated(); + } + } catch { + setCreateError('Не удалось создать зону. Попробуйте снова'); + } finally { + setIsCreating(false); + } + }; + + const isSubmitDisabled = + isCreating || + !zoneName.trim() || + !zonePrice.trim() || + Number.isNaN(Number(zonePrice)); + + return ( + + + + + + + + + Создать зону + + +
+ + + Название зоны + setZoneName(event.target.value)} + /> + + + Цена + setZonePrice(event.target.value)} + /> + + {createError && ( + + {createError} + + )} + +
+
+ + + + + + +
+
+
+ ); +}; + +export default CreateZoneDialog; diff --git a/domains-frontend/src/components/admin/zones/ManageZoneDialog.tsx b/domains-frontend/src/components/admin/zones/ManageZoneDialog.tsx new file mode 100644 index 0000000..326ebce --- /dev/null +++ b/domains-frontend/src/components/admin/zones/ManageZoneDialog.tsx @@ -0,0 +1,154 @@ +import { Button, Field, Input, Stack, Text } from '@chakra-ui/react'; +import { + DialogBackdrop, + DialogBody, + DialogCloseTrigger, + DialogContent, + DialogFooter, + DialogHeader, + DialogPositioner, + DialogRoot, + DialogTitle, + DialogTrigger, +} from '@chakra-ui/react'; +import { useEffect, useState, type FormEvent } from 'react'; +import type { Zone } from '~/api/models/domain-order'; +import { deleteZone, updateZone } from '~/api/services/domain-order'; + +type Props = { + zone: Zone; + onUpdated?: () => void | Promise; +}; + +const ManageZoneDialog = ({ zone, onUpdated }: Props) => { + const [price, setPrice] = useState(''); + const [isSaving, setIsSaving] = useState(false); + const [isDeleting, setIsDeleting] = useState(false); + const [error, setError] = useState(''); + + useEffect(() => { + setPrice(zone.price === undefined ? '' : String(zone.price)); + setError(''); + }, [zone.id, zone.price]); + + const handleSave = async (event: FormEvent) => { + event.preventDefault(); + + if (!zone.id) { + setError('Зона не найдена.'); + return; + } + + const nextPrice = Number(price); + if (Number.isNaN(nextPrice)) { + setError('Введите корректную цену.'); + return; + } + + setIsSaving(true); + setError(''); + + try { + await updateZone(zone.id, { price: nextPrice }); + if (onUpdated) { + await onUpdated(); + } + } catch { + setError('Не удалось обновить зону. Попробуйте снова.'); + } finally { + setIsSaving(false); + } + }; + + const handleDelete = async () => { + if (!zone.id) { + setError('Зона не найдена.'); + return; + } + + setIsDeleting(true); + setError(''); + + try { + await deleteZone(zone.id); + if (onUpdated) { + await onUpdated(); + } + } catch { + setError('Не удалось удалить зону. Попробуйте снова.'); + } finally { + setIsDeleting(false); + } + }; + + const isSubmitDisabled = + isSaving || isDeleting || !price.trim() || Number.isNaN(Number(price)); + const formId = `manage-zone-form-${zone.id ?? zone.name ?? 'zone'}`; + + return ( + + + + + + + + + Управление зоной + + +
+ + + Зона + {zone.name ?? '-'} + + + Цена + setPrice(event.target.value)} + /> + + {error && ( + + {error} + + )} + +
+
+ + + + + + + +
+
+
+ ); +}; + +export default ManageZoneDialog; diff --git a/domains-frontend/src/components/app/profile/ChangePassword.tsx b/domains-frontend/src/components/app/profile/ChangePassword.tsx new file mode 100644 index 0000000..8884d39 --- /dev/null +++ b/domains-frontend/src/components/app/profile/ChangePassword.tsx @@ -0,0 +1,103 @@ +import { Button, Field, Input, Stack, Text } from '@chakra-ui/react'; +import { + DialogActionTrigger, + DialogBackdrop, + DialogBody, + DialogCloseTrigger, + DialogContent, + DialogFooter, + DialogHeader, + DialogPositioner, + DialogRoot, + DialogTitle, + DialogTrigger, +} from '@chakra-ui/react'; +import { useState, type FormEvent } from 'react'; + +const ChangePassword = () => { + const [currentPassword, setCurrentPassword] = useState(''); + const [newPassword, setNewPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + + const isMismatch = + newPassword.length > 0 && + confirmPassword.length > 0 && + newPassword !== confirmPassword; + + const isSubmitDisabled = + !currentPassword || !newPassword || !confirmPassword || isMismatch; + + const handleSubmit = (e: FormEvent) => { + e.preventDefault(); + }; + + return ( + + + + + + + + + Смена пароля + + +
+ + + Текущий пароль + setCurrentPassword(e.target.value)} + /> + + + Новый пароль + setNewPassword(e.target.value)} + /> + + + Повторите новый пароль + setConfirmPassword(e.target.value)} + /> + + {isMismatch && ( + + Пароли не совпадают + + )} + +
+
+ + + + + + + + +
+
+
+ ); +}; + +export default ChangePassword; diff --git a/domains-frontend/src/components/app/profile/EnableTwoFactorDialog.tsx b/domains-frontend/src/components/app/profile/EnableTwoFactorDialog.tsx new file mode 100644 index 0000000..6dfd630 --- /dev/null +++ b/domains-frontend/src/components/app/profile/EnableTwoFactorDialog.tsx @@ -0,0 +1,152 @@ +import { Button, Field, Input, Stack, Text } from '@chakra-ui/react'; +import { + DialogBackdrop, + DialogBody, + DialogCloseTrigger, + DialogContent, + DialogFooter, + DialogHeader, + DialogPositioner, + DialogRoot, + DialogTitle, + DialogTrigger, +} from '@chakra-ui/react'; +import { useState, type FormEvent } from 'react'; +import type { TwoFactorSetupResponse } from '~/api/models/auth'; +import { enable2FA, generateSetup } from '~/api/services/auth'; + +type Props = { + onEnabled?: () => void | Promise; +}; + +const EnableTwoFactorDialog = ({ onEnabled }: Props) => { + const [setup, setSetup] = useState(null); + const [code, setCode] = useState(''); + const [isLoadingSetup, setIsLoadingSetup] = useState(false); + const [isEnabling, setIsEnabling] = useState(false); + const [error, setError] = useState(''); + const [success, setSuccess] = useState(''); + + const handleOpen = async () => { + setError(''); + setSuccess(''); + if (setup || isLoadingSetup) return; + + setIsLoadingSetup(true); + try { + const response = await generateSetup(); + setSetup(response?.data ?? null); + } catch { + setError('Не удалось получить настройки 2FA. Попробуйте еще раз.'); + } finally { + setIsLoadingSetup(false); + } + }; + + const handleEnable = async (event: FormEvent) => { + event.preventDefault(); + setError(''); + setSuccess(''); + + const secret = setup?.secret ?? setup?.manualEntryKey; + if (!secret) { + setError('Настройки 2FA не найдены. Попробуйте еще раз.'); + return; + } + + if (!code.trim()) { + setError('Введите корректный код.'); + return; + } + + setIsEnabling(true); + try { + await enable2FA({ secret, code: code.trim() }); + setSuccess('Двухфакторная аутентификация включена.'); + setCode(''); + if (onEnabled) { + await onEnabled(); + } + } catch { + setError('Не удалось включить 2FA. Попробуйте еще раз.'); + } finally { + setIsEnabling(false); + } + }; + + const isSubmitDisabled = isEnabling || !code.trim() || isLoadingSetup; + + return ( + + + + + + + + + Включить 2FA + + +
+ + {isLoadingSetup ? ( + Загрузка настроек... + ) : ( + <> + {setup?.qrCodeUrl && ( + 2FA QR code + )} + + Ключ настройки + + + + Код + setCode(event.target.value)} + /> + + + )} + {error && ( + + {error} + + )} + {success && ( + + {success} + + )} + +
+
+ + + + + + +
+
+
+ ); +}; + +export default EnableTwoFactorDialog; diff --git a/domains-frontend/src/components/dashboard/DomainList.tsx b/domains-frontend/src/components/dashboard/DomainList.tsx new file mode 100644 index 0000000..a0ed656 --- /dev/null +++ b/domains-frontend/src/components/dashboard/DomainList.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import type { DomainResponse } from '../../api/models'; +import { Button, Grid, GridItem, HStack, Stack, Text } from '@chakra-ui/react'; +import DateText from '../DateText'; +import { ArrowRight } from 'lucide-react'; + +type Props = { + domains: DomainResponse[]; +}; + +const DomainList = (props: Props) => { + return ( + + {props.domains.map((domain) => ( + + + {domain.fqdn} + + + + до {domain.expiresAt} + + + + + + + + + + ))} + + ); +}; + +export default DomainList; diff --git a/domains-frontend/src/components/dashboard/EventList.tsx b/domains-frontend/src/components/dashboard/EventList.tsx new file mode 100644 index 0000000..0c015aa --- /dev/null +++ b/domains-frontend/src/components/dashboard/EventList.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import type { DomainResponse } from '../../api/models'; +import { + Badge, + Button, + Grid, + GridItem, + HStack, + Stack, + Text, +} from '@chakra-ui/react'; +import DateText from '../DateText'; +import { ArrowRight, Proportions } from 'lucide-react'; +import type { Dayjs } from 'dayjs'; + +type Props = { + events: { + id: string; + type: 'SYSTEM' | 'USER'; + message: string; + at: string | Date | Dayjs; + }[]; +}; + +const EventList = (props: Props) => { + return ( + + {props.events.map((event) => ( + + + + {event.type === 'SYSTEM' ? 'Система' : 'Пользователь'} + + + {event.message} + + {event.at} + + + ))} + + ); +}; + +export default EventList; diff --git a/domains-frontend/src/components/domainsTable/DomainRow.tsx b/domains-frontend/src/components/domainsTable/DomainRow.tsx new file mode 100644 index 0000000..45adbff --- /dev/null +++ b/domains-frontend/src/components/domainsTable/DomainRow.tsx @@ -0,0 +1,29 @@ +import type { ReactNode } from 'react'; +import type { DomainQuery } from '../../api/models/DomainQuery'; +import { Button, Table, Text } from '@chakra-ui/react'; + +type Props = { + domain: DomainQuery; + buttonsFunction?: (domain: DomainQuery) => ReactNode; +}; + +const DomainRow = (props: Props) => { + const { domain, buttonsFunction } = props; + return ( + + {domain.fqdn} + {domain.price}₽ / месяц + + {buttonsFunction ? ( + buttonsFunction(domain) + ) : domain.free ? ( + + ) : ( + Домен занят + )} + + + ); +}; + +export default DomainRow; diff --git a/domains-frontend/src/components/domainsTable/DomainsTable.tsx b/domains-frontend/src/components/domainsTable/DomainsTable.tsx new file mode 100644 index 0000000..3901c0c --- /dev/null +++ b/domains-frontend/src/components/domainsTable/DomainsTable.tsx @@ -0,0 +1,39 @@ +import { Table } from '@chakra-ui/react'; +import React, { type ReactNode } from 'react'; +import type { DomainQuery } from '~/api/models/DomainQuery'; +import DomainRow from './DomainRow'; + +type Props = { + domains: DomainQuery[]; + buttonsFunction?: (domain: DomainQuery) => ReactNode; +}; + +const DomainsTable = (props: Props) => { + return ( + + + + + + Домен + + + Цена + + + + + + {props.domains.map((domain) => ( + + ))} + + + ); +}; + +export default DomainsTable; diff --git a/domains-frontend/src/components/layouts/AdminLayout.tsx b/domains-frontend/src/components/layouts/AdminLayout.tsx new file mode 100644 index 0000000..093904f --- /dev/null +++ b/domains-frontend/src/components/layouts/AdminLayout.tsx @@ -0,0 +1,123 @@ +import { + Box, + Grid, + GridItem, + Heading, + HStack, + Spinner, + Stack, +} from '@chakra-ui/react'; +import { useEffect, useLayoutEffect, useRef, useState } from 'react'; +import AppLink from '../AppLink'; +import { Outlet, useNavigate } from 'react-router'; +import { refreshToken as apiRefreshToken } from '~/api/services/auth'; +import { getAccessToken, getRefreshToken, setTokens } from '~/utils/authTokens'; + +const AdminLayout = () => { + const navigate = useNavigate(); + const [isAuthReady, setIsAuthReady] = useState(false); + const headerRef = useRef(null); + const navRef = useRef(null); + + useEffect(() => { + let isActive = true; + + const ensureAuth = async () => { + const accessToken = getAccessToken(); + if (accessToken) { + setIsAuthReady(true); + return; + } + + const refreshToken = getRefreshToken(); + if (!refreshToken) { + navigate('/'); + setIsAuthReady(true); + return; + } + + try { + const response = await apiRefreshToken({ refreshToken }); + const nextAccessToken = response?.data?.accessToken; + const nextRefreshToken = response?.data?.refreshToken ?? refreshToken; + + if (!nextAccessToken) { + navigate('/'); + setIsAuthReady(true); + return; + } + + setTokens({ access: nextAccessToken, refresh: nextRefreshToken }); + setIsAuthReady(true); + } catch { + if (isActive) { + navigate('/'); + } + setIsAuthReady(true); + } + }; + + ensureAuth(); + + return () => { + isActive = false; + }; + }, [navigate]); + + useLayoutEffect(() => { + if (navRef.current?.style.width) + navRef.current.style.width = headerRef.current?.offsetWidth + ? `${headerRef.current?.offsetWidth}px` + : 'auto'; + }, []); + + if (!isAuthReady) { + return ( + + + + ); + } + + return ( + + + + Хрофорс Домены + + + + + администратор + + + + + Домены + Пользователи + Финансы + События + Зоны + + + + + + + + + ); +}; + +export default AdminLayout; diff --git a/domains-frontend/src/components/layouts/AppLayout.tsx b/domains-frontend/src/components/layouts/AppLayout.tsx new file mode 100644 index 0000000..1dac9a3 --- /dev/null +++ b/domains-frontend/src/components/layouts/AppLayout.tsx @@ -0,0 +1,118 @@ +import { + Box, + Grid, + GridItem, + Heading, + HStack, + Spinner, + Stack, + Text, +} from '@chakra-ui/react'; +import { useEffect, useState } from 'react'; +import AppLink from '../AppLink'; +import { Outlet, useNavigate } from 'react-router'; +import { getAccessToken, getRefreshToken, setTokens } from '~/utils/authTokens'; +import { refreshToken as apiRefreshToken } from '~/api/services/auth'; +import { useStores } from '~/store'; + +const AppLayout = () => { + const navigate = useNavigate(); + const [isAuthReady, setIsAuthReady] = useState(false); + const { userStore } = useStores(); + const { fetchMe } = userStore; + + useEffect(() => { + let isActive = true; + + const ensureAuth = async () => { + const accessToken = getAccessToken(); + if (accessToken) { + setIsAuthReady(true); + return; + } + + const refreshToken = getRefreshToken(); + if (!refreshToken) { + navigate('/'); + setIsAuthReady(true); + return; + } + + try { + const response = await apiRefreshToken({ refreshToken }); + const nextAccessToken = response?.data?.accessToken; + const nextRefreshToken = response?.data?.refreshToken ?? refreshToken; + + if (!nextAccessToken) { + navigate('/'); + setIsAuthReady(true); + return; + } + + setTokens({ access: nextAccessToken, refresh: nextRefreshToken }); + fetchMe(); + setIsAuthReady(true); + } catch { + if (isActive) { + navigate('/'); + } + setIsAuthReady(true); + } + }; + + ensureAuth(); + + return () => { + isActive = false; + }; + }, [navigate]); + + if (!isAuthReady) { + return ( + + + + ); + } + + return ( + + + + Хрофорс Домены + + + + + пользователь + + + + + Домены + DNS + Корзина + События + + + + + + + + + ); +}; + +export default AppLayout; diff --git a/domains-frontend/src/components/layouts/AuthLayout.tsx b/domains-frontend/src/components/layouts/AuthLayout.tsx new file mode 100644 index 0000000..3ae4831 --- /dev/null +++ b/domains-frontend/src/components/layouts/AuthLayout.tsx @@ -0,0 +1,19 @@ +import { Stack } from '@chakra-ui/react'; +import { Outlet } from 'react-router'; + +const AuthLayout = () => { + return ( + + + + + + ); +}; + +export default AuthLayout; diff --git a/domains-frontend/src/components/layouts/Layout.tsx b/domains-frontend/src/components/layouts/Layout.tsx new file mode 100644 index 0000000..2f8d2ee --- /dev/null +++ b/domains-frontend/src/components/layouts/Layout.tsx @@ -0,0 +1,18 @@ +import { Provider } from '../ui/provider.tsx'; +import { Outlet } from 'react-router'; +import { Toaster } from '../ui/toaster.tsx'; +import 'dayjs/locale/ru'; +import { StoreProvider } from '~/store/index.tsx'; + +const Layout = () => { + return ( + + + + + + + ); +}; + +export default Layout; diff --git a/domains-frontend/src/components/layouts/PublicLayout.tsx b/domains-frontend/src/components/layouts/PublicLayout.tsx new file mode 100644 index 0000000..30bbfac --- /dev/null +++ b/domains-frontend/src/components/layouts/PublicLayout.tsx @@ -0,0 +1,37 @@ +import { Button, Heading, HStack, Stack } from '@chakra-ui/react'; +import { Outlet, useNavigate } from 'react-router'; +import AppLink from '../AppLink'; + +const PublicLayout = () => { + const navigate = useNavigate(); + + return ( + + + + Хрофорс Домены + + + + + + Контакты + Политика конфиденциальности + Правила использования + + + ); +}; + +export default PublicLayout; diff --git a/domains-frontend/src/components/ui/color-mode.tsx b/domains-frontend/src/components/ui/color-mode.tsx new file mode 100644 index 0000000..b1dd9f5 --- /dev/null +++ b/domains-frontend/src/components/ui/color-mode.tsx @@ -0,0 +1,108 @@ +'use client'; + +import type { IconButtonProps, SpanProps } from '@chakra-ui/react'; +import { ClientOnly, IconButton, Skeleton, Span } from '@chakra-ui/react'; +import { ThemeProvider, useTheme } from 'next-themes'; +import type { ThemeProviderProps } from 'next-themes'; +import * as React from 'react'; +import { LuMoon, LuSun } from 'react-icons/lu'; + +export interface ColorModeProviderProps extends ThemeProviderProps {} + +export function ColorModeProvider(props: ColorModeProviderProps) { + return ( + + ); +} + +export type ColorMode = 'light' | 'dark'; + +export interface UseColorModeReturn { + colorMode: ColorMode; + setColorMode: (colorMode: ColorMode) => void; + toggleColorMode: () => void; +} + +export function useColorMode(): UseColorModeReturn { + const { resolvedTheme, setTheme, forcedTheme } = useTheme(); + const colorMode = forcedTheme || resolvedTheme; + const toggleColorMode = () => { + setTheme(resolvedTheme === 'dark' ? 'light' : 'dark'); + }; + return { + colorMode: colorMode as ColorMode, + setColorMode: setTheme, + toggleColorMode, + }; +} + +export function useColorModeValue(light: T, dark: T) { + const { colorMode } = useColorMode(); + return colorMode === 'dark' ? dark : light; +} + +export function ColorModeIcon() { + const { colorMode } = useColorMode(); + return colorMode === 'dark' ? : ; +} + +interface ColorModeButtonProps extends Omit {} + +export const ColorModeButton = React.forwardRef< + HTMLButtonElement, + ColorModeButtonProps +>(function ColorModeButton(props, ref) { + const { toggleColorMode } = useColorMode(); + return ( + }> + + + + + ); +}); + +export const LightMode = React.forwardRef( + function LightMode(props, ref) { + return ( + + ); + } +); + +export const DarkMode = React.forwardRef( + function DarkMode(props, ref) { + return ( + + ); + } +); diff --git a/domains-frontend/src/components/ui/provider.tsx b/domains-frontend/src/components/ui/provider.tsx new file mode 100644 index 0000000..e3e4f2c --- /dev/null +++ b/domains-frontend/src/components/ui/provider.tsx @@ -0,0 +1,13 @@ +'use client'; + +import { ChakraProvider } from '@chakra-ui/react'; +import { ColorModeProvider, type ColorModeProviderProps } from './color-mode'; +import { system } from '../../theme'; + +export function Provider(props: ColorModeProviderProps) { + return ( + + + + ); +} diff --git a/domains-frontend/src/components/ui/toaster.tsx b/domains-frontend/src/components/ui/toaster.tsx new file mode 100644 index 0000000..8032ce7 --- /dev/null +++ b/domains-frontend/src/components/ui/toaster.tsx @@ -0,0 +1,43 @@ +'use client'; + +import { + Toaster as ChakraToaster, + Portal, + Spinner, + Stack, + Toast, + createToaster, +} from '@chakra-ui/react'; + +export const toaster = createToaster({ + placement: 'bottom-end', + pauseOnPageIdle: true, +}); + +export const Toaster = () => { + return ( + + + {(toast) => ( + + {toast.type === 'loading' ? ( + + ) : ( + + )} + + {toast.title && {toast.title}} + {toast.description && ( + {toast.description} + )} + + {toast.action && ( + {toast.action.label} + )} + {toast.closable && } + + )} + + + ); +}; diff --git a/domains-frontend/src/components/ui/tooltip.tsx b/domains-frontend/src/components/ui/tooltip.tsx new file mode 100644 index 0000000..e92d201 --- /dev/null +++ b/domains-frontend/src/components/ui/tooltip.tsx @@ -0,0 +1,46 @@ +import { Tooltip as ChakraTooltip, Portal } from '@chakra-ui/react'; +import * as React from 'react'; + +export interface TooltipProps extends ChakraTooltip.RootProps { + showArrow?: boolean; + portalled?: boolean; + portalRef?: React.RefObject; + content: React.ReactNode; + contentProps?: ChakraTooltip.ContentProps; + disabled?: boolean; +} + +export const Tooltip = React.forwardRef( + function Tooltip(props, ref) { + const { + showArrow, + children, + disabled, + portalled = true, + content, + contentProps, + portalRef, + ...rest + } = props; + + if (disabled) return children; + + return ( + + {children} + + + + {showArrow && ( + + + + )} + {content} + + + + + ); + } +); diff --git a/domains-frontend/src/env.d.ts b/domains-frontend/src/env.d.ts new file mode 100644 index 0000000..698ba8b --- /dev/null +++ b/domains-frontend/src/env.d.ts @@ -0,0 +1,11 @@ +/// + +/** + * Imports the SVG file as a React component. + * @requires [@rsbuild/plugin-svgr](https://npmjs.com/package/@rsbuild/plugin-svgr) + */ +declare module '*.svg?react' { + import type React from 'react'; + const ReactComponent: React.FunctionComponent>; + export default ReactComponent; +} diff --git a/domains-frontend/src/index.tsx b/domains-frontend/src/index.tsx new file mode 100644 index 0000000..9fe74fd --- /dev/null +++ b/domains-frontend/src/index.tsx @@ -0,0 +1,15 @@ +import '@fontsource-variable/jost'; +import '@fontsource/golos-text'; +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; + +const rootEl = document.getElementById('root'); +if (rootEl) { + const root = ReactDOM.createRoot(rootEl); + root.render( + // + + // + ); +} diff --git a/domains-frontend/src/pages/CheckDomainPage.tsx b/domains-frontend/src/pages/CheckDomainPage.tsx new file mode 100644 index 0000000..abca09b --- /dev/null +++ b/domains-frontend/src/pages/CheckDomainPage.tsx @@ -0,0 +1,82 @@ +import { Button, HStack, Input, Stack, Table, Text } from '@chakra-ui/react'; +import { useCallback, useEffect, useState, type FormEvent } from 'react'; +import { useSearchParams } from 'react-router'; +import DomainRow from '../components/domainsTable/DomainRow'; +import { validateDomain } from '../utils/validateDomain'; +import { $ok } from '../common/atoms'; +import DomainsTable from '~/components/domainsTable/DomainsTable'; + +const CheckDomainPage = () => { + const [searchParams, _] = useSearchParams(); + const query = searchParams.get('q'); + const [input, setInput] = useState(query ?? ''); + const [error, setError] = useState(''); + + const [domains, setDomains] = useState( + query + ? ['.goip.pw', '.godns.pw', '.gofrom.pw'].map((domain) => ({ + fqdn: `${query}${domain}`, + price: 50, + free: Math.random() > 0.5, + })) + : [] + ); + + const fetchDomains = (domain: string) => { + console.log('Fetch Domains'); + + // TODO Fetch domains + }; + + const handleSubmit = useCallback( + (e: FormEvent) => { + e.preventDefault(); + + const domain = input.trim().toLocaleLowerCase(); + const [result, reason] = validateDomain(domain); + + if (result === $ok) { + fetchDomains(domain); + } else { + setError(reason); + } + }, + [input] + ); + + useEffect(() => { + if (!query) return; + + fetchDomains(query); + }, []); + + return ( + +
+ + { + setInput(e.target.value); + setError(''); + }} + /> + + + {error && ( + + {error} + + )} +
+ +
+ ); +}; + +export default CheckDomainPage; diff --git a/domains-frontend/src/pages/NotFound.tsx b/domains-frontend/src/pages/NotFound.tsx new file mode 100644 index 0000000..43e8d76 --- /dev/null +++ b/domains-frontend/src/pages/NotFound.tsx @@ -0,0 +1,29 @@ +import { Heading, Link, Stack } from '@chakra-ui/react'; +import React from 'react'; +import { Link as RLink } from 'react-router'; + +type Props = { + fullPage?: boolean; +}; + +const NotFound = (props: Props) => { + return ( + + + 404 + + Такой страницы не существует + {/* @ts-ignore */} + + Вернуться на главную + + + ); +}; + +export default NotFound; diff --git a/domains-frontend/src/pages/WelcomePage.tsx b/domains-frontend/src/pages/WelcomePage.tsx new file mode 100644 index 0000000..20f06fc --- /dev/null +++ b/domains-frontend/src/pages/WelcomePage.tsx @@ -0,0 +1,103 @@ +import { Box, Button, HStack, Input, Stack, Text } from '@chakra-ui/react'; +import { useCallback, useEffect, useState, type FormEvent } from 'react'; +import { useNavigate } from 'react-router'; +import { validateDomain } from '../utils/validateDomain'; +import { $ok } from '../common/atoms'; + +const WelcomePage = () => { + const [input, setInput] = useState(''); + const [error, setError] = useState(''); + const domains = ['.goip.pw', '.godns.pw', '.gofrom.pw']; + const [domainIndex, setDomainIndex] = useState(0); + const [isFading, setIsFading] = useState(false); + const navigate = useNavigate(); + + useEffect(() => { + const intervalId = setInterval(() => { + setIsFading(true); + const timeoutId = setTimeout(() => { + setDomainIndex((prev) => (prev + 1) % domains.length); + setIsFading(false); + }, 300); + + return () => clearTimeout(timeoutId); + }, 4000); + + return () => clearInterval(intervalId); + }, [domains.length]); + + const handleSubmit = useCallback( + (e: FormEvent) => { + e.preventDefault(); + const domain = input.trim().toLocaleLowerCase(); + const [result, reason] = validateDomain(domain); + if (result === $ok) { + navigate(`/check-domain?q=${domain}`); + } else { + setError(reason); + } + }, + [input] + ); + + return ( + + + + Проверьте доступность домена + +
+ + + { + setInput(e.target.value); + if (error) setError(''); + }} + /> + + + {domains[domainIndex]} + + + + + + {error && ( + + {error} + + )} +
+
+
+ ); +}; + +export default WelcomePage; diff --git a/domains-frontend/src/pages/admin/AdminDashboardPage.tsx b/domains-frontend/src/pages/admin/AdminDashboardPage.tsx new file mode 100644 index 0000000..416990f --- /dev/null +++ b/domains-frontend/src/pages/admin/AdminDashboardPage.tsx @@ -0,0 +1,83 @@ +import { + Box, + Button, + Heading, + HStack, + Input, + Stack, + Text, +} from '@chakra-ui/react'; + +const AdminDashboardPage = () => { + return ( + + Админ-панель + + + Кол-во пользователей + + 1135 + + + + + Кол-во доменов + + 115 + + + + + Оборот за неделю + + 1555 рублей + + + + + Оборот за месяц + + 15550 рублей + + + + + + Отчёт + + С + + по + + + + + + ); +}; + +export default AdminDashboardPage; diff --git a/domains-frontend/src/pages/admin/FinancesPage.tsx b/domains-frontend/src/pages/admin/FinancesPage.tsx new file mode 100644 index 0000000..77fd225 --- /dev/null +++ b/domains-frontend/src/pages/admin/FinancesPage.tsx @@ -0,0 +1,85 @@ +import { + Button, + Grid, + GridItem, + Heading, + HStack, + Stack, + Text, +} from '@chakra-ui/react'; +import React from 'react'; +import DateText from '~/components/DateText'; + +const FinancesPage = () => { + return ( + + Финансы + + Оборот за месяц: 18514 рублей + Оборот за неделю: 1321 рублей + + + + Счета + + + пользователь + + + операция + + + статус + + + дата + + + сумма + + + + ivain@zinch.me + поступление(карта) + совершена + + {new Date()} + + 1500 рублей + + + + + + + ivain@zinch.me + поступление(карта) + ожидание оплаты + + {new Date()} + + 1500 рублей + + + + + + + + + ); +}; + +export default FinancesPage; diff --git a/domains-frontend/src/pages/admin/SystemEventsPage.tsx b/domains-frontend/src/pages/admin/SystemEventsPage.tsx new file mode 100644 index 0000000..021550e --- /dev/null +++ b/domains-frontend/src/pages/admin/SystemEventsPage.tsx @@ -0,0 +1,37 @@ +import { Grid, GridItem, Heading, Stack, Text } from '@chakra-ui/react'; +import DateText from '~/components/DateText'; + +const SystemEventsPage = () => { + return ( + + События + + + пользователь + + + действие + + + дата + + + ivan@zinch.me + покупка домена some.godns.pw + + {new Date()} + + + + ); +}; + +export default SystemEventsPage; diff --git a/domains-frontend/src/pages/admin/UsersDomainsPage.tsx b/domains-frontend/src/pages/admin/UsersDomainsPage.tsx new file mode 100644 index 0000000..066c541 --- /dev/null +++ b/domains-frontend/src/pages/admin/UsersDomainsPage.tsx @@ -0,0 +1,79 @@ +import { + Button, + Grid, + GridItem, + Heading, + HStack, + Stack, + Text, +} from '@chakra-ui/react'; +import React from 'react'; +import DateText from '~/components/DateText'; + +const UsersDomainsPage = () => { + return ( + + + Домены + + + + + + домен + + + пользователь + + + истекает + + + + hello.example.com + hello@zinch.com + + {new Date(2026, 1, 3)} + + + + + + + + + omg.example.com + omg@zinch.com + + {new Date(2026, 3, 3)} + + + + + + + + + + ); +}; + +export default UsersDomainsPage; diff --git a/domains-frontend/src/pages/admin/UsersPage.tsx b/domains-frontend/src/pages/admin/UsersPage.tsx new file mode 100644 index 0000000..0685feb --- /dev/null +++ b/domains-frontend/src/pages/admin/UsersPage.tsx @@ -0,0 +1,61 @@ +import { + Button, + Grid, + GridItem, + Heading, + HStack, + Stack, + Text, +} from '@chakra-ui/react'; + +const UsersPage = () => { + return ( + + Пользователи + + + + Email + + + кол-во доменов + + + + some@email.com + 5 + + + + + + + + another@email.com + 7 + + + + + + + + + + ); +}; + +export default UsersPage; diff --git a/domains-frontend/src/pages/app/CartPage.tsx b/domains-frontend/src/pages/app/CartPage.tsx new file mode 100644 index 0000000..c5b192d --- /dev/null +++ b/domains-frontend/src/pages/app/CartPage.tsx @@ -0,0 +1,280 @@ +import { + Box, + Button, + Field, + Heading, + HStack, + Input, + Stack, + Text, +} from '@chakra-ui/react'; +import { useCallback, useEffect, useMemo, useState, type FormEvent } from 'react'; +import type { DomainQuery } from '~/api/models/DomainQuery'; +import { RecordType, type Zone as ExdnsZone } from '~/api/models/exdns'; +import { + AddCartItemRequestAction, + AddCartItemRequestTerm, +} from '~/api/models/domain-order'; +import { + addItem, + clearCart, + createDomain, + getCart, + getZoneByName, + removeItem, + searchDomains, +} from '~/api/services/domain-order'; +import { postZonesDomain } from '~/api/services/exdns'; +import DomainsTable from '~/components/domainsTable/DomainsTable'; + +type CartDomain = DomainQuery & { itemId?: string }; + +type DomainSearchItem = { + fqdn?: string; + price?: number; + free?: boolean; +}; + +type CartItem = { + id?: string; + fqdn?: string; + price?: number; +}; + +const mapCartItems = (items: CartItem[]): CartDomain[] => + items.map((item) => ({ + itemId: item.id, + fqdn: item.fqdn ?? '', + price: item.price ?? 0, + free: false, + })); + +const mapSearchItems = (items: DomainSearchItem[]): DomainQuery[] => + items.map((item) => ({ + fqdn: item.fqdn ?? '', + price: item.price ?? 0, + free: Boolean(item.free), + })); + +const resolveZoneId = async (fqdn: string) => { + const parts = fqdn.split('.').filter(Boolean); + if (parts.length <= 2) return ''; + + const zoneName = `${parts[parts.length - 2]}.${parts[parts.length - 1]}`; + const zoneResponse = await getZoneByName(zoneName); + return zoneResponse?.data?.id ?? ''; +}; + +const buildZonePayload = (fqdn: string): ExdnsZone => ({ + name: fqdn, + version: 1, + records: [ + { + name: '@', + type: RecordType.A, + ttl: 300, + data: '127.0.0.1', + }, + ], +}); + +const CartPage = () => { + const [query, setQuery] = useState(''); + const [cartDomains, setCartDomains] = useState([]); + const [domains, setDomains] = useState([]); + const [isCartLoading, setIsCartLoading] = useState(false); + const [isSearchLoading, setIsSearchLoading] = useState(false); + const [error, setError] = useState(''); + + const cartCount = useMemo(() => cartDomains.length, [cartDomains]); + + const loadCart = useCallback(async () => { + setIsCartLoading(true); + setError(''); + + try { + const response = await getCart(); + const items = response?.data?.items ?? []; + setCartDomains(mapCartItems(items)); + } catch { + setError('Не удалось загрузить корзину. Попробуйте еще раз.'); + } finally { + setIsCartLoading(false); + } + }, []); + + useEffect(() => { + loadCart(); + }, [loadCart]); + + const handleSubmit = useCallback( + async (e: FormEvent) => { + e.preventDefault(); + const search = query.trim(); + if (!search) return; + + setIsSearchLoading(true); + setError(''); + + try { + const response = await searchDomains({ query: search }); + const items = response?.data ?? []; + setDomains(mapSearchItems(items)); + } catch { + setError('Не удалось выполнить поиск доменов. Попробуйте еще раз.'); + } finally { + setIsSearchLoading(false); + } + }, + [query] + ); + + const handlePurchase = useCallback(async () => { + if (cartDomains.length === 0) return; + + setIsCartLoading(true); + setError(''); + + try { + for (const domain of cartDomains) { + const fqdn = domain.fqdn.trim(); + if (!fqdn) continue; + + const zoneId = await resolveZoneId(fqdn); + if (!zoneId) { + throw new Error('zone'); + } + + const expiresAt = new Date(); + expiresAt.setFullYear(expiresAt.getFullYear() + 1); + + await createDomain({ + fqdn, + zoneId, + expiresAt: expiresAt.toISOString(), + }); + await postZonesDomain(fqdn, buildZonePayload(fqdn)); + } + + await clearCart(); + setCartDomains([]); + } catch { + setError('Не удалось оформить покупку. Попробуйте еще раз.'); + } finally { + setIsCartLoading(false); + } + }, [cartDomains]); + + const handleAddToCart = useCallback( + async (domain: DomainQuery) => { + if (!domain.free) return; + + setIsCartLoading(true); + setError(''); + + try { + await addItem({ + action: AddCartItemRequestAction.register, + term: AddCartItemRequestTerm.yearly, + fqdn: domain.fqdn, + price: domain.price, + }); + await loadCart(); + } catch { + setError('Не удалось добавить домен в корзину. Попробуйте еще раз.'); + } finally { + setIsCartLoading(false); + } + }, + [loadCart] + ); + + const handleRemoveFromCart = useCallback(async (domain: CartDomain) => { + if (!domain.itemId) return; + + setIsCartLoading(true); + setError(''); + + try { + await removeItem(domain.itemId); + setCartDomains((prev) => prev.filter((item) => item.itemId !== domain.itemId)); + } catch { + setError('Не удалось удалить домен из корзины. Попробуйте еще раз.'); + } finally { + setIsCartLoading(false); + } + }, []); + + return ( + + + Корзина + + {cartCount} доменов + + + +
+ + + Домен + setQuery(e.target.value)} + /> + + + +
+ {error && ( + + {error} + + )} + ( + + )} + /> + + Доступные домены + + domain.free ? ( + + ) : ( + Недоступен + ) + } + /> +
+ ); +}; + +export default CartPage; diff --git a/domains-frontend/src/pages/app/DNSPage.tsx b/domains-frontend/src/pages/app/DNSPage.tsx new file mode 100644 index 0000000..2332013 --- /dev/null +++ b/domains-frontend/src/pages/app/DNSPage.tsx @@ -0,0 +1,210 @@ +import { + Accordion, + Box, + Button, + createListCollection, + Field, + Grid, + GridItem, + Heading, + HStack, + Input, + InputGroup, + Portal, + Select, + Stack, + Text, +} from '@chakra-ui/react'; + +const DNSPage = () => { + const frameworks = createListCollection({ + items: [ + { label: 'hello.zom.com', value: 'hello.zom.com' }, + { label: 'omg.com.com', value: 'omg.com.com' }, + { label: 'why.me.co', value: 'why.me.co' }, + { label: 'not.my.domain.com', value: 'not.my.domain.com' }, + ], + }); + + const DNSTypes = createListCollection({ + items: [ + { label: 'A', value: 'a' }, + { label: 'AAAA', value: 'aaaa' }, + { label: 'SOA', value: 'soa' }, + { label: 'CNAME', value: 'cname' }, + { label: 'TXT', value: 'txt' }, + { label: 'MX', value: 'mx' }, + { label: 'SRV', value: 'srv' }, + { label: 'CAA', value: 'caa' }, + ], + }); + + return ( + + DNS + + + Выберите домен + + + + + + + + + + + + {frameworks.items.map((framework) => ( + + {framework.label} + + + ))} + + + + + + + + + + + + Добавить запись + + + + + + + + Название + + + + + + Тип + + + + + + + + + + + + + + {DNSTypes.items.map((type) => ( + + {type.label} + + + ))} + + + + + + + + Значение + + + + + + + + + + + + + Записи + + + + + + + + + @ + + + + + + + A + 5.153.135.4 + + + + + TXT + gasvfcda + + + + + + + + + + + + www + + + + + + + A + 5.153.135.4 + + + + + TXT + gasvfcda + + + + + + + + + + + + + + + + ); +}; + +export default DNSPage; diff --git a/domains-frontend/src/pages/app/DashboardPage.tsx b/domains-frontend/src/pages/app/DashboardPage.tsx new file mode 100644 index 0000000..1b176d5 --- /dev/null +++ b/domains-frontend/src/pages/app/DashboardPage.tsx @@ -0,0 +1,62 @@ +import { Stack } from '@chakra-ui/react'; +import React from 'react'; +import AppLink from '../../components/AppLink'; +import { ArrowRight, MoveRight } from 'lucide-react'; +import dayjs from 'dayjs'; +import DomainList from '../../components/dashboard/DomainList'; +import EventList from '../../components/dashboard/EventList'; + +const DashboardPage = () => { + const domains = [ + { + id: 'e29d0a63-1e74-4d44-b433-59524ecc67ae', + fqdn: 'hello.example.com', + expiresAt: dayjs(new Date(2026, 1, 3)), + }, + { + id: '25c12320-addf-4a80-bce2-c10aa8be177f', + fqdn: 'hello.omg.com', + expiresAt: dayjs(new Date(2026, 2, 6)), + }, + { + id: 'e9a0b6d3-a82e-412f-861e-a313c4f3d91b', + fqdn: 'goodbye.example.com', + expiresAt: dayjs(new Date(2026, 2, 12)), + }, + ]; + + const events = [ + { + id: 'e9a0b6d3-a82e-412f-861e-a313c4f3d91b', + type: 'SYSTEM', + message: 'Что-то произошло', + at: dayjs(new Date(2026, 2, 12)), + }, + { + id: 'e9a0bvd3-a82e-412f-861e-a313c4f3d91b', + type: 'USER', + message: 'Выполнен вход в систему', + at: dayjs(new Date(2026, 2, 12)), + }, + ]; + + return ( + + + + Мои домены {' '} + + + + + + + Мои события {' '} + + + + + ); +}; + +export default DashboardPage; diff --git a/domains-frontend/src/pages/app/DomainsPage.tsx b/domains-frontend/src/pages/app/DomainsPage.tsx new file mode 100644 index 0000000..afad480 --- /dev/null +++ b/domains-frontend/src/pages/app/DomainsPage.tsx @@ -0,0 +1,54 @@ +import { Button, Heading, HStack, Stack, Text } from '@chakra-ui/react'; +import { useEffect, useState } from 'react'; +import type { DomainResponse } from '~/api/models/domain-order'; +import { getAllDomains } from '~/api/services/domain-order'; +import DomainList from '../../components/dashboard/DomainList'; + +const DomainsPage = () => { + const [domains, setDomains] = useState([]); + + useEffect(() => { + let isMounted = true; + + const loadDomains = async () => { + try { + const response = await getAllDomains({ + pageable: { + page: 0, + size: 50, + }, + }); + if (isMounted) { + setDomains(response?.data?.content ?? []); + } + } catch { + if (isMounted) { + setDomains([]); + } + } + }; + + loadDomains(); + + return () => { + isMounted = false; + }; + }, []); + + return ( + + + Мои домены + + 15 доменов + + + + + + ); +}; + +export default DomainsPage; diff --git a/domains-frontend/src/pages/app/EventsPage.tsx b/domains-frontend/src/pages/app/EventsPage.tsx new file mode 100644 index 0000000..5a31941 --- /dev/null +++ b/domains-frontend/src/pages/app/EventsPage.tsx @@ -0,0 +1,29 @@ +import { Heading, Stack } from '@chakra-ui/react'; +import dayjs from 'dayjs'; +import EventList from '~/components/dashboard/EventList'; + +const EventsPage = () => { + const events = [ + { + id: 'e9a0b6d3-a82e-412f-861e-a313c4f3d91b', + type: 'SYSTEM', + message: 'Что-то произошло', + at: dayjs(new Date(2026, 2, 12)), + }, + { + id: 'e9a0bvd3-a82e-412f-861e-a313c4f3d91b', + type: 'USER', + message: 'Выполнен вход в систему', + at: dayjs(new Date(2026, 2, 12)), + }, + ]; + + return ( + + События + + + ); +}; + +export default EventsPage; diff --git a/domains-frontend/src/pages/app/ProfilePage.tsx b/domains-frontend/src/pages/app/ProfilePage.tsx new file mode 100644 index 0000000..4cd9ae5 --- /dev/null +++ b/domains-frontend/src/pages/app/ProfilePage.tsx @@ -0,0 +1,84 @@ +import { + Box, + Button, + Grid, + GridItem, + Heading, + HStack, + Spinner, + Stack, + Text, + VStack, +} from '@chakra-ui/react'; +import { observer } from 'mobx-react-lite'; +import { useEffect, useState } from 'react'; +import { get2FAStatus } from '~/api/services/auth'; +import EnableTwoFactorDialog from '~/components/app/profile/EnableTwoFactorDialog'; +import { useStores } from '~/store'; + +const ProfilePage = observer(() => { + const { userStore } = useStores(); + const { user } = userStore; + + const [tfaStatus, setTfaStatus] = useState(undefined); + + useEffect(() => { + get2FAStatus().then((status) => setTfaStatus(Boolean(status.data))); + }, []); + + return ( + + Профиль + + + Данные + + + Email + {user?.email ?? '??'} + + {/* + + */} + + + + 2FA + + {tfaStatus === undefined && ( + + + + )} + {tfaStatus === true && ( + <> + + Подключена 2FA по TOTP + + + + + + )} + {tfaStatus === false && ( + <> + 2FA не подключена + setTfaStatus(true)} /> + + )} + + + + + {/* */} + {/* */} + + + + + ); +}); + +export default ProfilePage; diff --git a/domains-frontend/src/pages/auth/CheckEmailPage.tsx b/domains-frontend/src/pages/auth/CheckEmailPage.tsx new file mode 100644 index 0000000..8fba5a7 --- /dev/null +++ b/domains-frontend/src/pages/auth/CheckEmailPage.tsx @@ -0,0 +1,68 @@ +import { Heading, Stack, Text } from '@chakra-ui/react'; +import type { AxiosError } from 'axios'; +import { observer } from 'mobx-react-lite'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { resendVerificationEmail } from '~/api/services/auth'; +import { toaster } from '~/components/ui/toaster'; +import { useStores } from '~/store'; + +const CheckEmailPage = observer(() => { + const [wait, setWait] = useState(120); + const waitText = useMemo(() => `Через ${wait} секунд`, [wait]); + const { authStore: registrationStore } = useStores(); + + const handleClick = useCallback(() => { + if (wait > 0) return; + resendVerificationEmail({ email: registrationStore.email }) + .then(() => { + toaster.create({ + title: 'Отправлено подтверждающее письмо по электронной почте', + }); + }) + .catch((e: AxiosError<{ message: string }>) => { + toaster.create({ + title: 'Не удалось повторно отправить подтверждающее письмо', + description: e?.response?.data?.message, + type: 'error', + }); + }); + }, [registrationStore.email, wait]); + + useEffect(() => { + if (wait <= 0) return; + const intervalId = setInterval(() => { + setWait((prev) => (prev > 0 ? prev - 1 : 0)); + }, 1000); + + return () => clearInterval(intervalId); + }, [wait]); + + return ( + + Проверьте свою электронную почту + + Мы отправили подтверждающую ссылку на ваш адрес электронной почты. + Перейдите по ссылке, чтобы завершить регистрацию. + + + Если вы не получили электронное письмо, вы можете запросить новое.{' '} + 0 ? 'fg.subtle' : 'secondary.solid'} + > + Повторно отправить электронное письмо + {' '} + {waitText}. + + + Проверьте папку со спамом или попробуйте снова через несколько минут, + если письмо не пришло. + + + ); +}); + +export default CheckEmailPage; diff --git a/domains-frontend/src/pages/auth/ForgetPasswordPage.tsx b/domains-frontend/src/pages/auth/ForgetPasswordPage.tsx new file mode 100644 index 0000000..18a5307 --- /dev/null +++ b/domains-frontend/src/pages/auth/ForgetPasswordPage.tsx @@ -0,0 +1,56 @@ +import { + Button, + Field, + Heading, + HStack, + Input, + Stack, + Text, +} from '@chakra-ui/react'; +import AppLink from '../../components/AppLink'; +import { useCallback, useState, type FormEvent } from 'react'; + +const ForgetPasswordPage = () => { + const [email, setEmail] = useState(''); + + const handleSubmit = useCallback( + (e: FormEvent) => { + e.preventDefault(); + }, + [email] + ); + + return ( + + Сбросить пароль + + Введите свой адрес электронной почты, и мы вышлем вам ссылку для сброса + пароля. + +
+ + + + Email + + setEmail(e.target.value)} + /> + + + +
+ + Войти + +
+ ); +}; + +export default ForgetPasswordPage; diff --git a/domains-frontend/src/pages/auth/SignInPage.tsx b/domains-frontend/src/pages/auth/SignInPage.tsx new file mode 100644 index 0000000..1f53ba7 --- /dev/null +++ b/domains-frontend/src/pages/auth/SignInPage.tsx @@ -0,0 +1,136 @@ +import { + Alert, + Button, + Field, + Heading, + HStack, + Input, + Stack, +} from '@chakra-ui/react'; +import AppLink from '../../components/AppLink'; +import type { AxiosError } from 'axios'; +import { useNavigate, useSearchParams } from 'react-router'; +import { useForm } from 'react-hook-form'; +import { getUserById, login } from '~/api/services/auth'; +import { setTokens } from '~/utils/authTokens'; +import { useState } from 'react'; +import { useStores } from '~/store'; + +const SignInPage = () => { + const [params, _] = useSearchParams(); + const [error, setError] = useState(''); + const [isSubmitting, setIsSubmitting] = useState(false); + const { userStore, authStore } = useStores(); + + const navigate = useNavigate(); + const { register, handleSubmit } = useForm<{ + email: string; + password: string; + }>(); + + const onSubmit = handleSubmit(async (formData) => { + setIsSubmitting(true); + setError(''); + + try { + const response = await login({ + ...formData, + }); + const accessToken = response?.data?.accessToken; + const refreshToken = response?.data?.refreshToken; + const userId = response?.data?.userId; + + if (!accessToken || !refreshToken || !userId) { + setError( + response?.message ?? + 'Не удалось войти в систему. Проверьте свои учетные данные и повторите попытку.' + ); + return; + } + + setTokens({ access: accessToken, refresh: refreshToken }); + const user = await getUserById(userId); + if (user.data) userStore.setUser(user.data); + navigate('/app'); + } catch (e) { + const apiError = e as AxiosError<{ error: { message?: string, code?: string } }>; + if (apiError.response?.data?.error?.code === 'TOTP_REQUIRED') { + authStore.setEmail(formData.email); + authStore.setPassword(formData.password); + navigate('/auth/2fa/totp'); + return; + } + setError( + apiError?.response?.data?.error?.message ?? + 'Не удалось войти в систему. Проверьте свои учетные данные и повторите попытку.' + ); + } finally { + setIsSubmitting(false); + } + }); + + return ( + + Войти + + {params.has('success') && ( + + + + Учетная запись подтверждена + + Не удалось войти в систему. Проверьте свои учетные данные и + повторите попытку. + + + + )} + +
+ + {error && ( + + + + {error} + + + )} + + + Email + + + + + + Пароль + + + + + +
+ + Зарегистрироваться + Забыли пароль + +
+ ); +}; + +export default SignInPage; diff --git a/domains-frontend/src/pages/auth/SignUpPage.tsx b/domains-frontend/src/pages/auth/SignUpPage.tsx new file mode 100644 index 0000000..788f8a0 --- /dev/null +++ b/domains-frontend/src/pages/auth/SignUpPage.tsx @@ -0,0 +1,145 @@ +import { + Alert, + Button, + Checkbox, + Field, + Heading, + HStack, + Input, + Link, + Stack, +} from '@chakra-ui/react'; +import AppLink from '../../components/AppLink'; +import type { AxiosError } from 'axios'; +import { useNavigate } from 'react-router'; +import { useForm } from 'react-hook-form'; +import { register as apiRegister } from '~/api/services/auth'; +import { useState } from 'react'; +import { useStores } from '~/store'; + +const SignUpPage = () => { + const navigate = useNavigate(); + const [error, setError] = useState(''); + const [isSubmitting, setIsSubmitting] = useState(false); + const { authStore: registrationStore } = useStores(); + + const { register, handleSubmit, getValues } = useForm<{ + email: string; + password: string; + confirmPassword: string; + policyAccepted: boolean; + marketingAccepted: boolean; + }>(); + + const onSubmit = handleSubmit(async (data) => { + const email = data.email.trim().toLowerCase(); + setIsSubmitting(true); + setError(''); + + try { + await apiRegister({ + email, + password: data.password, + }); + registrationStore.setEmail(email); + navigate('/auth/check-email', { state: { email } }); + } catch (e) { + const apiError = e as AxiosError<{ message?: string }>; + setError( + apiError?.response?.data?.message ?? + 'Не удалось зарегистрироваться. Проверьте данные и попробуйте снова.' + ); + } finally { + setIsSubmitting(false); + } + }); + + return ( + + Регистрация +
+ + {error && ( + + + + {error} + + + )} + + + Email + + + + + + Пароль + + + + + + Подтверждение пароля + + value === getValues('password'), + })} + /> + + + + + + + Я принимаю условия сервиса и политику конфиденциальности.{' '} + + Условия + + + + + + + + Хочу получать маркетинговые рассылки.{' '} + + Политика рассылок + + + + + + +
+ + Вход + +
+ ); +}; + +export default SignUpPage; diff --git a/domains-frontend/src/pages/auth/TFAPage.tsx b/domains-frontend/src/pages/auth/TFAPage.tsx new file mode 100644 index 0000000..182eba7 --- /dev/null +++ b/domains-frontend/src/pages/auth/TFAPage.tsx @@ -0,0 +1,23 @@ +import { Button, Heading, Stack } from '@chakra-ui/react'; +import { Clock, KeyRound } from 'lucide-react'; +import React from 'react'; +import { useNavigate } from 'react-router'; + +const TFAPage = () => { + const navigate = useNavigate(); + + return ( + + Выберите метод двухфакторной аутентификации + + + + ); +}; + +export default TFAPage; diff --git a/domains-frontend/src/pages/auth/TFATotpPage.tsx b/domains-frontend/src/pages/auth/TFATotpPage.tsx new file mode 100644 index 0000000..e88fe0f --- /dev/null +++ b/domains-frontend/src/pages/auth/TFATotpPage.tsx @@ -0,0 +1,104 @@ +import { Alert, Button, Heading, HStack, PinInput, Stack } from '@chakra-ui/react'; +import type { AxiosError } from 'axios'; +import { observer } from 'mobx-react-lite'; +import { useEffect, useState, type FormEvent } from 'react'; +import { useNavigate } from 'react-router'; +import { getUserById, login } from '~/api/services/auth'; +import { useStores } from '~/store'; +import { setTokens } from '~/utils/authTokens'; + +const TFATotpPage = observer(() => { + const [value, setValue] = useState(['', '', '', '', '', '']); + const [error, setError] = useState(''); + const [isSubmitting, setIsSubmitting] = useState(false); + const { authStore, userStore } = useStores(); + const { email, password } = authStore; + const navigate = useNavigate(); + + useEffect(() => { + if (!email || !password) { + navigate('/auth/sign-in'); + } + }, [email, password, navigate]); + + const handleSubmit = async (event: FormEvent) => { + event.preventDefault(); + + const totpCode = value.join('').trim(); + if (totpCode.length !== 6) { + setError('Введите 6-значный код.'); + return; + } + + setIsSubmitting(true); + setError(''); + + try { + const response = await login({ + email, + password, + totpCode, + }); + const accessToken = response?.data?.accessToken; + const refreshToken = response?.data?.refreshToken; + const userId = response?.data?.userId; + + if (!accessToken || !refreshToken || !userId) { + setError(response?.message ?? 'Не удалось войти в систему. Повторите попытку.'); + return; + } + + setTokens({ access: accessToken, refresh: refreshToken }); + const user = await getUserById(userId); + if (user.data) userStore.setUser(user.data); + authStore.setEmail(''); + authStore.setPassword(''); + navigate('/app'); + } catch (e) { + const apiError = e as AxiosError<{ message?: string }>; + setError(apiError?.response?.data?.message ?? 'Не удалось войти в систему. Повторите попытку.'); + } finally { + setIsSubmitting(false); + } + }; + + return ( +
+ + Введите 6-значный код из приложения-аутентификатора. + {error && ( + + + + {error} + + + )} + + setValue(e.value)} + > + + + + + + + + + + + + + +
+ ); +}); + +export default TFATotpPage; diff --git a/domains-frontend/src/pages/auth/TFAWebAuthnPage.tsx b/domains-frontend/src/pages/auth/TFAWebAuthnPage.tsx new file mode 100644 index 0000000..5c070c2 --- /dev/null +++ b/domains-frontend/src/pages/auth/TFAWebAuthnPage.tsx @@ -0,0 +1,16 @@ +import { Button, Heading, Stack } from '@chakra-ui/react'; +import { KeyRound } from 'lucide-react'; +import React from 'react'; + +const TFAWebAuthnPage = () => { + return ( + + Пройдите аутентификацию при помощи PassKey + + + ); +}; + +export default TFAWebAuthnPage; diff --git a/domains-frontend/src/pages/auth/VerificateEmailPage.tsx b/domains-frontend/src/pages/auth/VerificateEmailPage.tsx new file mode 100644 index 0000000..1b78048 --- /dev/null +++ b/domains-frontend/src/pages/auth/VerificateEmailPage.tsx @@ -0,0 +1,53 @@ +import { Stack, Heading, Spinner, VStack, Text } from '@chakra-ui/react'; +import type { AxiosError } from 'axios'; +import React, { useEffect, useState } from 'react'; +import { useNavigate, useSearchParams } from 'react-router'; +import { verifyEmail } from '~/api/services/auth'; + +const VerificateEmailPage = () => { + const [param, _] = useSearchParams(); + const token = param.get('token'); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(''); + const navigate = useNavigate(); + + useEffect(() => { + if (!token) { + setError( + 'Проверка не удалась. Ссылка может быть недействительной или истекшим сроком действия.' + ); + setLoading(false); + return; + } + + verifyEmail({ token: token }) + .then(() => { + navigate('/auth/sign-in?success'); + }) + .catch((e: AxiosError<{ message: string }>) => { + setError( + e?.response?.data?.message ?? + 'Проверка не удалась. Ссылка может быть недействительной или истекшим сроком действия.' + ); + setLoading(false); + }); + }, [navigate, token]); + + return ( + + Подтверждение адреса электронной почты + {loading ? ( + + + + ) : ( + <> + Мы не смогли подтвердить ваш адрес электронной почты. + {error} + + )} + + ); +}; + +export default VerificateEmailPage; diff --git a/domains-frontend/src/pages/auth/ZonesPage.tsx b/domains-frontend/src/pages/auth/ZonesPage.tsx new file mode 100644 index 0000000..45363c7 --- /dev/null +++ b/domains-frontend/src/pages/auth/ZonesPage.tsx @@ -0,0 +1,82 @@ +import { Grid, GridItem, Heading, HStack, Stack, Text } from '@chakra-ui/react'; +import { Fragment, useCallback, useEffect, useState } from 'react'; +import type { Zone } from '~/api/models/domain-order'; +import { getAllZones } from '~/api/services/domain-order'; +import CreateZoneDialog from '~/components/admin/zones/CreateZoneDialog'; +import ManageZoneDialog from '~/components/admin/zones/ManageZoneDialog'; + +const ZonesPage = () => { + const [zones, setZones] = useState([]); + const [isLoading, setIsLoading] = useState(false); + + const loadZones = useCallback(async () => { + setIsLoading(true); + try { + const response = await getAllZones({ + pageable: { + page: 0, + size: 50, + }, + }); + setZones(response?.data?.content ?? []); + } catch { + setZones([]); + } finally { + setIsLoading(false); + } + }, []); + + useEffect(() => { + loadZones(); + }, [loadZones]); + + return ( + + + Зоны 2-го уровня + + {zones.length} зон + + + + {isLoading ? ( + Загрузка... + ) : ( + + + Зона + + + Цена + + + {zones.map((zone) => ( + + + {zone.name ?? '-'} + + + {`${zone.price ?? '-'} рублей / месяц`} + + + + + + + + ))} + + )} + + ); +}; + +export default ZonesPage; diff --git a/domains-frontend/src/router/index.tsx b/domains-frontend/src/router/index.tsx new file mode 100644 index 0000000..7ef13b0 --- /dev/null +++ b/domains-frontend/src/router/index.tsx @@ -0,0 +1,73 @@ +import { Route, Routes } from 'react-router'; +import WelcomePage from '../pages/WelcomePage.tsx'; +import Layout from '../components/layouts/Layout.tsx'; +import PublicLayout from '../components/layouts/PublicLayout.tsx'; +import CheckDomainPage from '../pages/CheckDomainPage.tsx'; +import NotFound from '../pages/NotFound.tsx'; +import AuthLayout from '../components/layouts/AuthLayout.tsx'; +import SignInPage from '../pages/auth/SignInPage.tsx'; +import SignUpPage from '../pages/auth/SignUpPage.tsx'; +import ForgetPasswordPage from '../pages/auth/ForgetPasswordPage.tsx'; +import CheckEmailPage from '../pages/auth/CheckEmailPage.tsx'; +import TFAPage from '../pages/auth/TFAPage.tsx'; +import TFATotpPage from '../pages/auth/TFATotpPage.tsx'; +import TFAWebAuthnPage from '../pages/auth/TFAWebAuthnPage.tsx'; +import VerificateEmailPage from '../pages/auth/VerificateEmailPage.tsx'; +import AppLayout from '../components/layouts/AppLayout.tsx'; +import DashboardPage from '../pages/app/DashboardPage.tsx'; +import DomainsPage from '../pages/app/DomainsPage.tsx'; +import EventsPage from '../pages/app/EventsPage.tsx'; +import CartPage from '../pages/app/CartPage.tsx'; +import DNSPage from '../pages/app/DNSPage.tsx'; +import ProfilePage from '../pages/app/ProfilePage.tsx'; +import AdminLayout from '~/components/layouts/AdminLayout.tsx'; +import AdminDashboardPage from '~/pages/admin/AdminDashboardPage.tsx'; +import UsersDomainsPage from '~/pages/admin/UsersDomainsPage.tsx'; +import UsersPage from '~/pages/admin/UsersPage.tsx'; +import SystemEventsPage from '~/pages/admin/SystemEventsPage.tsx'; +import FinancesPage from '~/pages/admin/FinancesPage.tsx'; +import ZonesPage from '~/pages/auth/ZonesPage.tsx'; + +const Index = () => { + return ( + + }> + } /> + }> + } /> + } /> + + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + }> + } /> + } /> + } /> + } /> + } /> + } /> + + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + ); +}; + +export default Index; diff --git a/domains-frontend/src/store/AutoStore.ts b/domains-frontend/src/store/AutoStore.ts new file mode 100644 index 0000000..067c85c --- /dev/null +++ b/domains-frontend/src/store/AutoStore.ts @@ -0,0 +1,18 @@ +import { makeAutoObservable } from 'mobx'; + +export class AuthStore { + email: string = ''; + password: string = ''; + + constructor() { + makeAutoObservable(this, {}, { autoBind: true }); + } + + setEmail(mail: string) { + this.email = mail; + } + + setPassword(p: string) { + this.password = p; + } +} diff --git a/domains-frontend/src/store/RootStore.ts b/domains-frontend/src/store/RootStore.ts new file mode 100644 index 0000000..a435a4c --- /dev/null +++ b/domains-frontend/src/store/RootStore.ts @@ -0,0 +1,12 @@ +import { AuthStore } from './AutoStore'; +import { UserStore } from './UserStore'; + +export class RootStore { + authStore: AuthStore; + userStore: UserStore; + + constructor() { + this.authStore = new AuthStore(); + this.userStore = new UserStore(); + } +} diff --git a/domains-frontend/src/store/UserStore.ts b/domains-frontend/src/store/UserStore.ts new file mode 100644 index 0000000..de62b5d --- /dev/null +++ b/domains-frontend/src/store/UserStore.ts @@ -0,0 +1,22 @@ +import { makeAutoObservable, runInAction } from 'mobx'; +import type { UserResponse } from '~/api/models/auth'; +import { getCurrentUser } from '~/api/services/auth'; + +export class UserStore { + user!: UserResponse; + + constructor() { + makeAutoObservable(this, {}, { autoBind: true }); + } + + setUser(user: UserResponse) { + this.user = user; + } + + async fetchMe() { + const user = await getCurrentUser(); + runInAction(() => { + if (user.data) this.user = user.data; + }); + } +} diff --git a/domains-frontend/src/store/index.tsx b/domains-frontend/src/store/index.tsx new file mode 100644 index 0000000..dada06c --- /dev/null +++ b/domains-frontend/src/store/index.tsx @@ -0,0 +1,11 @@ +import React, { createContext, useContext } from 'react'; +import { RootStore } from './RootStore'; + +const rootStore = new RootStore(); +const StoreContext = createContext(rootStore); + +export const StoreProvider = ({ children }: { children: React.ReactNode }) => ( + {children} +); + +export const useStores = () => useContext(StoreContext); diff --git a/domains-frontend/src/theme/index.ts b/domains-frontend/src/theme/index.ts new file mode 100644 index 0000000..b42b037 --- /dev/null +++ b/domains-frontend/src/theme/index.ts @@ -0,0 +1,68 @@ +import { createSystem, defaultConfig, defineConfig } from '@chakra-ui/react'; + +const config = defineConfig({ + theme: { + tokens: { + colors: { + accent: { + 50: { value: '#fdf9e6' }, + 100: { value: '#fbf1c8' }, + 200: { value: '#f7e79c' }, + 300: { value: '#f3dc6f' }, + 400: { value: '#f0d45f' }, + 500: { value: '#eed059' }, + 600: { value: '#d8b84f' }, + 700: { value: '#b3923f' }, + 800: { value: '#8b6f30' }, + 900: { value: '#6a5425' }, + }, + secondary: { + 50: { value: '#eef1ff' }, + 100: { value: '#d6defe' }, + 200: { value: '#b2c1fc' }, + 300: { value: '#8da4f8' }, + 400: { value: '#6f8cf3' }, + 500: { value: '#5976ee' }, + 600: { value: '#4e63d7' }, + 700: { value: '#3f4eb6' }, + 800: { value: '#323c8c' }, + 900: { value: '#262d69' }, + }, + }, + radii: { + sm: { value: '20px' }, + md: { value: '20px' }, + lg: { value: '20px' }, + xl: { value: '20px' }, + }, + fonts: { + heading: { value: "'Jest', 'Jost Variable', sans-serif" }, + body: { value: "'Golos Text', sans-serif" }, + }, + }, + semanticTokens: { + colors: { + accent: { + solid: { value: '{colors.accent.500}' }, + contrast: { value: '{colors.accent.900}' }, + fg: { value: '{colors.accent.700}' }, + muted: { value: '{colors.accent.100}' }, + subtle: { value: '{colors.accent.200}' }, + emphasized: { value: '{colors.accent.300}' }, + focusRing: { value: '{colors.accent.500}' }, + }, + secondary: { + solid: { value: '{colors.secondary.500}' }, + contrast: { value: 'white' }, + fg: { value: '{colors.secondary.700}' }, + muted: { value: '{colors.secondary.100}' }, + subtle: { value: '{colors.secondary.200}' }, + emphasized: { value: '{colors.secondary.300}' }, + focusRing: { value: '{colors.secondary.500}' }, + }, + }, + }, + }, +}); + +export const system = createSystem(defaultConfig, config); diff --git a/domains-frontend/src/types.d.ts b/domains-frontend/src/types.d.ts new file mode 100644 index 0000000..4ca5cd8 --- /dev/null +++ b/domains-frontend/src/types.d.ts @@ -0,0 +1,10 @@ +export {}; + +declare global { + interface Window { + _hrofors?: { + access?: string; + refresh?: string; + }; + } +} diff --git a/domains-frontend/src/utils/authTokens.ts b/domains-frontend/src/utils/authTokens.ts new file mode 100644 index 0000000..44d6696 --- /dev/null +++ b/domains-frontend/src/utils/authTokens.ts @@ -0,0 +1,60 @@ +type TokenState = { + access?: string; + refresh?: string; +}; + +const STORAGE_KEY = 'hrofors_refresh'; + +const getWindowStore = () => { + if (typeof window === 'undefined') { + return undefined; + } + + if (!window._hrofors) { + window._hrofors = {}; + } + + return window._hrofors; +}; + +const readStoredRefresh = () => { + if (typeof window === 'undefined') { + return undefined; + } + + return localStorage.getItem(STORAGE_KEY) || undefined; +}; + +export const getAccessToken = () => getWindowStore()?.access; + +export const getRefreshToken = () => { + const store = getWindowStore(); + const stored = readStoredRefresh(); + + if (store && !store.refresh && stored) { + store.refresh = stored; + } + + return store?.refresh ?? stored; +}; + +export const setTokens = ({ access, refresh }: TokenState) => { + const store = getWindowStore(); + + if (store) { + if (access !== undefined) { + store.access = access; + } + if (refresh !== undefined) { + store.refresh = refresh; + } + } + + if (typeof window !== 'undefined' && refresh !== undefined) { + if (refresh) { + localStorage.setItem(STORAGE_KEY, refresh); + } else { + localStorage.removeItem(STORAGE_KEY); + } + } +}; diff --git a/domains-frontend/src/utils/validateDomain.ts b/domains-frontend/src/utils/validateDomain.ts new file mode 100644 index 0000000..d2057a6 --- /dev/null +++ b/domains-frontend/src/utils/validateDomain.ts @@ -0,0 +1,17 @@ +import { $error, $ok } from '../common/atoms'; + +export const validateDomain = ( + domain: string +): [typeof $ok, string] | [typeof $error, string] => { + const regex = new RegExp( + '^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)(?:\\.(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?))*$', + 'i' + ); + if (domain.length === 0) + return [$error, 'Домен должен содержать хотя бы одну букву']; + if (domain.length > 63) + return [$error, 'Домен не может быть больше 63 символов']; + if (!regex.test(domain)) + return [$error, 'Домен содержит недопустимую последовательность символов']; + return [$ok, domain]; +}; diff --git a/domains-frontend/tsconfig.json b/domains-frontend/tsconfig.json new file mode 100644 index 0000000..a095d49 --- /dev/null +++ b/domains-frontend/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "lib": ["DOM", "ES2020"], + "jsx": "react-jsx", + "target": "ES2020", + "noEmit": true, + "skipLibCheck": true, + "useDefineForClassFields": true, + + /* modules */ + "module": "ESNext", + "moduleDetection": "force", + "moduleResolution": "bundler", + "verbatimModuleSyntax": true, + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "noUncheckedSideEffectImports": true, + + /* type checking */ + "strict": true, + + "paths": { + "~/*": ["./src/*"] + } + }, + "include": ["src"] +}