gitscope
← marzneshin / Diff · 2aca77e → 2aca77e
Changes 2aca77e..2aca77e
Patch commit
diff --git a/.github/workflows/dashboard-codeql.yml b/.github/workflows/dashboard-codeql.yml
index 236effa..4671d6f 100644
--- a/.github/workflows/dashboard-codeql.yml
+++ b/.github/workflows/dashboard-codeql.yml
@@ -15,11 +15,11 @@ on:
push:
branches: [ "master" ]
paths:
- - 'app/dashboard/**'
+ - 'dashboard/**'
pull_request:
branches: [ "master" ]
paths:
- - 'app/dashboard/**'
+ - 'dashboard/**'
schedule:
- cron: '40 13 * * 2'
diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml
index e5f7f93..f83bbf4 100644
--- a/.github/workflows/package.yml
+++ b/.github/workflows/package.yml
@@ -18,16 +18,16 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: '20.x'
- cache: 'npm'
- cache-dependency-path: 'app/dashboard/package-lock.json'
+ cache: 'pnpm'
+ cache-dependency-path: 'dashboard/pnpm-lock.json'
- name: Install dependencies
run: npm install
- working-directory: ./app/dashboard/
+ working-directory: ./dashboard/
- name: Build Dashboard
run: npm run build --if-present -- --outDir dist --base '/dashboard/'
- working-directory: ./app/dashboard/
+ working-directory: ./dashboard/
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
diff --git a/app/dashboard/.eslintignore b/app/dashboard/.eslintignore
deleted file mode 100644
index b4b77e9..0000000
--- a/app/dashboard/.eslintignore
+++ /dev/null
@@ -1,65 +0,0 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-
-# Runtime data
-pids
-*.pid
-*.seed
-*.pid.lock
-
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
-
-# Coverage directory used by tools like istanbul
-coverage
-
-# nyc test coverage
-.nyc_output
-
-# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
-.grunt
-
-# Bower dependency directory (https://bower.io/)
-bower_components
-
-# node-waf configuration
-.lock-wscript
-
-# Compiled binary addons (https://nodejs.org/api/addons.html)
-build/Release
-build/
-
-# Dependency directories
-node_modules/
-jspm_packages/
-
-# TypeScript v1 declaration files
-typings/
-
-# Optional npm cache directory
-.npm
-
-# Optional eslint cache
-.eslintcache
-
-# Optional REPL history
-.node_repl_history
-
-# Output of 'npm pack'
-*.tgz
-
-# Yarn Integrity file
-.yarn-integrity
-
-# dotenv environment variables file
-.env
-
-# next.js build output
-.next
-
-dist
-.idea
diff --git a/app/dashboard/.eslintrc.js b/app/dashboard/.eslintrc.js
deleted file mode 100644
index c80a10b..0000000
--- a/app/dashboard/.eslintrc.js
+++ /dev/null
@@ -1,39 +0,0 @@
-module.exports = {
- globals: {
- window: true,
- document: true,
- localStorage: true,
- module: true,
- HTMLDivElement: true,
- HTMLElement: true,
- SVGSVGElement: true,
- HTMLSelectElement: true,
- HTMLTextAreaElement: true,
- HTMLInputElement: true,
- },
- env: {
- es6: true,
- node: true,
- jest: true,
- },
- extends: 'eslint:recommended',
- parser: '@typescript-eslint/parser',
- plugins: ['@typescript-eslint'],
- parserOptions: {
- ecmaVersion: 2017,
- sourceType: 'module',
- },
- rules: {
- indent: ['error', 2],
- 'linebreak-style': ['error', 'unix'],
- quotes: ['error', 'single'],
- 'no-console': 'off',
- 'no-unused-vars': 'off',
- '@typescript-eslint/no-unused-vars': [
- 'error',
- { vars: 'all', args: 'after-used', ignoreRestSiblings: false },
- ],
- '@typescript-eslint/explicit-function-return-type': 'off',
- 'no-empty': 'warn',
- },
-};
diff --git a/app/dashboard/.eslintrc.json b/app/dashboard/.eslintrc.json
deleted file mode 100644
index 9b1fb59..0000000
--- a/app/dashboard/.eslintrc.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "extends": [
- "airbnb",
- "prettier",
- "prettier/react",
- "plugin:prettier/recommended",
- "plugin:jest/recommended",
- "plugin:unicorn/recommended"
- ],
- "plugins": [
- "prettier",
- "jest",
- "unicorn"
- ],
- "parserOptions": {
- "sourceType": "module",
- "ecmaFeatures": {
- "jsx": true
- }
- },
- "env": {
- "es6": true,
- "browser": true,
- "jest": true
- },
- "settings": {
- "import/resolver": {
- "node": {
- "extensions": [
- ".js",
- ".jsx",
- ".ts",
- ".tsx"
- ]
- }
- }
- },
- "overrides": [
- {
- "files": [
- "**/*.ts",
- "**/*.tsx"
- ],
- "parser": "typescript-eslint-parser",
- "rules": {
- "no-undef": "off"
- }
- }
- ]
-}
diff --git a/app/dashboard/README.md b/app/dashboard/README.md
deleted file mode 100644
index f0379b3..0000000
--- a/app/dashboard/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Dashboard UI for marzban
-
-## Requirements
-
-For development, you will only need Node.js installed on your environement.
-
-### Node
-
-[Node](http://nodejs.org/) is really easy to install & now include [NPM](https://npmjs.org/).
-This project has been developed on the Nodejs v16.17.0 so if you faced any issue during installation that may related to the node version, install Node with version >= v16.17.0.
-
-## Install
-
- git clone https://github.com/gozargah/marz-manager.git
- cd marz-manager
- yarn install
-
-### Configure app
-
-Copy `example.env` to `.env` then set the backend api address:
-
- VITE_BASE_API=https://somewhere.com/someapi
-
-#### Environment variables
-
-| Name | Description |
-| ------------- | ------------------------------------------------------------------------------------ |
-| VITE_BASE_API | The api url of the deployed backend ([Marzban](https://github.com/gozargah/Marzban)) |
-
-## Start development server
-
- yarn dev
-
-## Simple build for production
-
- yarn build
-
-## Contribution
-
-Feel free to contribute. Go on and fork the project. After commiting the changes, make a PR. It means a lot to us.
diff --git a/app/dashboard/chakra.config.ts b/app/dashboard/chakra.config.ts
deleted file mode 100644
index b69e327..0000000
--- a/app/dashboard/chakra.config.ts
+++ /dev/null
@@ -1,169 +0,0 @@
-import { extendTheme } from '@chakra-ui/react';
-export const theme = extendTheme({
- shadows: { outline: '0 0 0 2px var(--chakra-colors-primary-200)' },
- fonts: {
- body: 'Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif',
- },
- colors: {
- 'light-border': '#d2d2d4',
- 'dark-bg': '#1A202C',
- primary: {
- 50: '#9cb7f2',
- 100: '#88a9ef',
- 200: '#749aec',
- 300: '#618ce9',
- 400: '#4d7de7',
- 500: '#396fe4',
- 600: '#3364cd',
- 700: '#2e59b6',
- 800: '#284ea0',
- 900: '#224389',
- },
- gray: {
- 750: '#222C3B',
- },
- },
- components: {
- Alert: {
- baseStyle: {
- container: {
- borderRadius: '6px',
- fontSize: 'sm',
- },
- },
- },
- Select: {
- baseStyle: {
- field: {
- _dark: {
- borderColor: 'gray.600',
- borderRadius: '6px',
- },
- _light: {
- borderRadius: '6px',
- },
- },
- },
- },
- FormHelperText: {
- baseStyle: {
- fontSize: 'xs',
- },
- },
- FormLabel: {
- baseStyle: {
- fontSize: 'sm',
- fontWeight: 'medium',
- mb: '1',
- _dark: { color: 'gray.300' },
- },
- },
- Input: {
- baseStyle: {
- addon: {
- _dark: {
- borderColor: 'gray.600',
- _placeholder: {
- color: 'gray.500',
- },
- },
- },
- field: {
- _focusVisible: {
- boxShadow: 'none',
- borderColor: 'primary.200',
- outlineColor: 'primary.200',
- },
- _dark: {
- borderColor: 'gray.600',
- _disabled: {
- color: 'gray.400',
- borderColor: 'gray.500',
- },
- _placeholder: {
- color: 'gray.500',
- },
- },
- },
- },
- },
- Table: {
- baseStyle: {
- table: {
- borderCollapse: 'separate',
- borderSpacing: 0,
- },
- thead: {
- borderBottomColor: 'light-border',
- },
- th: {
- background: '#F9FAFB',
- borderColor: 'light-border !important',
- borderBottomColor: 'light-border !important',
- borderTop: '1px solid ',
- borderTopColor: 'light-border !important',
- _first: {
- borderLeft: '1px solid',
- borderColor: 'light-border !important',
- },
- _last: {
- borderRight: '1px solid',
- borderColor: 'light-border !important',
- },
- _dark: {
- borderColor: 'gray.600 !important',
- background: 'gray.750',
- },
- },
- td: {
- transition: 'all .1s ease-out',
- borderColor: 'light-border',
- borderBottomColor: 'light-border !important',
- _first: {
- borderLeft: '1px solid',
- borderColor: 'light-border',
- _dark: {
- borderColor: 'gray.600',
- },
- },
- _last: {
- borderRight: '1px solid',
- borderColor: 'light-border',
- _dark: {
- borderColor: 'gray.600',
- },
- },
- _dark: {
- borderColor: 'gray.600',
- borderBottomColor: 'gray.600 !important',
- },
- },
- tr: {
- '&.interactive': {
- cursor: 'pointer',
- _hover: {
- '& > td': {
- bg: 'gray.200',
- },
- _dark: {
- '& > td': {
- bg: 'gray.750',
- },
- },
- },
- },
- _last: {
- '& > td': {
- _first: {
- borderBottomLeftRadius: '8px',
- },
- _last: {
- borderBottomRightRadius: '8px',
- },
- },
- },
- },
- },
- },
- },
-});
diff --git a/app/dashboard/example.env b/app/dashboard/example.env
deleted file mode 100644
index 1409355..0000000
--- a/app/dashboard/example.env
+++ /dev/null
@@ -1 +0,0 @@
-VITE_BASE_API=
diff --git a/app/dashboard/index.html b/app/dashboard/index.html
deleted file mode 100644
index c21c605..0000000
--- a/app/dashboard/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html lang="en-us">
-
-<head>
- <meta charset="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <title>Marzneshin</title>
- <link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png" />
- <link rel="icon" type="image/png" sizes="32x32" href="/favicon/favicon-32x32.png" />
- <link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16x16.png" />
- <link rel="manifest" href="/favicon/site.webmanifest" />
- <link rel="mask-icon" href="/favicon/safari-pinned-tab.svg" color="#5bbad5" />
- <link rel="shortcut icon" href="/favicon/favicon.ico" />
- <meta name="apple-mobile-web-app-title" content="Marzban" />
- <meta name="application-name" content="Marzban" />
- <meta name="msapplication-TileColor" content="#2b5797" />
- <meta name="msapplication-config" content="/favicon/browserconfig.xml" />
- <meta name="theme-color" content="#3B81F6" />
-</head>
-
-<body>
- <div id="root"></div>
- <script type="module" src="/src/index.tsx"></script>
-</body>
-
-</html>
diff --git a/app/dashboard/package-lock.json b/app/dashboard/package-lock.json
deleted file mode 100644
index 3601178..0000000
--- a/app/dashboard/package-lock.json
+++ /dev/null
@@ -1,10645 +0,0 @@
-{
- "name": "marzneshin-dashboard",
- "version": "0.1.3",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "marzneshin-dashboard",
- "version": "0.1.3",
- "hasInstallScript": true,
- "dependencies": {
- "@chakra-ui/icons": "^2.1.1",
- "@chakra-ui/react": "^2.5.5",
- "@emotion/react": "^11.10.5",
- "@emotion/styled": "^11.10.5",
- "@heroicons/react": "^2.0.12",
- "@hookform/devtools": "^4.3.1",
- "@hookform/resolvers": "^2.9.10",
- "@tanstack/react-query-devtools": "^5.24.8",
- "apexcharts": "^3.40.0",
- "classnames": "^2.3.2",
- "dayjs": "^1.11.6",
- "eslint": "^8.56.0",
- "eslint-plugin-react": "^7.33.2",
- "framer-motion": "^7.6.6",
- "i18next": "^22.4.14",
- "i18next-browser-languagedetector": "^7.0.1",
- "i18next-http-backend": "^2.2.0",
- "jsoneditor": "^9.10.1",
- "lodash.debounce": "^4.0.8",
- "ohmyfetch": "^0.4.21",
- "qrcode.react": "^3.1.0",
- "react": "^18.2.0",
- "react-apexcharts": "^1.4.0",
- "react-copy-to-clipboard": "^5.1.0",
- "react-datepicker": "^4.8.0",
- "react-dom": "^18.2.0",
- "react-github-btn": "^1.4.0",
- "react-hook-form": "^7.39.1",
- "react-i18next": "^12.2.0",
- "react-json-editor-ajrm": "^2.5.14",
- "react-loading-skeleton": "^3.1.0",
- "react-query": "^3.39.3",
- "react-resizable-panels": "^2.0.9",
- "react-router-dom": "^6.4.3",
- "react-slick": "^0.29.0",
- "react-use-websocket": "^4.3.1",
- "rollup-plugin-visualizer": "^5.9.0",
- "slick-carousel": "^1.8.1",
- "vite-tsconfig-paths": "^4.0.3",
- "zod": "^3.19.1",
- "zustand": "^4.4.6",
- "zustand-computed": "^1.3.3"
- },
- "devDependencies": {
- "@chakra-ui/cli": "^2.3.0",
- "@types/jsoneditor": "^9.9.0",
- "@types/lodash.debounce": "^4.0.7",
- "@types/react": "^18.0.17",
- "@types/react-copy-to-clipboard": "^5.0.4",
- "@types/react-datepicker": "^4.8.0",
- "@types/react-dom": "^18.0.6",
- "@types/react-json-editor-ajrm": "^2.5.3",
- "@types/react-slick": "^0.23.10",
- "@typescript-eslint/eslint-plugin": "^6.19.1",
- "@typescript-eslint/parser": "^6.19.1",
- "@vitejs/plugin-react": "^2.1.0",
- "autoprefixer": "^10.4.12",
- "eslint-config-prettier": "^9.1.0",
- "eslint-plugin-import": "^2.29.1",
- "eslint-plugin-prettier": "^5.1.3",
- "eslint-plugin-react-hooks": "^4.6.0",
- "node-sass": "^9.0.0",
- "sass": "^1.70.0",
- "typescript": "^4.9.5",
- "vite": "^3.1.0",
- "vite-plugin-svgr": "^2.2.2"
- }
- },
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@ampproject/remapping": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
- "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
- "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
- "dependencies": {
- "@babel/highlight": "^7.23.4",
- "chalk": "^2.4.2"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
- "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz",
- "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==",
- "dev": true,
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.23.5",
- "@babel/generator": "^7.23.6",
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helpers": "^7.24.0",
- "@babel/parser": "^7.24.0",
- "@babel/template": "^7.24.0",
- "@babel/traverse": "^7.24.0",
- "@babel/types": "^7.24.0",
- "convert-source-map": "^2.0.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/core/node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true
- },
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/generator": {
- "version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
- "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.23.6",
- "@jridgewell/gen-mapping": "^0.3.2",
- "@jridgewell/trace-mapping": "^0.3.17",
- "jsesc": "^2.5.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
- "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
- "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
- "dev": true,
- "dependencies": {
- "@babel/compat-data": "^7.23.5",
- "@babel/helper-validator-option": "^7.23.5",
- "browserslist": "^4.22.2",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
- "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-function-name": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
- "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
- "dev": true,
- "dependencies": {
- "@babel/template": "^7.22.15",
- "@babel/types": "^7.23.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
- "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
- "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
- "dependencies": {
- "@babel/types": "^7.22.15"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
- "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
- "dev": true,
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-simple-access": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/helper-validator-identifier": "^7.22.20"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz",
- "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-simple-access": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
- "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
- "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
- "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
- "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
- "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz",
- "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==",
- "dev": true,
- "dependencies": {
- "@babel/template": "^7.24.0",
- "@babel/traverse": "^7.24.0",
- "@babel/types": "^7.24.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
- "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.22.20",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz",
- "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==",
- "dev": true,
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz",
- "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz",
- "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==",
- "dev": true,
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-jsx": "^7.23.3",
- "@babel/types": "^7.23.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-development": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz",
- "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==",
- "dev": true,
- "dependencies": {
- "@babel/plugin-transform-react-jsx": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-self": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz",
- "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-source": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz",
- "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz",
- "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz",
- "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.23.5",
- "@babel/parser": "^7.24.0",
- "@babel/types": "^7.24.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz",
- "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.23.5",
- "@babel/generator": "^7.23.6",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-hoist-variables": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.24.0",
- "@babel/types": "^7.24.0",
- "debug": "^4.3.1",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz",
- "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
- "dependencies": {
- "@babel/helper-string-parser": "^7.23.4",
- "@babel/helper-validator-identifier": "^7.22.20",
- "to-fast-properties": "^2.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@chakra-ui/accordion": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.3.1.tgz",
- "integrity": "sha512-FSXRm8iClFyU+gVaXisOSEw0/4Q+qZbFRiuhIAkVU6Boj0FxAMrlo9a8AV5TuF77rgaHytCdHk0Ng+cyUijrag==",
- "dependencies": {
- "@chakra-ui/descendant": "3.1.0",
- "@chakra-ui/icon": "3.2.0",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-use-controllable-state": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/transition": "2.1.0"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/alert": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.2.2.tgz",
- "integrity": "sha512-jHg4LYMRNOJH830ViLuicjb3F+v6iriE/2G5T+Sd0Hna04nukNJ1MxUmBPE+vI22me2dIflfelu2v9wdB6Pojw==",
- "dependencies": {
- "@chakra-ui/icon": "3.2.0",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/spinner": "2.1.0"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/anatomy": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.2.2.tgz",
- "integrity": "sha512-MV6D4VLRIHr4PkW4zMyqfrNS1mPlCTiCXwvYGtDFQYr+xHFfonhAuf9WjsSc0nyp2m0OdkSLnzmVKkZFLo25Tg=="
- },
- "node_modules/@chakra-ui/avatar": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.3.0.tgz",
- "integrity": "sha512-8gKSyLfygnaotbJbDMHDiJoF38OHXUYVme4gGxZ1fLnQEdPVEaIWfH+NndIjOM0z8S+YEFnT9KyGMUtvPrBk3g==",
- "dependencies": {
- "@chakra-ui/image": "2.1.0",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/breadcrumb": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.2.0.tgz",
- "integrity": "sha512-4cWCG24flYBxjruRi4RJREWTGF74L/KzI2CognAW/d/zWR0CjiScuJhf37Am3LFbCySP6WSoyBOtTIoTA4yLEA==",
- "dependencies": {
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/breakpoint-utils": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz",
- "integrity": "sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5"
- }
- },
- "node_modules/@chakra-ui/button": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-2.1.0.tgz",
- "integrity": "sha512-95CplwlRKmmUXkdEp/21VkEWgnwcx2TOBG6NfYlsuLBDHSLlo5FKIiE2oSi4zXc4TLcopGcWPNcm/NDaSC5pvA==",
- "dependencies": {
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/spinner": "2.1.0"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/card": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/card/-/card-2.2.0.tgz",
- "integrity": "sha512-xUB/k5MURj4CtPAhdSoXZidUbm8j3hci9vnc+eZJVDqhDOShNlD6QeniQNRPRys4lWAQLCbFcrwL29C8naDi6g==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/checkbox": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.3.2.tgz",
- "integrity": "sha512-85g38JIXMEv6M+AcyIGLh7igNtfpAN6KGQFYxY9tBj0eWvWk4NKQxvqqyVta0bSAyIl1rixNIIezNpNWk2iO4g==",
- "dependencies": {
- "@chakra-ui/form-control": "2.2.0",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.1.0",
- "@chakra-ui/react-use-controllable-state": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
- "@chakra-ui/react-use-update-effect": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/visually-hidden": "2.2.0",
- "@zag-js/focus-visible": "0.16.0"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/cli": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/cli/-/cli-2.4.1.tgz",
- "integrity": "sha512-GZZuHUA1cXJWpmYNiVTLPihvY4VhIssRl+AXgw/0IbeodTMop3jWlIioPKLAQeXu5CwvRA6iESyGjnu1V8Zykg==",
- "dev": true,
- "dependencies": {
- "chokidar": "^3.5.3",
- "cli-check-node": "^1.3.4",
- "cli-handle-unhandled": "^1.1.1",
- "cli-welcome": "^2.2.2",
- "commander": "^9.3.0",
- "esbuild": "^0.17.18",
- "prettier": "^2.8.8"
- },
- "bin": {
- "chakra-cli": "bin/index.js"
- }
- },
- "node_modules/@chakra-ui/cli/node_modules/prettier": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
- "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
- "dev": true,
- "bin": {
- "prettier": "bin-prettier.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/@chakra-ui/clickable": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.1.0.tgz",
- "integrity": "sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw==",
- "dependencies": {
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/close-button": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.1.1.tgz",
- "integrity": "sha512-gnpENKOanKexswSVpVz7ojZEALl2x5qjLYNqSQGbxz+aP9sOXPfUS56ebyBrre7T7exuWGiFeRwnM0oVeGPaiw==",
- "dependencies": {
- "@chakra-ui/icon": "3.2.0"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/color-mode": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.2.0.tgz",
- "integrity": "sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg==",
- "dependencies": {
- "@chakra-ui/react-use-safe-layout-effect": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/control-box": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.1.0.tgz",
- "integrity": "sha512-gVrRDyXFdMd8E7rulL0SKeoljkLQiPITFnsyMO8EFHNZ+AHt5wK4LIguYVEq88APqAGZGfHFWXr79RYrNiE3Mg==",
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/counter": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.1.0.tgz",
- "integrity": "sha512-s6hZAEcWT5zzjNz2JIWUBzRubo9la/oof1W7EKZVVfPYHERnl5e16FmBC79Yfq8p09LQ+aqFKm/etYoJMMgghw==",
- "dependencies": {
- "@chakra-ui/number-utils": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/css-reset": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.3.0.tgz",
- "integrity": "sha512-cQwwBy5O0jzvl0K7PLTLgp8ijqLPKyuEMiDXwYzl95seD3AoeuoCLyzZcJtVqaUZ573PiBdAbY/IlZcwDOItWg==",
- "peerDependencies": {
- "@emotion/react": ">=10.0.35",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/descendant": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.1.0.tgz",
- "integrity": "sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ==",
- "dependencies": {
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/dom-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.1.0.tgz",
- "integrity": "sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ=="
- },
- "node_modules/@chakra-ui/editable": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-3.1.0.tgz",
- "integrity": "sha512-j2JLrUL9wgg4YA6jLlbU88370eCRyor7DZQD9lzpY95tSOXpTljeg3uF9eOmDnCs6fxp3zDWIfkgMm/ExhcGTg==",
- "dependencies": {
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.1.0",
- "@chakra-ui/react-use-controllable-state": "2.1.0",
- "@chakra-ui/react-use-focus-on-pointer-down": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
- "@chakra-ui/react-use-update-effect": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/event-utils": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz",
- "integrity": "sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw=="
- },
- "node_modules/@chakra-ui/focus-lock": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.1.0.tgz",
- "integrity": "sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w==",
- "dependencies": {
- "@chakra-ui/dom-utils": "2.1.0",
- "react-focus-lock": "^2.9.4"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/form-control": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.2.0.tgz",
- "integrity": "sha512-wehLC1t4fafCVJ2RvJQT2jyqsAwX7KymmiGqBu7nQoQz8ApTkGABWpo/QwDh3F/dBLrouHDoOvGmYTqft3Mirw==",
- "dependencies": {
- "@chakra-ui/icon": "3.2.0",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/hooks": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.2.1.tgz",
- "integrity": "sha512-RQbTnzl6b1tBjbDPf9zGRo9rf/pQMholsOudTxjy4i9GfTfz6kgp5ValGjQm2z7ng6Z31N1cnjZ1AlSzQ//ZfQ==",
- "dependencies": {
- "@chakra-ui/react-utils": "2.0.12",
- "@chakra-ui/utils": "2.0.15",
- "compute-scroll-into-view": "3.0.3",
- "copy-to-clipboard": "3.3.3"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/icon": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.2.0.tgz",
- "integrity": "sha512-xxjGLvlX2Ys4H0iHrI16t74rG9EBcpFvJ3Y3B7KMQTrnW34Kf7Da/UC8J67Gtx85mTHW020ml85SVPKORWNNKQ==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/icons": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/icons/-/icons-2.1.1.tgz",
- "integrity": "sha512-3p30hdo4LlRZTT5CwoAJq3G9fHI0wDc0pBaMHj4SUn0yomO+RcDRlzhdXqdr5cVnzax44sqXJVnf3oQG0eI+4g==",
- "dependencies": {
- "@chakra-ui/icon": "3.2.0"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/image": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.1.0.tgz",
- "integrity": "sha512-bskumBYKLiLMySIWDGcz0+D9Th0jPvmX6xnRMs4o92tT3Od/bW26lahmV2a2Op2ItXeCmRMY+XxJH5Gy1i46VA==",
- "dependencies": {
- "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/input": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-2.1.2.tgz",
- "integrity": "sha512-GiBbb3EqAA8Ph43yGa6Mc+kUPjh4Spmxp1Pkelr8qtudpc3p2PJOOebLpd90mcqw8UePPa+l6YhhPtp6o0irhw==",
- "dependencies": {
- "@chakra-ui/form-control": "2.2.0",
- "@chakra-ui/object-utils": "2.1.0",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/layout": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.3.1.tgz",
- "integrity": "sha512-nXuZ6WRbq0WdgnRgLw+QuxWAHuhDtVX8ElWqcTK+cSMFg/52eVP47czYBE5F35YhnoW2XBwfNoNgZ7+e8Z01Rg==",
- "dependencies": {
- "@chakra-ui/breakpoint-utils": "2.0.8",
- "@chakra-ui/icon": "3.2.0",
- "@chakra-ui/object-utils": "2.1.0",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/lazy-utils": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz",
- "integrity": "sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg=="
- },
- "node_modules/@chakra-ui/live-region": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.1.0.tgz",
- "integrity": "sha512-ZOxFXwtaLIsXjqnszYYrVuswBhnIHHP+XIgK1vC6DePKtyK590Wg+0J0slDwThUAd4MSSIUa/nNX84x1GMphWw==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/media-query": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.3.0.tgz",
- "integrity": "sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g==",
- "dependencies": {
- "@chakra-ui/breakpoint-utils": "2.0.8",
- "@chakra-ui/react-env": "3.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/menu": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.2.1.tgz",
- "integrity": "sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g==",
- "dependencies": {
- "@chakra-ui/clickable": "2.1.0",
- "@chakra-ui/descendant": "3.1.0",
- "@chakra-ui/lazy-utils": "2.0.5",
- "@chakra-ui/popper": "3.1.0",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-use-animation-state": "2.1.0",
- "@chakra-ui/react-use-controllable-state": "2.1.0",
- "@chakra-ui/react-use-disclosure": "2.1.0",
- "@chakra-ui/react-use-focus-effect": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/react-use-outside-click": "2.2.0",
- "@chakra-ui/react-use-update-effect": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/transition": "2.1.0"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/modal": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.3.1.tgz",
- "integrity": "sha512-TQv1ZaiJMZN+rR9DK0snx/OPwmtaGH1HbZtlYt4W4s6CzyK541fxLRTjIXfEzIGpvNW+b6VFuFjbcR78p4DEoQ==",
- "dependencies": {
- "@chakra-ui/close-button": "2.1.1",
- "@chakra-ui/focus-lock": "2.1.0",
- "@chakra-ui/portal": "2.1.0",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/transition": "2.1.0",
- "aria-hidden": "^1.2.3",
- "react-remove-scroll": "^2.5.6"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/number-input": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.1.2.tgz",
- "integrity": "sha512-pfOdX02sqUN0qC2ysuvgVDiws7xZ20XDIlcNhva55Jgm095xjm8eVdIBfNm3SFbSUNxyXvLTW/YQanX74tKmuA==",
- "dependencies": {
- "@chakra-ui/counter": "2.1.0",
- "@chakra-ui/form-control": "2.2.0",
- "@chakra-ui/icon": "3.2.0",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.1.0",
- "@chakra-ui/react-use-event-listener": "2.1.0",
- "@chakra-ui/react-use-interval": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
- "@chakra-ui/react-use-update-effect": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/number-utils": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz",
- "integrity": "sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg=="
- },
- "node_modules/@chakra-ui/object-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.1.0.tgz",
- "integrity": "sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ=="
- },
- "node_modules/@chakra-ui/pin-input": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.1.0.tgz",
- "integrity": "sha512-x4vBqLStDxJFMt+jdAHHS8jbh294O53CPQJoL4g228P513rHylV/uPscYUHrVJXRxsHfRztQO9k45jjTYaPRMw==",
- "dependencies": {
- "@chakra-ui/descendant": "3.1.0",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-use-controllable-state": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/popover": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.2.1.tgz",
- "integrity": "sha512-K+2ai2dD0ljvJnlrzesCDT9mNzLifE3noGKZ3QwLqd/K34Ym1W/0aL1ERSynrcG78NKoXS54SdEzkhCZ4Gn/Zg==",
- "dependencies": {
- "@chakra-ui/close-button": "2.1.1",
- "@chakra-ui/lazy-utils": "2.0.5",
- "@chakra-ui/popper": "3.1.0",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-animation-state": "2.1.0",
- "@chakra-ui/react-use-disclosure": "2.1.0",
- "@chakra-ui/react-use-focus-effect": "2.1.0",
- "@chakra-ui/react-use-focus-on-pointer-down": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/popper": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.1.0.tgz",
- "integrity": "sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg==",
- "dependencies": {
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@popperjs/core": "^2.9.3"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/portal": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.1.0.tgz",
- "integrity": "sha512-9q9KWf6SArEcIq1gGofNcFPSWEyl+MfJjEUg/un1SMlQjaROOh3zYr+6JAwvcORiX7tyHosnmWC3d3wI2aPSQg==",
- "dependencies": {
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-use-safe-layout-effect": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/progress": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.2.0.tgz",
- "integrity": "sha512-qUXuKbuhN60EzDD9mHR7B67D7p/ZqNS2Aze4Pbl1qGGZfulPW0PY8Rof32qDtttDQBkzQIzFGE8d9QpAemToIQ==",
- "dependencies": {
- "@chakra-ui/react-context": "2.1.0"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/provider": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.4.2.tgz",
- "integrity": "sha512-w0Tef5ZCJK1mlJorcSjItCSbyvVuqpvyWdxZiVQmE6fvSJR83wZof42ux0+sfWD+I7rHSfj+f9nzhNaEWClysw==",
- "dependencies": {
- "@chakra-ui/css-reset": "2.3.0",
- "@chakra-ui/portal": "2.1.0",
- "@chakra-ui/react-env": "3.1.0",
- "@chakra-ui/system": "2.6.2",
- "@chakra-ui/utils": "2.0.15"
- },
- "peerDependencies": {
- "@emotion/react": "^11.0.0",
- "@emotion/styled": "^11.0.0",
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/radio": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.1.2.tgz",
- "integrity": "sha512-n10M46wJrMGbonaghvSRnZ9ToTv/q76Szz284gv4QUWvyljQACcGrXIONUnQ3BIwbOfkRqSk7Xl/JgZtVfll+w==",
- "dependencies": {
- "@chakra-ui/form-control": "2.2.0",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5",
- "@zag-js/focus-visible": "0.16.0"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react": {
- "version": "2.8.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-2.8.2.tgz",
- "integrity": "sha512-Hn0moyxxyCDKuR9ywYpqgX8dvjqwu9ArwpIb9wHNYjnODETjLwazgNIliCVBRcJvysGRiV51U2/JtJVrpeCjUQ==",
- "dependencies": {
- "@chakra-ui/accordion": "2.3.1",
- "@chakra-ui/alert": "2.2.2",
- "@chakra-ui/avatar": "2.3.0",
- "@chakra-ui/breadcrumb": "2.2.0",
- "@chakra-ui/button": "2.1.0",
- "@chakra-ui/card": "2.2.0",
- "@chakra-ui/checkbox": "2.3.2",
- "@chakra-ui/close-button": "2.1.1",
- "@chakra-ui/control-box": "2.1.0",
- "@chakra-ui/counter": "2.1.0",
- "@chakra-ui/css-reset": "2.3.0",
- "@chakra-ui/editable": "3.1.0",
- "@chakra-ui/focus-lock": "2.1.0",
- "@chakra-ui/form-control": "2.2.0",
- "@chakra-ui/hooks": "2.2.1",
- "@chakra-ui/icon": "3.2.0",
- "@chakra-ui/image": "2.1.0",
- "@chakra-ui/input": "2.1.2",
- "@chakra-ui/layout": "2.3.1",
- "@chakra-ui/live-region": "2.1.0",
- "@chakra-ui/media-query": "3.3.0",
- "@chakra-ui/menu": "2.2.1",
- "@chakra-ui/modal": "2.3.1",
- "@chakra-ui/number-input": "2.1.2",
- "@chakra-ui/pin-input": "2.1.0",
- "@chakra-ui/popover": "2.2.1",
- "@chakra-ui/popper": "3.1.0",
- "@chakra-ui/portal": "2.1.0",
- "@chakra-ui/progress": "2.2.0",
- "@chakra-ui/provider": "2.4.2",
- "@chakra-ui/radio": "2.1.2",
- "@chakra-ui/react-env": "3.1.0",
- "@chakra-ui/select": "2.1.2",
- "@chakra-ui/skeleton": "2.1.0",
- "@chakra-ui/skip-nav": "2.1.0",
- "@chakra-ui/slider": "2.1.0",
- "@chakra-ui/spinner": "2.1.0",
- "@chakra-ui/stat": "2.1.1",
- "@chakra-ui/stepper": "2.3.1",
- "@chakra-ui/styled-system": "2.9.2",
- "@chakra-ui/switch": "2.1.2",
- "@chakra-ui/system": "2.6.2",
- "@chakra-ui/table": "2.1.0",
- "@chakra-ui/tabs": "3.0.0",
- "@chakra-ui/tag": "3.1.1",
- "@chakra-ui/textarea": "2.1.2",
- "@chakra-ui/theme": "3.3.1",
- "@chakra-ui/theme-utils": "2.0.21",
- "@chakra-ui/toast": "7.0.2",
- "@chakra-ui/tooltip": "2.3.1",
- "@chakra-ui/transition": "2.1.0",
- "@chakra-ui/utils": "2.0.15",
- "@chakra-ui/visually-hidden": "2.2.0"
- },
- "peerDependencies": {
- "@emotion/react": "^11.0.0",
- "@emotion/styled": "^11.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-children-utils": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz",
- "integrity": "sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-context": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.1.0.tgz",
- "integrity": "sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-env": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.1.0.tgz",
- "integrity": "sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw==",
- "dependencies": {
- "@chakra-ui/react-use-safe-layout-effect": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-types": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz",
- "integrity": "sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-animation-state": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.1.0.tgz",
- "integrity": "sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg==",
- "dependencies": {
- "@chakra-ui/dom-utils": "2.1.0",
- "@chakra-ui/react-use-event-listener": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-callback-ref": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.1.0.tgz",
- "integrity": "sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-controllable-state": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.1.0.tgz",
- "integrity": "sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-disclosure": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.1.0.tgz",
- "integrity": "sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-event-listener": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.1.0.tgz",
- "integrity": "sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-focus-effect": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.1.0.tgz",
- "integrity": "sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ==",
- "dependencies": {
- "@chakra-ui/dom-utils": "2.1.0",
- "@chakra-ui/react-use-event-listener": "2.1.0",
- "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
- "@chakra-ui/react-use-update-effect": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-focus-on-pointer-down": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.1.0.tgz",
- "integrity": "sha512-2jzrUZ+aiCG/cfanrolsnSMDykCAbv9EK/4iUyZno6BYb3vziucmvgKuoXbMPAzWNtwUwtuMhkby8rc61Ue+Lg==",
- "dependencies": {
- "@chakra-ui/react-use-event-listener": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-interval": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.1.0.tgz",
- "integrity": "sha512-8iWj+I/+A0J08pgEXP1J1flcvhLBHkk0ln7ZvGIyXiEyM6XagOTJpwNhiu+Bmk59t3HoV/VyvyJTa+44sEApuw==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-latest-ref": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.1.0.tgz",
- "integrity": "sha512-m0kxuIYqoYB0va9Z2aW4xP/5b7BzlDeWwyXCH6QpT2PpW3/281L3hLCm1G0eOUcdVlayqrQqOeD6Mglq+5/xoQ==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-merge-refs": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.1.0.tgz",
- "integrity": "sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-outside-click": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.2.0.tgz",
- "integrity": "sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-pan-event": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.1.0.tgz",
- "integrity": "sha512-xmL2qOHiXqfcj0q7ZK5s9UjTh4Gz0/gL9jcWPA6GVf+A0Od5imEDa/Vz+533yQKWiNSm1QGrIj0eJAokc7O4fg==",
- "dependencies": {
- "@chakra-ui/event-utils": "2.0.8",
- "@chakra-ui/react-use-latest-ref": "2.1.0",
- "framesync": "6.1.2"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-previous": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.1.0.tgz",
- "integrity": "sha512-pjxGwue1hX8AFcmjZ2XfrQtIJgqbTF3Qs1Dy3d1krC77dEsiCUbQ9GzOBfDc8pfd60DrB5N2tg5JyHbypqh0Sg==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-safe-layout-effect": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.1.0.tgz",
- "integrity": "sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-size": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.1.0.tgz",
- "integrity": "sha512-tbLqrQhbnqOjzTaMlYytp7wY8BW1JpL78iG7Ru1DlV4EWGiAmXFGvtnEt9HftU0NJ0aJyjgymkxfVGI55/1Z4A==",
- "dependencies": {
- "@zag-js/element-size": "0.10.5"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-timeout": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.1.0.tgz",
- "integrity": "sha512-cFN0sobKMM9hXUhyCofx3/Mjlzah6ADaEl/AXl5Y+GawB5rgedgAcu2ErAgarEkwvsKdP6c68CKjQ9dmTQlJxQ==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.1.0"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-update-effect": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.1.0.tgz",
- "integrity": "sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-utils": {
- "version": "2.0.12",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz",
- "integrity": "sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==",
- "dependencies": {
- "@chakra-ui/utils": "2.0.15"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/select": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-2.1.2.tgz",
- "integrity": "sha512-ZwCb7LqKCVLJhru3DXvKXpZ7Pbu1TDZ7N0PdQ0Zj1oyVLJyrpef1u9HR5u0amOpqcH++Ugt0f5JSmirjNlctjA==",
- "dependencies": {
- "@chakra-ui/form-control": "2.2.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/shared-utils": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz",
- "integrity": "sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q=="
- },
- "node_modules/@chakra-ui/skeleton": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.1.0.tgz",
- "integrity": "sha512-JNRuMPpdZGd6zFVKjVQ0iusu3tXAdI29n4ZENYwAJEMf/fN0l12sVeirOxkJ7oEL0yOx2AgEYFSKdbcAgfUsAQ==",
- "dependencies": {
- "@chakra-ui/media-query": "3.3.0",
- "@chakra-ui/react-use-previous": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/skip-nav": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/skip-nav/-/skip-nav-2.1.0.tgz",
- "integrity": "sha512-Hk+FG+vadBSH0/7hwp9LJnLjkO0RPGnx7gBJWI4/SpoJf3e4tZlWYtwGj0toYY4aGKl93jVghuwGbDBEMoHDug==",
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/slider": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.1.0.tgz",
- "integrity": "sha512-lUOBcLMCnFZiA/s2NONXhELJh6sY5WtbRykPtclGfynqqOo47lwWJx+VP7xaeuhDOPcWSSecWc9Y1BfPOCz9cQ==",
- "dependencies": {
- "@chakra-ui/number-utils": "2.0.7",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.1.0",
- "@chakra-ui/react-use-controllable-state": "2.1.0",
- "@chakra-ui/react-use-latest-ref": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/react-use-pan-event": "2.1.0",
- "@chakra-ui/react-use-size": "2.1.0",
- "@chakra-ui/react-use-update-effect": "2.1.0"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/spinner": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.1.0.tgz",
- "integrity": "sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/stat": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.1.1.tgz",
- "integrity": "sha512-LDn0d/LXQNbAn2KaR3F1zivsZCewY4Jsy1qShmfBMKwn6rI8yVlbvu6SiA3OpHS0FhxbsZxQI6HefEoIgtqY6Q==",
- "dependencies": {
- "@chakra-ui/icon": "3.2.0",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/stepper": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/stepper/-/stepper-2.3.1.tgz",
- "integrity": "sha512-ky77lZbW60zYkSXhYz7kbItUpAQfEdycT0Q4bkHLxfqbuiGMf8OmgZOQkOB9uM4v0zPwy2HXhe0vq4Dd0xa55Q==",
- "dependencies": {
- "@chakra-ui/icon": "3.2.0",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/styled-system": {
- "version": "2.9.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.9.2.tgz",
- "integrity": "sha512-To/Z92oHpIE+4nk11uVMWqo2GGRS86coeMmjxtpnErmWRdLcp1WVCVRAvn+ZwpLiNR+reWFr2FFqJRsREuZdAg==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5",
- "csstype": "^3.1.2",
- "lodash.mergewith": "4.6.2"
- }
- },
- "node_modules/@chakra-ui/switch": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.1.2.tgz",
- "integrity": "sha512-pgmi/CC+E1v31FcnQhsSGjJnOE2OcND4cKPyTE+0F+bmGm48Q/b5UmKD9Y+CmZsrt/7V3h8KNczowupfuBfIHA==",
- "dependencies": {
- "@chakra-ui/checkbox": "2.3.2",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/system": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-2.6.2.tgz",
- "integrity": "sha512-EGtpoEjLrUu4W1fHD+a62XR+hzC5YfsWm+6lO0Kybcga3yYEij9beegO0jZgug27V+Rf7vns95VPVP6mFd/DEQ==",
- "dependencies": {
- "@chakra-ui/color-mode": "2.2.0",
- "@chakra-ui/object-utils": "2.1.0",
- "@chakra-ui/react-utils": "2.0.12",
- "@chakra-ui/styled-system": "2.9.2",
- "@chakra-ui/theme-utils": "2.0.21",
- "@chakra-ui/utils": "2.0.15",
- "react-fast-compare": "3.2.2"
- },
- "peerDependencies": {
- "@emotion/react": "^11.0.0",
- "@emotion/styled": "^11.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/table": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-2.1.0.tgz",
- "integrity": "sha512-o5OrjoHCh5uCLdiUb0Oc0vq9rIAeHSIRScc2ExTC9Qg/uVZl2ygLrjToCaKfaaKl1oQexIeAcZDKvPG8tVkHyQ==",
- "dependencies": {
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/tabs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-3.0.0.tgz",
- "integrity": "sha512-6Mlclp8L9lqXmsGWF5q5gmemZXOiOYuh0SGT/7PgJVNPz3LXREXlXg2an4MBUD8W5oTkduCX+3KTMCwRrVrDYw==",
- "dependencies": {
- "@chakra-ui/clickable": "2.1.0",
- "@chakra-ui/descendant": "3.1.0",
- "@chakra-ui/lazy-utils": "2.0.5",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-use-controllable-state": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/tag": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.1.1.tgz",
- "integrity": "sha512-Bdel79Dv86Hnge2PKOU+t8H28nm/7Y3cKd4Kfk9k3lOpUh4+nkSGe58dhRzht59lEqa4N9waCgQiBdkydjvBXQ==",
- "dependencies": {
- "@chakra-ui/icon": "3.2.0",
- "@chakra-ui/react-context": "2.1.0"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/textarea": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.1.2.tgz",
- "integrity": "sha512-ip7tvklVCZUb2fOHDb23qPy/Fr2mzDOGdkrpbNi50hDCiV4hFX02jdQJdi3ydHZUyVgZVBKPOJ+lT9i7sKA2wA==",
- "dependencies": {
- "@chakra-ui/form-control": "2.2.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/theme": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.3.1.tgz",
- "integrity": "sha512-Hft/VaT8GYnItGCBbgWd75ICrIrIFrR7lVOhV/dQnqtfGqsVDlrztbSErvMkoPKt0UgAkd9/o44jmZ6X4U2nZQ==",
- "dependencies": {
- "@chakra-ui/anatomy": "2.2.2",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/theme-tools": "2.1.2"
- },
- "peerDependencies": {
- "@chakra-ui/styled-system": ">=2.8.0"
- }
- },
- "node_modules/@chakra-ui/theme-tools": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.1.2.tgz",
- "integrity": "sha512-Qdj8ajF9kxY4gLrq7gA+Azp8CtFHGO9tWMN2wfF9aQNgG9AuMhPrUzMq9AMQ0MXiYcgNq/FD3eegB43nHVmXVA==",
- "dependencies": {
- "@chakra-ui/anatomy": "2.2.2",
- "@chakra-ui/shared-utils": "2.0.5",
- "color2k": "^2.0.2"
- },
- "peerDependencies": {
- "@chakra-ui/styled-system": ">=2.0.0"
- }
- },
- "node_modules/@chakra-ui/theme-utils": {
- "version": "2.0.21",
- "resolved": "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.21.tgz",
- "integrity": "sha512-FjH5LJbT794r0+VSCXB3lT4aubI24bLLRWB+CuRKHijRvsOg717bRdUN/N1fEmEpFnRVrbewttWh/OQs0EWpWw==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/styled-system": "2.9.2",
- "@chakra-ui/theme": "3.3.1",
- "lodash.mergewith": "4.6.2"
- }
- },
- "node_modules/@chakra-ui/toast": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-7.0.2.tgz",
- "integrity": "sha512-yvRP8jFKRs/YnkuE41BVTq9nB2v/KDRmje9u6dgDmE5+1bFt3bwjdf9gVbif4u5Ve7F7BGk5E093ARRVtvLvXA==",
- "dependencies": {
- "@chakra-ui/alert": "2.2.2",
- "@chakra-ui/close-button": "2.1.1",
- "@chakra-ui/portal": "2.1.0",
- "@chakra-ui/react-context": "2.1.0",
- "@chakra-ui/react-use-timeout": "2.1.0",
- "@chakra-ui/react-use-update-effect": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/styled-system": "2.9.2",
- "@chakra-ui/theme": "3.3.1"
- },
- "peerDependencies": {
- "@chakra-ui/system": "2.6.2",
- "framer-motion": ">=4.0.0",
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/tooltip": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.3.1.tgz",
- "integrity": "sha512-Rh39GBn/bL4kZpuEMPPRwYNnccRCL+w9OqamWHIB3Qboxs6h8cOyXfIdGxjo72lvhu1QI/a4KFqkM3St+WfC0A==",
- "dependencies": {
- "@chakra-ui/dom-utils": "2.1.0",
- "@chakra-ui/popper": "3.1.0",
- "@chakra-ui/portal": "2.1.0",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-disclosure": "2.1.0",
- "@chakra-ui/react-use-event-listener": "2.1.0",
- "@chakra-ui/react-use-merge-refs": "2.1.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/transition": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.1.0.tgz",
- "integrity": "sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "framer-motion": ">=4.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/utils": {
- "version": "2.0.15",
- "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz",
- "integrity": "sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA==",
- "dependencies": {
- "@types/lodash.mergewith": "4.6.7",
- "css-box-model": "1.2.1",
- "framesync": "6.1.2",
- "lodash.mergewith": "4.6.2"
- }
- },
- "node_modules/@chakra-ui/visually-hidden": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.2.0.tgz",
- "integrity": "sha512-KmKDg01SrQ7VbTD3+cPWf/UfpF5MSwm3v7MWi0n5t8HnnadT13MF0MJCDSXbBWnzLv1ZKJ6zlyAOeARWX+DpjQ==",
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@emotion/babel-plugin": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
- "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
- "dependencies": {
- "@babel/helper-module-imports": "^7.16.7",
- "@babel/runtime": "^7.18.3",
- "@emotion/hash": "^0.9.1",
- "@emotion/memoize": "^0.8.1",
- "@emotion/serialize": "^1.1.2",
- "babel-plugin-macros": "^3.1.0",
- "convert-source-map": "^1.5.0",
- "escape-string-regexp": "^4.0.0",
- "find-root": "^1.1.0",
- "source-map": "^0.5.7",
- "stylis": "4.2.0"
- }
- },
- "node_modules/@emotion/cache": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
- "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
- "dependencies": {
- "@emotion/memoize": "^0.8.1",
- "@emotion/sheet": "^1.2.2",
- "@emotion/utils": "^1.2.1",
- "@emotion/weak-memoize": "^0.3.1",
- "stylis": "4.2.0"
- }
- },
- "node_modules/@emotion/hash": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
- "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
- },
- "node_modules/@emotion/is-prop-valid": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
- "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
- "dependencies": {
- "@emotion/memoize": "^0.8.1"
- }
- },
- "node_modules/@emotion/memoize": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
- "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
- },
- "node_modules/@emotion/react": {
- "version": "11.11.4",
- "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz",
- "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.11.0",
- "@emotion/cache": "^11.11.0",
- "@emotion/serialize": "^1.1.3",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
- "@emotion/utils": "^1.2.1",
- "@emotion/weak-memoize": "^0.3.1",
- "hoist-non-react-statics": "^3.3.1"
- },
- "peerDependencies": {
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@emotion/serialize": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz",
- "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==",
- "dependencies": {
- "@emotion/hash": "^0.9.1",
- "@emotion/memoize": "^0.8.1",
- "@emotion/unitless": "^0.8.1",
- "@emotion/utils": "^1.2.1",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@emotion/sheet": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
- "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
- },
- "node_modules/@emotion/styled": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz",
- "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.11.0",
- "@emotion/is-prop-valid": "^1.2.1",
- "@emotion/serialize": "^1.1.2",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
- "@emotion/utils": "^1.2.1"
- },
- "peerDependencies": {
- "@emotion/react": "^11.0.0-rc.0",
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@emotion/unitless": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
- "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
- },
- "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
- "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
- "peerDependencies": {
- "react": ">=16.8.0"
- }
- },
- "node_modules/@emotion/utils": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
- "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
- },
- "node_modules/@emotion/weak-memoize": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
- "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
- "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz",
- "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz",
- "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz",
- "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz",
- "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz",
- "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz",
- "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz",
- "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz",
- "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz",
- "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz",
- "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz",
- "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz",
- "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz",
- "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz",
- "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz",
- "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz",
- "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz",
- "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz",
- "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz",
- "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz",
- "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz",
- "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
- "dependencies": {
- "eslint-visitor-keys": "^3.3.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
- "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
- "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@eslint/js": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
- "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/@fastify/busboy": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
- "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@gar/promisify": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
- "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
- "dev": true
- },
- "node_modules/@heroicons/react": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.1.tgz",
- "integrity": "sha512-JyyN9Lo66kirbCMuMMRPtJxtKJoIsXKS569ebHGGRKbl8s4CtUfLnyKJxteA+vIKySocO4s1SkTkGS4xtG/yEA==",
- "peerDependencies": {
- "react": ">= 16"
- }
- },
- "node_modules/@hookform/devtools": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@hookform/devtools/-/devtools-4.3.1.tgz",
- "integrity": "sha512-CrWxEoHQZaOXJZVQ8KBgOuAa8p2LI8M0DAN5GTRTmdCieRwFVjVDEmuTAVazWVRRkpEQSgSt3KYp7VmmqXdEnw==",
- "dependencies": {
- "@emotion/react": "^11.1.5",
- "@emotion/styled": "^11.3.0",
- "@types/lodash": "^4.14.168",
- "little-state-machine": "^4.1.0",
- "lodash": "^4.17.21",
- "react-simple-animate": "^3.3.12",
- "use-deep-compare-effect": "^1.8.1",
- "uuid": "^8.3.2"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17 || ^18",
- "react-dom": "^16.8.0 || ^17 || ^18"
- }
- },
- "node_modules/@hookform/resolvers": {
- "version": "2.9.11",
- "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.9.11.tgz",
- "integrity": "sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ==",
- "peerDependencies": {
- "react-hook-form": "^7.0.0"
- }
- },
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.11.14",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
- "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
- "dependencies": {
- "@humanwhocodes/object-schema": "^2.0.2",
- "debug": "^4.3.1",
- "minimatch": "^3.0.5"
- },
- "engines": {
- "node": ">=10.10.0"
- }
- },
- "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/object-schema": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
- "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw=="
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@motionone/animation": {
- "version": "10.17.0",
- "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.17.0.tgz",
- "integrity": "sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg==",
- "dependencies": {
- "@motionone/easing": "^10.17.0",
- "@motionone/types": "^10.17.0",
- "@motionone/utils": "^10.17.0",
- "tslib": "^2.3.1"
- }
- },
- "node_modules/@motionone/dom": {
- "version": "10.17.0",
- "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.17.0.tgz",
- "integrity": "sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q==",
- "dependencies": {
- "@motionone/animation": "^10.17.0",
- "@motionone/generators": "^10.17.0",
- "@motionone/types": "^10.17.0",
- "@motionone/utils": "^10.17.0",
- "hey-listen": "^1.0.8",
- "tslib": "^2.3.1"
- }
- },
- "node_modules/@motionone/easing": {
- "version": "10.17.0",
- "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.17.0.tgz",
- "integrity": "sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg==",
- "dependencies": {
- "@motionone/utils": "^10.17.0",
- "tslib": "^2.3.1"
- }
- },
- "node_modules/@motionone/generators": {
- "version": "10.17.0",
- "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.17.0.tgz",
- "integrity": "sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ==",
- "dependencies": {
- "@motionone/types": "^10.17.0",
- "@motionone/utils": "^10.17.0",
- "tslib": "^2.3.1"
- }
- },
- "node_modules/@motionone/types": {
- "version": "10.17.0",
- "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.0.tgz",
- "integrity": "sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA=="
- },
- "node_modules/@motionone/utils": {
- "version": "10.17.0",
- "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.17.0.tgz",
- "integrity": "sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg==",
- "dependencies": {
- "@motionone/types": "^10.17.0",
- "hey-listen": "^1.0.8",
- "tslib": "^2.3.1"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@npmcli/fs": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz",
- "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==",
- "dev": true,
- "dependencies": {
- "@gar/promisify": "^1.1.3",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/@npmcli/move-file": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz",
- "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==",
- "deprecated": "This functionality has been moved to @npmcli/fs",
- "dev": true,
- "dependencies": {
- "mkdirp": "^1.0.4",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/@pkgr/core": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
- "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/unts"
- }
- },
- "node_modules/@popperjs/core": {
- "version": "2.11.8",
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
- "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/popperjs"
- }
- },
- "node_modules/@remix-run/router": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz",
- "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==",
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@rollup/pluginutils": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
- "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
- "dev": true,
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^2.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@sphinxxxx/color-conversion": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz",
- "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw=="
- },
- "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz",
- "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
- "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
- "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz",
- "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz",
- "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz",
- "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz",
- "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-transform-svg-component": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz",
- "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-preset": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz",
- "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==",
- "dev": true,
- "dependencies": {
- "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1",
- "@svgr/babel-plugin-remove-jsx-attribute": "*",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "*",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1",
- "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1",
- "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1",
- "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1",
- "@svgr/babel-plugin-transform-svg-component": "^6.5.1"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/core": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz",
- "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.19.6",
- "@svgr/babel-preset": "^6.5.1",
- "@svgr/plugin-jsx": "^6.5.1",
- "camelcase": "^6.2.0",
- "cosmiconfig": "^7.0.1"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/core/node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@svgr/hast-util-to-babel-ast": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz",
- "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.20.0",
- "entities": "^4.4.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/plugin-jsx": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz",
- "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.19.6",
- "@svgr/babel-preset": "^6.5.1",
- "@svgr/hast-util-to-babel-ast": "^6.5.1",
- "svg-parser": "^2.0.4"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@svgr/core": "^6.0.0"
- }
- },
- "node_modules/@tanstack/query-core": {
- "version": "5.26.3",
- "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.26.3.tgz",
- "integrity": "sha512-kKv7VHIleC7cwpMS3M63mWUFFbdiRo7JZMVUyZ4z/79RZoAi7/vGTVkCrnNqyKl+zwBRkumYL+eiYtyShGZd0A==",
- "peer": true,
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/tannerlinsley"
- }
- },
- "node_modules/@tanstack/query-devtools": {
- "version": "5.24.0",
- "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.24.0.tgz",
- "integrity": "sha512-pThim455t69zrZaQKa7IRkEIK8UBTS+gHVAdNfhO72Xh4rWpMc63ovRje5/n6iw63+d6QiJzVadsJVdPoodSeQ==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/tannerlinsley"
- }
- },
- "node_modules/@tanstack/react-query": {
- "version": "5.26.3",
- "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.26.3.tgz",
- "integrity": "sha512-fP/kEu8aVLb6ln0ySazaeyivVkSQ9EnFfA5kQ7yIQNklx5JCW7otHVY6GVjZtd/3wK6QU99yvdSH0rN0LV2vmA==",
- "peer": true,
- "dependencies": {
- "@tanstack/query-core": "5.26.3"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/tannerlinsley"
- },
- "peerDependencies": {
- "react": "^18.0.0"
- }
- },
- "node_modules/@tanstack/react-query-devtools": {
- "version": "5.26.3",
- "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.26.3.tgz",
- "integrity": "sha512-byhbST7CDC8cH1tPLPYG/lNMr/QcYMMqxG9+jayiz7H//QScp9+B7cpSItp9QPaN30fCj7pIAlbCifWDcLC4/A==",
- "dependencies": {
- "@tanstack/query-devtools": "5.24.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/tannerlinsley"
- },
- "peerDependencies": {
- "@tanstack/react-query": "^5.26.3",
- "react": "^18.0.0"
- }
- },
- "node_modules/@tootallnate/once": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
- "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
- "dev": true,
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@types/ace": {
- "version": "0.0.52",
- "resolved": "https://registry.npmjs.org/@types/ace/-/ace-0.0.52.tgz",
- "integrity": "sha512-YPF9S7fzpuyrxru+sG/rrTpZkC6gpHBPF14W3x70kqVOD+ks6jkYLapk4yceh36xej7K4HYxcyz9ZDQ2lTvwgQ==",
- "dev": true
- },
- "node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true
- },
- "node_modules/@types/json5": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
- "dev": true
- },
- "node_modules/@types/jsoneditor": {
- "version": "9.9.5",
- "resolved": "https://registry.npmjs.org/@types/jsoneditor/-/jsoneditor-9.9.5.tgz",
- "integrity": "sha512-+Wex7QCirPcG90WA8/CmvDO21KUjz63/G7Yk52Yx/NhWHw5DyeET/L+wjZHAeNeNCCnMOTEtVX5gc3F4UXwXMQ==",
- "dev": true,
- "dependencies": {
- "@types/ace": "*",
- "ajv": "^6.12.0"
- }
- },
- "node_modules/@types/lodash": {
- "version": "4.14.202",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
- "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ=="
- },
- "node_modules/@types/lodash.debounce": {
- "version": "4.0.9",
- "resolved": "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz",
- "integrity": "sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ==",
- "dev": true,
- "dependencies": {
- "@types/lodash": "*"
- }
- },
- "node_modules/@types/lodash.mergewith": {
- "version": "4.6.7",
- "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz",
- "integrity": "sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==",
- "dependencies": {
- "@types/lodash": "*"
- }
- },
- "node_modules/@types/minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
- "dev": true
- },
- "node_modules/@types/normalize-package-data": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
- "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
- "dev": true
- },
- "node_modules/@types/parse-json": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
- "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.11",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
- "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==",
- "devOptional": true
- },
- "node_modules/@types/react": {
- "version": "18.2.64",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.64.tgz",
- "integrity": "sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg==",
- "devOptional": true,
- "dependencies": {
- "@types/prop-types": "*",
- "@types/scheduler": "*",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-copy-to-clipboard": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/@types/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.7.tgz",
- "integrity": "sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==",
- "dev": true,
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/react-datepicker": {
- "version": "4.19.6",
- "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-4.19.6.tgz",
- "integrity": "sha512-uH5fzxt9eXxnc+hDCy/iRSFqU2+9lR/q2lAmaG4WILMai1o3IOdpcV+VSypzBFJLTEC2jrfeDXcdol0CJVMq4g==",
- "dev": true,
- "dependencies": {
- "@popperjs/core": "^2.9.2",
- "@types/react": "*",
- "date-fns": "^2.0.1",
- "react-popper": "^2.2.5"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "18.2.21",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.21.tgz",
- "integrity": "sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw==",
- "dev": true,
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/react-json-editor-ajrm": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/@types/react-json-editor-ajrm/-/react-json-editor-ajrm-2.5.6.tgz",
- "integrity": "sha512-Dk8WUF0UPzHCnDfgNQ7EBtjZRsHLZPfjm/fFZOrHVO4TbD1EQpKS/i8p3EpVEnvgE5LJack35eAxFjxN1UWMnA==",
- "dev": true,
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/react-slick": {
- "version": "0.23.13",
- "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.13.tgz",
- "integrity": "sha512-bNZfDhe/L8t5OQzIyhrRhBr/61pfBcWaYJoq6UDqFtv5LMwfg4NsVDD2J8N01JqdAdxLjOt66OZEp6PX+dGs/A==",
- "dev": true,
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/scheduler": {
- "version": "0.16.8",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
- "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
- "devOptional": true
- },
- "node_modules/@types/semver": {
- "version": "7.5.8",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
- "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
- "dev": true
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
- "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==",
- "dev": true,
- "dependencies": {
- "@eslint-community/regexpp": "^4.5.1",
- "@typescript-eslint/scope-manager": "6.21.0",
- "@typescript-eslint/type-utils": "6.21.0",
- "@typescript-eslint/utils": "6.21.0",
- "@typescript-eslint/visitor-keys": "6.21.0",
- "debug": "^4.3.4",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.4",
- "natural-compare": "^1.4.0",
- "semver": "^7.5.4",
- "ts-api-utils": "^1.0.1"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
- "eslint": "^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
- "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/scope-manager": "6.21.0",
- "@typescript-eslint/types": "6.21.0",
- "@typescript-eslint/typescript-estree": "6.21.0",
- "@typescript-eslint/visitor-keys": "6.21.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
- "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "6.21.0",
- "@typescript-eslint/visitor-keys": "6.21.0"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz",
- "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/typescript-estree": "6.21.0",
- "@typescript-eslint/utils": "6.21.0",
- "debug": "^4.3.4",
- "ts-api-utils": "^1.0.1"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
- "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
- "dev": true,
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
- "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "6.21.0",
- "@typescript-eslint/visitor-keys": "6.21.0",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "minimatch": "9.0.3",
- "semver": "^7.5.4",
- "ts-api-utils": "^1.0.1"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
- "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
- "dev": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@types/json-schema": "^7.0.12",
- "@types/semver": "^7.5.0",
- "@typescript-eslint/scope-manager": "6.21.0",
- "@typescript-eslint/types": "6.21.0",
- "@typescript-eslint/typescript-estree": "6.21.0",
- "semver": "^7.5.4"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
- "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "6.21.0",
- "eslint-visitor-keys": "^3.4.1"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@ungap/structured-clone": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
- "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
- },
- "node_modules/@vitejs/plugin-react": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz",
- "integrity": "sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.19.6",
- "@babel/plugin-transform-react-jsx": "^7.19.0",
- "@babel/plugin-transform-react-jsx-development": "^7.18.6",
- "@babel/plugin-transform-react-jsx-self": "^7.18.6",
- "@babel/plugin-transform-react-jsx-source": "^7.19.6",
- "magic-string": "^0.26.7",
- "react-refresh": "^0.14.0"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "peerDependencies": {
- "vite": "^3.0.0"
- }
- },
- "node_modules/@yr/monotone-cubic-spline": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz",
- "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA=="
- },
- "node_modules/@zag-js/dom-query": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-0.16.0.tgz",
- "integrity": "sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ=="
- },
- "node_modules/@zag-js/element-size": {
- "version": "0.10.5",
- "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.10.5.tgz",
- "integrity": "sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w=="
- },
- "node_modules/@zag-js/focus-visible": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.16.0.tgz",
- "integrity": "sha512-a7U/HSopvQbrDU4GLerpqiMcHKEkQkNPeDZJWz38cw/6Upunh41GjHetq5TB84hxyCaDzJ6q2nEdNoBQfC0FKA==",
- "dependencies": {
- "@zag-js/dom-query": "0.16.0"
- }
- },
- "node_modules/abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "dev": true
- },
- "node_modules/ace-builds": {
- "version": "1.32.7",
- "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.7.tgz",
- "integrity": "sha512-ziv35kaYELFw4suWlotz/Xsl1/1LhWAbwFoD3zIgCgP9gXGECEsAM4GhiB0T0xZdmQjyv6hmAzO280g0+n4vGw=="
- },
- "node_modules/acorn": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
- "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dev": true,
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/agentkeepalive": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
- "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
- "dev": true,
- "dependencies": {
- "humanize-ms": "^1.2.1"
- },
- "engines": {
- "node": ">= 8.0.0"
- }
- },
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/apexcharts": {
- "version": "3.47.0",
- "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.47.0.tgz",
- "integrity": "sha512-s/fgNCA69b8lJdhI3R7Z+/Df47RPplLyHwuvttecR+aaZ3/Pm6wHYPiAGjqDNbVsMGXhuA9mcOpIYU5ZWeSdeg==",
- "dependencies": {
- "@yr/monotone-cubic-spline": "^1.0.3",
- "svg.draggable.js": "^2.2.2",
- "svg.easing.js": "^2.0.0",
- "svg.filter.js": "^2.0.2",
- "svg.pathmorphing.js": "^0.1.3",
- "svg.resize.js": "^1.4.3",
- "svg.select.js": "^3.0.1"
- }
- },
- "node_modules/aproba": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
- "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
- "dev": true
- },
- "node_modules/are-we-there-yet": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
- "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
- "dev": true,
- "dependencies": {
- "delegates": "^1.0.0",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
- },
- "node_modules/aria-hidden": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
- "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
- "dependencies": {
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/array-buffer-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
- "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
- "dependencies": {
- "call-bind": "^1.0.5",
- "is-array-buffer": "^3.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-includes": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
- "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "is-string": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/array.prototype.filter": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz",
- "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-array-method-boxes-properly": "^1.0.0",
- "is-string": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.findlast": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz",
- "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==",
- "dependencies": {
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.3.0",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.findlastindex": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz",
- "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.3.0",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flat": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
- "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
- "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.toreversed": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
- "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- }
- },
- "node_modules/array.prototype.tosorted": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz",
- "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==",
- "dependencies": {
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.1.0",
- "es-shim-unscopables": "^1.0.2"
- }
- },
- "node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
- "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
- "dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.2.1",
- "get-intrinsic": "^1.2.3",
- "is-array-buffer": "^3.0.4",
- "is-shared-array-buffer": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/async-foreach": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
- "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/asynciterator.prototype": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
- "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
- "dependencies": {
- "has-symbols": "^1.0.3"
- }
- },
- "node_modules/autoprefixer": {
- "version": "10.4.18",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz",
- "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/autoprefixer"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "browserslist": "^4.23.0",
- "caniuse-lite": "^1.0.30001591",
- "fraction.js": "^4.3.7",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.0.0",
- "postcss-value-parser": "^4.2.0"
- },
- "bin": {
- "autoprefixer": "bin/autoprefixer"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/available-typed-arrays": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
- "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
- "dependencies": {
- "possible-typed-array-names": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/babel-plugin-macros": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
- "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
- "dependencies": {
- "@babel/runtime": "^7.12.5",
- "cosmiconfig": "^7.0.0",
- "resolve": "^1.19.0"
- },
- "engines": {
- "node": ">=10",
- "npm": ">=6"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
- },
- "node_modules/big-integer": {
- "version": "1.6.52",
- "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
- "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/broadcast-channel": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz",
- "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==",
- "dependencies": {
- "@babel/runtime": "^7.7.2",
- "detect-node": "^2.1.0",
- "js-sha3": "0.8.0",
- "microseconds": "0.2.0",
- "nano-time": "1.0.0",
- "oblivious-set": "1.0.0",
- "rimraf": "3.0.2",
- "unload": "2.2.0"
- }
- },
- "node_modules/browserslist": {
- "version": "4.23.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
- "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "caniuse-lite": "^1.0.30001587",
- "electron-to-chromium": "^1.4.668",
- "node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.13"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/cacache": {
- "version": "16.1.3",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz",
- "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==",
- "dev": true,
- "dependencies": {
- "@npmcli/fs": "^2.1.0",
- "@npmcli/move-file": "^2.0.0",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.1.0",
- "glob": "^8.0.1",
- "infer-owner": "^1.0.4",
- "lru-cache": "^7.7.1",
- "minipass": "^3.1.6",
- "minipass-collect": "^1.0.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "mkdirp": "^1.0.4",
- "p-map": "^4.0.0",
- "promise-inflight": "^1.0.1",
- "rimraf": "^3.0.2",
- "ssri": "^9.0.0",
- "tar": "^6.1.11",
- "unique-filename": "^2.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/cacache/node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/cacache/node_modules/lru-cache": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
- "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/cacache/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
- "dev": true,
- "dependencies": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001597",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz",
- "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ]
- },
- "node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chalk/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/classnames": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
- "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
- },
- "node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/clear-any-console": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/clear-any-console/-/clear-any-console-1.16.2.tgz",
- "integrity": "sha512-OL/7wZpNy9x0GBSzz3poWja84Nr7iaH8aYNsJ5Uet2BVLj6Lm1zvWpZN/yH46Vv3ae7YfHmLLMmfHj911fshJg==",
- "dev": true
- },
- "node_modules/cli-check-node": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/cli-check-node/-/cli-check-node-1.3.4.tgz",
- "integrity": "sha512-iLGgQXm82iP8eH3R67qbOWs5qqUOLmNnMy5Lzl/RybcMh3y+H2zWU5POzuQ6oDUOdz4XWuxcFhP75szqd6frLg==",
- "dev": true,
- "dependencies": {
- "chalk": "^3.0.0",
- "log-symbols": "^3.0.0"
- }
- },
- "node_modules/cli-check-node/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/cli-check-node/node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cli-check-node/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/cli-check-node/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/cli-check-node/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cli-check-node/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cli-handle-error": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/cli-handle-error/-/cli-handle-error-4.4.0.tgz",
- "integrity": "sha512-RyBCnKlc7xVr79cKb9RfBq+4fjwQeX8HKeNzIPnI/W+DWWIUUKh2ur576DpwJ3kZt2UGHlIAOF7N9txy+mgZsA==",
- "dev": true,
- "dependencies": {
- "chalk": "^3.0.0",
- "log-symbols": "^3.0.0"
- }
- },
- "node_modules/cli-handle-error/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/cli-handle-error/node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cli-handle-error/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/cli-handle-error/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/cli-handle-error/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cli-handle-error/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cli-handle-unhandled": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/cli-handle-unhandled/-/cli-handle-unhandled-1.1.1.tgz",
- "integrity": "sha512-Em91mJvU7VdgT2MxQpyY633vW1tDzRjPDbii6ZjEBHHLLh0xDoVkFt/wjvi9nSvJcz9rJmvtJSK8KL/hvF0Stg==",
- "dev": true,
- "dependencies": {
- "cli-handle-error": "^4.1.0"
- }
- },
- "node_modules/cli-welcome": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/cli-welcome/-/cli-welcome-2.2.2.tgz",
- "integrity": "sha512-LgDGS0TW4nIf8v81wpuZzfOEDPcy68u0jKR0Fy5IaWftqdminI6FoDiMFt1mjPylqKGNv/wFsZ7fCs93IeDMIw==",
- "dev": true,
- "dependencies": {
- "chalk": "^2.4.2",
- "clear-any-console": "^1.16.0",
- "prettier": "^2.0.5"
- }
- },
- "node_modules/cli-welcome/node_modules/prettier": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
- "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
- "dev": true,
- "bin": {
- "prettier": "bin-prettier.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
- },
- "node_modules/color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
- "dev": true,
- "bin": {
- "color-support": "bin.js"
- }
- },
- "node_modules/color2k": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz",
- "integrity": "sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog=="
- },
- "node_modules/commander": {
- "version": "9.5.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
- "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || >=14"
- }
- },
- "node_modules/compute-scroll-into-view": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz",
- "integrity": "sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A=="
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
- },
- "node_modules/console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
- "dev": true
- },
- "node_modules/convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
- },
- "node_modules/copy-to-clipboard": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
- "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
- "dependencies": {
- "toggle-selection": "^1.0.6"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "node_modules/cosmiconfig": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
- "dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/cross-fetch": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
- "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
- "dependencies": {
- "node-fetch": "^2.6.12"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/css-box-model": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz",
- "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==",
- "dependencies": {
- "tiny-invariant": "^1.0.6"
- }
- },
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
- },
- "node_modules/date-fns": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
- "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
- "dependencies": {
- "@babel/runtime": "^7.21.0"
- },
- "engines": {
- "node": ">=0.11"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/date-fns"
- }
- },
- "node_modules/dayjs": {
- "version": "1.11.10",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
- "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decamelize-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
- "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
- "dev": true,
- "dependencies": {
- "decamelize": "^1.1.0",
- "map-obj": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/decamelize-keys/node_modules/map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
- },
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
- "dev": true
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/destr": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz",
- "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA=="
- },
- "node_modules/detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
- },
- "node_modules/detect-node-es": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
- "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.700",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.700.tgz",
- "integrity": "sha512-40dqKQ3F7C8fbBEmjSeJ+qEHCKzPyrP9SkeIBZ3wSCUH9nhWStrDz030XlDzlhNhlul1Z0fz7TpDFnsIzo4Jtg==",
- "dev": true
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "node_modules/encoding": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
- "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
- "optional": true,
- "dependencies": {
- "iconv-lite": "^0.6.2"
- }
- },
- "node_modules/enquire.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
- "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw=="
- },
- "node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "dev": true,
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/err-code": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
- "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
- "dev": true
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.22.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz",
- "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==",
- "dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "arraybuffer.prototype.slice": "^1.0.3",
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "es-set-tostringtag": "^2.0.3",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.4",
- "get-symbol-description": "^1.0.2",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.1",
- "internal-slot": "^1.0.7",
- "is-array-buffer": "^3.0.4",
- "is-callable": "^1.2.7",
- "is-negative-zero": "^2.0.3",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.3",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.13",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.13.1",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.5",
- "regexp.prototype.flags": "^1.5.2",
- "safe-array-concat": "^1.1.0",
- "safe-regex-test": "^1.0.3",
- "string.prototype.trim": "^1.2.8",
- "string.prototype.trimend": "^1.0.7",
- "string.prototype.trimstart": "^1.0.7",
- "typed-array-buffer": "^1.0.2",
- "typed-array-byte-length": "^1.0.1",
- "typed-array-byte-offset": "^1.0.2",
- "typed-array-length": "^1.0.5",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.14"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-array-method-boxes-properly": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
- "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
- "dev": true
- },
- "node_modules/es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
- "dependencies": {
- "get-intrinsic": "^1.2.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-iterator-helpers": {
- "version": "1.0.17",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz",
- "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==",
- "dependencies": {
- "asynciterator.prototype": "^1.0.0",
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.4",
- "es-errors": "^1.3.0",
- "es-set-tostringtag": "^2.0.2",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "globalthis": "^1.0.3",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.7",
- "iterator.prototype": "^1.1.2",
- "safe-array-concat": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
- "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
- "dependencies": {
- "get-intrinsic": "^1.2.4",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-shim-unscopables": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
- "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
- "dependencies": {
- "hasown": "^2.0.0"
- }
- },
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/esbuild": {
- "version": "0.17.19",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz",
- "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==",
- "dev": true,
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/android-arm": "0.17.19",
- "@esbuild/android-arm64": "0.17.19",
- "@esbuild/android-x64": "0.17.19",
- "@esbuild/darwin-arm64": "0.17.19",
- "@esbuild/darwin-x64": "0.17.19",
- "@esbuild/freebsd-arm64": "0.17.19",
- "@esbuild/freebsd-x64": "0.17.19",
- "@esbuild/linux-arm": "0.17.19",
- "@esbuild/linux-arm64": "0.17.19",
- "@esbuild/linux-ia32": "0.17.19",
- "@esbuild/linux-loong64": "0.17.19",
- "@esbuild/linux-mips64el": "0.17.19",
- "@esbuild/linux-ppc64": "0.17.19",
- "@esbuild/linux-riscv64": "0.17.19",
- "@esbuild/linux-s390x": "0.17.19",
- "@esbuild/linux-x64": "0.17.19",
- "@esbuild/netbsd-x64": "0.17.19",
- "@esbuild/openbsd-x64": "0.17.19",
- "@esbuild/sunos-x64": "0.17.19",
- "@esbuild/win32-arm64": "0.17.19",
- "@esbuild/win32-ia32": "0.17.19",
- "@esbuild/win32-x64": "0.17.19"
- }
- },
- "node_modules/esbuild-android-64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz",
- "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-android-arm64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz",
- "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-darwin-64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz",
- "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-darwin-arm64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
- "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-freebsd-64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz",
- "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-freebsd-arm64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz",
- "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-32": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz",
- "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz",
- "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-arm": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz",
- "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-arm64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz",
- "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-mips64le": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz",
- "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-ppc64le": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz",
- "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-riscv64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz",
- "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-s390x": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
- "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-netbsd-64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz",
- "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-openbsd-64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
- "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-sunos-64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
- "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-32": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
- "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
- "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-arm64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
- "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
- "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.4",
- "@eslint/js": "8.57.0",
- "@humanwhocodes/config-array": "^0.11.14",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "@ungap/structured-clone": "^1.2.0",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-config-prettier": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
- "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
- "dev": true,
- "bin": {
- "eslint-config-prettier": "bin/cli.js"
- },
- "peerDependencies": {
- "eslint": ">=7.0.0"
- }
- },
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
- "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
- "dev": true,
- "dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.13.0",
- "resolve": "^1.22.4"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-module-utils": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz",
- "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==",
- "dev": true,
- "dependencies": {
- "debug": "^3.2.7"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-module-utils/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import": {
- "version": "2.29.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
- "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
- "dev": true,
- "dependencies": {
- "array-includes": "^3.1.7",
- "array.prototype.findlastindex": "^1.2.3",
- "array.prototype.flat": "^1.3.2",
- "array.prototype.flatmap": "^1.3.2",
- "debug": "^3.2.7",
- "doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.9",
- "eslint-module-utils": "^2.8.0",
- "hasown": "^2.0.0",
- "is-core-module": "^2.13.1",
- "is-glob": "^4.0.3",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.7",
- "object.groupby": "^1.0.1",
- "object.values": "^1.1.7",
- "semver": "^6.3.1",
- "tsconfig-paths": "^3.15.0"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/eslint-plugin-prettier": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz",
- "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==",
- "dev": true,
- "dependencies": {
- "prettier-linter-helpers": "^1.0.0",
- "synckit": "^0.8.6"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint-plugin-prettier"
- },
- "peerDependencies": {
- "@types/eslint": ">=8.0.0",
- "eslint": ">=8.0.0",
- "eslint-config-prettier": "*",
- "prettier": ">=3.0.0"
- },
- "peerDependenciesMeta": {
- "@types/eslint": {
- "optional": true
- },
- "eslint-config-prettier": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-plugin-react": {
- "version": "7.34.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz",
- "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==",
- "dependencies": {
- "array-includes": "^3.1.7",
- "array.prototype.findlast": "^1.2.4",
- "array.prototype.flatmap": "^1.3.2",
- "array.prototype.toreversed": "^1.1.2",
- "array.prototype.tosorted": "^1.1.3",
- "doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.0.17",
- "estraverse": "^5.3.0",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.7",
- "object.fromentries": "^2.0.7",
- "object.hasown": "^1.1.3",
- "object.values": "^1.1.7",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.5",
- "semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.10"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
- }
- },
- "node_modules/eslint-plugin-react-hooks": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
- "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/resolve": {
- "version": "2.0.0-next.5",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
- "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/eslint/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/eslint/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/eslint/node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/eslint/node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eslint/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/eslint/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eslint/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
- "dependencies": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
- },
- "node_modules/fast-diff": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
- "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
- "dev": true
- },
- "node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
- },
- "node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "dependencies": {
- "flat-cache": "^3.0.4"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-root": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
- "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
- },
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/flat-cache": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
- "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.3",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/flatted": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
- "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="
- },
- "node_modules/focus-lock": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.4.tgz",
- "integrity": "sha512-Gv0N3mvej3pD+HWkNryrF8sExzEHqhQ6OSFxD4DPxm9n5HGCaHme98ZMBZroNEAJcsdtHxk+skvThGKyUeoEGA==",
- "dependencies": {
- "tslib": "^2.0.3"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "dependencies": {
- "is-callable": "^1.1.3"
- }
- },
- "node_modules/fraction.js": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
- "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
- "dev": true,
- "engines": {
- "node": "*"
- },
- "funding": {
- "type": "patreon",
- "url": "https://github.com/sponsors/rawify"
- }
- },
- "node_modules/framer-motion": {
- "version": "7.10.3",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-7.10.3.tgz",
- "integrity": "sha512-k2ccYeZNSpPg//HTaqrU+4pRq9f9ZpaaN7rr0+Rx5zA4wZLbk547wtDzge2db1sB+1mnJ6r59P4xb+aEIi/W+w==",
- "dependencies": {
- "@motionone/dom": "^10.15.3",
- "hey-listen": "^1.0.8",
- "tslib": "2.4.0"
- },
- "optionalDependencies": {
- "@emotion/is-prop-valid": "^0.8.2"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": {
- "version": "0.8.8",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
- "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
- "optional": true,
- "dependencies": {
- "@emotion/memoize": "0.7.4"
- }
- },
- "node_modules/framer-motion/node_modules/@emotion/memoize": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
- "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
- "optional": true
- },
- "node_modules/framer-motion/node_modules/tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
- },
- "node_modules/framesync": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz",
- "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==",
- "dependencies": {
- "tslib": "2.4.0"
- }
- },
- "node_modules/framesync/node_modules/tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
- },
- "node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/function.prototype.name": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
- "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "functions-have-names": "^1.2.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gauge": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
- "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
- "dev": true,
- "dependencies": {
- "aproba": "^1.0.3 || ^2.0.0",
- "color-support": "^1.1.3",
- "console-control-strings": "^1.1.0",
- "has-unicode": "^2.0.1",
- "signal-exit": "^3.0.7",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "wide-align": "^1.1.5"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/gaze": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
- "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
- "dev": true,
- "dependencies": {
- "globule": "^1.0.0"
- },
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-nonce": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
- "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/get-stdin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
- "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/get-symbol-description": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
- "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
- "dependencies": {
- "call-bind": "^1.0.5",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/github-buttons": {
- "version": "2.27.0",
- "resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.27.0.tgz",
- "integrity": "sha512-PmfRMI2Rttg/2jDfKBeSl621sEznrsKF019SuoLdoNlO7qRUZaOyEI5Li4uW+79pVqnDtKfIEVuHTIJ5lgy64w=="
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/glob/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/glob/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "dependencies": {
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/globrex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
- "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="
- },
- "node_modules/globule": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz",
- "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==",
- "dev": true,
- "dependencies": {
- "glob": "~7.1.1",
- "lodash": "^4.17.21",
- "minimatch": "~3.0.2"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/globule/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/globule/node_modules/glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/globule/node_modules/minimatch": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
- "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="
- },
- "node_modules/hard-rejection": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "dependencies": {
- "es-define-property": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
- "dev": true
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/hey-listen": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz",
- "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q=="
- },
- "node_modules/hoist-non-react-statics": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
- "dependencies": {
- "react-is": "^16.7.0"
- }
- },
- "node_modules/hosted-git-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/hosted-git-info/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/hosted-git-info/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/html-parse-stringify": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
- "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
- "dependencies": {
- "void-elements": "3.1.0"
- }
- },
- "node_modules/http-cache-semantics": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
- "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
- "dev": true
- },
- "node_modules/http-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
- "dev": true,
- "dependencies": {
- "@tootallnate/once": "2",
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "dev": true,
- "dependencies": {
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/humanize-ms": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
- "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.0.0"
- }
- },
- "node_modules/i18next": {
- "version": "22.5.1",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz",
- "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://locize.com"
- },
- {
- "type": "individual",
- "url": "https://locize.com/i18next.html"
- },
- {
- "type": "individual",
- "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
- }
- ],
- "dependencies": {
- "@babel/runtime": "^7.20.6"
- }
- },
- "node_modules/i18next-browser-languagedetector": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz",
- "integrity": "sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==",
- "dependencies": {
- "@babel/runtime": "^7.23.2"
- }
- },
- "node_modules/i18next-http-backend": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz",
- "integrity": "sha512-Z/aQsGZk1gSxt2/DztXk92DuDD20J+rNudT7ZCdTrNOiK8uQppfvdjq9+DFQfpAnFPn3VZS+KQIr1S/W1KxhpQ==",
- "dependencies": {
- "cross-fetch": "4.0.0"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "optional": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ignore": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/immutable": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz",
- "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==",
- "dev": true
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/infer-owner": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
- "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
- "dev": true
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/internal-slot": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
- "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
- "dependencies": {
- "es-errors": "^1.3.0",
- "hasown": "^2.0.0",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
- },
- "node_modules/ip-address": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
- "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
- "dev": true,
- "dependencies": {
- "jsbn": "1.1.0",
- "sprintf-js": "^1.1.3"
- },
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/is-array-buffer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
- "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
- },
- "node_modules/is-async-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
- "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dependencies": {
- "has-bigints": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
- "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
- "dependencies": {
- "hasown": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-finalizationregistry": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
- "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-lambda": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
- "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
- "dev": true
- },
- "node_modules/is-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
- "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
- "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-set": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
- "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
- "dependencies": {
- "call-bind": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
- "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
- "dependencies": {
- "which-typed-array": "^1.1.14"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakmap": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
- "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakset": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
- "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "get-intrinsic": "^1.2.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
- },
- "node_modules/iterator.prototype": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
- "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
- "dependencies": {
- "define-properties": "^1.2.1",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "reflect.getprototypeof": "^1.0.4",
- "set-function-name": "^2.0.1"
- }
- },
- "node_modules/javascript-natural-sort": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
- "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw=="
- },
- "node_modules/jmespath": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz",
- "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==",
- "engines": {
- "node": ">= 0.6.0"
- }
- },
- "node_modules/jquery": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
- "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
- "peer": true
- },
- "node_modules/js-base64": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
- "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==",
- "dev": true
- },
- "node_modules/js-sha3": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
- "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsbn": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
- "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
- "dev": true
- },
- "node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true,
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "node_modules/json-source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz",
- "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg=="
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
- },
- "node_modules/json2mq": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
- "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
- "dependencies": {
- "string-convert": "^0.2.0"
- }
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/jsoneditor": {
- "version": "9.10.5",
- "resolved": "https://registry.npmjs.org/jsoneditor/-/jsoneditor-9.10.5.tgz",
- "integrity": "sha512-fVZ0NMt+zm4rqTKBv2x7zPdLeaRyKo1EjJkaR1QjK4gEM1rMwICILYSW1OPxSc1qqyAoDaA/eeNrluKoxOocCA==",
- "dependencies": {
- "ace-builds": "^1.31.1",
- "ajv": "^6.12.6",
- "javascript-natural-sort": "^0.7.1",
- "jmespath": "^0.16.0",
- "json-source-map": "^0.6.1",
- "jsonrepair": "3.1.0",
- "mobius1-selectr": "^2.4.13",
- "picomodal": "^3.0.0",
- "vanilla-picker": "^2.12.2"
- }
- },
- "node_modules/jsonrepair": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.1.0.tgz",
- "integrity": "sha512-idqReg23J0PVRAADmZMc5xQM3xeOX5bTB6OTyMnzq33IXJXmn9iJuWIEvGmrN80rQf4d7uLTMEDwpzujNcI0Rg==",
- "bin": {
- "jsonrepair": "bin/cli.js"
- }
- },
- "node_modules/jsx-ast-utils": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
- "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flat": "^1.3.1",
- "object.assign": "^4.1.4",
- "object.values": "^1.1.6"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
- },
- "node_modules/little-state-machine": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/little-state-machine/-/little-state-machine-4.8.0.tgz",
- "integrity": "sha512-xfi5+iDxTLhu0hbnNubUs+qoQQqxhtEZeObP5ELjUlHnl74bbasY7mOonsGQrAouyrbag3ebNLSse5xX1T7buQ==",
- "peerDependencies": {
- "react": "^16.8.0 || ^17 || ^18"
- }
- },
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
- },
- "node_modules/lodash.mergewith": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
- "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="
- },
- "node_modules/log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
- "dev": true,
- "dependencies": {
- "chalk": "^2.4.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/magic-string": {
- "version": "0.26.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz",
- "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==",
- "dev": true,
- "dependencies": {
- "sourcemap-codec": "^1.4.8"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/make-fetch-happen": {
- "version": "10.2.1",
- "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz",
- "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==",
- "dev": true,
- "dependencies": {
- "agentkeepalive": "^4.2.1",
- "cacache": "^16.1.0",
- "http-cache-semantics": "^4.1.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "is-lambda": "^1.0.1",
- "lru-cache": "^7.7.1",
- "minipass": "^3.1.6",
- "minipass-collect": "^1.0.2",
- "minipass-fetch": "^2.0.3",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "negotiator": "^0.6.3",
- "promise-retry": "^2.0.1",
- "socks-proxy-agent": "^7.0.0",
- "ssri": "^9.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/make-fetch-happen/node_modules/lru-cache": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
- "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/map-obj": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
- "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/match-sorter": {
- "version": "6.3.4",
- "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz",
- "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==",
- "dependencies": {
- "@babel/runtime": "^7.23.8",
- "remove-accents": "0.5.0"
- }
- },
- "node_modules/meow": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
- "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
- "dev": true,
- "dependencies": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize": "^1.2.0",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.18.0",
- "yargs-parser": "^20.2.3"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/microseconds": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz",
- "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA=="
- },
- "node_modules/min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/minimatch": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
- "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/minimist-options": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
- "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
- "dev": true,
- "dependencies": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0",
- "kind-of": "^6.0.3"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minipass-collect": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
- "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/minipass-fetch": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz",
- "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.1.6",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.1.2"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- },
- "optionalDependencies": {
- "encoding": "^0.1.13"
- }
- },
- "node_modules/minipass-flush": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
- "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/minipass-pipeline": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
- "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minipass-sized": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
- "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minipass/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/minizlib/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/mobius1-selectr": {
- "version": "2.4.13",
- "resolved": "https://registry.npmjs.org/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz",
- "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw=="
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/nan": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz",
- "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==",
- "dev": true
- },
- "node_modules/nano-time": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz",
- "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==",
- "dependencies": {
- "big-integer": "^1.6.16"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
- "devOptional": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
- },
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/node-fetch-native": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-0.1.8.tgz",
- "integrity": "sha512-ZNaury9r0NxaT2oL65GvdGDy+5PlSaHTovT6JV5tOW07k1TQmgC0olZETa4C9KZg0+6zBr99ctTYa3Utqj9P/Q=="
- },
- "node_modules/node-gyp": {
- "version": "8.4.1",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz",
- "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==",
- "dev": true,
- "dependencies": {
- "env-paths": "^2.2.0",
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.6",
- "make-fetch-happen": "^9.1.0",
- "nopt": "^5.0.0",
- "npmlog": "^6.0.0",
- "rimraf": "^3.0.2",
- "semver": "^7.3.5",
- "tar": "^6.1.2",
- "which": "^2.0.2"
- },
- "bin": {
- "node-gyp": "bin/node-gyp.js"
- },
- "engines": {
- "node": ">= 10.12.0"
- }
- },
- "node_modules/node-gyp/node_modules/@npmcli/fs": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
- "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
- "dev": true,
- "dependencies": {
- "@gar/promisify": "^1.0.1",
- "semver": "^7.3.5"
- }
- },
- "node_modules/node-gyp/node_modules/@npmcli/move-file": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
- "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
- "deprecated": "This functionality has been moved to @npmcli/fs",
- "dev": true,
- "dependencies": {
- "mkdirp": "^1.0.4",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/node-gyp/node_modules/@tootallnate/once": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/node-gyp/node_modules/cacache": {
- "version": "15.3.0",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
- "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
- "dev": true,
- "dependencies": {
- "@npmcli/fs": "^1.0.0",
- "@npmcli/move-file": "^1.0.1",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "glob": "^7.1.4",
- "infer-owner": "^1.0.4",
- "lru-cache": "^6.0.0",
- "minipass": "^3.1.1",
- "minipass-collect": "^1.0.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.2",
- "mkdirp": "^1.0.3",
- "p-map": "^4.0.0",
- "promise-inflight": "^1.0.1",
- "rimraf": "^3.0.2",
- "ssri": "^8.0.1",
- "tar": "^6.0.2",
- "unique-filename": "^1.1.1"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/node-gyp/node_modules/http-proxy-agent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
- "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
- "dev": true,
- "dependencies": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/node-gyp/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/node-gyp/node_modules/make-fetch-happen": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
- "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
- "dev": true,
- "dependencies": {
- "agentkeepalive": "^4.1.3",
- "cacache": "^15.2.0",
- "http-cache-semantics": "^4.1.0",
- "http-proxy-agent": "^4.0.1",
- "https-proxy-agent": "^5.0.0",
- "is-lambda": "^1.0.1",
- "lru-cache": "^6.0.0",
- "minipass": "^3.1.3",
- "minipass-collect": "^1.0.2",
- "minipass-fetch": "^1.3.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "negotiator": "^0.6.2",
- "promise-retry": "^2.0.1",
- "socks-proxy-agent": "^6.0.0",
- "ssri": "^8.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/node-gyp/node_modules/minipass-fetch": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
- "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.1.0",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "optionalDependencies": {
- "encoding": "^0.1.12"
- }
- },
- "node_modules/node-gyp/node_modules/socks-proxy-agent": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz",
- "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==",
- "dev": true,
- "dependencies": {
- "agent-base": "^6.0.2",
- "debug": "^4.3.3",
- "socks": "^2.6.2"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/node-gyp/node_modules/ssri": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
- "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.1.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/node-gyp/node_modules/unique-filename": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
- "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
- "dev": true,
- "dependencies": {
- "unique-slug": "^2.0.0"
- }
- },
- "node_modules/node-gyp/node_modules/unique-slug": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
- "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
- "dev": true,
- "dependencies": {
- "imurmurhash": "^0.1.4"
- }
- },
- "node_modules/node-gyp/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/node-releases": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
- "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
- "dev": true
- },
- "node_modules/node-sass": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-9.0.0.tgz",
- "integrity": "sha512-yltEuuLrfH6M7Pq2gAj5B6Zm7m+gdZoG66wTqG6mIZV/zijq3M2OO2HswtT6oBspPyFhHDcaxWpsBm0fRNDHPg==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "async-foreach": "^0.1.3",
- "chalk": "^4.1.2",
- "cross-spawn": "^7.0.3",
- "gaze": "^1.0.0",
- "get-stdin": "^4.0.1",
- "glob": "^7.0.3",
- "lodash": "^4.17.15",
- "make-fetch-happen": "^10.0.4",
- "meow": "^9.0.0",
- "nan": "^2.17.0",
- "node-gyp": "^8.4.1",
- "sass-graph": "^4.0.1",
- "stdout-stream": "^1.4.0",
- "true-case-path": "^2.2.1"
- },
- "bin": {
- "node-sass": "bin/node-sass"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/node-sass/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/node-sass/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/node-sass/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/node-sass/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/node-sass/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/node-sass/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/nopt": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
- "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
- "dev": true,
- "dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/normalize-package-data": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
- "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^4.0.1",
- "is-core-module": "^2.5.0",
- "semver": "^7.3.4",
- "validate-npm-package-license": "^3.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/npmlog": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
- "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
- "dev": true,
- "dependencies": {
- "are-we-there-yet": "^3.0.0",
- "console-control-strings": "^1.1.0",
- "gauge": "^4.0.3",
- "set-blocking": "^2.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
- "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
- "dependencies": {
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.entries": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
- "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.fromentries": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
- "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.groupby": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz",
- "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==",
- "dev": true,
- "dependencies": {
- "array.prototype.filter": "^1.0.3",
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.0.0"
- }
- },
- "node_modules/object.hasown": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz",
- "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==",
- "dependencies": {
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.values": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
- "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/oblivious-set": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz",
- "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw=="
- },
- "node_modules/ohmyfetch": {
- "version": "0.4.21",
- "resolved": "https://registry.npmjs.org/ohmyfetch/-/ohmyfetch-0.4.21.tgz",
- "integrity": "sha512-VG7f/JRvqvBOYvL0tHyEIEG7XHWm7OqIfAs6/HqwWwDfjiJ1g0huIpe5sFEmyb+7hpFa1EGNH2aERWR72tlClw==",
- "deprecated": "Package renamed to https://github.com/unjs/ofetch",
- "dependencies": {
- "destr": "^1.2.0",
- "node-fetch-native": "^0.1.8",
- "ufo": "^0.8.6",
- "undici": "^5.12.0"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/open": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
- "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
- "dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
- "dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dev": true,
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "devOptional": true
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/picomodal": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/picomodal/-/picomodal-3.0.0.tgz",
- "integrity": "sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw=="
- },
- "node_modules/possible-typed-array-names": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
- "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.35",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
- "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
- "devOptional": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prettier": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
- "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
- "dev": true,
- "peer": true,
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/prettier-linter-helpers": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
- "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
- "dev": true,
- "dependencies": {
- "fast-diff": "^1.1.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "node_modules/promise-inflight": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
- "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
- "dev": true
- },
- "node_modules/promise-retry": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
- "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
- "dev": true,
- "dependencies": {
- "err-code": "^2.0.2",
- "retry": "^0.12.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/prop-types": {
- "version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/qrcode.react": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz",
- "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/quick-lru": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
- "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
- "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
- "dependencies": {
- "loose-envify": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-apexcharts": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.1.tgz",
- "integrity": "sha512-G14nVaD64Bnbgy8tYxkjuXEUp/7h30Q0U33xc3AwtGFijJB9nHqOt1a6eG0WBn055RgRg+NwqbKGtqPxy15d0Q==",
- "dependencies": {
- "prop-types": "^15.8.1"
- },
- "peerDependencies": {
- "apexcharts": "^3.41.0",
- "react": ">=0.13"
- }
- },
- "node_modules/react-clientside-effect": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz",
- "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==",
- "dependencies": {
- "@babel/runtime": "^7.12.13"
- },
- "peerDependencies": {
- "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/react-copy-to-clipboard": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz",
- "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==",
- "dependencies": {
- "copy-to-clipboard": "^3.3.1",
- "prop-types": "^15.8.1"
- },
- "peerDependencies": {
- "react": "^15.3.0 || 16 || 17 || 18"
- }
- },
- "node_modules/react-datepicker": {
- "version": "4.25.0",
- "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.25.0.tgz",
- "integrity": "sha512-zB7CSi44SJ0sqo8hUQ3BF1saE/knn7u25qEMTO1CQGofY1VAKahO8k9drZtp0cfW1DMfoYLR3uSY1/uMvbEzbg==",
- "dependencies": {
- "@popperjs/core": "^2.11.8",
- "classnames": "^2.2.6",
- "date-fns": "^2.30.0",
- "prop-types": "^15.7.2",
- "react-onclickoutside": "^6.13.0",
- "react-popper": "^2.3.0"
- },
- "peerDependencies": {
- "react": "^16.9.0 || ^17 || ^18",
- "react-dom": "^16.9.0 || ^17 || ^18"
- }
- },
- "node_modules/react-dom": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
- "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.0"
- },
- "peerDependencies": {
- "react": "^18.2.0"
- }
- },
- "node_modules/react-fast-compare": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
- "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
- },
- "node_modules/react-focus-lock": {
- "version": "2.11.2",
- "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.11.2.tgz",
- "integrity": "sha512-DDTbEiov0+RthESPVSTIdAWPPKic+op3sCcP+icbMRobvQNt7LuAlJ3KoarqQv5sCgKArru3kXmlmFTa27/CdQ==",
- "dependencies": {
- "@babel/runtime": "^7.0.0",
- "focus-lock": "^1.3.2",
- "prop-types": "^15.6.2",
- "react-clientside-effect": "^1.2.6",
- "use-callback-ref": "^1.3.0",
- "use-sidecar": "^1.1.2"
- },
- "peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-github-btn": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/react-github-btn/-/react-github-btn-1.4.0.tgz",
- "integrity": "sha512-lV4FYClAfjWnBfv0iNlJUGhamDgIq6TayD0kPZED6VzHWdpcHmPfsYOZ/CFwLfPv4Zp+F4m8QKTj0oy2HjiGXg==",
- "dependencies": {
- "github-buttons": "^2.22.0"
- },
- "peerDependencies": {
- "react": ">=16.3.0"
- }
- },
- "node_modules/react-hook-form": {
- "version": "7.51.0",
- "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.0.tgz",
- "integrity": "sha512-BggOy5j58RdhdMzzRUHGOYhSz1oeylFAv6jUSG86OvCIvlAvS7KvnRY7yoAf2pfEiPN7BesnR0xx73nEk3qIiw==",
- "engines": {
- "node": ">=12.22.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/react-hook-form"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17 || ^18"
- }
- },
- "node_modules/react-i18next": {
- "version": "12.3.1",
- "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-12.3.1.tgz",
- "integrity": "sha512-5v8E2XjZDFzK7K87eSwC7AJcAkcLt5xYZ4+yTPDAW1i7C93oOY1dnr4BaQM7un4Hm+GmghuiPvevWwlca5PwDA==",
- "dependencies": {
- "@babel/runtime": "^7.20.6",
- "html-parse-stringify": "^3.0.1"
- },
- "peerDependencies": {
- "i18next": ">= 19.0.0",
- "react": ">= 16.8.0"
- },
- "peerDependenciesMeta": {
- "react-dom": {
- "optional": true
- },
- "react-native": {
- "optional": true
- }
- }
- },
- "node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
- "node_modules/react-json-editor-ajrm": {
- "version": "2.5.14",
- "resolved": "https://registry.npmjs.org/react-json-editor-ajrm/-/react-json-editor-ajrm-2.5.14.tgz",
- "integrity": "sha512-z2035l5lnU0Wo73AUonj68d1Eh9vjVcLXEa8YogDEeFPcogzYkfT6R38fvYlLKDhP0oI+LyOO/IBWsFkXs4M0Q==",
- "dependencies": {
- "@babel/runtime": "^7.0.0-rc.0"
- },
- "peerDependencies": {
- "react": ">=16.2.0",
- "react-dom": ">=16.2.0"
- }
- },
- "node_modules/react-loading-skeleton": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.4.0.tgz",
- "integrity": "sha512-1oJEBc9+wn7BbkQQk7YodlYEIjgeR+GrRjD+QXkVjwZN7LGIcAFHrx4NhT7UHGBxNY1+zax3c+Fo6XQM4R7CgA==",
- "peerDependencies": {
- "react": ">=16.8.0"
- }
- },
- "node_modules/react-onclickoutside": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz",
- "integrity": "sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==",
- "funding": {
- "type": "individual",
- "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md"
- },
- "peerDependencies": {
- "react": "^15.5.x || ^16.x || ^17.x || ^18.x",
- "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x"
- }
- },
- "node_modules/react-popper": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz",
- "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==",
- "dependencies": {
- "react-fast-compare": "^3.0.1",
- "warning": "^4.0.2"
- },
- "peerDependencies": {
- "@popperjs/core": "^2.0.0",
- "react": "^16.8.0 || ^17 || ^18",
- "react-dom": "^16.8.0 || ^17 || ^18"
- }
- },
- "node_modules/react-query": {
- "version": "3.39.3",
- "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz",
- "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==",
- "dependencies": {
- "@babel/runtime": "^7.5.5",
- "broadcast-channel": "^3.4.1",
- "match-sorter": "^6.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/tannerlinsley"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "react-dom": {
- "optional": true
- },
- "react-native": {
- "optional": true
- }
- }
- },
- "node_modules/react-refresh": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
- "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-remove-scroll": {
- "version": "2.5.7",
- "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz",
- "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==",
- "dependencies": {
- "react-remove-scroll-bar": "^2.3.4",
- "react-style-singleton": "^2.2.1",
- "tslib": "^2.1.0",
- "use-callback-ref": "^1.3.0",
- "use-sidecar": "^1.1.2"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-remove-scroll-bar": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.5.tgz",
- "integrity": "sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==",
- "dependencies": {
- "react-style-singleton": "^2.2.1",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-resizable-panels": {
- "version": "2.0.12",
- "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.0.12.tgz",
- "integrity": "sha512-m0cfwlVQ+460iQbOSVfs3MljVniHI/LGpHGQBa7aNCYUYwaERHcf5W/lCTsoRhbGQfMW9An0M8gxUHILA53Jeg==",
- "peerDependencies": {
- "react": "^16.14.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/react-router": {
- "version": "6.22.3",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz",
- "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==",
- "dependencies": {
- "@remix-run/router": "1.15.3"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "react": ">=16.8"
- }
- },
- "node_modules/react-router-dom": {
- "version": "6.22.3",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz",
- "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==",
- "dependencies": {
- "@remix-run/router": "1.15.3",
- "react-router": "6.22.3"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "react": ">=16.8",
- "react-dom": ">=16.8"
- }
- },
- "node_modules/react-simple-animate": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/react-simple-animate/-/react-simple-animate-3.5.2.tgz",
- "integrity": "sha512-xLE65euP920QMTOmv5haPlml+hmOPDkbIr5WeF7ADIXWBYt5kW/vwpNfWg8EKMab8aeDxIZ6QjffVh8v2dUyhg==",
- "peerDependencies": {
- "react-dom": "^16.8.0 || ^17 || ^18"
- }
- },
- "node_modules/react-slick": {
- "version": "0.29.0",
- "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.29.0.tgz",
- "integrity": "sha512-TGdOKE+ZkJHHeC4aaoH85m8RnFyWqdqRfAGkhd6dirmATXMZWAxOpTLmw2Ll/jPTQ3eEG7ercFr/sbzdeYCJXA==",
- "dependencies": {
- "classnames": "^2.2.5",
- "enquire.js": "^2.1.6",
- "json2mq": "^0.2.0",
- "lodash.debounce": "^4.0.8",
- "resize-observer-polyfill": "^1.5.0"
- },
- "peerDependencies": {
- "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/react-style-singleton": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
- "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
- "dependencies": {
- "get-nonce": "^1.0.0",
- "invariant": "^2.2.4",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-use-websocket": {
- "version": "4.8.1",
- "resolved": "https://registry.npmjs.org/react-use-websocket/-/react-use-websocket-4.8.1.tgz",
- "integrity": "sha512-FTXuG5O+LFozmu1BRfrzl7UIQngECvGJmL7BHsK4TYXuVt+mCizVA8lT0hGSIF0Z0TedF7bOo1nRzOUdginhDw==",
- "peerDependencies": {
- "react": ">= 18.0.0",
- "react-dom": ">= 18.0.0"
- }
- },
- "node_modules/read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "dependencies": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "dependencies": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/read-pkg-up/node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up/node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/read-pkg-up/node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up/node_modules/type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg/node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "node_modules/read-pkg/node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "node_modules/read-pkg/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/read-pkg/node_modules/type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "dependencies": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/reflect.getprototypeof": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz",
- "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==",
- "dependencies": {
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.0.0",
- "get-intrinsic": "^1.2.3",
- "globalthis": "^1.0.3",
- "which-builtin-type": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
- },
- "node_modules/regexp.prototype.flags": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
- "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
- "dependencies": {
- "call-bind": "^1.0.6",
- "define-properties": "^1.2.1",
- "es-errors": "^1.3.0",
- "set-function-name": "^2.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/remove-accents": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz",
- "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A=="
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/resize-observer-polyfill": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
- "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
- },
- "node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rollup": {
- "version": "2.79.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
- "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
- "devOptional": true,
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/rollup-plugin-visualizer": {
- "version": "5.12.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz",
- "integrity": "sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==",
- "dependencies": {
- "open": "^8.4.0",
- "picomatch": "^2.3.1",
- "source-map": "^0.7.4",
- "yargs": "^17.5.1"
- },
- "bin": {
- "rollup-plugin-visualizer": "dist/bin/cli.js"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "rollup": "2.x || 3.x || 4.x"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/rollup-plugin-visualizer/node_modules/source-map": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-array-concat": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
- "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "get-intrinsic": "^1.2.4",
- "has-symbols": "^1.0.3",
- "isarray": "^2.0.5"
- },
- "engines": {
- "node": ">=0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/safe-regex-test": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
- "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
- "dependencies": {
- "call-bind": "^1.0.6",
- "es-errors": "^1.3.0",
- "is-regex": "^1.1.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "optional": true
- },
- "node_modules/sass": {
- "version": "1.71.1",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz",
- "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==",
- "dev": true,
- "dependencies": {
- "chokidar": ">=3.0.0 <4.0.0",
- "immutable": "^4.0.0",
- "source-map-js": ">=0.6.2 <2.0.0"
- },
- "bin": {
- "sass": "sass.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/sass-graph": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.1.tgz",
- "integrity": "sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.0.0",
- "lodash": "^4.17.11",
- "scss-tokenizer": "^0.4.3",
- "yargs": "^17.2.1"
- },
- "bin": {
- "sassgraph": "bin/sassgraph"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/scheduler": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
- "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
- "dependencies": {
- "loose-envify": "^1.1.0"
- }
- },
- "node_modules/scss-tokenizer": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz",
- "integrity": "sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw==",
- "dev": true,
- "dependencies": {
- "js-base64": "^2.4.9",
- "source-map": "^0.7.3"
- }
- },
- "node_modules/scss-tokenizer/node_modules/source-map": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
- "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
- "dev": true
- },
- "node_modules/set-function-length": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/set-function-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
- "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/slick-carousel": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
- "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==",
- "peerDependencies": {
- "jquery": ">=1.8.0"
- }
- },
- "node_modules/smart-buffer": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
- "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
- "dev": true,
- "engines": {
- "node": ">= 6.0.0",
- "npm": ">= 3.0.0"
- }
- },
- "node_modules/socks": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz",
- "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==",
- "dev": true,
- "dependencies": {
- "ip-address": "^9.0.5",
- "smart-buffer": "^4.2.0"
- },
- "engines": {
- "node": ">= 10.0.0",
- "npm": ">= 3.0.0"
- }
- },
- "node_modules/socks-proxy-agent": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
- "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
- "dev": true,
- "dependencies": {
- "agent-base": "^6.0.2",
- "debug": "^4.3.3",
- "socks": "^2.6.2"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
- "devOptional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/sourcemap-codec": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
- "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
- "deprecated": "Please use @jridgewell/sourcemap-codec instead",
- "dev": true
- },
- "node_modules/spdx-correct": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
- "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
- "dev": true,
- "dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-exceptions": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
- "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
- "dev": true
- },
- "node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-license-ids": {
- "version": "3.0.17",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz",
- "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==",
- "dev": true
- },
- "node_modules/sprintf-js": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
- "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
- "dev": true
- },
- "node_modules/ssri": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz",
- "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.1.1"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/stdout-stream": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
- "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
- "dev": true,
- "dependencies": {
- "readable-stream": "^2.0.1"
- }
- },
- "node_modules/stdout-stream/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/stdout-stream/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/stdout-stream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/stdout-stream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/string-convert": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
- "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string.prototype.matchall": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz",
- "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
- "regexp.prototype.flags": "^1.5.0",
- "set-function-name": "^2.0.0",
- "side-channel": "^1.0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trim": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
- "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimend": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
- "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
- "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "dependencies": {
- "min-indent": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/stylis": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
- "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
- },
- "node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/svg-parser": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
- "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
- "dev": true
- },
- "node_modules/svg.draggable.js": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz",
- "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==",
- "dependencies": {
- "svg.js": "^2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/svg.easing.js": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz",
- "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==",
- "dependencies": {
- "svg.js": ">=2.3.x"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/svg.filter.js": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz",
- "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==",
- "dependencies": {
- "svg.js": "^2.2.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/svg.js": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz",
- "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA=="
- },
- "node_modules/svg.pathmorphing.js": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz",
- "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==",
- "dependencies": {
- "svg.js": "^2.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/svg.resize.js": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz",
- "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==",
- "dependencies": {
- "svg.js": "^2.6.5",
- "svg.select.js": "^2.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/svg.resize.js/node_modules/svg.select.js": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz",
- "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==",
- "dependencies": {
- "svg.js": "^2.2.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/svg.select.js": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz",
- "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==",
- "dependencies": {
- "svg.js": "^2.6.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/synckit": {
- "version": "0.8.8",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz",
- "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==",
- "dev": true,
- "dependencies": {
- "@pkgr/core": "^0.1.0",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/unts"
- }
- },
- "node_modules/tar": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
- "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
- "dev": true,
- "dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^5.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/tar/node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tar/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
- },
- "node_modules/tiny-invariant": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
- "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="
- },
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toggle-selection": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
- "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
- },
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
- },
- "node_modules/trim-newlines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
- "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/true-case-path": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz",
- "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==",
- "dev": true
- },
- "node_modules/ts-api-utils": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
- "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
- "dev": true,
- "engines": {
- "node": ">=16"
- },
- "peerDependencies": {
- "typescript": ">=4.2.0"
- }
- },
- "node_modules/tsconfig-paths": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
- "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
- "dev": true,
- "dependencies": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
- }
- },
- "node_modules/tsconfig-paths/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.2.0"
- },
- "bin": {
- "json5": "lib/cli.js"
- }
- },
- "node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/type-fest": {
- "version": "0.18.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
- "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/typed-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
- "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "is-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/typed-array-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
- "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-byte-offset": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
- "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
- "dependencies": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-length": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz",
- "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13",
- "possible-typed-array-names": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typescript": {
- "version": "4.9.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
- "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/ufo": {
- "version": "0.8.6",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.6.tgz",
- "integrity": "sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw=="
- },
- "node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/undici": {
- "version": "5.28.3",
- "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz",
- "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==",
- "dependencies": {
- "@fastify/busboy": "^2.0.0"
- },
- "engines": {
- "node": ">=14.0"
- }
- },
- "node_modules/unique-filename": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz",
- "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==",
- "dev": true,
- "dependencies": {
- "unique-slug": "^3.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/unique-slug": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz",
- "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==",
- "dev": true,
- "dependencies": {
- "imurmurhash": "^0.1.4"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/unload": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz",
- "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==",
- "dependencies": {
- "@babel/runtime": "^7.6.2",
- "detect-node": "^2.0.4"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
- "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/use-callback-ref": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.1.tgz",
- "integrity": "sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==",
- "dependencies": {
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-deep-compare-effect": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/use-deep-compare-effect/-/use-deep-compare-effect-1.8.1.tgz",
- "integrity": "sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==",
- "dependencies": {
- "@babel/runtime": "^7.12.5",
- "dequal": "^2.0.2"
- },
- "engines": {
- "node": ">=10",
- "npm": ">=6"
- },
- "peerDependencies": {
- "react": ">=16.13"
- }
- },
- "node_modules/use-sidecar": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
- "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
- "dependencies": {
- "detect-node-es": "^1.1.0",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-sync-external-store": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
- "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
- },
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "node_modules/vanilla-picker": {
- "version": "2.12.2",
- "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.2.tgz",
- "integrity": "sha512-dk0gNeNL9fQFGd1VEhNDQfFlbCqAiksRh1H2tVPlavkH88n/a/y30rXi9PPKrYPTK5kEfPO4xcldt4ts/1wIAg==",
- "dependencies": {
- "@sphinxxxx/color-conversion": "^2.2.2"
- }
- },
- "node_modules/vite": {
- "version": "3.2.8",
- "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.8.tgz",
- "integrity": "sha512-EtQU16PLIJpAZol2cTLttNP1mX6L0SyI0pgQB1VOoWeQnMSvtiwovV3D6NcjN8CZQWWyESD2v5NGnpz5RvgOZA==",
- "devOptional": true,
- "dependencies": {
- "esbuild": "^0.15.9",
- "postcss": "^8.4.18",
- "resolve": "^1.22.1",
- "rollup": "^2.79.1"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- },
- "peerDependencies": {
- "@types/node": ">= 14",
- "less": "*",
- "sass": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.4.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- }
- }
- },
- "node_modules/vite-plugin-svgr": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz",
- "integrity": "sha512-q+mJJol6ThvqkkJvvVFEndI4EaKIjSI0I3jNFgSoC9fXAz1M7kYTVUin8fhUsFojFDKZ9VHKtX6NXNaOLpbsHA==",
- "dev": true,
- "dependencies": {
- "@rollup/pluginutils": "^5.0.2",
- "@svgr/core": "^6.5.1"
- },
- "peerDependencies": {
- "vite": "^2.6.0 || 3 || 4"
- }
- },
- "node_modules/vite-tsconfig-paths": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.1.tgz",
- "integrity": "sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==",
- "dependencies": {
- "debug": "^4.1.1",
- "globrex": "^0.1.2",
- "tsconfck": "^3.0.1"
- },
- "peerDependencies": {
- "vite": "*"
- },
- "peerDependenciesMeta": {
- "vite": {
- "optional": true
- }
- }
- },
- "node_modules/vite-tsconfig-paths/node_modules/tsconfck": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.3.tgz",
- "integrity": "sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==",
- "bin": {
- "tsconfck": "bin/tsconfck.js"
- },
- "engines": {
- "node": "^18 || >=20"
- },
- "peerDependencies": {
- "typescript": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/vite-tsconfig-paths/node_modules/typescript": {
- "version": "5.4.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz",
- "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==",
- "optional": true,
- "peer": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/vite/node_modules/@esbuild/android-arm": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz",
- "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/vite/node_modules/@esbuild/linux-loong64": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz",
- "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/vite/node_modules/esbuild": {
- "version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
- "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
- "devOptional": true,
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/android-arm": "0.15.18",
- "@esbuild/linux-loong64": "0.15.18",
- "esbuild-android-64": "0.15.18",
- "esbuild-android-arm64": "0.15.18",
- "esbuild-darwin-64": "0.15.18",
- "esbuild-darwin-arm64": "0.15.18",
- "esbuild-freebsd-64": "0.15.18",
- "esbuild-freebsd-arm64": "0.15.18",
- "esbuild-linux-32": "0.15.18",
- "esbuild-linux-64": "0.15.18",
- "esbuild-linux-arm": "0.15.18",
- "esbuild-linux-arm64": "0.15.18",
- "esbuild-linux-mips64le": "0.15.18",
- "esbuild-linux-ppc64le": "0.15.18",
- "esbuild-linux-riscv64": "0.15.18",
- "esbuild-linux-s390x": "0.15.18",
- "esbuild-netbsd-64": "0.15.18",
- "esbuild-openbsd-64": "0.15.18",
- "esbuild-sunos-64": "0.15.18",
- "esbuild-windows-32": "0.15.18",
- "esbuild-windows-64": "0.15.18",
- "esbuild-windows-arm64": "0.15.18"
- }
- },
- "node_modules/void-elements": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
- "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/warning": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
- "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
- },
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-builtin-type": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
- "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
- "dependencies": {
- "function.prototype.name": "^1.1.5",
- "has-tostringtag": "^1.0.0",
- "is-async-function": "^2.0.0",
- "is-date-object": "^1.0.5",
- "is-finalizationregistry": "^1.0.2",
- "is-generator-function": "^1.0.10",
- "is-regex": "^1.1.4",
- "is-weakref": "^1.0.2",
- "isarray": "^2.0.5",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.9"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-collection": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
- "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
- "dependencies": {
- "is-map": "^2.0.3",
- "is-set": "^2.0.3",
- "is-weakmap": "^2.0.2",
- "is-weakset": "^2.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
- "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
- "dependencies": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/wide-align": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
- "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
- "dev": true,
- "dependencies": {
- "string-width": "^1.0.2 || 2 || 3 || 4"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/wrap-ansi/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- },
- "node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs/node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/zod": {
- "version": "3.22.4",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz",
- "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- },
- "node_modules/zustand": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz",
- "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
- "dependencies": {
- "use-sync-external-store": "1.2.0"
- },
- "engines": {
- "node": ">=12.7.0"
- },
- "peerDependencies": {
- "@types/react": ">=16.8",
- "immer": ">=9.0.6",
- "react": ">=16.8"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "immer": {
- "optional": true
- },
- "react": {
- "optional": true
- }
- }
- },
- "node_modules/zustand-computed": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/zustand-computed/-/zustand-computed-1.4.0.tgz",
- "integrity": "sha512-u2UcABkJ1MqvO9HMW2lJ/FKOyN9EBmbDso5fmt9/JgSGO3WqkL/agVfR8RJsoH1yYp9gu9/uJPO2ObQDRaKrhQ==",
- "peerDependencies": {
- "react": "^18.2.0",
- "zustand": "^4.3.8"
- }
- }
- }
-}
diff --git a/app/dashboard/package.json b/app/dashboard/package.json
deleted file mode 100644
index 6a28ad1..0000000
--- a/app/dashboard/package.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "name": "marzneshin-dashboard",
- "private": true,
- "version": "0.1.3",
- "scripts": {
- "dev": "vite --port 3000",
- "build": "tsc && vite build",
- "preview": "vite preview --port 3000",
- "gen:theme-typings": "chakra-cli tokens ./chakra.config.ts",
- "postinstall": "npm run gen:theme-typings",
- "lint": "eslint --ignore-path .eslintignore . --ext ts --ext tsx --ext js --ext jsx",
- "lint:fix": "eslint --ignore-path .eslintignore . --ext ts --ext tsx --ext js --ext jsx --fix"
- },
- "dependencies": {
- "@chakra-ui/icons": "^2.1.1",
- "@chakra-ui/react": "^2.5.5",
- "@emotion/react": "^11.10.5",
- "@emotion/styled": "^11.10.5",
- "@heroicons/react": "^2.0.12",
- "@hookform/devtools": "^4.3.1",
- "@hookform/resolvers": "^2.9.10",
- "@tanstack/react-query-devtools": "^5.24.8",
- "apexcharts": "^3.40.0",
- "classnames": "^2.3.2",
- "dayjs": "^1.11.6",
- "eslint": "^8.56.0",
- "eslint-plugin-react": "^7.33.2",
- "framer-motion": "^7.6.6",
- "i18next": "^22.4.14",
- "i18next-browser-languagedetector": "^7.0.1",
- "i18next-http-backend": "^2.2.0",
- "jsoneditor": "^9.10.1",
- "lodash.debounce": "^4.0.8",
- "ohmyfetch": "^0.4.21",
- "qrcode.react": "^3.1.0",
- "react": "^18.2.0",
- "react-apexcharts": "^1.4.0",
- "react-copy-to-clipboard": "^5.1.0",
- "react-datepicker": "^4.8.0",
- "react-dom": "^18.2.0",
- "react-github-btn": "^1.4.0",
- "react-hook-form": "^7.39.1",
- "react-i18next": "^12.2.0",
- "react-json-editor-ajrm": "^2.5.14",
- "react-loading-skeleton": "^3.1.0",
- "react-query": "^3.39.3",
- "react-resizable-panels": "^2.0.9",
- "react-router-dom": "^6.4.3",
- "react-slick": "^0.29.0",
- "react-use-websocket": "^4.3.1",
- "rollup-plugin-visualizer": "^5.9.0",
- "slick-carousel": "^1.8.1",
- "vite-tsconfig-paths": "^4.0.3",
- "zod": "^3.19.1",
- "zustand": "^4.4.6",
- "zustand-computed": "^1.3.3"
- },
- "devDependencies": {
- "@chakra-ui/cli": "^2.3.0",
- "@types/jsoneditor": "^9.9.0",
- "@types/lodash.debounce": "^4.0.7",
- "@types/react": "^18.0.17",
- "@types/react-copy-to-clipboard": "^5.0.4",
- "@types/react-datepicker": "^4.8.0",
- "@types/react-dom": "^18.0.6",
- "@types/react-json-editor-ajrm": "^2.5.3",
- "@types/react-slick": "^0.23.10",
- "@typescript-eslint/eslint-plugin": "^6.19.1",
- "@typescript-eslint/parser": "^6.19.1",
- "@vitejs/plugin-react": "^2.1.0",
- "autoprefixer": "^10.4.12",
- "eslint-config-prettier": "^9.1.0",
- "eslint-plugin-import": "^2.29.1",
- "eslint-plugin-prettier": "^5.1.3",
- "eslint-plugin-react-hooks": "^4.6.0",
- "node-sass": "^9.0.0",
- "sass": "^1.70.0",
- "typescript": "^4.9.5",
- "vite": "^3.1.0",
- "vite-plugin-svgr": "^2.2.2"
- }
-}
diff --git a/app/dashboard/public/favicon/android-chrome-192x192.png b/app/dashboard/public/favicon/android-chrome-192x192.png
deleted file mode 100644
index b4cda80..0000000
Binary files a/app/dashboard/public/favicon/android-chrome-192x192.png and /dev/null differ
diff --git a/app/dashboard/public/favicon/android-chrome-512x512.png b/app/dashboard/public/favicon/android-chrome-512x512.png
deleted file mode 100644
index 44766a4..0000000
Binary files a/app/dashboard/public/favicon/android-chrome-512x512.png and /dev/null differ
diff --git a/app/dashboard/public/favicon/apple-touch-icon.png b/app/dashboard/public/favicon/apple-touch-icon.png
deleted file mode 100644
index c6735c8..0000000
Binary files a/app/dashboard/public/favicon/apple-touch-icon.png and /dev/null differ
diff --git a/app/dashboard/public/favicon/browserconfig.xml b/app/dashboard/public/favicon/browserconfig.xml
deleted file mode 100644
index c08fb32..0000000
--- a/app/dashboard/public/favicon/browserconfig.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<browserconfig>
- <msapplication>
- <tile>
- <square150x150logo src="/favicon/mstile-150x150.png"/>
- <TileColor>#2b5797</TileColor>
- </tile>
- </msapplication>
-</browserconfig>
diff --git a/app/dashboard/public/favicon/favicon-16x16.png b/app/dashboard/public/favicon/favicon-16x16.png
deleted file mode 100644
index 171d2b5..0000000
Binary files a/app/dashboard/public/favicon/favicon-16x16.png and /dev/null differ
diff --git a/app/dashboard/public/favicon/favicon-32x32.png b/app/dashboard/public/favicon/favicon-32x32.png
deleted file mode 100644
index 0a2366a..0000000
Binary files a/app/dashboard/public/favicon/favicon-32x32.png and /dev/null differ
diff --git a/app/dashboard/public/favicon/favicon.ico b/app/dashboard/public/favicon/favicon.ico
deleted file mode 100644
index 904ad81..0000000
Binary files a/app/dashboard/public/favicon/favicon.ico and /dev/null differ
diff --git a/app/dashboard/public/favicon/logo.svg b/app/dashboard/public/favicon/logo.svg
deleted file mode 100644
index 6bf7ccf..0000000
--- a/app/dashboard/public/favicon/logo.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg viewBox="0 0 747 747" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M746.671 209.652V77.6572C746.671 72.9384 743.827 68.6832 739.468 66.8811C735.108 65.0738 730.093 66.0739 726.754 69.4072L579.354 216.807C577.453 202.386 570.203 189.203 559.037 179.87C547.875 170.542 533.615 165.744 519.083 166.432C504.551 167.12 490.807 173.24 480.573 183.583L414.375 249.776C412.417 235.391 405.141 222.25 393.985 212.959C382.823 203.662 368.594 198.88 354.083 199.552C339.578 200.224 325.849 206.302 315.594 216.588L274.343 257.828L19.9167 3.41515C16.5781 0.0818157 11.5625 -0.918184 7.20306 0.889149C2.84373 2.69648 0 6.94648 0 11.6651V143.649C0 146.743 1.22917 149.712 3.41667 151.899L191.843 340.339L3.41667 528.753C1.2292 530.94 0 533.909 0 537.003V668.997C0 673.716 2.84373 677.971 7.20306 679.773C11.5624 681.581 16.578 680.58 19.9167 677.247L167.317 529.847C169.285 544.233 176.561 557.358 187.718 566.65C198.869 575.947 213.098 580.728 227.603 580.066C242.103 579.404 255.838 573.342 266.098 563.071L332.295 496.874V496.879C334.259 511.264 341.535 524.395 352.691 533.686C363.853 542.977 378.082 547.759 392.587 547.092C407.093 546.421 420.822 540.348 431.077 530.066L472.327 488.826L726.754 743.239C728.941 745.427 731.91 746.656 735.004 746.656C736.535 746.661 738.056 746.359 739.473 745.77C743.832 743.963 746.671 739.708 746.671 734.989V602.994C746.671 599.901 745.442 596.932 743.254 594.744L554.827 406.318L743.254 217.904H743.259C745.447 215.717 746.676 212.748 746.676 209.654L746.671 209.652ZM23.3373 39.8118L257.844 274.318L208.328 323.818L23.3413 138.818L23.3373 39.8118ZM723.337 706.825L488.831 472.318L538.347 422.818L723.333 607.818L723.337 706.825ZM23.3373 541.825L332.097 233.078C338.764 226.719 347.624 223.172 356.843 223.172C366.056 223.172 374.916 226.719 381.588 233.078C388.151 239.641 391.838 248.548 391.838 257.828C391.838 267.114 388.151 276.016 381.588 282.577L23.3347 640.831L23.3373 541.825ZM249.604 546.575C240.755 555.419 227.864 558.872 215.781 555.638C203.703 552.398 194.265 542.961 191.027 530.883C187.792 518.8 191.245 505.91 200.089 497.06L497.076 200.074C505.92 191.23 518.811 187.772 530.893 191.011C542.971 194.246 552.409 203.678 555.648 215.76C558.888 227.839 555.434 240.73 546.591 249.572L249.604 546.575ZM723.337 204.815L414.577 513.562C407.911 519.926 399.051 523.473 389.832 523.473C380.618 523.473 371.753 519.926 365.087 513.562C358.529 506.999 354.842 498.098 354.842 488.816C354.842 479.535 358.529 470.634 365.087 464.071L723.34 105.818L723.337 204.815Z" fill="currentColor"/>
-</svg>
diff --git a/app/dashboard/public/favicon/mstile-150x150.png b/app/dashboard/public/favicon/mstile-150x150.png
deleted file mode 100644
index d352655..0000000
Binary files a/app/dashboard/public/favicon/mstile-150x150.png and /dev/null differ
diff --git a/app/dashboard/public/favicon/safari-pinned-tab.svg b/app/dashboard/public/favicon/safari-pinned-tab.svg
deleted file mode 100644
index d3a67fe..0000000
--- a/app/dashboard/public/favicon/safari-pinned-tab.svg
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
- "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
-<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
- width="747.000000pt" height="747.000000pt" viewBox="0 0 747.000000 747.000000"
- preserveAspectRatio="xMidYMid meet">
-<metadata>
-Created by potrace 1.14, written by Peter Selinger 2001-2017
-</metadata>
-<g transform="translate(0.000000,747.000000) scale(0.100000,-0.100000)"
-fill="#000000" stroke="none">
-<path d="M58 7454 c-60 -32 -58 -8 -58 -771 l0 -698 957 -957 958 -958 -947
--948 c-520 -521 -951 -957 -957 -969 -8 -15 -11 -229 -11 -713 0 -634 1 -694
-17 -721 29 -49 99 -72 146 -48 12 6 356 345 764 752 468 467 744 736 746 727
-3 -8 10 -35 17 -60 50 -186 223 -354 416 -405 75 -20 210 -19 288 1 145 37
-171 58 562 447 l362 359 17 -58 c60 -210 217 -366 420 -419 76 -19 210 -19
-289 1 136 35 182 69 441 326 l240 237 1285 -1284 c880 -879 1294 -1286 1313
--1291 38 -9 72 2 110 35 l32 29 3 689 c1 378 0 699 -3 713 -4 16 -366 385
--961 980 l-954 955 946 945 c520 520 952 957 960 972 12 23 14 135 14 708 0
-611 -2 686 -16 716 -28 60 -111 83 -164 48 -14 -9 -356 -347 -761 -752 l-736
--734 -7 46 c-4 25 -26 83 -48 129 -127 254 -434 387 -691 298 -143 -50 -161
--65 -543 -444 l-361 -358 -7 43 c-4 24 -25 81 -48 128 -70 145 -205 259 -363
-306 -81 24 -229 24 -310 0 -139 -41 -184 -74 -438 -325 l-238 -235 -1287 1287
-c-1284 1284 -1287 1287 -1327 1287 -22 -1 -52 -7 -67 -16z m2269 -2971 l-247
--248 -920 920 -920 920 0 495 0 495 1167 -1167 1168 -1168 -248 -247z m3341
--620 c-1721 -1721 -1603 -1612 -1744 -1621 -173 -11 -313 87 -360 252 -20 72
--14 153 17 229 20 46 227 257 1833 1865 l1811 1812 3 -487 2 -488 -1562 -1562z
-m-315 1677 c102 -38 188 -148 207 -264 10 -66 -4 -155 -35 -215 -17 -33 -441
--463 -1557 -1577 -1492 -1491 -1535 -1532 -1593 -1554 -111 -40 -239 -24 -332
-43 -91 65 -151 198 -139 309 14 136 -94 20 1570 1686 875 876 1540 1534 1565
-1550 95 56 203 63 314 22z m-1623 -345 c165 -83 232 -296 145 -463 -17 -34
--508 -532 -1829 -1852 l-1806 -1805 0 490 0 490 1563 1561 c1676 1675 1594
-1598 1712 1613 71 9 157 -4 215 -34z m3500 -4295 l0 -495 -1170 1170 -1170
-1170 247 247 248 248 922 -922 923 -923 0 -495z"/>
-</g>
-</svg>
diff --git a/app/dashboard/public/favicon/site.webmanifest b/app/dashboard/public/favicon/site.webmanifest
deleted file mode 100644
index 5eb5e44..0000000
--- a/app/dashboard/public/favicon/site.webmanifest
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "",
- "short_name": "",
- "icons": [
- {
- "src": "/favicon/android-chrome-192x192.png",
- "sizes": "192x192",
- "type": "image/png"
- },
- {
- "src": "/favicon/android-chrome-512x512.png",
- "sizes": "512x512",
- "type": "image/png"
- }
- ],
- "theme_color": "#ffffff",
- "background_color": "#ffffff",
- "display": "standalone"
-}
diff --git a/app/dashboard/public/locales/en.json b/app/dashboard/public/locales/en.json
deleted file mode 100644
index db20623..0000000
--- a/app/dashboard/public/locales/en.json
+++ /dev/null
@@ -1,258 +0,0 @@
-{
- "home": "Home",
- "hosts": "Hosts",
- "password": "Password",
- "cancel": "Cancel",
- "apply": "Apply",
- "delete": "Delete",
- "reset": "Reset",
- "createUser": "Create User",
- "createService": "Create Service",
- "username": "Username",
- "name": "Name",
- "node": "Node",
- "nodes": "Nodes",
- "xrayVersion": "xray version",
- "addNode": "Add Node",
- "expires": "Expires in {{time}}",
- "expired": "Expired {{time}} ago",
- "dateFormat": "MMMM d, yyy",
- "services": "Services",
- "inbound": "Inbound",
- "inbounds": "Inbounds",
- "sidebar": {
- "groups": {
- "management": "Management",
- "settings": "Settings"
- }
- },
- "login": {
- "login": "Login",
- "loginYourAccount": "Login to your account",
- "welcomeBack": "Welcome back, please enter your details",
- "fieldRequired": "This field is required"
- },
- "header": {
- "hostSettings": "Host Settings",
- "nodeSettings": "Node Settings",
- "nodesUsage": "Nodes Usage",
- "donation": "Donation",
- "logout": "Log out"
- },
- "deleteUser": {
- "title": "Delete User",
- "prompt": "Are you sure you want to delete <b>{{username}}</b>?",
- "deleteSuccess": "{{username}} deleted successfully."
- },
- "usersTable": {
- "status": "status",
- "dataUsage": "data usage",
- "noUserMatched": "It seems there is no user matched with what you are looking for",
- "noUser": "There is no user added to the system",
- "copyLink": "Copy Subscription Link",
- "copied": "Copied",
- "copyConfigs": "Copy Configs",
- "total": "Total"
- },
- "servicesTable": {
- "noServiceMatched": "It seems there is no user matched with what you are looking for",
- "noService": "There is no user added to the system",
- "usersNumber": "Users",
- "inboundsNumber": "Inbounds",
- "total": "Total"
- },
- "nodesTable": {
- "status": "status",
- "dataUsage": "data usage",
- "editNode": "Edit node",
- "copyCertificate": "Copy Certificate",
- "copied": "Certificate Copied",
- "addNode": "Add node",
- "ipPort": "Node IP Port",
- "xrayVersion": "xray version",
- "noNodeMatched": "It seems there is no node matched with what you are looking for",
- "noNode": "There is no node added to the system",
- "copyConfigs": "Copy Configs",
- "total": "Total"
- },
- "hostsTable": {
- "inboundIsNotSelectedToCreate": "An inbound must be selected first",
- "status": "status",
- "editHost": "Edit host",
- "createHosts": "Create host",
- "address": "Address",
- "noHostMatched": "It seems there is no host matched with what you are looking for",
- "noHost": "Select an inbound, there is no host in the system",
- "port": "Port",
- "total": "Total"
- },
- "noInboundsCallout": {
- "header": "Configure Nodes!",
- "body": "Please configure nodes to access inbounds hosts"
- },
- "userDialog": {
- "dataLimit": "Data Limit",
- "periodicUsageReset": "Periodic Usage Reset",
- "warningNoProtocol": "Please select at least one protocol",
- "expiryDate": "Expiry Date",
- "note": "Note",
- "resetUsage": "Reset Usage",
- "usage": "Usage",
- "protocols": "Protocols",
- "services": "Services",
- "editUserTitle": "Edit user",
- "editUser": "Edit user",
- "userEdited": "User {{username}} edited.",
- "userCreated": "User {{username}} created.",
- "userAlreadyExists": "User already exists",
- "vmessDesc": "Fast and secure",
- "vlessDesc": "Lightweight, fast and secure",
- "trojanDesc": "Lightweight, secure and lightening fast",
- "shadowsocksDesc": "Fast and secure, but not efficient as others",
- "resetStrategyNo": "No",
- "resetStrategyDaily": "Daily",
- "resetStrategyWeekly": "Weekly",
- "resetStrategyMonthly": "Monthly",
- "resetStrategyAnnually": "Annually",
- "selectOneProtocol": "Please select at least one protocol",
- "optional": "optional",
- "method": "Method",
- "generatedByDefault": "Automatically generated by default",
- "hours": "Hours",
- "days": "Days",
- "weeks": "Weeks",
- "months": "Months",
- "relative": "Relative",
- "absolute": "Absolute",
- "custom": "Custom",
- "startDate": "Start date",
- "endDate": "End date",
- "revokeSubscription": "Revoke Subscription",
- "total": "Total: "
- },
- "nodeDialog": {
- "editNodeTitle": "Edit node",
- "createNewNode": "Create node",
- "nodeEdited": "Node {{name}} edited.",
- "nodeCreated": "Node {{name}} created.",
- "nodeAlreadyExists": "Node already exists",
- "optional": "optional",
- "total": "Total: ",
- "updateSubmit": "Submit update",
- "addSubmit": "Submit",
- "title": "Using Marzban-Node, you are able to scale up your connection quality by adding different nodes on different servers.",
- "addNewMarzbanNode": "Add New Marzban Node",
- "certificate": "Certificate",
- "connection-hint": "To setup a Marzban Node, you need to set this certificate on the node to initialize a secure connection between main server and the node",
- "download-certificate": "Download certificate",
- "show-certificate": "Show certificate",
- "hide-certificate": "Hide certificate",
- "addHostForEveryInbound": "Add this node as a new host for every inbound",
- "addNode": "Add Node",
- "addNodeSuccess": "Node {{name}} added successfully",
- "apply": "editNode",
- "nodeName": "Name",
- "nodeAddress": "Address",
- "nodePort": "Port",
- "nodeAPIPort": "API Port",
- "editNode": "Update Node",
- "reconnecting": "Reconnecting...",
- "reconnect": "Reconnect"
- },
- "serviceDialog": {
- "editServiceTitle": "Edit service",
- "editService": "Edit service",
- "createNewService": "Create service",
- "serviceEdited": "Service {{name}} edited.",
- "serviceCreated": "Service {{name}} created.",
- "serviceAlreadyExists": "Service already exists",
- "resetStrategyNo": "No",
- "optional": "optional",
- "total": "Total: "
- },
- "hostsDialog": {
- "title": "Using this setting, you are able to assign specific address for each inbound.",
- "desc": "Use these variables to make it dynamic",
- "username": "The username of the user",
- "dataUsage": "The current usage of the user",
- "remainingData": "Remaining data of the user",
- "dataLimit": "The usage limit of the user",
- "remainingDays": "Remaining days of the user",
- "expireDate": "Expiry date of the user",
- "jalaliExpireDate": "Expiry date of the user in solar calendar",
- "remainingTime": "Remaining time of the user",
- "statusEmoji": "User status as an emoji (✅,⌛️,🪫,❌,🔌)",
- "proxyProtocol": "Proxy protocol (e.g. VMess)",
- "proxyMethod": "Proxy transport method (e.g. ws)",
- "currentServer": "Current server ip address",
- "security": "Security Layer",
- "host": "Request Host",
- "port": "Port",
- "path": "Path",
- "sni": "SNI",
- "createSubmit": "Submit",
- "editSubmit": "Submit",
- "createHost": "Create host",
- "editHost": "Edit host",
- "savedSuccess": "Hosts saved successfully",
- "loading": "loading...",
- "apply": "Apply",
- "port.info": "By default, a host uses the default port of the inbound. You can set a custom port in case this host is a server that forwards traffic from a port that differs from your server's port. For example, the server may forward traffic from port 8443 to the default port of your inbound server.",
- "path.info": "Set a path for host users, useful behind a reverse proxy.",
- "sni.info": "By default, a host uses the default SNI of the inbound. You can set a custom SNI in case this host is a server that has a different SNI. For example, the server may receive traffic with a different SSL certificate, perform SSL termination, and forward it to your inbound server.",
- "host.info": "By default, if a request host is set in the Xray config, this host is used. However, you can set a custom request host here if needed.",
- "security.info": "If the middleware server of this host uses a different security layer than the inbound's default, you can set a custom security layer here.",
- "alpn": "ALPN",
- "fingerprint": "Fingerprint",
- "host.multiHost": "To set multiple addresses, separate them with <badge>,</badge> Each time an address is chosen randomly.",
- "host.wildcard": "Use <badge>*</badge> to generate a random string (works for wildcard domain names)"
- },
- "revoke": "Revoke",
- "deleteNode": {
- "title": "Delete Node",
- "prompt": "Are you sure you want to delete the <b>{{name}}</b> node?",
- "deleteSuccess": "Node {{name}} removed successfully"
- },
- "deleteService": {
- "title": "Delete Service",
- "prompt": "Are you sure you want to delete the <b>{{name}}</b> node?",
- "deleteSuccess": "Service {{name}} removed successfully"
- },
- "users": "Users",
- "active": "active",
- "disabled": "disabled",
- "activeUsers": "active users",
- "dataUsage": "data usage",
- "memoryUsage": "memory usage",
- "itemsPerPage": "Items per page",
- "previous": "Previous",
- "next": "Next",
- "createNewUser": "Create new user",
- "search": "Search",
- "resetAllUsage": "Reset All Usages",
- "qrcodeDialog.sublink": "Subscribe Link",
- "resetUserUsage.prompt": "Are you sure you want to reset <b>{{username}}</b>'s usage?",
- "resetUserUsage.title": "Reset User Usage",
- "resetUserUsage.success": "{{username}}'s usage has reset successfully.",
- "resetUserUsage.error": "Usage reset failed, please try again.",
- "revokeUserSub.prompt": "Are you sure you want to revoke <b>{{username}}</b>'s subscription?",
- "revokeUserSub.title": "Revoke User Subscription",
- "revokeUserSub.success": "{{username}}'s subscription has revoked successfully.",
- "revokeUserSub.error": "Subscription revoke failed, please try again.",
- "resetAllUsage.title": "Reset data usage for all users",
- "resetAllUsage.prompt": "This action clears all of the users' data usage completely. Are you sure you want to reset all usage? THIS CANNOT BE UNDONE!",
- "resetAllUsage.success": "All usage has reset successfully.",
- "resetAllUsage.error": "Usage reset failed, please try again.",
- "core.title": "Core Settings",
- "core.socket.connecting": "Connecting...",
- "core.socket.connected": "Connected",
- "core.socket.not_connected": "Not Connected",
- "core.socket.closed": "Closed",
- "core.restarting": "Restarting...",
- "core.restartCore": "Restart Core",
- "core.save": "Save",
- "core.logs": "Logs",
- "core.configuration": "Configuration",
- "core.generalErrorMessage": "Something went wrong, please check the configuration",
- "core.successMessage": "Core settings updated successfully"
-}
diff --git a/app/dashboard/public/locales/fa.json b/app/dashboard/public/locales/fa.json
deleted file mode 100644
index 1e8c785..0000000
--- a/app/dashboard/public/locales/fa.json
+++ /dev/null
@@ -1,165 +0,0 @@
-{
- "password": "گذرواژه",
- "login": "ورود",
- "cancel": "لغو",
- "apply": "تایید",
- "delete": "حذف",
- "reset": "بازنشانی",
- "createUser": "افزودن کاربر",
- "username": "نام کاربری",
- "dateInfo.year": " سال",
- "dateInfo.month": " ماه",
- "dateInfo.day": " روز",
- "dateInfo.hour": " ساعت",
- "dateInfo.min": " دقیقه",
- "expires": "پایان در {{time}}",
- "expired": "{{time}} پیش به پایان رسیده",
- "dateFormat": "MM/dd/yyyy",
- "inbound": "ورودی",
- "login.loginYourAccount": "وارد حساب خود شوید",
- "login.welcomeBack": "خوش آمدید, لطفا اطلاعات خود را وارد کنید",
- "login.fieldRequired": "This field is required",
- "header.hostSettings": "تنظیمات هاست",
- "header.nodeSettings": "تنظیمات گره‌ها",
- "header.nodesUsage": "نمودار گره‌ها",
- "header.donation": "کمک مالی",
- "header.logout": "خروج",
- "pageHeaderTitle.Home": "صفحه اصلی",
- "pageHeaderTitle.Users": "کاربر ها",
- "pageHeaderTitle.Services": "سرویس ها",
- "pageHeaderTitle.Host": "هاست",
- "pageHeaderTitle.Nodes": "نود ها",
- "deleteUser.title": "حذف کاربر",
- "deleteUser.prompt": "از حذف کاربر <b>{{username}}</b> مطمئن هستید?",
- "deleteUser.deleteSuccess": "{{username}} با موفقیت حذف شد.",
- "usersTable.status": "وضعیت",
- "usersTable.dataUsage": "مصرف داده",
- "usersTable.noUserMatched": "به‌نظر میرسه کاربری که جستجو کردید، وجود ندارد",
- "usersTable.noUser": "کاربری افزوده نشده است",
- "usersTable.copyLink": "کپی لینک اشتراک",
- "usersTable.copied": "کپی شد",
- "usersTable.copyConfigs": "تنظیمات کپی",
- "usersTable.total": "مجموع",
- "userDialog.dataLimit": "حد مصرف داده",
- "userDialog.periodicUsageReset": "بازنشانی دوره‌ای مصرف",
- "userDialog.warningNoProtocol": "لطفا حداقل یک پروتکل انتخاب کنید",
- "userDialog.note": "توضیحات",
- "userDialog.expiryDate": "تاریخ پایان",
- "userDialog.resetUsage": "بازنشانی مصرف",
- "userDialog.usage": "مصرف",
- "userDialog.protocols": "پروتکل‌ها",
- "userDialog.services": "سرویس ها",
- "userDialog.editUserTitle": "ویرایش کاربر",
- "userDialog.editUser": "ویرایش کاربر",
- "userDialog.userEdited": "کاربر {{username}} ویرایش شد.",
- "userDialog.userCreated": "کاربر {{username}} ساخته شد.",
- "userDialog.userAlreadyExists": "کاربر وجود دارد",
- "userDialog.vmessDesc": "سریع و امن",
- "userDialog.vlessDesc": "سبک، سریع و امن",
- "userDialog.trojanDesc": "سبک، امن و فوق‌العاده سریع",
- "userDialog.shadowsocksDesc": "سریع و امن، اما کارآمد کمتر از بقیه",
- "userDialog.resetStrategyNo": "خیر",
- "userDialog.resetStrategyDaily": "روزانه",
- "userDialog.resetStrategyWeekly": "هفتگی",
- "userDialog.resetStrategyMonthly": "ماهانه",
- "userDialog.resetStrategyAnnually": "سالانه",
- "userDialog.selectOneProtocol": "لطفا حداقل یک پروتکل انتخاب کنید",
- "userDialog.optional": "اختیاری",
- "userDialog.method": "روش",
- "userDialog.generatedByDefault": "پیش‌فرض ساخته می‌شود",
- "userDialog.hours": "ساعات",
- "userDialog.days": "روزها",
- "userDialog.weeks": "هفته‌ها",
- "userDialog.months": "ماه‌ها",
- "userDialog.relative": "نسبی",
- "userDialog.absolute": "مطلق",
- "userDialog.custom": "انتخابی",
- "userDialog.startDate": "تاریخ شروع",
- "userDialog.endDate": "تاریخ پایان",
- "userDialog.total": "مجموع: ",
- "hostsDialog.title": "با انتخاب این تنظیمات، می‌توانید برای هر ورودی یک آدرس منحصر به فرد انتخاب کنید.",
- "hostsDialog.desc": "برای ساخت نوشته پویا، از این متغیرها استفاده کنید",
- "hostsDialog.username": "نام کاربری کاربر",
- "hostsDialog.dataUsage": "مصرف کنونی کاربر",
- "hostsDialog.remainingData": "حجم باقی‌مانده کاربر",
- "hostsDialog.dataLimit": "حد مصرف کاربر",
- "hostsDialog.remainingDays": "روزهای باقی مانده کاربر",
- "hostsDialog.expireDate": "تاریخ انقضای کاربر به میلادی",
- "hostsDialog.jalaliExpireDate": "تاریخ انقضای کاربر به شمسی",
- "hostsDialog.remainingTime": "زمان باقی مانده کاربر",
- "hostsDialog.statusEmoji": "وضعیت کاربر در قالب اموجی (✅,⌛️,🪫,❌,🔌)",
- "hostsDialog.proxyProtocol": "پروتکل پروکسی (مانند VMess)",
- "hostsDialog.proxyMethod": "روش انتقال پروکسی (مانند ws)",
- "hostsDialog.currentServer": "IP کنونی سرور",
- "hostsDialog.security": "لایه امنیت",
- "hostsDialog.host": "هاست درخواست",
- "hostsDialog.port": "پورت",
- "hostsDialog.sni": "SNI",
- "hostsDialog.advancedOptions": "تنظیمات پیشرفته",
- "hostsDialog.addHost": "افزودن هاست",
- "hostsDialog.savedSuccess": "هاست‌ها با موفقیت ذخیره شدند",
- "hostsDialog.loading": "درحال بارگزاری...",
- "hostsDialog.apply": "اعمال",
- "hostsDialog.port.info": "به طور پیش‌فرض، هاست، از پورت پیش‌فرض ورودی استفاده میکند، در صورتی که این هاست ترافیک را از پورتی، متفاوت از پورت سرور، منتقل می‌کند، می‌توانید آن را تغییر دهید. برای مثال، ممکن از سرور ترافیک را از پورت 8443 به پورت پیش‌فرض سرور ورودی شما منتقل کند.",
- "hostsDialog.sni.info": "به طور پیش‌فرض، هاست، از SNI پیش‌فرض ورودی استفاده میکند، در صورتی که این هاست یک SNI دیگری دارد، می‌توانید آن را تغییر دهید. برای مثال، ممکن است سرور ترافیک با SSL متفاوت را دریافت و منتقل کند.",
- "hostsDialog.host.info": "به‌طور پیش‌فرض، اگر هاست درخواستی در پیکربندی *** تنظیم شده باشد، این هاست استفاده می‌شود. اما می‌توانید یک هاست درخواستی متفاوت در اینجا قرار دهید.",
- "hostsDialog.security.info": "اگر میان‌افزار سرور این هاست، از لایه امنیتی متفاوتی از ورودی استفاده می‌کند، می‌توانید اینجا انتخاب کنید",
- "hostsDialog.alpn": "ALPN",
- "hostsDialog.fingerprint": "اثرانگشت",
- "hostsDialog.host.multiHost": "برای تنظیم چند آدرس، با <badge>,</badge> از هم جدا کنید. هر دفعه آدرسی به صورت تصادفی قرار داده می‌شود.",
- "hostsDialog.host.wildcard": "از <badge>*</badge> برای ساخت عبارت تصادفی استفاده کنید (برای نام‌های wildcard کار می‌کند)",
- "nodes.title": "با استفاده از Marzban-Node, شما می‌توانید با افزودن گره‌های متفاوت در سرورهای متفاوت، کیفیت اتصال خود را بالاتر ببرید.",
- "nodes.addNewMarzbanNode": "افزودن گره مرزبان",
- "nodes.certificate": "گواهی",
- "nodes.addHostForEveryInbound": "استفاده از این گره به عنوان میزبان تمام ورودی‌ها",
- "nodes.addNode": "افزودن گره",
- "nodes.addNodeSuccess": "گره {{name}} با موفقیت افزوده شد",
- "nodes.apply": "ویرایش گره",
- "nodes.nodeName": "نام",
- "nodes.nodeAddress": "آدرس",
- "nodes.nodePort": "پورت",
- "nodes.nodeAPIPort": "پورت API",
- "nodes.editNode": "ویرایش گره",
- "nodes.reconnect": "اتصال مجدد",
- "nodes.connection-hint": "برای راه اندازی یک گره جدید، لازم است گواهی زیر را روی گره تنظیم کنید تا یک اتصال امن بین سرور اصلی و گره ایجاد شود.",
- "nodes.download-certificate": "دانلود گواهی",
- "nodes.show-certificate": "نمایش دادن گواهی",
- "nodes.hide-certificate": "مخفی کردن گواهی",
- "nodes.reconnecting": "درحال اتصال مجدد...",
- "deleteNode.title": "حذف گره",
- "deleteNode.prompt": "از حذف گره <b>{{name}}</b> مطمئن هستید؟",
- "deleteNode.deleteSuccess": "گره {{name}} با موفقیت حذف شد",
- "active": "فعال",
- "disabled": "غیر فعال",
- "users": "کاربران",
- "activeUsers": "کاربران فعال",
- "dataUsage": "مصرف داده",
- "memoryUsage": "مصرف حافظه",
- "itemsPerPage": "تعداد در صفحه",
- "previous": "قبلی",
- "next": "بعدی",
- "createNewUser": "ساخت کاربر",
- "search": "جستجو",
- "resetAllUsage": "بازنشانی کل مصرف",
- "qrcodeDialog.sublink": "لینک اشتراک",
- "resetUserUsage.prompt": "از بازنشانی مصرف <b>{{username}}</b> مطئمن هستید؟",
- "resetUserUsage.title": "بازنشانی مصرف کاربر",
- "resetUserUsage.success": "مصرف {{username}} با موفقیت بازنشانی شد.",
- "resetUserUsage.error": "بازنشانی مصرف انجام نشد، دوباره تلاش کنید.",
- "resetAllUsage.title": "بازنشانی مصرف تمام کاربران",
- "resetAllUsage.prompt": "این عمل مصرف تمام کاربران را بازنشانی می‌کند. از این بازنشانی مطمئن هستید؟ این عمل قابل بازگشت نیست!",
- "resetAllUsage.success": "مصرف کل با موفقیت بازنشانی شد.",
- "resetAllUsage.error": "بازنشانی مصرف انجام نشد، دوباره تلاش کنید.",
- "core.title": "تنظیمات هسته",
- "core.socket.connecting": "در حال اتصال...",
- "core.socket.connected": "متصل",
- "core.socket.not_connected": "عدم اتصال",
- "core.socket.closed": "بسته شده",
- "core.restarting": "درحال اجرا مجدد...",
- "core.restartCore": "اجرا مجدد هسته",
- "core.save": "ذخیره",
- "core.logs": "گزارش",
- "core.configuration": "پیکربندی",
- "core.generalErrorMessage": "مشکلی پیش آمده، لطفا پیکربندی را بررسی کنید",
- "core.successMessage": "تنظیمات هسته با موفقیت ثبت شد"
-}
diff --git a/app/dashboard/public/locales/ru.json b/app/dashboard/public/locales/ru.json
deleted file mode 100644
index bdf9606..0000000
--- a/app/dashboard/public/locales/ru.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
- "password": "Пароль",
- "login": "Вход",
- "cancel": "Отмена",
- "apply": "Применить",
- "delete": "Удалить",
- "reset": "Сбросить",
- "createUser": "Создать",
- "username": "Имя пользователя",
- "expires": "Истекает через {{time}}",
- "expired": "Истекло {{time}} назад",
- "dateFormat": "MMMM d, yyy",
- "inbound": "inbound",
- "login.loginYourAccount": "Войдите в свой аккаунт",
- "login.welcomeBack": "Пожалуйста, введите свои данные",
- "login.fieldRequired": "Это поле обязательно для заполнения",
- "header.hostSettings": "Настройки хоста",
- "header.nodeSettings": "Настройки узлов",
- "header.nodesUsage": "Использование узлов",
- "header.donation": "Пожертвование",
- "header.logout": "Выйти",
- "deleteUser.title": "Удалить пользователя",
- "deleteUser.prompt": "Вы уверены, что хотите удалить пользователя <b>{{username}}</b>?",
- "deleteUser.deleteSuccess": "{{username}} успешно удален.",
- "usersTable.status": "Статус",
- "usersTable.dataUsage": "Расход трафика",
- "usersTable.noUserMatched": "Похоже, нет пользователя, соответствующего вашему запросу",
- "usersTable.noUser": "В системе нет созданных пользователей",
- "usersTable.copyLink": "Скопировать ссылку на подписку",
- "usersTable.copied": "Скопировано",
- "usersTable.copyConfigs": "Скопировать конфигурации",
- "usersTable.total": "Всего",
- "userDialog.dataLimit": "Лимит трафика",
- "userDialog.periodicUsageReset": "Период сброса трафика",
- "userDialog.warningNoProtocol": "Пожалуйста, выберите хотя бы один протокол",
- "userDialog.expiryDate": "Дата истечения срока",
- "userDialog.note": "Примечание",
- "userDialog.resetUsage": "Сбросить трафик",
- "userDialog.usage": "Потребление",
- "userDialog.protocols": "Протоколы",
- "userDialog.services": "Услуги",
- "userDialog.editUserTitle": "Редактировать пользователя",
- "userDialog.editUser": "Редактировать",
- "userDialog.userEdited": "Пользователь {{username}} изменен.",
- "userDialog.userCreated": "Пользователь {{username}} создан.",
- "userDialog.userAlreadyExists": "Пользователь уже существует",
- "userDialog.vmessDesc": "Быстрый и безопасный",
- "userDialog.vlessDesc": "Легковесный, быстрый и безопасный",
- "userDialog.trojanDesc": "Легковесный, безопасный и быстрый",
- "userDialog.shadowsocksDesc": "Быстрый и безопасный, но не такой эффективный, как другие",
- "userDialog.resetStrategyNo": "Нет",
- "userDialog.resetStrategyDaily": "Ежедневно",
- "userDialog.resetStrategyWeekly": "Еженедельно",
- "userDialog.resetStrategyMonthly": "Ежемесячно",
- "userDialog.resetStrategyAnnually": "Ежегодно",
- "userDialog.selectOneProtocol": "Пожалуйста, выберите хотя бы один протокол",
- "userDialog.optional": "необязательно",
- "userDialog.method": "Метод",
- "userDialog.generatedByDefault": "по умолчанию",
- "userDialog.hours": "Часы",
- "userDialog.days": "Дни",
- "userDialog.weeks": "Недели",
- "userDialog.months": "Месяцы",
- "userDialog.relative": "Относительно",
- "userDialog.absolute": "Абсолютно",
- "userDialog.custom": "Пользовательский",
- "userDialog.startDate": "Дата начала",
- "userDialog.endDate": "Дата окончания",
- "userDialog.revokeSubscription": "Отозвать подписку",
- "revoke": "Отозвать",
- "userDialog.total": "Всего: ",
- "hostsDialog.title": "Используя эту настройку, Вы можете настроить свои inbound.",
- "hostsDialog.desc": "Используйте эти переменные, чтобы сделать его динамическим",
- "hostsDialog.username": "Имя пользователя",
- "hostsDialog.dataUsage": "Использованный трафик пользователя",
- "hostsDialog.remainingData": "Оставшийся трафик пользователя",
- "hostsDialog.dataLimit": "Лимит трафика пользователя",
- "hostsDialog.remainingDays": "Оставшиеся дни пользователя",
- "hostsDialog.expireDate": "Дата истечения срока пользователя",
- "hostsDialog.jalaliExpireDate": "Дата истечения срока по солнечному календарю",
- "hostsDialog.remainingTime": "Оставшееся время пользователя",
- "hostsDialog.statusEmoji": "Статус пользователя в виде смайлика (✅,⌛️,🪫,❌,🔌)",
- "hostsDialog.proxyProtocol": "Протокол прокси (например, VMess)",
- "hostsDialog.proxyMethod": "Метод транспорта прокси (например, ws)",
- "hostsDialog.currentServer": "Текущий IP-адрес сервера",
- "hostsDialog.security": "Security Layer",
- "hostsDialog.host": "Host",
- "hostsDialog.port": "Port",
- "hostsDialog.sni": "SNI",
- "hostsDialog.advancedOptions": "Дополнительные опции",
- "hostsDialog.addHost": "Добавить хост",
- "hostsDialog.savedSuccess": "Хосты успешно сохранены",
- "hostsDialog.loading": "загрузка...",
- "hostsDialog.apply": "Применить",
- "hostsDialog.port.info": "По умолчанию хост использует порт, значение которого обьявленно в inbound. Вы можете установить свое значение порта, если с него трафик перенаправляется на другой порт. Например, сервер может перенаправлять трафик с порта 443 на порт по умолчанию Вашего inbound",
- "hostsDialog.sni.info": "По умолчанию хост использует SNI, значение которого обьявленно в inbound. Вы можете установить свое значение SNI, если этот хост содержит другие SNI. Например, сервер может принимать трафик с другим SSL-сертификатом, выполнять SSL-терминацию и перенаправлять его на ваш inbound.",
- "hostsDialog.host.info": "По умолчанию, если в конфигурации XRAY задан запрашиваемый хост, то он и будет использоваться. Однако, если необходимо, вы можете установить здесь пользовательский запрашиваемый хост.",
- "hostsDialog.security.info": "Если промежуточный сервер этого хоста использует другой security layer, отличный от security layer Вашего inbound по умолчанию, Вы можете установить его здесь",
- "hostsDialog.alpn": "ALPN",
- "hostsDialog.fingerprint": "Fingerprint",
- "hostsDialog.host.multiHost": "Чтобы установить несколько адресов, разделяйте их с помощью <badge>,</badge>. Каждый раз будет выбран случайный адрес.",
- "hostsDialog.host.wildcard": "Используйте <badge>*</badge>, чтобы сгенерировать случайную строку (работает для wildcard доменов)",
- "nodes.title": "Используя Marzban-Node, Вы можете масштабировать инфраструктуру, добавляя узлы на разных серверах.",
- "nodes.addNewMarzbanNode": "Добавить новый узел Marzban",
- "nodes.certificate": "Сертификат",
- "nodes.addHostForEveryInbound": "Добавить этот узел как новый хост для каждого inbound",
- "nodes.addNode": "Добавить узел",
- "nodes.addNodeSuccess": "Узел {{name}} успешно добавлен",
- "nodes.apply": "Настройки узла успешно обновлены",
- "nodes.nodeName": "Имя",
- "nodes.nodeAddress": "Адрес",
- "nodes.nodePort": "Порт",
- "nodes.nodeAPIPort": "API порт",
- "nodes.editNode": "Редактировать узел",
- "nodes.reconnect": "Переподключиться",
- "nodes.connection-hint": "Для настройки узла Marzban, необходимо установить на нем данный сертификат, для инициализации безопасного соединения между главным сервером и узлом",
- "nodes.download-certificate": "Скачать сертификат",
- "nodes.show-certificate": "Показать сертификат",
- "nodes.hide-certificate": "Скрыть сертификат",
- "nodes.reconnecting": "Переподключение...",
- "deleteNode.title": "Удалить узел",
- "deleteNode.prompt": "Вы уверены, что хотите удалить узел <b>{{name}}</b>?",
- "deleteNode.deleteSuccess": "Узел {{name}} успешно удален",
- "users": "Пользователи",
- "activeUsers": "Пользователи",
- "dataUsage": "Трафик",
- "memoryUsage": "Память",
- "itemsPerPage": "Элементов на страницу",
- "previous": "Назад",
- "next": "Вперед",
- "createNewUser": "Создать нового пользователя",
- "search": "Поиск",
- "resetAllUsage": "Сбросить расход трафика",
- "qrcodeDialog.sublink": "Ссылка на подписку",
- "resetUserUsage.prompt": "Вы уверены, что хотите сбросить расход трафика для пользователя <b>{{username}}</b>?",
- "resetUserUsage.title": "Сбросить расход трафика пользователя",
- "resetUserUsage.success": "Расход трафика пользователя {{username}} успешно сброшен.",
- "resetUserUsage.error": "Сброс расхода не удался, пожалуйста, попробуйте еще раз.",
- "revokeUserSub.prompt": "Вы уверены, что хотите отозвать подписку для пользователя <b>{{username}}</b>?",
- "revokeUserSub.title": "Отозвать подписку пользователя",
- "revokeUserSub.success": "Подписка пользователя {{username}} успешно отозвана.",
- "revokeUserSub.error": "Отзыв подписки не удался, пожалуйста, попробуйте еще раз.",
- "resetAllUsage.title": "Сбросить расход трафика для всех пользователей",
- "resetAllUsage.prompt": "Это действие полностью очищает весь расход трафика пользователей. Вы уверены? ЭТО ДЕЙСТВИЕ НЕОБРАТИМО!",
- "resetAllUsage.success": "Расход трафика успешно сброшен.",
- "resetAllUsage.error": "Сброс расхода трафика не удался, пожалуйста, попробуйте еще раз.",
- "core.title": "Основные настройки",
- "core.socket.connecting": "Соединение...",
- "core.socket.connected": "Подключено",
- "core.socket.not_connected": "Не подключено",
- "core.socket.closed": "Закрыто",
- "core.restarting": "Перезагрузка...",
- "core.restartCore": "Перезагрузить ядро",
- "core.save": "Сохранить",
- "core.logs": "Логи",
- "core.configuration": "Конфигурация",
- "core.generalErrorMessage": "Что-то пошло не так, пожалуйста, проверьте конфигурацию",
- "core.successMessage": "Основные настройки успешно обновлены"
-}
diff --git a/app/dashboard/public/locales/zh.json b/app/dashboard/public/locales/zh.json
deleted file mode 100644
index fe14360..0000000
--- a/app/dashboard/public/locales/zh.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "password": "密码",
- "login": "登录",
- "cancel": "取消",
- "apply": "应用",
- "delete": "删除",
- "reset": "重置",
- "createUser": "创建用户",
- "username": "用户名",
- "expires": "{{time}}有效",
- "expired": "{{time}}失效",
- "dateFormat": "MM/dd/yyyy",
- "inbound": "入站",
- "login.loginYourAccount": "登录您的帐号",
- "login.welcomeBack": "欢迎回来,请输入您的详细信息",
- "login.fieldRequired": "此项必填",
- "header.hostSettings": "设置",
- "header.nodeSettings": "节点设置",
- "header.nodesUsage": "节点统计",
- "header.donation": "捐赠",
- "header.logout": "退出",
- "deleteUser.title": "删除用户",
- "deleteUser.prompt": "您确定你要删除 <b>{{username}}</b>?",
- "deleteUser.deleteSuccess": "{{username}} 删除成功。",
- "usersTable.status": "状态",
- "usersTable.dataUsage": "流量统计",
- "usersTable.noUserMatched": "没有找到您搜索的用户",
- "usersTable.noUser": "还没有添加任何用户",
- "usersTable.copyLink": "复制订阅链接",
- "usersTable.copied": "已复制",
- "usersTable.copyConfigs": "复制配置",
- "usersTable.total": "总共",
- "userDialog.dataLimit": "流量限制",
- "userDialog.periodicUsageReset": "定期重置流量",
- "userDialog.expiryDate": "过期日期",
- "userDialog.resetUsage": "重置流量",
- "userDialog.usage": "流量详情",
- "userDialog.protocols": "协议",
- "userDialog.services": "服务",
- "userDialog.editUserTitle": "用户编辑",
- "userDialog.editUser": "修改",
- "userDialog.userEdited": "已更新用户 {{username}}。",
- "userDialog.userCreated": "成功创建用户 {{username}}。",
- "userDialog.userAlreadyExists": "用户已存在",
- "userDialog.vmessDesc": "快速且安全",
- "userDialog.vlessDesc": "轻量、快速且安全",
- "userDialog.trojanDesc": "轻量、安全且非常快",
- "userDialog.shadowsocksDesc": "快速且安全, 但效率不如其它",
- "userDialog.resetStrategyNo": "无",
- "userDialog.resetStrategyDaily": "每天",
- "userDialog.resetStrategyWeekly": "每周",
- "userDialog.resetStrategyMonthly": "每月",
- "userDialog.resetStrategyAnnually": "每年",
- "userDialog.selectOneProtocol": "请至少选择一个协议",
- "userDialog.optional": "可以为空",
- "userDialog.method": "加密方式",
- "userDialog.generatedByDefault": "默认自动生成",
- "userDialog.hours": "小时",
- "userDialog.days": "天",
- "userDialog.weeks": "周",
- "userDialog.months": "月",
- "userDialog.relative": "相对时间",
- "userDialog.absolute": "选择范围",
- "userDialog.custom": "自定义",
- "userDialog.startDate": "开始日期",
- "userDialog.endDate": "结束日期",
- "userDialog.total": "总共:",
- "hostsDialog.title": "使用此设置,您可以为每个入站分配特定的地址。",
- "hostsDialog.desc": "使用这些变量使其可以动态替换",
- "hostsDialog.username": "用户的用户名",
- "hostsDialog.dataUsage": "用户当前流量情况",
- "hostsDialog.remainingData": "用户剩余流量情况",
- "hostsDialog.dataLimit": "用户的流量限制",
- "hostsDialog.remainingDays": "用户的剩余天数",
- "hostsDialog.expireDate": "用户的有效期",
- "hostsDialog.jalaliExpireDate": "用户阳历有效日期",
- "hostsDialog.remainingTime": "用户剩余时间",
- "hostsDialog.statusEmoji": "用户状态作为表情符号 (✅,⌛️,🪫,❌,🔌)",
- "hostsDialog.proxyProtocol": "代理协议(例如 VMess)",
- "hostsDialog.proxyMethod": "代理传输方法(例如 ws)",
- "hostsDialog.currentServer": "当前服务器的 IP 地址",
- "hostsDialog.security": "安全层",
- "hostsDialog.host": "请求主机",
- "hostsDialog.port": "端口",
- "hostsDialog.sni": "SNI",
- "hostsDialog.advancedOptions": "高级选项",
- "hostsDialog.addHost": "添加主机",
- "hostsDialog.savedSuccess": "设置保存成功",
- "hostsDialog.loading": "加载中...",
- "hostsDialog.apply": "保存",
- "hostsDialog.port.info": "默认情况下,主机使用入站端口的默认端口。如果此主机是一个服务器,用于从与您的服务器端口不同的端口转发流量,则可以设置自定义端口。例如,服务器可能会将来自端口 8443 的流量转发到您入站服务器的默认端口。",
- "hostsDialog.sni.info": "默认情况下,主机使用入站 SNI 的默认值。如果此主机是一个服务器且 SNI 不同,则可以设置自定义 SNI。例如,服务器可能会接收带有不同 SSL 证书的流量,执行 SSL 处理并将其转发到您的入站服务器。",
- "hostsDialog.host.info": "默认情况下,如果在 Xray 配置中设置了请求主机,则使用该主机。但是,如果需要,您可以在此处设置自定义请求主机。",
- "hostsDialog.security.info": "如果此主机的中间件服务器使用的安全层与入站默认值不同,则可以在此处设置自定义安全层。",
- "hostsDialog.alpn": "ALPN",
- "hostsDialog.fingerprint": "指纹",
- "nodes.title": "使用 Marzban-Node,您可以通过在不同的服务器上添加不同的节点来提供多节点负载。",
- "nodes.addNewMarzbanNode": "添加新的 Marzban 节点",
- "nodes.certificate": "证书",
- "nodes.addHostForEveryInbound": "为每个入站请求添加此节点作为新主机",
- "nodes.addNode": "添加节点",
- "nodes.addNodeSuccess": "节点 {{name}} 添加成功",
- "nodes.editNode": "保存",
- "nodes.nodeName": "名称",
- "nodes.nodeAddress": "地址",
- "nodes.nodePort": "端口",
- "nodes.nodeAPIPort": "API 端口",
- "nodes.reconnect": "重新连接",
- "nodes.connection-hint": "要设置Marzban节点,您需要在节点上设置此证书以初始化主服务器和节点之间的安全连接",
- "nodes.download-certificate": "下载证书",
- "nodes.show-certificate": "如何证书",
- "nodes.hide-certificate": "隐藏证书",
- "nodes.reconnecting": "重连中...",
- "deleteNode.title": "删除节点",
- "deleteNode.prompt": "您确实要删除 <b>{{name}}</b> 节点吗?",
- "deleteNode.deleteSuccess": "节点 {{name}} 删除成功",
- "users": "用户",
- "activeUsers": "活跃用户",
- "dataUsage": "总流量",
- "memoryUsage": "内存状态",
- "itemsPerPage": "每页条数",
- "previous": "上一页",
- "next": "下一页",
- "createNewUser": "创建新用户",
- "search": "搜索",
- "resetAllUsage": "重置所有统计",
- "qrcodeDialog.sublink": "订阅链接",
- "resetUserUsage.prompt": "您确定要重置 <b>{{username}}</b> 的流量统计吗?",
- "resetUserUsage.title": "重置用户流量统计",
- "resetUserUsage.success": "{{username}} 的流量统计重置完成。",
- "resetUserUsage.error": "重置失败,请稍候再试",
- "resetAllUsage.title": "重置所有用户的数据使用情况",
- "resetAllUsage.prompt": "此操作将清除所有用户统计,您确定要执行此操作吗? 这不能被撤消!",
- "resetAllUsage.success": "所有统计重置完成。",
- "resetAllUsage.error": "重置失败,请稍候再试!"
-}
diff --git a/app/dashboard/src/App.tsx b/app/dashboard/src/App.tsx
deleted file mode 100644
index 1fbd734..0000000
--- a/app/dashboard/src/App.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import 'react-datepicker/dist/react-datepicker.css';
-import 'react-loading-skeleton/dist/skeleton.css';
-import { RouterProvider } from 'react-router-dom';
-import { FC, Suspense } from 'react';
-import { router } from 'pages/routes';
-
-const App: FC = () => {
- return (
- <main>
- <Suspense>
- <RouterProvider router={router} />
- </Suspense>
- </main>
- );
-}
-
-export default App;
diff --git a/app/dashboard/src/assets/add_file.svg b/app/dashboard/src/assets/add_file.svg
deleted file mode 100644
index 6ddbc18..0000000
--- a/app/dashboard/src/assets/add_file.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" width="782.04441" height="701.88002" viewBox="0 0 782.04441 701.88002" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M609.48783,100.59015l-25.44631,6.56209L270.53735,187.9987,245.091,194.56079A48.17927,48.17927,0,0,0,210.508,253.17865L320.849,681.05606a48.17924,48.17924,0,0,0,58.61776,34.58317l.06572-.01695,364.26536-93.93675.06572-.01695a48.17923,48.17923,0,0,0,34.58309-58.6178l-110.341-427.87741A48.17928,48.17928,0,0,0,609.48783,100.59015Z" transform="translate(-208.9778 -99.05999)" fill="#f2f2f2"/><path d="M612.94784,114.00532l-30.13945,7.77236L278.68955,200.20385l-30.139,7.77223a34.30949,34.30949,0,0,0-24.6275,41.74308l110.341,427.87741a34.30946,34.30946,0,0,0,41.7431,24.62736l.06572-.01695,364.26536-93.93674.06619-.01707a34.30935,34.30935,0,0,0,24.627-41.7429l-110.341-427.87741A34.30938,34.30938,0,0,0,612.94784,114.00532Z" transform="translate(-208.9778 -99.05999)" fill="#fff"/><path d="M590.19,252.56327,405.917,300.08359a8.01411,8.01411,0,0,1-4.00241-15.52046l184.273-47.52033A8.01412,8.01412,0,0,1,590.19,252.56327Z" transform="translate(-208.9778 -99.05999)" fill="#f2f2f2"/><path d="M628.955,270.49906,412.671,326.27437a8.01411,8.01411,0,1,1-4.00241-15.52046l216.284-55.77531a8.01411,8.01411,0,0,1,4.00242,15.52046Z" transform="translate(-208.9778 -99.05999)" fill="#f2f2f2"/><path d="M620.45825,369.93676l-184.273,47.52032a8.01411,8.01411,0,1,1-4.00242-15.52046l184.273-47.52032a8.01411,8.01411,0,1,1,4.00241,15.52046Z" transform="translate(-208.9778 -99.05999)" fill="#f2f2f2"/><path d="M659.22329,387.87255l-216.284,55.77531a8.01411,8.01411,0,1,1-4.00242-15.52046l216.284-55.77531a8.01411,8.01411,0,0,1,4.00242,15.52046Z" transform="translate(-208.9778 -99.05999)" fill="#f2f2f2"/><path d="M650.72653,487.31025l-184.273,47.52033a8.01412,8.01412,0,0,1-4.00242-15.52047l184.273-47.52032a8.01411,8.01411,0,0,1,4.00242,15.52046Z" transform="translate(-208.9778 -99.05999)" fill="#f2f2f2"/><path d="M689.49156,505.246l-216.284,55.77532a8.01412,8.01412,0,1,1-4.00241-15.52047l216.284-55.77531a8.01411,8.01411,0,0,1,4.00242,15.52046Z" transform="translate(-208.9778 -99.05999)" fill="#f2f2f2"/><path d="M374.45884,348.80871l-65.21246,16.817a3.847,3.847,0,0,1-4.68062-2.76146L289.5963,304.81607a3.847,3.847,0,0,1,2.76145-4.68061l65.21247-16.817a3.847,3.847,0,0,1,4.68061,2.76145l14.96947,58.04817A3.847,3.847,0,0,1,374.45884,348.80871Z" transform="translate(-208.9778 -99.05999)" fill="#e6e6e6"/><path d="M404.72712,466.1822l-65.21247,16.817a3.847,3.847,0,0,1-4.68062-2.76146l-14.96946-58.04816A3.847,3.847,0,0,1,322.626,417.509l65.21246-16.817a3.847,3.847,0,0,1,4.68062,2.76145l14.96946,58.04817A3.847,3.847,0,0,1,404.72712,466.1822Z" transform="translate(-208.9778 -99.05999)" fill="#e6e6e6"/><path d="M434.99539,583.55569l-65.21246,16.817a3.847,3.847,0,0,1-4.68062-2.76145l-14.96946-58.04817a3.847,3.847,0,0,1,2.76145-4.68062l65.21247-16.817a3.847,3.847,0,0,1,4.68061,2.76146l14.96947,58.04816A3.847,3.847,0,0,1,434.99539,583.55569Z" transform="translate(-208.9778 -99.05999)" fill="#e6e6e6"/><path d="M863.63647,209.0517H487.31811a48.17928,48.17928,0,0,0-48.125,48.12512V699.05261a48.17924,48.17924,0,0,0,48.125,48.12507H863.63647a48.17924,48.17924,0,0,0,48.125-48.12507V257.17682A48.17928,48.17928,0,0,0,863.63647,209.0517Z" transform="translate(-208.9778 -99.05999)" fill="#e6e6e6"/><path d="M863.637,222.90589H487.31811a34.30948,34.30948,0,0,0-34.271,34.27093V699.05261a34.30947,34.30947,0,0,0,34.271,34.27088H863.637a34.30936,34.30936,0,0,0,34.27051-34.27088V257.17682A34.30937,34.30937,0,0,0,863.637,222.90589Z" transform="translate(-208.9778 -99.05999)" fill="#fff"/><circle cx="694.19401" cy="614.02963" r="87.85039" fill="#3182CE"/><path d="M945.18722,701.63087H914.63056V671.07421a11.45875,11.45875,0,0,0-22.9175,0v30.55666H861.1564a11.45875,11.45875,0,0,0,0,22.9175h30.55666V755.105a11.45875,11.45875,0,1,0,22.9175,0V724.54837h30.55666a11.45875,11.45875,0,0,0,0-22.9175Z" transform="translate(-208.9778 -99.05999)" fill="#fff"/><path d="M807.00068,465.71551H616.699a8.01412,8.01412,0,1,1,0-16.02823H807.00068a8.01412,8.01412,0,0,1,0,16.02823Z" transform="translate(-208.9778 -99.05999)" fill="#e6e6e6"/><path d="M840.05889,492.76314H616.699a8.01412,8.01412,0,1,1,0-16.02823H840.05889a8.01411,8.01411,0,1,1,0,16.02823Z" transform="translate(-208.9778 -99.05999)" fill="#e6e6e6"/><path d="M807.00068,586.929H616.699a8.01412,8.01412,0,1,1,0-16.02823H807.00068a8.01411,8.01411,0,0,1,0,16.02823Z" transform="translate(-208.9778 -99.05999)" fill="#e6e6e6"/><path d="M840.05889,613.97661H616.699a8.01412,8.01412,0,1,1,0-16.02823H840.05889a8.01412,8.01412,0,1,1,0,16.02823Z" transform="translate(-208.9778 -99.05999)" fill="#e6e6e6"/><path d="M574.07028,505.04162H506.72434a3.847,3.847,0,0,1-3.84278-3.84278V441.25158a3.847,3.847,0,0,1,3.84278-3.84278h67.34594a3.847,3.847,0,0,1,3.84278,3.84278v59.94726A3.847,3.847,0,0,1,574.07028,505.04162Z" transform="translate(-208.9778 -99.05999)" fill="#e6e6e6"/><path d="M574.07028,626.25509H506.72434a3.847,3.847,0,0,1-3.84278-3.84278V562.46505a3.847,3.847,0,0,1,3.84278-3.84278h67.34594a3.847,3.847,0,0,1,3.84278,3.84278v59.94726A3.847,3.847,0,0,1,574.07028,626.25509Z" transform="translate(-208.9778 -99.05999)" fill="#e6e6e6"/><path d="M807.21185,330.781H666.91017a8.01411,8.01411,0,0,1,0-16.02823H807.21185a8.01411,8.01411,0,0,1,0,16.02823Z" transform="translate(-208.9778 -99.05999)" fill="#ccc"/><path d="M840.27007,357.82862H666.91017a8.01411,8.01411,0,1,1,0-16.02822h173.3599a8.01411,8.01411,0,0,1,0,16.02822Z" transform="translate(-208.9778 -99.05999)" fill="#ccc"/><path d="M635.85911,390.6071H506.51316a3.847,3.847,0,0,1-3.84277-3.84277V285.81706a3.847,3.847,0,0,1,3.84277-3.84277H635.85911a3.847,3.847,0,0,1,3.84277,3.84277V386.76433A3.847,3.847,0,0,1,635.85911,390.6071Z" transform="translate(-208.9778 -99.05999)" fill="#ccc"/></svg>
diff --git a/app/dashboard/src/assets/logo.svg b/app/dashboard/src/assets/logo.svg
deleted file mode 100644
index 6bf7ccf..0000000
--- a/app/dashboard/src/assets/logo.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg viewBox="0 0 747 747" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M746.671 209.652V77.6572C746.671 72.9384 743.827 68.6832 739.468 66.8811C735.108 65.0738 730.093 66.0739 726.754 69.4072L579.354 216.807C577.453 202.386 570.203 189.203 559.037 179.87C547.875 170.542 533.615 165.744 519.083 166.432C504.551 167.12 490.807 173.24 480.573 183.583L414.375 249.776C412.417 235.391 405.141 222.25 393.985 212.959C382.823 203.662 368.594 198.88 354.083 199.552C339.578 200.224 325.849 206.302 315.594 216.588L274.343 257.828L19.9167 3.41515C16.5781 0.0818157 11.5625 -0.918184 7.20306 0.889149C2.84373 2.69648 0 6.94648 0 11.6651V143.649C0 146.743 1.22917 149.712 3.41667 151.899L191.843 340.339L3.41667 528.753C1.2292 530.94 0 533.909 0 537.003V668.997C0 673.716 2.84373 677.971 7.20306 679.773C11.5624 681.581 16.578 680.58 19.9167 677.247L167.317 529.847C169.285 544.233 176.561 557.358 187.718 566.65C198.869 575.947 213.098 580.728 227.603 580.066C242.103 579.404 255.838 573.342 266.098 563.071L332.295 496.874V496.879C334.259 511.264 341.535 524.395 352.691 533.686C363.853 542.977 378.082 547.759 392.587 547.092C407.093 546.421 420.822 540.348 431.077 530.066L472.327 488.826L726.754 743.239C728.941 745.427 731.91 746.656 735.004 746.656C736.535 746.661 738.056 746.359 739.473 745.77C743.832 743.963 746.671 739.708 746.671 734.989V602.994C746.671 599.901 745.442 596.932 743.254 594.744L554.827 406.318L743.254 217.904H743.259C745.447 215.717 746.676 212.748 746.676 209.654L746.671 209.652ZM23.3373 39.8118L257.844 274.318L208.328 323.818L23.3413 138.818L23.3373 39.8118ZM723.337 706.825L488.831 472.318L538.347 422.818L723.333 607.818L723.337 706.825ZM23.3373 541.825L332.097 233.078C338.764 226.719 347.624 223.172 356.843 223.172C366.056 223.172 374.916 226.719 381.588 233.078C388.151 239.641 391.838 248.548 391.838 257.828C391.838 267.114 388.151 276.016 381.588 282.577L23.3347 640.831L23.3373 541.825ZM249.604 546.575C240.755 555.419 227.864 558.872 215.781 555.638C203.703 552.398 194.265 542.961 191.027 530.883C187.792 518.8 191.245 505.91 200.089 497.06L497.076 200.074C505.92 191.23 518.811 187.772 530.893 191.011C542.971 194.246 552.409 203.678 555.648 215.76C558.888 227.839 555.434 240.73 546.591 249.572L249.604 546.575ZM723.337 204.815L414.577 513.562C407.911 519.926 399.051 523.473 389.832 523.473C380.618 523.473 371.753 519.926 365.087 513.562C358.529 506.999 354.842 498.098 354.842 488.816C354.842 479.535 358.529 470.634 365.087 464.071L723.34 105.818L723.337 204.815Z" fill="currentColor"/>
-</svg>
diff --git a/app/dashboard/src/components/callout/index.tsx b/app/dashboard/src/components/callout/index.tsx
deleted file mode 100644
index 5cdae9e..0000000
--- a/app/dashboard/src/components/callout/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-import { Box, ChakraProps, Text } from '@chakra-ui/react'
-import { FC } from 'react'
-
-type CalloutProps = {
- header: string,
- body: string,
-};
-
-export const Callout: FC<CalloutProps & ChakraProps> = ({ header, body, ...props }) => {
- return (
- <Box bg="gray.50" _dark={{ bg: 'gray.700' }} borderRadius="10" borderColor="red.500" border="2px" p="4" {...props}>
- <Text fontSize="xl" fontWeight="bold">
- {header}
- </Text>
- {body}
- </Box>
- )
-}
diff --git a/app/dashboard/src/components/delete-modal/index.tsx b/app/dashboard/src/components/delete-modal/index.tsx
deleted file mode 100644
index a0a7733..0000000
--- a/app/dashboard/src/components/delete-modal/index.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
-import {
- Button,
- Modal,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- ModalFooter,
- ModalHeader,
- ModalOverlay,
- Spinner,
- Text,
-} from '@chakra-ui/react';
-import { FC } from 'react';
-import { Trans, useTranslation } from 'react-i18next';
-import { DeleteIcon } from 'components/dialog';
-import { Icon } from 'components/icon';
-
-type DeleteModalProps = {
- onDelete: () => void,
- deleteObjectPromptT: string,
- deleteObjectTitleT: string,
- deletingObjectName?: string,
- isOpen: boolean,
- onClose: () => void,
- loading: boolean,
-}
-
-export const DeleteModal: FC<DeleteModalProps> = ({
- onDelete,
- isOpen,
- onClose,
- deletingObjectName,
- loading,
- deleteObjectTitleT,
- deleteObjectPromptT
-}) => {
- const { t } = useTranslation();
-
- return (
- <Modal isCentered isOpen={isOpen} onClose={onClose} size="sm">
- <ModalOverlay bg="blackAlpha.300" backdropFilter="blur(10px)" />
- <ModalContent mx="3">
- <ModalHeader pt={6}>
- <Icon color="red">
- <DeleteIcon />
- </Icon>
- </ModalHeader>
- <ModalCloseButton mt={3} />
- <ModalBody>
- <Text fontWeight="semibold" fontSize="lg">
- {t(deleteObjectTitleT)}
- </Text>
- {deletingObjectName && (
- <Text
- mt={1}
- fontSize="sm"
- _dark={{ color: 'gray.400' }}
- color="gray.600"
- >
- <Trans components={{ b: <b /> }}>
- {t(deleteObjectPromptT, { name: deletingObjectName })}
- </Trans>
- </Text>
- )}
- </ModalBody>
- <ModalFooter display="flex">
- <Button size="sm" onClick={onClose} mr={3} w="full" variant="outline">
- {t('cancel')}
- </Button>
- <Button
- size="sm"
- w="full"
- colorScheme="red"
- onClick={() => onDelete()}
- leftIcon={loading ? <Spinner size="xs" /> : undefined}
- >
- {t('delete')}
- </Button>
- </ModalFooter>
- </ModalContent>
- </Modal>
- );
-};
diff --git a/app/dashboard/src/components/dialog/icons.tsx b/app/dashboard/src/components/dialog/icons.tsx
deleted file mode 100644
index 5cac0b8..0000000
--- a/app/dashboard/src/components/dialog/icons.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-
-import { chakra } from '@chakra-ui/react';
-import {
- PencilIcon,
- UserPlusIcon,
- TrashIcon
-} from '@heroicons/react/24/outline';
-
-export const AddIcon = chakra(UserPlusIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
-
-export const EditIcon = chakra(PencilIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
-
-
-export const DeleteIcon = chakra(TrashIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
diff --git a/app/dashboard/src/components/dialog/index.ts b/app/dashboard/src/components/dialog/index.ts
deleted file mode 100644
index 4946043..0000000
--- a/app/dashboard/src/components/dialog/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './modal-footer';
-export * from './modal-header';
-export * from './icons';
diff --git a/app/dashboard/src/components/dialog/modal-footer.tsx b/app/dashboard/src/components/dialog/modal-footer.tsx
deleted file mode 100644
index ffd7afa..0000000
--- a/app/dashboard/src/components/dialog/modal-footer.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import React, { ReactNode } from 'react';
-import {
- HStack,
-} from '@chakra-ui/react';
-import { ModalFooter } from '@chakra-ui/react';
-
-interface UserDialogFooterProps {
- children: ReactNode
-}
-
-export const DialogModalFooter: React.FC<UserDialogFooterProps> = ({
- children
-}) => {
-
- return (
- <ModalFooter mt="3">
- <HStack
- justifyContent="space-between"
- w="full"
- gap={3}
- flexDirection={{
- base: 'column',
- sm: 'row',
- }}
- >
- {children}
- </HStack>
- </ModalFooter >
- );
-};
diff --git a/app/dashboard/src/components/dialog/modal-header.tsx b/app/dashboard/src/components/dialog/modal-header.tsx
deleted file mode 100644
index 23a7599..0000000
--- a/app/dashboard/src/components/dialog/modal-header.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-
-import { Text, HStack, ModalHeader } from '@chakra-ui/react';
-import { ChakraIcon } from 'types';
-import { Icon } from '../icon';
-
-export const DialogModalHeader = ({ HeaderIcon, title }: { HeaderIcon: ChakraIcon, title: string }) => {
- return (
- <ModalHeader pt={6}>
- <HStack gap={2}>
- <Icon color="primary">
- {HeaderIcon && <HeaderIcon color="white" />}
- </Icon>
- <Text fontWeight="semibold" fontSize="lg">
- {title}
- </Text>
- </HStack>
- </ModalHeader>
- );
-}
diff --git a/app/dashboard/src/components/footer/index.tsx b/app/dashboard/src/components/footer/index.tsx
deleted file mode 100644
index b381270..0000000
--- a/app/dashboard/src/components/footer/index.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { BoxProps, HStack, Link, Text } from '@chakra-ui/react';
-import { ORGANIZATION_URL, CO_CONTRIBUTOR, REPO_URL } from 'constants/Project';
-import { useDashboard } from 'stores';
-import { FC } from 'react';
-
-export const Footer: FC<BoxProps> = (props) => {
- const { version } = useDashboard();
- return (
- <HStack w="full" position="fixed" justifyContent="center" {...props}>
- <Text
- display="inline-block"
- color="gray.500"
- fontSize="xs"
- >
- <Link color="blue.400" href={REPO_URL}>
- Marzneshin
- </Link>
- {version ? ` (v${version}), ` : ', '}
- Made by{' '}
- <Link color="blue.400" href={ORGANIZATION_URL}>
- khodedawsh
- </Link>
- {' & '}
- <Link color="blue.400" href={CO_CONTRIBUTOR}>
- mardin.cc
- </Link>
- </Text>
- </HStack>
- );
-};
diff --git a/app/dashboard/src/components/header/github-button.tsx b/app/dashboard/src/components/header/github-button.tsx
deleted file mode 100644
index 516bcf6..0000000
--- a/app/dashboard/src/components/header/github-button.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-
-import { REPO_URL } from 'constants/Project';
-import { useColorMode } from '@chakra-ui/react';
-import GitHubButton from 'react-github-btn';
-
-export const GithubMenuButton = () => {
- const { colorMode } = useColorMode();
- const gBtnColor = colorMode === 'dark' ? 'dark_dimmed' : colorMode;
- return (
- <GitHubButton
- href={REPO_URL}
- data-color-scheme={`no-preference: ${gBtnColor}; light: ${gBtnColor}; dark: ${gBtnColor};`}
- data-size="large"
- data-show-count="true"
- aria-label="Star Marzneshin on GitHub"
- >
- Star
- </GitHubButton>
- )
-}
diff --git a/app/dashboard/src/components/header/index.tsx b/app/dashboard/src/components/header/index.tsx
deleted file mode 100644
index 6c3b624..0000000
--- a/app/dashboard/src/components/header/index.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import {
- Box,
- HStack,
- Text,
-} from '@chakra-ui/react';
-import { useDashboard } from 'stores';
-import { FC, ReactNode } from 'react';
-import { useTranslation } from 'react-i18next';
-import { Language } from 'components/language';
-import { ThemeToggle } from 'components/theme-toggler';
-
-type HeaderProps = {
- actions?: ReactNode;
-};
-
-import { GithubMenuButton } from './github-button';
-import { HeaderMenu } from './menu';
-
-export const Header: FC<HeaderProps> = () => {
- const { activePage, } = useDashboard();
- const { t } = useTranslation();
- return (
- <HStack
- gap={2}
- justifyContent="space-between"
- __css={{
- '& .menuList': {
- direction: 'ltr',
- },
- }}
- bg='white'
- _dark={{ bg: 'dark-bg' }}
- p="6"
- borderBottom={'1px solid gray.600'}
- position="sticky"
- alignItems="center"
- zIndex={999}
- top={0}
- >
- <Text as="h1" fontWeight="bold" fontSize="2xl" m="0">
- {t(activePage.name)}
- </Text>
- <Box css={{ direction: 'ltr' }}>
- <HStack alignItems="center">
- <GithubMenuButton />
- <Language />
- <ThemeToggle />
- <HeaderMenu />
- </HStack>
- </Box>
- </HStack>
- );
-};
diff --git a/app/dashboard/src/components/header/menu.tsx b/app/dashboard/src/components/header/menu.tsx
deleted file mode 100644
index fd90111..0000000
--- a/app/dashboard/src/components/header/menu.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import {
- IconButton,
- Menu,
- MenuButton,
- MenuItem,
- chakra,
- MenuList,
-} from '@chakra-ui/react';
-import { DONATION_URL } from 'constants/Project'
-import {
- ArrowLeftStartOnRectangleIcon,
- Bars3Icon,
- CurrencyDollarIcon,
-} from '@heroicons/react/24/outline';
-import { FC } from 'react';
-import { Link } from 'react-router-dom';
-import { useTranslation } from 'react-i18next';
-
-const iconProps = {
- baseStyle: {
- w: 4,
- h: 4,
- },
-};
-
-const SettingsIcon = chakra(Bars3Icon, iconProps);
-const LogoutIcon = chakra(ArrowLeftStartOnRectangleIcon, iconProps);
-const DonationIcon = chakra(CurrencyDollarIcon, iconProps);
-
-type HeaderMenuProps = {};
-
-export const HeaderMenu: FC<HeaderMenuProps> = () => {
- const { t } = useTranslation('header');
- return (
- <Menu>
- <MenuButton
- as={IconButton}
- size="sm"
- variant="outline"
- icon={<SettingsIcon />}
- position="relative"
- ></MenuButton>
- <MenuList minW="170px" zIndex={99999} className="menuList">
- <Link to={DONATION_URL} target="_blank">
- <MenuItem
- maxW="170px"
- fontSize="sm"
- icon={<DonationIcon />}
- position="relative"
- >
- {t('donation')}{' '}
- </MenuItem>
- </Link>
- <Link to="/login">
- <MenuItem maxW="170px" fontSize="sm" icon={<LogoutIcon />}>
- {t('logout')}
- </MenuItem>
- </Link>
- </MenuList>
- </Menu>
- )
-}
diff --git a/app/dashboard/src/components/icon/index.tsx b/app/dashboard/src/components/icon/index.tsx
deleted file mode 100644
index c2a77c7..0000000
--- a/app/dashboard/src/components/icon/index.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import { Box, Text } from '@chakra-ui/react';
-import { FC, PropsWithChildren } from 'react';
-
-export type IconType = {
- color: string;
-};
-
-export const Icon: FC<PropsWithChildren<IconType>> = ({ children, color }) => {
- return (
- <Box
- position="relative"
- width="36px"
- height="36px"
- display="flex"
- justifyContent="center"
- alignItems="center"
- _before={{
- content: '""',
- display: 'block',
- position: 'absolute',
- top: '0',
- left: '0',
- width: 'calc(100%)',
- height: 'calc(100%)',
- bg: `${color}.400`,
- opacity: '.5',
- borderRadius: '5px',
- zIndex: '1',
- _dark: {
- bg: `${color}.400`,
- },
- }}
- _after={{
- content: '""',
- display: 'block',
- position: 'absolute',
- top: '0',
- left: '0',
- width: 'calc(100% + 10px)',
- height: 'calc(100% + 10px)',
- transform: 'translate(-5px, -5px)',
- bg: `${color}.400`,
- opacity: '.4',
- borderRadius: '8px',
- zIndex: '1',
- _dark: {
- bg: `${color}.400`,
- },
- }}
- >
- <Text
- color={`${color}.500`}
- _dark={{ color: `${color}.900` }}
- position="relative"
- zIndex="2"
- >
- {children}
- </Text>
- </Box>
- );
-};
diff --git a/app/dashboard/src/components/inbounds-card/index.tsx b/app/dashboard/src/components/inbounds-card/index.tsx
deleted file mode 100644
index a474861..0000000
--- a/app/dashboard/src/components/inbounds-card/index.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Inbounds Card Component
- *
- * - name
- * - protocol
- * - Nodes number
-*/
-
-import { FC, PropsWithChildren } from 'react'
-import { ProtocolType } from 'types'
-import { Text, Spacer, VStack, chakra, Flex } from '@chakra-ui/react';
-import { IconBaseStyle } from 'constants/IconBaseStyle';
-import { ServerStackIcon } from '@heroicons/react/24/outline';
-import { SystemPropertyStatus } from 'components/system-property-status';
-
-type InboundCardProps = {
- tag: string,
- protocol: ProtocolType,
- nodeName: string;
-}
-
-const InboundsIcon = chakra(ServerStackIcon, IconBaseStyle);
-
-export const BadgeTag: FC<PropsWithChildren> = ({ children }) => {
- return (
- <Text fontSize="sm" color="primary.700" _dark={{ color: 'gray.100', bg: 'primary.700' }} bg="gray.100" pl="3px" pr="3px" border="1px" borderRadius="md" borderColor="primary.700" fontWeight="light">
- {children}
- </Text>
- )
-}
-
-export const InboundCard: FC<InboundCardProps> = ({ tag, protocol, nodeName }) => {
- return (
- <VStack justifyContent={'start'} alignItems={'start'} w="full">
- <Text fontSize="md" color="gray.700" _dark={{ color: 'gray.100' }} fontWeight="semibold">
- {tag}
- </Text>
- <Flex justifyContent={'spaced-between'} flexDir="row" w="full">
- <SystemPropertyStatus value={nodeName} StatusIcon={InboundsIcon} />
- <Spacer />
- <BadgeTag>
- {protocol}
- </BadgeTag>
- </Flex>
- </VStack >
- )
-}
diff --git a/app/dashboard/src/components/input/index.tsx b/app/dashboard/src/components/input/index.tsx
deleted file mode 100644
index 48ecaea..0000000
--- a/app/dashboard/src/components/input/index.tsx
+++ /dev/null
@@ -1,188 +0,0 @@
-import {
- chakra,
- FormControl,
- FormErrorMessage,
- FormLabel,
- Input as ChakraInput,
- InputGroup,
- InputLeftAddon,
- InputProps as ChakraInputProps,
- InputRightAddon,
- InputRightElement,
- NumberDecrementStepper,
- NumberIncrementStepper,
- NumberInput,
- NumberInputField,
- NumberInputStepper
-} from '@chakra-ui/react';
-import { XMarkIcon } from '@heroicons/react/24/outline';
-import classNames from 'classnames';
-import React, { PropsWithChildren, ReactNode } from 'react';
-
-const ClearIcon = chakra(XMarkIcon, {
- baseStyle: {
- w: 4,
- h: 4,
- },
-});
-
-export type InputProps = PropsWithChildren<
- {
- value?: string;
- className?: string;
- endAdornment?: ReactNode;
- startAdornment?: ReactNode;
- type?: string;
- placeholder?: string;
- onChange?: (e: any) => void;
- onBlur?: (e: any) => void;
- onClick?: (e: any) => void;
- name?: string;
- error?: string;
- disabled?: boolean;
- step?: number;
- label?: string;
- clearable?: boolean;
- } & ChakraInputProps
->;
-
-export const Input = React.forwardRef<HTMLInputElement, InputProps>(
- (
- {
- disabled,
- step,
- label,
- className,
- startAdornment,
- endAdornment,
- type = 'text',
- placeholder,
- onChange,
- onBlur,
- name,
- value,
- onClick,
- error,
- clearable = false,
- ...props
- },
- ref
- ) => {
- const clear = () => {
- if (onChange)
- onChange({
- target: {
- value: '',
- name,
- },
- });
- };
- const { size = 'md' } = props;
- const Component = type == 'number' ? NumberInputField : ChakraInput;
- const Wrapper = type == 'number' ? NumberInput : React.Fragment;
- const wrapperProps =
- type == 'number'
- ? {
- keepWithinRange: true,
- precision: 5,
- format: (value: string | number) => {
- return isNaN(parseFloat(String(value)))
- ? value
- : Number(parseFloat(String(value)).toFixed(5)) === 0
- ? value
- : Number(parseFloat(String(value)).toFixed(5));
- },
- min: 0,
- step,
- name,
- type,
- placeholder,
- onChange: (v: any) => {
- if (onChange) onChange(v);
- },
- onBlur,
- value,
- onClick,
- disabled,
- flexGrow: 1,
- size,
- }
- : {};
- return (
- <FormControl isInvalid={!!error}>
- {label && <FormLabel>{label}</FormLabel>}
- <InputGroup
- size={size}
- w="full"
- rounded="md"
- _focusWithin={{
- outline: '2px solid',
- outlineColor: 'primary.200',
- }}
- bg={disabled ? 'gray.100' : 'transparent'}
- _dark={{ bg: disabled ? 'gray.600' : 'transparent' }}
- >
- {startAdornment && <InputLeftAddon>{startAdornment}</InputLeftAddon>}
- <Wrapper {...wrapperProps}>
- {/* @ts-ignore */}
- <Component
- name={name}
- ref={ref}
- step={step}
- className={classNames(className)}
- type={type}
- placeholder={placeholder}
- onChange={onChange}
- onBlur={onBlur}
- value={value}
- onClick={onClick}
- disabled={disabled}
- flexGrow={1}
- _focusVisible={{
- outline: 'none',
- borderTopColor: 'transparent',
- borderRightColor: 'transparent',
- borderBottomColor: 'transparent',
- }}
- _disabled={{
- cursor: 'not-allowed',
- }}
- {...props}
- roundedLeft={startAdornment ? '0' : 'md'}
- roundedRight={endAdornment ? '0' : 'md'}
- />
- {type == 'number' && (
- <>
- <NumberInputStepper>
- <NumberIncrementStepper />
- <NumberDecrementStepper />
- </NumberInputStepper>
- </>
- )}
- </Wrapper>
- {endAdornment && (
- <InputRightAddon
- borderLeftRadius={0}
- borderRightRadius="6px"
- bg="transparent"
- >
- {endAdornment}
- </InputRightAddon>
- )}
- {clearable && value && value.length && (
- <InputRightElement
- borderLeftRadius={0}
- borderRightRadius="6px"
- bg="transparent"
- onClick={clear}
- cursor="pointer"
- >
- <ClearIcon />
- </InputRightElement>
- )}
- </InputGroup>
- {!!error && <FormErrorMessage>{error}</FormErrorMessage>}
- </FormControl>
- );
- }
-);
diff --git a/app/dashboard/src/components/json-editor/index.tsx b/app/dashboard/src/components/json-editor/index.tsx
deleted file mode 100644
index 2fd7b77..0000000
--- a/app/dashboard/src/components/json-editor/index.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { Box, useColorMode } from '@chakra-ui/react';
-import JSONEditor, { JSONEditorMode, JSONEditorOptions } from 'jsoneditor';
-import 'jsoneditor/dist/jsoneditor.css';
-import { forwardRef, useEffect, useRef } from 'react';
-import './styles.css';
-import './themes.js';
-
-export type JSONEditorProps = {
- onChange: (value: string) => void;
- json: any;
- mode?: JSONEditorMode;
-};
-export const JsonEditor = forwardRef<HTMLDivElement, JSONEditorProps>(
- ({ json, onChange, mode = 'code' }, ref) => {
- const { colorMode } = useColorMode();
- const options: JSONEditorOptions = {
- mode,
- onChangeText: onChange,
- statusBar: false,
- mainMenuBar: false,
- theme: colorMode === 'dark' ? 'ace/theme/nord_dark' : 'ace/theme/dawn',
- };
-
- const jsonEditorContainer = useRef<HTMLDivElement>(null);
- const jsonEditorRef = useRef<JSONEditor | null>(null);
-
- useEffect(() => {
- jsonEditorRef.current = new JSONEditor(
- jsonEditorContainer.current!,
- options
- );
-
- return () => {
- if (jsonEditorRef.current) jsonEditorRef.current.destroy();
- };
- }, []);
-
- useEffect(() => {
- if (jsonEditorRef.current) jsonEditorRef.current.update(json);
- }, [json]);
-
- return (
- <Box
- ref={ref}
- border="1px solid"
- borderColor="gray.300"
- _dark={{
- borderColor: 'gray.500',
- }}
- borderRadius={5}
- h="full"
- >
- <Box height="full" ref={jsonEditorContainer} />
- </Box>
- );
- }
-);
diff --git a/app/dashboard/src/components/json-editor/styles.css b/app/dashboard/src/components/json-editor/styles.css
deleted file mode 100644
index 12010e4..0000000
--- a/app/dashboard/src/components/json-editor/styles.css
+++ /dev/null
@@ -1,259 +0,0 @@
-.ace_gutter-cell{
- padding-left: 20px;
- padding-right: 16px !important;
-}
-.ace_editor, .jsoneditor{
- border-radius: 4px;
-}
-.ace_editor{
- min-height: 300px;
-}
-.jsoneditor {
- border: 0;
-}
-
-/* light theme */
-.ace-dawn .ace_gutter {
- background: #ebebeb;
- color: #333
-}
-
-.ace-dawn .ace_print-margin {
- width: 1px;
- background: #e8e8e8
-}
-
-.ace-dawn {
- background-color: #F9F9F9;
- color: #080808
-}
-
-.ace-dawn .ace_cursor {
- color: #000000
-}
-
-.ace-dawn .ace_marker-layer .ace_selection {
- background: rgba(39, 95, 255, 0.30)
-}
-
-.ace-dawn.ace_multiselect .ace_selection.ace_start {
- box-shadow: 0 0 3px 0px #F9F9F9;
-}
-
-.ace-dawn .ace_marker-layer .ace_step {
- background: rgb(255, 255, 0)
-}
-
-.ace-dawn .ace_marker-layer .ace_bracket {
- margin: -1px 0 0 -1px;
- border: 1px solid rgba(75, 75, 126, 0.50)
-}
-
-.ace-dawn .ace_marker-layer .ace_active-line {
- background: rgba(36, 99, 180, 0.12)
-}
-
-.ace-dawn .ace_gutter-active-line {
- background-color : #dcdcdc
-}
-
-.ace-dawn .ace_marker-layer .ace_selected-word {
- border: 1px solid rgba(39, 95, 255, 0.30)
-}
-
-.ace-dawn .ace_invisible {
- color: rgba(75, 75, 126, 0.50)
-}
-
-.ace-dawn .ace_keyword,
-.ace-dawn .ace_meta {
- color: #794938
-}
-
-.ace-dawn .ace_constant,
-.ace-dawn .ace_constant.ace_character,
-.ace-dawn .ace_constant.ace_character.ace_escape,
-.ace-dawn .ace_constant.ace_other {
- color: #811F24
-}
-
-.ace-dawn .ace_invalid.ace_illegal {
- text-decoration: underline;
- font-style: italic;
- color: #F8F8F8;
- background-color: #B52A1D
-}
-
-.ace-dawn .ace_invalid.ace_deprecated {
- text-decoration: underline;
- font-style: italic;
- color: #B52A1D
-}
-
-.ace-dawn .ace_support {
- color: #691C97
-}
-
-.ace-dawn .ace_support.ace_constant {
- color: #B4371F
-}
-
-.ace-dawn .ace_fold {
- background-color: #794938;
- border-color: #080808
-}
-
-.ace-dawn .ace_list,
-.ace-dawn .ace_markup.ace_list,
-.ace-dawn .ace_support.ace_function {
- color: #693A17
-}
-
-.ace-dawn .ace_storage {
- font-style: italic;
- color: #A71D5D
-}
-
-.ace-dawn .ace_string {
- color: #0B6125
-}
-
-.ace-dawn .ace_string.ace_regexp {
- color: #CF5628
-}
-
-.ace-dawn .ace_comment {
- font-style: italic;
- color: #5A525F
-}
-
-.ace-dawn .ace_heading,
-.ace-dawn .ace_markup.ace_heading {
- color: #19356D
-}
-
-.ace-dawn .ace_variable {
- color: #234A97
-}
-
-.ace-dawn .ace_indent-guide {
- background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y
-}
-
-.ace-dawn .ace_indent-guide-active {
- background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;
-}
-
-
-/* dark theme */
-.ace-nord-dark .ace_gutter {
- color: #616e88;
-}
-
-.ace-nord-dark .ace_print-margin {
- width: 1px;
- background: #4c566a;
-}
-
-.ace-nord-dark {
- background-color: #2e3440;
- color: #d8dee9;
-}
-
-.ace-nord-dark .ace_entity.ace_other.ace_attribute-name,
-.ace-nord-dark .ace_storage {
- color: #d8dee9;
-}
-
-.ace-nord-dark .ace_cursor {
- color: #d8dee9;
-}
-
-.ace-nord-dark .ace_string.ace_regexp {
- color: #bf616a;
-}
-
-.ace-nord-dark .ace_marker-layer .ace_active-line {
- background: #434c5ecc;
-}
-.ace-nord-dark .ace_marker-layer .ace_selection {
- background: #434c5ecc;
-}
-
-.ace-nord-dark.ace_multiselect .ace_selection.ace_start {
- box-shadow: 0 0 3px 0px #2e3440;
-}
-
-.ace-nord-dark .ace_marker-layer .ace_step {
- background: #ebcb8b;
-}
-
-.ace-nord-dark .ace_marker-layer .ace_bracket {
- margin: -1px 0 0 -1px;
- border: 1px solid #88c0d066;
-}
-
-.ace-nord-dark .ace_gutter-active-line {
- background-color: #434c5ecc;
-}
-
-.ace-nord-dark .ace_marker-layer .ace_selected-word {
- border: 1px solid #88c0d066;
-}
-
-.ace-nord-dark .ace_invisible {
- color: #4c566a;
-}
-
-.ace-nord-dark .ace_keyword,
-.ace-nord-dark .ace_meta,
-.ace-nord-dark .ace_support.ace_class,
-.ace-nord-dark .ace_support.ace_type {
- color: #81a1c1;
-}
-
-.ace-nord-dark .ace_constant.ace_character,
-.ace-nord-dark .ace_constant.ace_other {
- color: #d8dee9;
-}
-
-.ace-nord-dark .ace_constant.ace_language {
- color: #5e81ac;
-}
-
-.ace-nord-dark .ace_constant.ace_escape {
- color: #ebcB8b;
-}
-
-.ace-nord-dark .ace_constant.ace_numeric {
- color: #b48ead;
-}
-
-.ace-nord-dark .ace_fold {
- background-color: #4c566a;
- border-color: #d8dee9;
-}
-
-.ace-nord-dark .ace_entity.ace_name.ace_function,
-.ace-nord-dark .ace_entity.ace_name.ace_tag,
-.ace-nord-dark .ace_support.ace_function,
-.ace-nord-dark .ace_variable,
-.ace-nord-dark .ace_variable.ace_language {
- color: #8fbcbb;
-}
-
-.ace-nord-dark .ace_string {
- color: #a3be8c;
-}
-
-.ace-nord-dark .ace_comment {
- color: #616e88;
-}
-
-.ace-nord-dark .ace_indent-guide {
- box-shadow: inset -1px 0 0 0 #434c5eb3;
-}
-
-.ace-nord-dark .ace_indent-guide-active {
- box-shadow: inset -1px 0 0 0 #8395b8b3;
-}
diff --git a/app/dashboard/src/components/json-editor/themes.js b/app/dashboard/src/components/json-editor/themes.js
deleted file mode 100644
index 772f334..0000000
--- a/app/dashboard/src/components/json-editor/themes.js
+++ /dev/null
@@ -1,22 +0,0 @@
-window.ace.define(
- 'ace/theme/nord_dark',
- ['require', 'exports', 'module', 'ace/lib/dom'],
- (acequire, exports) => {
- exports.isDark = true;
- exports.cssClass = 'ace-nord-dark';
- const dom = acequire('../lib/dom');
- dom.importCssString(exports.cssText, exports.cssClass);
- }
-);
-
-window.ace.define(
- 'ace/theme/dawn',
- ['require', 'exports', 'module', 'ace/lib/dom'],
- (acequire, exports) => {
- exports.isDark = false;
- exports.cssClass = 'ace-dawn';
-
- const dom = acequire('../lib/dom');
- dom.importCssString(exports.cssText, exports.cssClass);
- }
-);
diff --git a/app/dashboard/src/components/language/index.tsx b/app/dashboard/src/components/language/index.tsx
deleted file mode 100644
index 875cd2f..0000000
--- a/app/dashboard/src/components/language/index.tsx
+++ /dev/null
@@ -1,72 +0,0 @@
-import {
- chakra,
- IconButton,
- Menu,
- MenuButton,
- MenuItem,
- MenuList,
-} from '@chakra-ui/react';
-import { LanguageIcon } from '@heroicons/react/24/outline';
-import { FC, ReactNode } from 'react';
-import { useTranslation } from 'react-i18next';
-
-type HeaderProps = {
- actions?: ReactNode;
-};
-
-const LangIcon = chakra(LanguageIcon, {
- baseStyle: {
- w: 4,
- h: 4,
- },
-});
-
-export const Language: FC<HeaderProps> = () => {
- const { i18n } = useTranslation();
-
- var changeLanguage = (lang: string) => {
- i18n.changeLanguage(lang);
- };
-
- return (
- <Menu placement="bottom-end">
- <MenuButton
- as={IconButton}
- size="sm"
- variant="outline"
- icon={<LangIcon />}
- position="relative"
- />
- <MenuList minW="100px" zIndex={9999}>
- <MenuItem
- maxW="100px"
- fontSize="sm"
- onClick={() => changeLanguage('en')}
- >
- English
- </MenuItem>
- <MenuItem
- maxW="100px"
- fontSize="sm"
- onClick={() => changeLanguage('fa')}
- >
- فارسی
- </MenuItem>
- <MenuItem
- maxW="100px"
- fontSize="sm"
- onClick={() => changeLanguage('zh-cn')}
- >
- 简体中文
- </MenuItem>
- <MenuItem
- maxW="100px"
- fontSize="sm"
- onClick={() => changeLanguage('ru')}
- >
- Русский
- </MenuItem>
- </MenuList>
- </Menu>
- );
-};
diff --git a/app/dashboard/src/components/list-check-box/index.tsx b/app/dashboard/src/components/list-check-box/index.tsx
deleted file mode 100644
index 2096cc1..0000000
--- a/app/dashboard/src/components/list-check-box/index.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-import {
- Box,
-} from '@chakra-ui/react';
-import { ReactNode, Ref } from 'react';
-
-type ListCheckboxProps = {
- isChecked: boolean;
- onChange: () => void;
- renderContent: () => ReactNode;
- value: string;
- ref?: Ref<HTMLDivElement>;
-}
-
-
-export const ListCheckBox = (
- { isChecked, onChange, renderContent, ref, ...props }: ListCheckboxProps,
-
-) => {
- const darkStyle = { bg: isChecked ? 'gray.800' : 'transparent' };
-
- return (
- <Box
- ref={ref}
- border={isChecked ? '5px' : '3px'}
- w="full"
- borderColor={isChecked ? 'primary.500' : 'gray.600'}
- boxShadow={
- isChecked
- ? '0 0 0 3px rgba(102, 126, 234, 0.6)'
- : '0 0 0 1px rgba(102, 126, 234, 0.6)'
- }
- bg={isChecked ? 'gray.100' : 'transparent'}
- _dark={darkStyle}
- py="4px"
- px="8px"
- borderRadius="md"
- display="flex"
- alignItems="center"
- justifyContent="center"
- _hover={{
- cursor: 'pointer',
- borderColor: 'primary.300',
- }}
- onClick={onChange}
- {...props}
- >
- {renderContent()}
- </Box>
- );
-}
diff --git a/app/dashboard/src/components/online-badge/index.tsx b/app/dashboard/src/components/online-badge/index.tsx
deleted file mode 100644
index 85b23c8..0000000
--- a/app/dashboard/src/components/online-badge/index.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import {FC} from 'react';
-
-type UserStatusProps = {
- lastOnline?: string | null;
-};
-
-const convertDateFormat = (lastOnline: string | null | undefined): number | null => {
- if (!lastOnline) {
- return null;
- }
-
- const date = new Date(lastOnline + 'Z');
- return Math.floor(date.getTime() / 1000);
-};
-
-export const OnlineBadge: FC<UserStatusProps> = ({lastOnline}) => {
- const currentTimeInSeconds = Math.floor(Date.now() / 1000);
- const unixTime = convertDateFormat(lastOnline);
-
- if (typeof lastOnline === 'undefined' || lastOnline === null) {
- return <div className="circle pulse orange"></div>;
- }
-
- const timeDifferenceInSeconds = unixTime ? currentTimeInSeconds - unixTime : Infinity;
-
- if (timeDifferenceInSeconds > 0 && timeDifferenceInSeconds <= 60) {
- return <div className="circle pulse green"></div>;
- }
-
- return <div className="circle pulse red"></div>;
-};
\ No newline at end of file
diff --git a/app/dashboard/src/components/online-status/index.tsx b/app/dashboard/src/components/online-status/index.tsx
deleted file mode 100644
index 30da064..0000000
--- a/app/dashboard/src/components/online-status/index.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import {FC} from 'react';
-import {Text} from '@chakra-ui/react';
-import {relativeExpiryDate} from 'utils/dateFormatter';
-
-type UserStatusProps = {
- lastOnline: string | null;
-};
-
-const convertDateFormat = (lastOnline: string | null): number | null => {
- if (!lastOnline) {
- return null;
- }
-
- const date = new Date(lastOnline + 'Z');
- return Math.floor(date.getTime() / 1000);
-};
-
-export const OnlineStatus: FC<UserStatusProps> = ({lastOnline}) => {
- const currentTimeInSeconds = Math.floor(Date.now() / 1000);
- const unixTime = convertDateFormat(lastOnline);
-
- const timeDifferenceInSeconds = unixTime ? currentTimeInSeconds - unixTime : null;
- const dateInfo = unixTime ? relativeExpiryDate(unixTime) : {status: '', time: 'Not Connected Yet'};
-
- return (
- <Text
- display="inline-block"
- fontSize="xs"
- fontWeight="medium"
- ml="2"
- color="gray.600"
- _dark={{
- color: 'gray.400',
- }}
- >
- {timeDifferenceInSeconds && timeDifferenceInSeconds <= 60
- ? 'Online'
- : timeDifferenceInSeconds
- ? `${dateInfo.time} ago`
- : dateInfo.time}
- </Text>
- );
-};
\ No newline at end of file
diff --git a/app/dashboard/src/components/page/index.tsx b/app/dashboard/src/components/page/index.tsx
deleted file mode 100644
index 63d979c..0000000
--- a/app/dashboard/src/components/page/index.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { Box, VStack } from '@chakra-ui/react';
-import { FC, PropsWithChildren, useEffect } from 'react';
-import { useDashboard } from 'stores';
-import { PageType } from 'types';
-
-const usePage = (page: PageType) => {
- useEffect(() => {
- useDashboard.getState().activatePage(page);
- }, []);
-};
-
-type PageProp = {
- page: PageType;
-}
-
-export const Page: FC<PropsWithChildren<PageProp>> = ({ page, children }) => {
- usePage(page);
-
- return (
- <VStack justifyContent="space-between" mt={4} rowGap={4}>
- <Box w="full">
- {children}
- </Box>
- </VStack>
- );
-};
-
-export default Page;
diff --git a/app/dashboard/src/components/sidebar/index.tsx b/app/dashboard/src/components/sidebar/index.tsx
deleted file mode 100644
index 5f1234a..0000000
--- a/app/dashboard/src/components/sidebar/index.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import { HamburgerIcon } from '@chakra-ui/icons';
-import { chakra, Flex } from '@chakra-ui/react'
-import { pages } from 'stores';
-import { FC } from 'react';
-import { Logo } from './logo';
-import { SidebarGroup } from './sidebar-group';
-import { SidebarItem } from './sidebar-item';
-
-export const SidebarMenuIcon = chakra(HamburgerIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
-
-
-export const Sidebar: FC = () => {
- return (
- <aside>
- <Flex
- pos="sticky"
- borderRightWidth="4px"
- borderRightColor='gray.200'
- borderRightStyle="solid"
- flexDir="column"
- pt={4}
- h="100vh"
- bg="gray.50"
- _dark={{ bg: 'gray.800', borderRightColor: 'gray.700' }}
- >
- <Logo />
- <SidebarGroup titleT={'sidebar.groups.management'}>
- {Object.entries(pages).map(([pageKey, page]) =>
- <SidebarItem
- page={page}
- key={pageKey}
- />
- )}
- </SidebarGroup>
- </Flex>
- </aside>
- )
-}
diff --git a/app/dashboard/src/components/sidebar/logo.tsx b/app/dashboard/src/components/sidebar/logo.tsx
deleted file mode 100644
index cf94fbc..0000000
--- a/app/dashboard/src/components/sidebar/logo.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { Image } from '@chakra-ui/react'
-
-export const Logo = () => {
- return (
- <Image src="favicon/logo.svg" alt="marzneshin" boxSize="50px" w="full" />
- )
-}
diff --git a/app/dashboard/src/components/sidebar/sidebar-group.tsx b/app/dashboard/src/components/sidebar/sidebar-group.tsx
deleted file mode 100644
index 60500f4..0000000
--- a/app/dashboard/src/components/sidebar/sidebar-group.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Box, Text, VStack } from '@chakra-ui/react'
-import { FC, PropsWithChildren } from 'react'
-import { useTranslation } from 'react-i18next'
-
-type SidebarGroupProps = {
- titleT: string
-}
-
-export const SidebarGroup: FC<PropsWithChildren<SidebarGroupProps>> = ({ titleT, children }) => {
- const { t } = useTranslation();
- return (
- <Box>
- <VStack gap="2">
- <Text w="85%" fontWeight="bold" textTransform="uppercase" fontSize="xs" color="gray.500" >{t(titleT)}</Text>
- {children}
- </VStack>
- </Box>
- );
-}
diff --git a/app/dashboard/src/components/sidebar/sidebar-item.tsx b/app/dashboard/src/components/sidebar/sidebar-item.tsx
deleted file mode 100644
index 5ec53d6..0000000
--- a/app/dashboard/src/components/sidebar/sidebar-item.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-
-import { Flex, Text } from '@chakra-ui/react'
-import { useDashboard } from 'stores';
-import { Link as ReactRouterLink } from 'react-router-dom'
-import { Link as ChakraLink } from '@chakra-ui/react'
-import { Icon } from 'components/icon';
-import { FC, useEffect, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-import { PageType } from 'types';
-
-export type SideBarItemProps = {
- page: PageType,
-}
-
-export const SidebarItem: FC<SideBarItemProps> = ({ page }) => {
- const { t } = useTranslation();
- const { activePage, activatePage, isCollapsed } = useDashboard();
- const [active, activate] = useState(page === activePage);
-
- useEffect(() => { activate(page === activePage) }, [active, activePage]);
-
- const darkStyle = { bg: active ? 'primary.900' : 'transparent' };
- const hoverStyle = {
- borderRadius: 10,
- bg: active ? undefined : 'gray.200',
- _dark: {
- bg: 'gray.700'
- },
- transition: 'background-color 0.9s',
- };
- const ItemIcon = page.itemIcon;
- return (
- <ChakraLink
- as={ReactRouterLink}
- borderRadius={10}
- bg={active ? 'primary.500' : 'transparent'}
- border="4px"
- borderColor="transparent"
- _dark={darkStyle}
- to={page.path}
- w="85%"
- _hover={hoverStyle}
- onClick={() => {
- activatePage(page);
- }}
- >
- <Flex flexDir="row" alignItems="center" justifyContent={isCollapsed ? 'center' : undefined} >
- <Icon color="">
- <ItemIcon color={active ? 'gray.100' : undefined} _dark={{ color: active ? 'gray.100' : undefined }} />
- </Icon>
- <Text
- color={active ? 'gray.100' : 'gray.700'}
- _dark={{ color: 'gray.100' }} fontSize="xl"
- display={isCollapsed ? 'none' : 'block'}>
- {t(page.name)}
- </Text>
- </Flex>
- </ChakraLink>
- );
-}
diff --git a/app/dashboard/src/components/statistics-card/index.tsx b/app/dashboard/src/components/statistics-card/index.tsx
deleted file mode 100644
index ac7776d..0000000
--- a/app/dashboard/src/components/statistics-card/index.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export { StatisticsCardInLine } from './inline-card';
-export { StatisticsCardWide } from './wide-card';
-export const StatisticsQueryKey = 'statistics-query-key';
diff --git a/app/dashboard/src/components/statistics-card/inline-card.tsx b/app/dashboard/src/components/statistics-card/inline-card.tsx
deleted file mode 100644
index a56f6ef..0000000
--- a/app/dashboard/src/components/statistics-card/inline-card.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { StatisticsWidget } from './widget';
-import { FC, PropsWithChildren } from 'react';
-import { StatisticCardProps } from './statistics-props';
-
-export const StatisticsCardInLine: FC<PropsWithChildren<StatisticCardProps>> = ({
- title,
- content,
- icon }) => {
- return (
- <StatisticsWidget
- title={title}
- icon={icon}
- content={content}
- display="flex"
- justifyContent="space-between"
- flexDirection="row"
- />
- );
-};
diff --git a/app/dashboard/src/components/statistics-card/statistics-props.tsx b/app/dashboard/src/components/statistics-card/statistics-props.tsx
deleted file mode 100644
index 5f0229c..0000000
--- a/app/dashboard/src/components/statistics-card/statistics-props.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { ReactElement, ReactNode } from 'react';
-
-export type StatisticCardProps = {
- title: string;
- content: ReactNode;
- icon: ReactElement;
-};
diff --git a/app/dashboard/src/components/statistics-card/wide-card.tsx b/app/dashboard/src/components/statistics-card/wide-card.tsx
deleted file mode 100644
index 81a037f..0000000
--- a/app/dashboard/src/components/statistics-card/wide-card.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { StatisticsWidget } from './widget';
-import { FC, PropsWithChildren } from 'react';
-import { StatisticCardProps } from './statistics-props';
-
-export const StatisticsCardWide: FC<PropsWithChildren<StatisticCardProps>> = ({
- title,
- content,
- icon }) => {
- return (
- <StatisticsWidget
- title={title}
- icon={icon}
- content={content}
- flexDirection="column"
- />
- );
-};
diff --git a/app/dashboard/src/components/statistics-card/widget.tsx b/app/dashboard/src/components/statistics-card/widget.tsx
deleted file mode 100644
index 35fec1d..0000000
--- a/app/dashboard/src/components/statistics-card/widget.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-
-import { Box, Text, Card, ChakraProps, HStack } from '@chakra-ui/react';
-import { FC } from 'react';
-import { StatisticCardProps } from './statistics-props';
-
-export const StatisticsWidget: FC<ChakraProps & StatisticCardProps> = ({ icon, content, title, ...chakraProps }) => {
- return (
- <Card
- p={6}
- borderWidth="1px"
- borderColor="light-border"
- bg="#F9FAFB"
- _dark={{ borderColor: 'gray.600', bg: 'gray.750' }}
- borderStyle="solid"
- boxShadow="none"
- borderRadius="12px"
- width="full"
- display="flex"
- justifyContent="space-between"
- {...chakraProps}
- >
- <HStack alignItems="center" columnGap="4">
- <Box
- p="2"
- position="relative"
- color="white"
- _before={{
- content: '""',
- position: 'absolute',
- top: 0,
- left: 0,
- bg: 'primary.400',
- display: 'block',
- w: 'full',
- h: 'full',
- borderRadius: '5px',
- opacity: '.5',
- z: '1',
- }}
- _after={{
- content: '""',
- position: 'absolute',
- top: '-5px',
- left: '-5px',
- bg: 'primary.400',
- display: 'block',
- w: 'calc(100% + 10px)',
- h: 'calc(100% + 10px)',
- borderRadius: '8px',
- opacity: '.4',
- z: '1',
- }}
- >
- {icon}
- </Box>
- <Text
- color="gray.600"
- _dark={{
- color: 'gray.300',
- }}
- fontWeight="medium"
- textTransform="capitalize"
- fontSize="sm"
- >
- {title}
- </Text>
- </HStack>
- <Box fontSize="3xl" fontWeight="semibold" mt="2">
- {content}
- </Box>
- </Card>
- );
-};
diff --git a/app/dashboard/src/components/status-badge/index.tsx b/app/dashboard/src/components/status-badge/index.tsx
deleted file mode 100644
index ab43bab..0000000
--- a/app/dashboard/src/components/status-badge/index.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import { Badge, Text } from '@chakra-ui/react';
-
-import { statusColors } from 'constants/Settings';
-import { FC } from 'react';
-import { useTranslation } from 'react-i18next';
-import { Status as StatusType } from 'types';
-import { relativeExpiryDate } from 'utils/dateFormatter';
-
-type StatusProps = {
- expiryDate?: number | null;
- status: StatusType;
- compact?: boolean;
- showDetail?: boolean;
- extraText?: string | null;
-};
-export const StatusBadge: FC<StatusProps> = ({
- expiryDate,
- status,
- compact = false,
- showDetail = true,
- extraText,
-}) => {
- const { t } = useTranslation();
- const dateInfo = relativeExpiryDate(expiryDate);
- const Icon = statusColors[status].icon;
- return (
- <>
- <Badge
- colorScheme={statusColors[status].statusColor}
- rounded="full"
- display="inline-flex"
- px={3}
- py={1}
- columnGap={compact ? 1 : 2}
- alignItems="center"
- >
- <Icon w={compact ? 3 : 4} />
- {showDetail && (
- <Text
- textTransform="capitalize"
- fontSize={compact ? '.7rem' : '.875rem'}
- lineHeight={compact ? '1rem' : '1.25rem'}
- fontWeight="medium"
- letterSpacing="tighter"
- >
- {status}
- {extraText && `: ${extraText}`}
- </Text>
- )}
- </Badge>
- {showDetail && expiryDate && (
- <Text
- display="inline-block"
- fontSize="xs"
- fontWeight="medium"
- ml="2"
- color="gray.600"
- _dark={{
- color: 'gray.400',
- }}
- >
- {t(dateInfo.status, { time: dateInfo.time })}
- </Text>
- )}
- </>
- );
-};
diff --git a/app/dashboard/src/components/system-property-status/index.tsx b/app/dashboard/src/components/system-property-status/index.tsx
deleted file mode 100644
index 4df94c6..0000000
--- a/app/dashboard/src/components/system-property-status/index.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Flex } from '@chakra-ui/react';
-import { FC, useState } from 'react';
-import { ChakraIcon } from 'types';
-
-type SystemPropertyStatusProps = {
- value: number | string;
- StatusIcon: ChakraIcon;
-}
-
-export const SystemPropertyStatus: FC<SystemPropertyStatusProps> = ({ value, StatusIcon }) => {
- const [valueState,] = useState(value);
- return (
- <Flex flexDirection="row">
- <StatusIcon />
- <span>{valueState}</span>
- </Flex>
- );
-};
diff --git a/app/dashboard/src/components/table/empty-section.tsx b/app/dashboard/src/components/table/empty-section.tsx
deleted file mode 100644
index dc4c059..0000000
--- a/app/dashboard/src/components/table/empty-section.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-
-import { Box, Text, Button, chakra } from '@chakra-ui/react';
-import { FC } from 'react';
-import { ReactComponent as AddFileIcon } from 'assets/add_file.svg';
-import { t } from 'i18next';
-
-type EmptySectionProps = {
- isFiltered: boolean;
- noObjectMatchedT: string;
- noObjectT: string;
- createObjectT: string;
- onCreateObject?: (isOpen: boolean) => void;
-};
-
-const EmptySectionIcon = chakra(AddFileIcon);
-
-/**
- * Component to provide visual feedback for the result of table filtering
- * and table emptiness
- *
- * @param noObjectMatchedT - i18n token for "No <object> where Matched"
- * @param noObjectT - i18n token for "No <object> where found"
- * @param createObjectT - i18n token for "Create <object>" Button
- * @param onCreateObject - Create object event handler on click
- *
- */
-export const EmptySection: FC<EmptySectionProps> = ({
- isFiltered, noObjectT, noObjectMatchedT, createObjectT, onCreateObject
-}) => {
- return (
- <Box
- padding="5"
- py="8"
- display="flex"
- alignItems="center"
- flexDirection="column"
- gap={4}
- w="full"
- >
- <EmptySectionIcon
- maxHeight="200px"
- maxWidth="200px"
- _dark={{
- 'path[fill="#fff"]': {
- fill: 'gray.800',
- },
- 'path[fill="#f2f2f2"], path[fill="#e6e6e6"], path[fill="#ccc"]': {
- fill: 'gray.700',
- },
- 'circle[fill="#3182CE"]': {
- fill: 'primary.300',
- },
- }}
- _light={{
- 'path[fill="#f2f2f2"], path[fill="#e6e6e6"], path[fill="#ccc"]': {
- fill: 'gray.300',
- },
- 'circle[fill="#3182CE"]': {
- fill: 'primary.500',
- },
- }}
- />
- <Text fontWeight="medium" color="gray.600" _dark={{ color: 'gray.400' }}>
- {isFiltered ? t(noObjectMatchedT) : t(noObjectT)}
- </Text>
- {(!isFiltered && onCreateObject !== undefined) && (
- <Button
- size="sm"
- colorScheme="primary"
- onClick={() => onCreateObject(true)}
- >
- {t(createObjectT)}
- </Button>
- )}
- </Box>
- );
-};
diff --git a/app/dashboard/src/components/table/handle-sort.ts b/app/dashboard/src/components/table/handle-sort.ts
deleted file mode 100644
index b985dad..0000000
--- a/app/dashboard/src/components/table/handle-sort.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-
-import { FilterType } from 'types';
-
-export const handleSort = (
- filters: FilterType,
- column: string,
- onFilterChange: (filters: Partial<FilterType>) => void
-) => {
- let newSort = filters.sort;
- if (newSort.includes(column)) {
- if (newSort.startsWith('-')) {
- newSort = '-created_at';
- } else {
- newSort = '-' + column;
- }
- } else {
- newSort = column;
- }
- onFilterChange({
- sort: newSort,
- });
-};
diff --git a/app/dashboard/src/components/table/icons.ts b/app/dashboard/src/components/table/icons.ts
deleted file mode 100644
index bab7d0d..0000000
--- a/app/dashboard/src/components/table/icons.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-
-import { chakra } from '@chakra-ui/react';
-import {
- CheckIcon,
- ChevronDownIcon,
- ClipboardIcon,
- LinkIcon,
- PencilIcon,
- QrCodeIcon,
-} from '@heroicons/react/24/outline';
-
-
-export const iconProps = {
- baseStyle: {
- w: {
- base: 4,
- md: 5,
- },
- h: {
- base: 4,
- md: 5,
- },
- },
-};
-
-export const CopyIcon = chakra(ClipboardIcon, iconProps);
-export const AccordionArrowIcon = chakra(ChevronDownIcon, iconProps);
-export const CopiedIcon = chakra(CheckIcon, iconProps);
-export const SubscriptionLinkIcon = chakra(LinkIcon, iconProps);
-export const QRIcon = chakra(QrCodeIcon, iconProps);
-export const EditIcon = chakra(PencilIcon, iconProps);
-export const SortIcon = chakra(ChevronDownIcon, {
- baseStyle: {
- width: '15px',
- height: '15px'
- },
-});
diff --git a/app/dashboard/src/components/table/index.tsx b/app/dashboard/src/components/table/index.tsx
deleted file mode 100644
index 4575876..0000000
--- a/app/dashboard/src/components/table/index.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-export * from './icons';
-export * from './handle-sort';
-export * from './sort';
-export * from './pagination';
-export * from './status-sort-select';
-export * from './empty-section';
diff --git a/app/dashboard/src/components/table/pagination.tsx b/app/dashboard/src/components/table/pagination.tsx
deleted file mode 100644
index f00f14e..0000000
--- a/app/dashboard/src/components/table/pagination.tsx
+++ /dev/null
@@ -1,182 +0,0 @@
-import {
- Box,
- Button,
- ButtonGroup,
- chakra,
- HStack,
- Select,
- Text,
-} from '@chakra-ui/react';
-import {
- ArrowLongLeftIcon,
- ArrowLongRightIcon,
-} from '@heroicons/react/24/outline';
-import { ChangeEvent, FC } from 'react';
-import { useTranslation } from 'react-i18next';
-import { FilterType } from 'types';
-import { PageSizeManager } from 'utils/userPreferenceStorage';
-
-const PrevIcon = chakra(ArrowLongLeftIcon, {
- baseStyle: {
- w: 4,
- h: 4,
- },
-});
-const NextIcon = chakra(ArrowLongRightIcon, {
- baseStyle: {
- w: 4,
- h: 4,
- },
-});
-
-export type PaginationType = {
- count: number;
- perPage: number;
- page: number;
- onChange?: (page: number) => void;
-};
-
-const MINIMAL_PAGE_ITEM_COUNT = 5;
-
-/**
- * Generate numeric page items around current page.
- * - Always include first and last page
- * - Add ellipsis if needed
- */
-interface PageItem {
- value: string | number;
- isPlaceholder?: boolean;
-}
-
-function validateWidth(width: number): void {
- if (width < MINIMAL_PAGE_ITEM_COUNT || width % 2 === 0) {
- throw new Error(`Must allow at least ${MINIMAL_PAGE_ITEM_COUNT} odd page items`);
- }
-}
-
-function generatePageItems(total: number, current: number, width: number): PageItem[] {
- validateWidth(width);
-
- if (total < width) {
- return Array.from({ length: total }, (_, index) => ({ value: index }));
- }
-
- const left = Math.max(0, Math.min(total - width, current - Math.floor(width / 2)));
- const right = Math.min(left + width, total);
-
- const items: PageItem[] = [];
-
- if (left > 0) {
- items.push({ value: 0 }, { value: 'prev-more', isPlaceholder: true });
- }
-
- for (let i = left; i < right; i++) {
- items.push({ value: i });
- }
-
- if (right < total) {
- items.push({ value: 'next-more', isPlaceholder: true }, { value: total - 1 });
- }
-
- return items;
-}
-
-type PaginationProps = {
- total: number;
- onFilterChange: (filters: Partial<FilterType>) => void;
- filters: FilterType;
- pageSizeManager: PageSizeManager;
- pageListsNumbers?: number[];
-}
-
-export const Pagination: FC<PaginationProps> = ({
- filters,
- total,
- onFilterChange,
- pageSizeManager,
- pageListsNumbers = [10, 20, 30],
-}) => {
- const { limit: perPage, offset } = filters;
-
- const page = (offset || 0) / (perPage || 1);
- const noPages = Math.ceil(total / (perPage || 1));
- const pages = generatePageItems(noPages, page, 7);
-
- const changePage = (page: number) => {
- onFilterChange({
- ...filters,
- offset: page * (perPage as number),
- });
- };
-
- const handlePageSizeChange = (e: ChangeEvent<HTMLSelectElement>) => {
- onFilterChange({
- ...filters,
- limit: parseInt(e.target.value),
- });
- pageSizeManager.setPageSize(e.target.value);
- };
-
- const { t } = useTranslation();
-
- return (
- <HStack
- justifyContent="space-between"
- mt={4}
- w="full"
- display="flex"
- columnGap={{ lg: 4, md: 0 }}
- rowGap={{ md: 0, base: 4 }}
- flexDirection={{ md: 'row', base: 'column' }}
- >
- <Box order={{ base: 2, md: 1 }}>
- <HStack>
- <Select
- minW="60px"
- value={perPage}
- onChange={handlePageSizeChange}
- size="sm"
- rounded="md"
- >
- {pageListsNumbers.map((list, i) => {
- return (<option key={i}>{list}</option>)
- })}
- </Select>
- <Text whiteSpace={'nowrap'} fontSize="sm">
- {t('itemsPerPage')}
- </Text>
- </HStack>
- </Box>
-
- <ButtonGroup size="sm" isAttached variant="outline" order={{ base: 1, md: 2 }}>
- <Button
- leftIcon={<PrevIcon />}
- onClick={changePage.bind(null, page - 1)}
- isDisabled={page === 0 || noPages === 0}
- >
- {t('previous')}
- </Button>
- {pages.map((pageItem) => (
- <Button
- key={String(pageItem.value)}
- variant={String(pageItem.value) === String(page) ? 'solid' : 'outline'}
- onClick={() =>
- typeof pageItem.value === 'number' && changePage(pageItem.value)
- }
- >
- {String(pageItem.value) === 'prev-more' || String(pageItem.value) === 'next-more'
- ? '...'
- : (pageItem.value as number) + 1}
- </Button>
- ))}
- <Button
- rightIcon={<NextIcon />}
- onClick={changePage.bind(null, page + 1)}
- isDisabled={page + 1 === noPages || noPages === 0}
- >
- {t('next')}
- </Button>
- </ButtonGroup>
- </HStack>
- );
-};
diff --git a/app/dashboard/src/components/table/sort.tsx b/app/dashboard/src/components/table/sort.tsx
deleted file mode 100644
index f570880..0000000
--- a/app/dashboard/src/components/table/sort.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { SortIcon } from './icons';
-import { FC } from 'react';
-
-type SortType = {
- sort: string;
- column: string;
-};
-
-export const Sort: FC<SortType> = ({ sort, column }) => {
- if (sort.includes(column))
- return (
- <SortIcon
- transform={sort.startsWith('-') ? undefined : 'rotate(180deg)'} />
- );
- return null;
-};
diff --git a/app/dashboard/src/components/table/status-sort-select.tsx b/app/dashboard/src/components/table/status-sort-select.tsx
deleted file mode 100644
index 869fc05..0000000
--- a/app/dashboard/src/components/table/status-sort-select.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-
-import { Select } from '@chakra-ui/react'
-import { FilterType } from 'types';
-import React from 'react'
-
-interface StatusSortSelectProps {
- filters: FilterType;
- handleStatusFilter: (e: any) => void;
- options: string[];
-}
-
-export const StatusSortSelect: React.FC<StatusSortSelectProps> = ({ filters, handleStatusFilter, options }) => {
- return (
- <div>
- <Select
- value={filters.sort}
- fontSize="xs"
- fontWeight="extrabold"
- textTransform="uppercase"
- cursor="pointer"
- p={0}
- border={0}
- h="auto"
- w="auto"
- icon={<></>}
- _focusVisible={{
- border: '0 !important',
- }}
- onChange={handleStatusFilter}
- >
- <option></option>
- {options.map((option, i) => <option key={i}>{option}</option>)}
- </Select>
- </div>
- )
-}
diff --git a/app/dashboard/src/components/textarea/index.tsx b/app/dashboard/src/components/textarea/index.tsx
deleted file mode 100644
index 04dfebf..0000000
--- a/app/dashboard/src/components/textarea/index.tsx
+++ /dev/null
@@ -1,142 +0,0 @@
-import {
- chakra,
- FormControl,
- FormErrorMessage,
- FormLabel,
- InputGroup,
- InputLeftAddon,
- InputRightAddon,
- InputRightElement,
- Textarea as ChakraTextarea,
- TextareaProps as ChakraTextareaProps,
-} from '@chakra-ui/react';
-import { XMarkIcon } from '@heroicons/react/24/outline';
-import classNames from 'classnames';
-import React, { PropsWithChildren, ReactNode } from 'react';
-
-const ClearIcon = chakra(XMarkIcon, {
- baseStyle: {
- w: 4,
- h: 4,
- },
-});
-
-export type TextareaProps = PropsWithChildren<
- {
- value?: string;
- className?: string;
- endAdornment?: ReactNode;
- startAdornment?: ReactNode;
- type?: string;
- placeholder?: string;
- onChange?: (e: any) => void;
- onBlur?: (e: any) => void;
- onClick?: (e: any) => void;
- name?: string;
- error?: string;
- disabled?: boolean;
- step?: number;
- label?: string;
- clearable?: boolean;
- } & ChakraTextareaProps
->;
-
-export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
- (
- {
- disabled,
- step,
- label,
- className,
- startAdornment,
- endAdornment,
- placeholder,
- onChange,
- onBlur,
- name,
- value,
- onClick,
- error,
- clearable = false,
- ...props
- },
- ref
- ) => {
- const clear = () => {
- if (onChange)
- onChange({
- target: {
- value: '',
- name,
- },
- });
- };
- const { size = 'md' } = props;
-
- return (
- <FormControl isInvalid={!!error}>
- {label && <FormLabel>{label}</FormLabel>}
- <InputGroup
- size={size}
- w="full"
- rounded="md"
- _focusWithin={{
- outline: '2px solid',
- outlineColor: 'primary.200',
- }}
- bg={disabled ? 'gray.100' : 'transparent'}
- _dark={{ bg: disabled ? 'gray.600' : 'transparent' }}
- >
- {startAdornment && <InputLeftAddon>{startAdornment}</InputLeftAddon>}
- {/* @ts-ignore */}
- <ChakraTextarea
- name={name}
- ref={ref}
- step={step}
- className={classNames(className)}
- placeholder={placeholder}
- onChange={onChange}
- onBlur={onBlur}
- value={value}
- onClick={onClick}
- disabled={disabled}
- flexGrow={1}
- _focusVisible={{
- outline: 'none',
- borderTopColor: 'transparent',
- borderRightColor: 'transparent',
- borderBottomColor: 'transparent',
- }}
- _disabled={{
- cursor: 'not-allowed',
- }}
- {...props}
- roundedLeft={startAdornment ? '0' : 'md'}
- roundedRight={endAdornment ? '0' : 'md'}
- />
- {endAdornment && (
- <InputRightAddon
- borderLeftRadius={0}
- borderRightRadius="6px"
- bg="transparent"
- >
- {endAdornment}
- </InputRightAddon>
- )}
- {clearable && value && value.length && (
- <InputRightElement
- borderLeftRadius={0}
- borderRightRadius="6px"
- bg="transparent"
- onClick={clear}
- cursor="pointer"
- >
- <ClearIcon />
- </InputRightElement>
- )}
- </InputGroup>
- {!!error && <FormErrorMessage>{error}</FormErrorMessage>}
- </FormControl>
- );
- }
-);
diff --git a/app/dashboard/src/components/theme-toggler/index.tsx b/app/dashboard/src/components/theme-toggler/index.tsx
deleted file mode 100644
index f00e1b6..0000000
--- a/app/dashboard/src/components/theme-toggler/index.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-
-import { IconButton, chakra, useColorMode } from '@chakra-ui/react';
-import { MoonIcon, SunIcon } from '@heroicons/react/24/outline';
-import { updateThemeColor } from 'utils/themeColor';
-
-const iconProps = {
- baseStyle: {
- w: 4,
- h: 4,
- },
-};
-
-const DarkThemeIcon = chakra(MoonIcon, iconProps);
-const LightThemeIcon = chakra(SunIcon, iconProps);
-
-export const ThemeToggle = () => {
- const { colorMode, toggleColorMode } = useColorMode();
- return (
- <IconButton
- size="sm"
- variant="solid"
- colorScheme="gray"
- aria-label="switch theme"
- onClick={() => {
- updateThemeColor(colorMode == 'dark' ? 'light' : 'dark');
- toggleColorMode();
- }}
- >
- {colorMode === 'light' ? <DarkThemeIcon /> : <LightThemeIcon />}
- </IconButton>
- );
-};
diff --git a/app/dashboard/src/components/usage-filter/index.tsx b/app/dashboard/src/components/usage-filter/index.tsx
deleted file mode 100644
index 36576fd..0000000
--- a/app/dashboard/src/components/usage-filter/index.tsx
+++ /dev/null
@@ -1,379 +0,0 @@
-import {
- Box,
- ColorMode,
- HStack,
- Icon,
- SimpleGrid,
- Tab,
- TabList,
- TabPanel,
- TabPanels,
- Tabs,
- Text,
- UseRadioProps,
- VStack,
- useBreakpointValue,
- useDisclosure,
- useOutsideClick,
- useRadio,
- useRadioGroup,
-} from '@chakra-ui/react';
-import { CalendarIcon, ChevronRightIcon } from '@heroicons/react/24/outline';
-import { ApexOptions } from 'apexcharts';
-import { FilterUsageType } from 'types/filter';
-import dayjs, { ManipulateType } from 'dayjs';
-import { FC, useRef, useState } from 'react';
-import ReactDatePicker from 'react-datepicker';
-import { useTranslation } from 'react-i18next';
-import { generateDistinctColors } from 'utils/color';
-import { formatBytes } from 'utils/formatByte';
-
-type DateType = Date | null;
-
-const FilterItem: FC<UseRadioProps & { border?: boolean } & any> = ({
- border,
- ...props
-}) => {
- const { getInputProps, getRadioProps } = useRadio(props);
- const fontSize = useBreakpointValue({ base: 'xs', md: 'sm' });
- return (
- <Box as="label">
- <input {...getInputProps()} />
- <Box
- {...getRadioProps()}
- minW="48px"
- w="full"
- h="full"
- textAlign="center"
- cursor="pointer"
- fontSize={fontSize}
- borderWidth={border ? '1px' : '0px'}
- borderRadius="md"
- _checked={{
- bg: 'primary.500',
- color: 'white',
- borderColor: 'primary.500',
- }}
- _focus={{
- boxShadow: 'outline',
- }}
- px={3}
- py={1}
- >
- {props.children}
- </Box>
- </Box>
- );
-};
-
-export type UsageFilterProps = {
- onChange: (filter: string, query: FilterUsageType) => void;
- defaultValue: string;
-};
-
-export const UsageFilter: FC<UsageFilterProps> = ({
- onChange,
- defaultValue,
- ...props
-}) => {
- const { t, i18n } = useTranslation();
-
- const filterOptions = useBreakpointValue({
- base: ['7h', '1d', '3d', '1w'],
- md: ['7h', '1d', '3d', '1w', '1m', '3m'],
- })!;
- const filterOptionTypes = {
- h: 'hour',
- d: 'day',
- w: 'week',
- m: 'month',
- y: 'year',
- };
- const customFilterOptions = useBreakpointValue({
- base: [
- { title: 'hours', options: ['1h', '3h', '6h', '12h'] },
- { title: 'days', options: ['1d', '2d', '3d', '4d'] },
- { title: 'weeks', options: ['1w', '2w', '3w', '4w'] },
- { title: 'months', options: ['1m', '2m', '3m', '6m'] },
- ],
- md: [
- { title: 'hours', options: ['1h', '2h', '3h', '6h', '8h', '12h'] },
- { title: 'days', options: ['1d', '2d', '3d', '4d', '5d', '6d'] },
- { title: 'weeks', options: ['1w', '2w', '3w', '4w'] },
- { title: 'months', options: ['1m', '2m', '3m', '6m', '8m'] },
- ],
- })!;
- const {
- getRootProps,
- getRadioProps,
- } = useRadioGroup({
- name: 'filter',
- defaultValue: defaultValue,
- onChange: (value: string) => {
- if (value === 'custom') {
- return;
- }
-
- closeCustom();
-
- if (filterOptions.indexOf(value) >= 0) {
- setCustomLabel(t('userDialog.custom'));
- setCustom(false);
- } else {
- setCustomLabel(t('userDialog.custom') + ` (${value})`);
- setCustom(true);
- }
-
- const num = Number(value.substring(0, value.length - 1));
- const unit =
- filterOptionTypes[
- value[value.length - 1] as keyof typeof filterOptionTypes
- ];
- onChange(value, {
- start: dayjs()
- .utc()
- .subtract(num, unit as ManipulateType)
- .format('YYYY-MM-DDTHH:00:00'),
- });
- },
- });
-
- const {
- isOpen: isCustomOpen,
- onOpen: openCustom,
- onClose: closeCustom,
- } = useDisclosure();
- const customRef = useRef(null);
- useOutsideClick({ ref: customRef, handler: closeCustom });
-
- const [customLabel, setCustomLabel] = useState(t('userDialog.custom'));
- const [custom, setCustom] = useState(false);
- const [tabIndex, setTabIndex] = useState(0);
-
- const monthsShown = useBreakpointValue({ base: 1, md: 2 });
- const fontSize = useBreakpointValue({ base: 'xs', md: 'sm' });
- const [startDate, setStartDate] = useState(null as DateType);
- const [endDate, setEndDate] = useState(null as DateType);
- const onDateChange = (dates: [DateType, DateType]) => {
- const [start, end] = dates;
- if (endDate && !end) {
- setStartDate(null);
- setEndDate(null);
- } else {
- setStartDate(start);
- setEndDate(end);
- if (start && end) {
- closeCustom();
- onChange('custom', {
- start: dayjs(start).format('YYYY-MM-DDT00:00:00'),
- end: dayjs(end).format('YYYY-MM-DDT23:59:59'),
- });
- }
- }
- };
-
- return (
- <VStack {...props}>
- {tabIndex == 0 && (
- <SimpleGrid
- {...getRootProps()}
- gap={0}
- display="flex"
- borderWidth="1px"
- borderRadius="md"
- minW={{ base: '320px', md: '400px' }}
- >
- {filterOptions.map((value) => {
- return (
- <FilterItem key={value} {...getRadioProps({ value })}>
- {value}
- </FilterItem>
- );
- })}
- <Box
- onClick={() => {
- setStartDate(null);
- setEndDate(null);
- openCustom();
- }}
- cursor="pointer"
- borderRadius="md"
- w="full"
- fontSize={fontSize}
- px={3}
- py={1}
- bg={custom ? 'primary.500' : 'unset'}
- color={custom ? 'white' : 'unset'}
- borderColor={custom ? 'primary.500' : 'unset'}
- >
- <HStack>
- <Text>{customLabel}</Text>
- <Icon as={CalendarIcon} boxSize="18px" />
- </HStack>
- </Box>
- </SimpleGrid>
- )}
- {tabIndex == 1 && (
- <HStack
- onClick={openCustom}
- cursor="pointer"
- fontSize={fontSize}
- borderRadius="md"
- px={3}
- py={1}
- minW={{ base: '320px', md: '400px' }}
- borderWidth="1px"
- >
- <Text w="full" color={startDate ? 'unset' : 'gray.500'}>
- {startDate
- ? dayjs(startDate).format('YYYY-MM-DD (00:00)')
- : t('userDialog.startDate')}
- </Text>
- <Icon as={ChevronRightIcon} boxSize="18px" />
- <Text w="full" color={endDate ? 'unset' : 'gray.500'}>
- {endDate
- ? dayjs(endDate).format('YYYY-MM-DD (23:59)')
- : t('userDialog.endDate')}
- </Text>
- <Icon as={CalendarIcon} boxSize="18px" />
- </HStack>
- )}
- <VStack
- ref={customRef}
- marginTop="40px !important"
- borderRadius="md"
- borderWidth="1px"
- position="absolute"
- zIndex="1"
- backgroundColor="white"
- _dark={{
- backgroundColor: 'gray.700',
- }}
- display={isCustomOpen ? 'unset' : 'none'}
- >
- <Tabs onChange={(index) => setTabIndex(index)}>
- <TabList>
- <Tab fontSize={fontSize}>{t('userDialog.relative')}</Tab>
- <Tab fontSize={fontSize}>{t('userDialog.absolute')}</Tab>
- </TabList>
-
- <TabPanels>
- <TabPanel>
- {customFilterOptions.map((row) => {
- return (
- <VStack key={row.title} alignItems="start" pl={2} pr={2}>
- <HStack justifyItems="flex-start" mb={4}>
- <Text fontSize={fontSize} minW="60px">
- {t('userDialog.' + row.title)}
- </Text>
- {row.options.map((value: string) => {
- return (
- <FilterItem
- key={value + '.custom'}
- border={true}
- {...getRadioProps({ value })}
- >
- {value}
- </FilterItem>
- );
- })}
- </HStack>
- </VStack>
- );
- })}
- </TabPanel>
- <TabPanel className="datepicker-panel">
- <VStack>
- <ReactDatePicker
- locale={i18n.language.toLocaleLowerCase()}
- selected={startDate}
- onChange={onDateChange}
- startDate={startDate}
- endDate={endDate}
- selectsRange={true}
- maxDate={new Date()}
- monthsShown={monthsShown}
- peekNextMonth={false}
- inline
- />
- </VStack>
- </TabPanel>
- </TabPanels>
- </Tabs>
- </VStack>
- </VStack>
- );
-};
-
-export function createUsageConfig(
- colorMode: ColorMode,
- title: string,
- series: any = [],
- labels: any = []
-) {
- const total = formatBytes((series as [number]).reduce((t, c) => (t += c), 0));
- return {
- series: series,
- options: {
- labels: labels,
- chart: {
- width: '100%',
- height: '100%',
- type: 'donut',
- animations: {
- enabled: false,
- },
- },
- title: {
- text: `${title}${total}`,
- align: 'center',
- style: {
- fontWeight: 'var(--chakra-fontWeights-medium)',
- color:
- colorMode === 'dark' ? 'var(--chakra-colors-gray-300)' : undefined,
- },
- },
- legend: {
- position: 'bottom',
- labels: {
- colors: colorMode === 'dark' ? '#CBD5E0' : undefined,
- useSeriesColors: false,
- },
- },
- stroke: {
- width: 1,
- colors: undefined,
- },
- dataLabels: {
- formatter: (_, { seriesIndex, w }) => {
- return formatBytes(w.config.series[seriesIndex], 1);
- },
- },
- tooltip: {
- custom: ({ series, seriesIndex, w }) => {
- const readable = formatBytes(series[seriesIndex], 1);
- const total = Math.max(
- (series as [number]).reduce((t, c) => (t += c)),
- 1
- );
- const percent =
- Math.round((series[seriesIndex] / total) * 1000) / 10 + '%';
- return `
- <div style="
- background-color: ${w.globals.colors[seriesIndex]};
- padding-left:12px;
- padding-right:12px;
- padding-top:6px;
- padding-bottom:6px;
- font-size:0.725rem;
- "
- >
- ${w.config.labels[seriesIndex]}: <b>${percent}, ${readable}</b>
- </div>
- `;
- },
- },
- colors: generateDistinctColors(series.length),
- } as ApexOptions,
- };
-}
diff --git a/app/dashboard/src/constants/IconBaseStyle.ts b/app/dashboard/src/constants/IconBaseStyle.ts
deleted file mode 100644
index 32ba980..0000000
--- a/app/dashboard/src/constants/IconBaseStyle.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-
-export const IconBaseStyle = {
- baseStyle: {
- strokeWidth: '2px',
- color: 'primary.500',
- w: 5,
- h: 5,
- mx: '6px',
- },
-}
diff --git a/app/dashboard/src/constants/NodesSettings.tsx b/app/dashboard/src/constants/NodesSettings.tsx
deleted file mode 100644
index f8ffcbf..0000000
--- a/app/dashboard/src/constants/NodesSettings.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-export const statusColors: {
- [key: string]: {
- statusColor: string;
- };
-} = {
- connected: {
- statusColor: 'green',
- },
- disabled: {
- statusColor: 'gray',
- },
- connecting: {
- statusColor: 'orange',
- },
- error: {
- statusColor: 'red',
- },
-};
diff --git a/app/dashboard/src/constants/Project.ts b/app/dashboard/src/constants/Project.ts
deleted file mode 100644
index 8532b7d..0000000
--- a/app/dashboard/src/constants/Project.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export const REPO_URL = 'https://github.com/khodedawsh/Marzneshin';
-export const ORGANIZATION_URL = 'https://github.com/khodedawosh';
-export const CO_CONTRIBUTOR = 'https://mardin.cc/';
-export const DONATION_URL = 'https://github.com/khodedawosh/Marzneshin#donation';
diff --git a/app/dashboard/src/constants/Proxies.tsx b/app/dashboard/src/constants/Proxies.tsx
deleted file mode 100644
index ba5cbb1..0000000
--- a/app/dashboard/src/constants/Proxies.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import { ProxyHostSecurity } from 'types';
-
-export const proxyHostSecurity: { title: string; value: ProxyHostSecurity }[] =
- [
- {
- title: 'Inbound\'s default',
- value: 'inbound_default',
- },
- {
- title: 'TLS',
- value: 'tls',
- },
- {
- title: 'None',
- value: 'none',
- },
- ];
-
-export const proxyALPN: { title: string; value: string }[] = [
- {
- title: '',
- value: '',
- },
- {
- title: 'h2',
- value: 'h2',
- },
- {
- title: 'http/1.1',
- value: 'http/1.1',
- },
- {
- title: 'h2, http/1.1',
- value: 'h2,http/1.1',
- },
-];
-
-export const proxyFingerprint: { title: string; value: string }[] = [
- {
- title: '',
- value: '',
- },
- ...[
- 'chrome',
- 'firefox',
- 'safari',
- 'ios',
- 'android',
- 'edge',
- '360',
- 'qq',
- 'random',
- 'randomized',
- ].map((key) => ({ title: key, value: key })),
-];
-
-export const XTLSFlows = [
- { title: 'none', value: '' },
- { title: 'xtls-rprx-vision', value: 'xtls-rprx-vision' },
-];
-
-export const shadowsocksMethods = [
- 'aes-128-gcm',
- 'aes-256-gcm',
- 'chacha20-ietf-poly1305',
-];
diff --git a/app/dashboard/src/constants/Settings.tsx b/app/dashboard/src/constants/Settings.tsx
deleted file mode 100644
index f8c92a3..0000000
--- a/app/dashboard/src/constants/Settings.tsx
+++ /dev/null
@@ -1,105 +0,0 @@
-import { chakra, ChakraComponent } from '@chakra-ui/react';
-import {
- ClockIcon,
- ExclamationCircleIcon,
- NoSymbolIcon,
- WifiIcon,
-} from '@heroicons/react/24/outline';
-import { ForwardRefExoticComponent, SVGProps } from 'react';
-import { DataLimitResetStrategy } from 'types';
-
-const iconProps = {
- baseStyle: {
- strokeWidth: '2px',
- w: 4,
- h: 4,
- },
-};
-const ActiveStatusIcon = chakra(WifiIcon, iconProps);
-const DisabledStatusIcon = chakra(NoSymbolIcon, iconProps);
-const LimitedStatusIcon = chakra(ExclamationCircleIcon, iconProps);
-const ExpiredStatusIcon = chakra(ClockIcon, iconProps);
-const On_holdStatusIcon = chakra(ClockIcon, iconProps);
-
-export const resetStrategy: { title: string; value: DataLimitResetStrategy }[] =
- [
- {
- title: 'No',
- value: 'no_reset',
- },
- {
- title: 'Daily',
- value: 'day',
- },
- {
- title: 'Weekly',
- value: 'week',
- },
- {
- title: 'Monthly',
- value: 'month',
- },
- {
- title: 'Annually',
- value: 'year',
- },
- ];
-
-export const statusColors: {
- [key: string]: {
- statusColor: string;
- bandWidthColor: string;
- icon: ChakraComponent<ForwardRefExoticComponent<SVGProps<SVGSVGElement>>>;
- };
-} = {
- active: {
- statusColor: 'green',
- bandWidthColor: 'primary',
- icon: ActiveStatusIcon,
- },
- connected: {
- statusColor: 'green',
- bandWidthColor: 'primary',
- icon: ActiveStatusIcon,
- },
- healthy: {
- statusColor: 'green',
- bandWidthColor: 'primary',
- icon: ActiveStatusIcon,
- },
- disabled: {
- statusColor: 'gray',
- bandWidthColor: 'gray',
- icon: DisabledStatusIcon,
- },
- expired: {
- statusColor: 'orange',
- bandWidthColor: 'orange',
- icon: ExpiredStatusIcon,
- },
- on_hold: {
- statusColor: 'purple',
- bandWidthColor: 'purple',
- icon: On_holdStatusIcon,
- },
- connecting: {
- statusColor: 'orange',
- bandWidthColor: 'orange',
- icon: ExpiredStatusIcon,
- },
- unhealthy: {
- statusColor: 'red',
- bandWidthColor: 'red',
- icon: LimitedStatusIcon,
- },
- limited: {
- statusColor: 'red',
- bandWidthColor: 'red',
- icon: LimitedStatusIcon,
- },
- error: {
- statusColor: 'red',
- bandWidthColor: 'red',
- icon: LimitedStatusIcon,
- },
-};
diff --git a/app/dashboard/src/constants/query-ids.ts b/app/dashboard/src/constants/query-ids.ts
deleted file mode 100644
index 9ded4b9..0000000
--- a/app/dashboard/src/constants/query-ids.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-
-export const queryIds = {
- hosts: 'hosts',
- inbounds: 'inbounds',
- users: 'users',
- nodes: 'nodes',
- services: 'services',
-};
diff --git a/app/dashboard/src/index.scss b/app/dashboard/src/index.scss
deleted file mode 100644
index 782a579..0000000
--- a/app/dashboard/src/index.scss
+++ /dev/null
@@ -1,292 +0,0 @@
-@import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap");
-
-body {
- overflow: hidden;
-}
-
-.bg-blue-animate {
- animation: blur-animate 200ms ease-in;
- backdrop-filter: blur(10px);
-}
-
-@keyframes blur-animate {
- from {
- backdrop-filter: blur(1px);
- }
-
- to {
- backdrop-filter: blur(10px);
- }
-}
-
-.animate-spin {
- animation: spin 1s linear infinite;
-}
-
-@keyframes spin {
- from {
- transform: rotate(0deg);
- }
-
- to {
- transform: rotate(360deg);
- }
-}
-
-table thead {
- th:first-of-type {
- border-top-left-radius: 8px;
- }
-
- th:last-of-type {
- border-top-right-radius: 8px;
- }
-}
-
-.last-row {
- td:first-of-type {
- border-bottom-left-radius: 8px;
- }
-
- td:last-of-type {
- border-bottom-right-radius: 8px;
- }
-}
-
-.slick-prev {
- left: -40px;
-}
-
-.slick-next {
- right: -40px;
-}
-
-.slick-prev,
-.slick-next {
- z-index: 100;
-}
-
-.chakra-popover__popper {
- z-index: 9999 !important;
-}
-
-.inbound-item .chakra-checkbox__label {
- max-width: 100%;
- width: 100%;
-}
-
-// data picker
-.react-datepicker__navigation.react-datepicker__navigation--previous,
-.react-datepicker__navigation.react-datepicker__navigation--next {
- padding-top: 6px;
-}
-
-.react-datepicker {
- background-color: var(--chakra-colors-white) !important;
- border: 1px solid var(--chakra-colors-gray-200);
- border-radius: var(--chakra-radii-md) !important;
- position: relative;
-}
-
-.chakra-ui-dark .react-datepicker {
- background-color: var(--chakra-colors-gray-700) !important;
- border: 1px solid var(--chakra-colors-gray-600);
- border-radius: var(--chakra-radii-md) !important;
- position: relative;
-}
-
-.react-datepicker__header {
- text-align: center;
- background-color: unset;
- position: relative;
- border-bottom: 1px solid var(--chakra-colors-gray-200);
-}
-
-.chakra-ui-dark .react-datepicker__header {
- border-bottom: 1px solid var(--chakra-colors-gray-600);
-}
-
-.react-datepicker-popper[data-placement^=bottom] .react-datepicker__triangle::after {
- border-top: none;
- border-bottom-color: var(--chakra-colors-white);
-}
-
-.react-datepicker-popper[data-placement^=bottom] .react-datepicker__triangle::before {
- top: -1px;
- border-bottom-color: var(--chakra-colors-gray-200);
-}
-
-.chakra-ui-dark .react-datepicker-popper[data-placement^=bottom] .react-datepicker__triangle::after {
- border-top: none;
- border-bottom-color: var(--chakra-colors-gray-700);
-}
-
-.chakra-ui-dark .react-datepicker-popper[data-placement^=bottom] .react-datepicker__triangle::before {
- top: -1px;
- border-bottom-color: var(--chakra-colors-gray-600);
-}
-
-.react-datepicker__current-month,
-.react-datepicker__day-name,
-.react-datepicker__day {
- color: var(--chakra-colors-chakra-body-text) !important;
-}
-
-.chakra-ui-dark .react-datepicker__current-month,
-.chakra-ui-dark .react-datepicker__day-name,
-.chakra-ui-dark .react-datepicker__day {
- color: var(--chakra-colors-gray-300) !important;
-}
-
-.react-datepicker__day:hover {
- border-radius: 0.3rem;
- background-color: var(--chakra-colors-primary-300) !important;
- color: var(--chakra-colors-white) !important;
-}
-
-.chakra-ui-dark .react-datepicker__day:hover {
- border-radius: 0.3rem;
- background-color: var(--chakra-colors-primary-500) !important;
- color: var(--chakra-colors-gray-800) !important;
-}
-
-.react-datepicker__day--disabled {
- color: var(--chakra-colors-gray-400) !important;
-}
-
-.react-datepicker__day--disabled:hover {
- background-color: transparent !important;
- color: var(--chakra-colors-gray-400) !important;
-}
-
-.chakra-ui-dark .react-datepicker__day--disabled {
- color: var(--chakra-colors-gray-500) !important;
-}
-
-.chakra-ui-dark .react-datepicker__day--disabled:hover {
- background-color: transparent !important;
- color: var(--chakra-colors-gray-500) !important;
-}
-
-.react-datepicker__day--keyboard-selected,
-.react-datepicker__day--selected,
-.react-datepicker__day--in-selecting-range,
-.react-datepicker__day--in-range {
- border-radius: 0.3rem;
- background-color: var(--chakra-colors-primary-500) !important;
- color: var(--chakra-colors-white) !important;
-}
-
-.chakra-ui-dark .react-datepicker__day--keyboard-selected,
-.chakra-ui-dark .react-datepicker__day--selected,
-.chakra-ui-dark .react-datepicker__day--in-selecting-range,
-.chakra-ui-dark .react-datepicker__day--in-range {
- border-radius: 0.3rem;
- background-color: var(--chakra-colors-primary-200) !important;
- color: var(--chakra-colors-gray-800) !important;
-}
-
-.react-datepicker__day--in-selecting-range:not(.react-datepicker__day--in-range) {
- border-radius: 0.3rem;
- background-color: var(--chakra-colors-primary-400) !important;
-}
-
-.chakra-ui-dark .react-datepicker__day--in-selecting-range:not(.react-datepicker__day--in-range) {
- border-radius: 0.3rem;
- background-color: var(--chakra-colors-primary-400) !important;
-}
-
-.react-datepicker__day--outside-month {
- visibility: hidden;
-}
-
-.datepicker-panel .react-datepicker {
- background-color: unset;
- border: unset;
- border-radius: unset;
- display: inline-block;
- position: relative;
-}
-
-.green {
- background: #66ff99;
-}
-
-.red {
- background: #e53e3e;
-}
-
-.orange {
- background: #fbd38d;
-}
-
-.circle {
- min-width: 10px;
- min-height: 10px;
- border-radius: 50%;
-
- box-shadow: 0px 0px 1px 1px #0000001a;
-}
-
-.pulse {
- animation: pulse-animation 3s infinite;
-}
-
-.pulse.green {
- animation: green-pulse-animation 3s infinite;
-}
-
-.pulse.red {
- animation: red-pulse-animation 3s infinite;
-}
-
-.pulse.orange {
- animation: orange-pulse-animation 3s infinite;
-}
-
-@keyframes pulse-animation {
- 0% {
- box-shadow: 0 0 0 0px rgba(0, 0, 0, 0.4);
- }
-
- 100% {
- box-shadow: 0 0 0 10px rgba(0, 0, 0, 0);
- }
-}
-
-@keyframes green-pulse-animation {
- 0% {
- box-shadow: 0 0 0 0px #66ff9975;
- }
-
- 100% {
- box-shadow: 0 0 0 10px #66ff9900;
- }
-}
-
-@keyframes red-pulse-animation {
- 0% {
- box-shadow: 0 0 0 0px #e53e3e8c;
- }
-
- 100% {
- box-shadow: 0 0 0 10px #e53e3e00;
- }
-}
-
-@keyframes orange-pulse-animation {
- 0% {
- box-shadow: 0 0 0 0px #fbd38d85;
- }
-
- 100% {
- box-shadow: 0 0 0 10px #fbd38d00;
- }
-}
-
-.flex-status {
- display: flex;
- align-items: center;
- justify-content: start;
- gap: .7rem;
-}
diff --git a/app/dashboard/src/index.tsx b/app/dashboard/src/index.tsx
deleted file mode 100644
index 2dd49f0..0000000
--- a/app/dashboard/src/index.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { ChakraProvider, localStorageManager } from '@chakra-ui/react';
-import dayjs from 'dayjs';
-import Duration from 'dayjs/plugin/duration';
-import LocalizedFormat from 'dayjs/plugin/localizedFormat';
-import RelativeTime from 'dayjs/plugin/relativeTime';
-import Timezone from 'dayjs/plugin/timezone';
-import utc from 'dayjs/plugin/utc';
-import 'locales/i18n';
-import React from 'react';
-import ReactDOM from 'react-dom/client';
-import { QueryClientProvider } from '@tanstack/react-query';
-import { queryClient } from 'service/react-query';
-import { updateThemeColor } from 'utils/themeColor';
-import { theme } from '../chakra.config';
-import App from './App';
-import 'index.scss';
-import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
-
-dayjs.extend(Timezone);
-dayjs.extend(LocalizedFormat);
-dayjs.extend(utc);
-dayjs.extend(RelativeTime);
-dayjs.extend(Duration);
-
-updateThemeColor(localStorageManager.get() || 'light');
-
-ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
- <React.StrictMode>
- <ChakraProvider theme={theme}>
- <QueryClientProvider client={queryClient}>
- <App />
- <ReactQueryDevtools initialIsOpen={false} />
- </QueryClientProvider>
- </ChakraProvider>
- </React.StrictMode>
-);
diff --git a/app/dashboard/src/layouts/console-layout.tsx b/app/dashboard/src/layouts/console-layout.tsx
deleted file mode 100644
index b932b3c..0000000
--- a/app/dashboard/src/layouts/console-layout.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { Box } from '@chakra-ui/react';
-import { PanelGroup, Panel, PanelResizeHandle, ImperativePanelHandle } from 'react-resizable-panels';
-import { Footer } from 'components/footer';
-import { Header } from 'components/header';
-import { Sidebar } from 'components/sidebar';
-import { Suspense, useRef } from 'react';
-import { Outlet } from 'react-router-dom';
-import { useDashboard } from 'stores';
-
-export const ConsoleLayout = () => {
- const ref = useRef<ImperativePanelHandle>(null);
- const { collapseSidebar, expandSidebar } = useDashboard();
-
- return (
- <PanelGroup autoSaveId="sidebar-ratio" direction="horizontal">
- <Panel collapsible onExpand={expandSidebar} onCollapse={collapseSidebar} collapsedSize={5} defaultSize={20} maxSize={20} minSize={10} ref={ref}>
- <Sidebar />
- </Panel>
- <PanelResizeHandle />
- <Panel minSize={30} >
- <Box overflowY="auto" h="100vh" >
- <Header />
- <Box p="6">
- <Suspense>
- <Outlet />
- </Suspense>
- </Box>
- </Box>
- </Panel>
- <Footer bottom={3} />
- </PanelGroup>
- );
-};
-
-export default ConsoleLayout;
diff --git a/app/dashboard/src/locales/i18n.ts b/app/dashboard/src/locales/i18n.ts
deleted file mode 100644
index a05afb8..0000000
--- a/app/dashboard/src/locales/i18n.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { joinPaths } from '@remix-run/router';
-
-import fa from 'date-fns/locale/fa-IR';
-import ru from 'date-fns/locale/ru';
-import zh from 'date-fns/locale/zh-CN';
-import dayjs from 'dayjs';
-import i18n from 'i18next';
-import LanguageDetector from 'i18next-browser-languagedetector';
-import HttpApi from 'i18next-http-backend';
-import { registerLocale } from 'react-datepicker';
-import { initReactI18next } from 'react-i18next';
-
-declare module 'i18next' {
- interface CustomTypeOptions {
- returnNull: false;
- }
-}
-
-i18n
- .use(LanguageDetector)
- .use(initReactI18next)
- .use(HttpApi)
- .init(
- {
- debug: import.meta.env.NODE_ENV === 'development',
- returnNull: false,
- fallbackLng: 'en',
- interpolation: {
- escapeValue: false,
- },
- react: {
- useSuspense: false,
- },
- load: 'languageOnly',
- detection: {
- caches: ['localStorage', 'sessionStorage', 'cookie'],
- },
- backend: {
- loadPath: joinPaths([import.meta.env.BASE_URL, 'locales/{{lng}}.json']),
- },
- },
- function() {
- dayjs.locale(i18n.language);
- }
- );
-
-i18n.on('languageChanged', (lng) => {
- dayjs.locale(lng);
-});
-
-// DataPicker
-registerLocale('zh-cn', zh);
-registerLocale('ru', ru);
-registerLocale('fa', fa);
-
-export default i18n;
diff --git a/app/dashboard/src/pages/home/index.tsx b/app/dashboard/src/pages/home/index.tsx
deleted file mode 100644
index d9cf7f9..0000000
--- a/app/dashboard/src/pages/home/index.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-
-import Page from 'components/page';
-import { FC } from 'react';
-import { Statistics } from './statistics';
-import { pages } from 'stores';
-
-export const Home: FC = () => {
- return (
- <Page page={pages.home}>
- <Statistics mt="4" />
- </Page>
- );
-};
-
-export default Home;
diff --git a/app/dashboard/src/pages/home/statistics.tsx b/app/dashboard/src/pages/home/statistics.tsx
deleted file mode 100644
index a6cac6b..0000000
--- a/app/dashboard/src/pages/home/statistics.tsx
+++ /dev/null
@@ -1,121 +0,0 @@
-import { BoxProps, chakra, HStack, Text } from '@chakra-ui/react';
-import {
- ChartBarIcon,
- ChartPieIcon,
- UsersIcon,
-} from '@heroicons/react/24/outline';
-import { useDashboard } from 'stores';
-import { FC } from 'react';
-import { useTranslation } from 'react-i18next';
-import { useQuery } from '@tanstack/react-query';
-import { fetch } from 'service/http';
-import { formatBytes, numberWithCommas } from 'utils/formatByte';
-import { useEffect } from 'react';
-import { StatisticsCardInLine, StatisticsQueryKey } from 'components/statistics-card';
-
-const TotalUsersIcon = chakra(UsersIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- position: 'relative',
- zIndex: '2',
- },
-});
-
-const NetworkIcon = chakra(ChartBarIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- position: 'relative',
- zIndex: '2',
- },
-});
-
-const MemoryIcon = chakra(ChartPieIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- position: 'relative',
- zIndex: '2',
- },
-});
-
-
-export const Statistics: FC<BoxProps> = (props) => {
- const { version: currentVersion } = useDashboard();
- const { data: systemData } = useQuery({
- queryKey: [StatisticsQueryKey],
- queryFn: () => fetch('/system'),
- refetchInterval: 5000,
- });
-
- useEffect(() => {
- if (systemData?.version !== currentVersion && systemData !== undefined)
- useDashboard.setState({ version: systemData.version })
- }, [systemData]);
-
- const { t } = useTranslation();
- return (
- <HStack
- justifyContent="space-between"
- gap={0}
- columnGap={{ lg: 4, md: 0 }}
- rowGap={{ lg: 0, base: 4 }}
- display="flex"
- flexDirection={{ lg: 'row', base: 'column' }}
- {...props}
- >
- <StatisticsCardInLine
- title={t('activeUsers')}
- content={
- systemData && (
- <HStack alignItems="flex-end">
- <Text>{numberWithCommas(systemData.users_active)}</Text>
- <Text
- fontWeight="normal"
- fontSize="lg"
- as="span"
- display="inline-block"
- pb="5px"
- >
- / {numberWithCommas(systemData.total_user)}
- </Text>
- </HStack>
- )
- }
- icon={<TotalUsersIcon />}
- />
- <StatisticsCardInLine
- title={t('dataUsage')}
- content={
- systemData &&
- formatBytes(
- systemData.incoming_bandwidth + systemData.outgoing_bandwidth
- )
- }
- icon={<NetworkIcon />}
- />
- <StatisticsCardInLine
- title={t('memoryUsage')}
- content={
- systemData && (
- <HStack alignItems="flex-end">
- <Text>{formatBytes(systemData.mem_used, 1, true)[0]}</Text>
- <Text
- fontWeight="normal"
- fontSize="lg"
- as="span"
- display="inline-block"
- pb="5px"
- >
- {formatBytes(systemData.mem_used, 1, true)[1]} /{' '}
- {formatBytes(systemData.mem_total, 1)}
- </Text>
- </HStack>
- )
- }
- icon={<MemoryIcon />}
- />
- </HStack>
- );
-};
diff --git a/app/dashboard/src/pages/hosts/container.tsx b/app/dashboard/src/pages/hosts/container.tsx
deleted file mode 100644
index aafaf0f..0000000
--- a/app/dashboard/src/pages/hosts/container.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import { InboundsHostsFilters } from './filters'
-import { InboundsSidebar } from './inbounds-sidebar'
-import { HostsTable } from './table'
-import { queryIds } from 'constants/query-ids';
-import { useQuery } from '@tanstack/react-query';
-import { fetchInbounds, fetchInboundHosts, useInbounds } from 'stores';
-import { Grid, GridItem, } from '@chakra-ui/react';
-import { useTranslation } from 'react-i18next';
-import { Callout } from 'components/callout';
-
-export const InboundsHostsManager = () => {
- const { selectedInbound } = useInbounds();
-
- const { data: inbounds } = useQuery({
- queryKey: [queryIds.inbounds],
- initialData: [],
- queryFn: () => {
- return fetchInbounds();
- }
- });
-
- const { data: hosts } = useQuery({
- queryKey: [queryIds.hosts, selectedInbound?.id],
- initialData: [],
- queryFn: () => {
- return fetchInboundHosts(selectedInbound?.id);
- }
- });
-
- const { t } = useTranslation('noInboundsCallout');
-
- return inbounds.length === 0 ?
- <Callout header={t('noInboundsCallout.header')} body={t('noInboundsCallout.body')} />
- : (
- <>
- <InboundsHostsFilters />
- <Grid
- templateColumns='repeat(4, 1fr)'
- gap="3"
- h="10rem"
- >
- <GridItem colSpan={1}>
- <InboundsSidebar inbounds={inbounds} />
- </GridItem>
- <GridItem colSpan={3}>
- <HostsTable hosts={hosts} />
- </GridItem>
- </Grid>
- </>
-
- )
-}
diff --git a/app/dashboard/src/pages/hosts/dialog/default-values.ts b/app/dashboard/src/pages/hosts/dialog/default-values.ts
deleted file mode 100644
index f6627cc..0000000
--- a/app/dashboard/src/pages/hosts/dialog/default-values.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { HostSchema } from 'stores';
-export const getDefaultValues = (): HostSchema => {
- return {
- host: '',
- sni: '',
- port: null,
- path: '',
- address: '',
- remark: '',
- security: 'inbound_default',
- alpn: '',
- fingerprint: '',
- }
-};
diff --git a/app/dashboard/src/pages/hosts/dialog/icons.tsx b/app/dashboard/src/pages/hosts/dialog/icons.tsx
deleted file mode 100644
index 2787c25..0000000
--- a/app/dashboard/src/pages/hosts/dialog/icons.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-
-import { chakra } from '@chakra-ui/react';
-import { InformationCircleIcon, LinkIcon } from '@heroicons/react/24/outline';
-
-export const ModalIcon = chakra(LinkIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
-
-export const InfoIcon = chakra(InformationCircleIcon, {
- baseStyle: {
- w: 4,
- h: 4,
- color: 'gray.400',
- cursor: 'pointer',
- },
-});
diff --git a/app/dashboard/src/pages/hosts/dialog/index.tsx b/app/dashboard/src/pages/hosts/dialog/index.tsx
deleted file mode 100644
index 4ff37ab..0000000
--- a/app/dashboard/src/pages/hosts/dialog/index.tsx
+++ /dev/null
@@ -1,475 +0,0 @@
-import {
- Button,
- Select as ChakraSelect,
- FormControl,
- FormLabel,
- HStack,
- IconButton,
- Modal,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- ModalOverlay,
- Tooltip,
- VStack,
- chakra,
- useToast,
- Spacer,
- Popover,
- PopoverTrigger,
- Portal,
- PopoverContent,
- PopoverArrow,
- PopoverCloseButton,
- Text,
- Badge,
- Alert,
- AlertIcon,
- InputRightElement,
- InputGroup,
-} from '@chakra-ui/react';
-import { zodResolver } from '@hookform/resolvers/zod';
-import { FC, useEffect, useState } from 'react';
-import { useInbounds, HostType, HostSchema, hostSchema } from 'stores';
-import { Trans, useTranslation } from 'react-i18next';
-import { getDefaultValues } from './default-values';
-import { useForm } from 'react-hook-form';
-import 'slick-carousel/slick/slick-theme.css';
-import 'slick-carousel/slick/slick.css';
-import { DialogModalHeader, AddIcon, DeleteIcon } from 'components/dialog';
-import { Input as CustomInput } from 'components/input';
-import { EditIcon } from 'components/table';
-import { InfoIcon } from './icons';
-import {
- proxyALPN,
- proxyFingerprint,
- proxyHostSecurity,
-} from 'constants/Proxies';
-import { RemarkFieldPopover } from './remark-field-popover';
-
-export const Select = chakra(ChakraSelect, {
- baseStyle: {
- bg: 'white',
- _dark: {
- bg: 'gray.700',
- },
- },
-});
-
-export const Input = chakra(CustomInput, {
- baseStyle: {
- bg: 'white',
- _dark: {
- bg: 'gray.700',
- },
- },
-});
-
-/* TODO: Impelement specific errors and input verifications
- * */
-export const HostsDialog: FC = () => {
- const {
- selectedHost, isEditingHost, isCreatingHost, selectedInbound,
- onEditingHost, editHost, createHost, onCreatingHost, onDeletingHost
- } = useInbounds();
- const [loading, setLoading] = useState(false);
- const [error, setError] = useState<string | null>('');
- const { t } = useTranslation();
- const toast = useToast();
-
- const defaultValueHost: HostSchema = (isEditingHost === true && selectedHost !== null) ? selectedHost : getDefaultValues();
-
- const form = useForm<HostSchema>({
- resolver: zodResolver(hostSchema),
- defaultValues: defaultValueHost,
- });
-
- const isOpen = isEditingHost || isCreatingHost;
- const onClose = () => {
- onCreatingHost(false);
- onEditingHost(false, null);
- };
-
- useEffect(() => {
- (isOpen) && form.reset(defaultValueHost);
- }, [isOpen]);
-
- const submit = async (values: HostSchema | HostType) => {
- setLoading(true);
- const methods = { edited: editHost, created: createHost };
- const method = isEditingHost ? 'edited' : 'created';
- const refId = (isEditingHost ? selectedHost?.id : null) ?? selectedInbound?.id;
- setError(null);
- await methods[method](refId, values)
- .then(() => {
- toast({
- title: t(
- isEditingHost ? 'hostsDialog.editHost' : 'hostsDialog.createHost',
- { hoshtName: values.host }
- ),
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- onClose();
- })
- .catch((err) => {
- if (err?.response?.status === 409 || err?.response?.status === 400)
- setError(err?.response?._data?.detail);
- if (err?.response?.status === 422) {
- Object.keys(err.response._data.detail).forEach((key) => {
- setError(err?.response._data.detail[key] as string);
- form.setError(
- key as 'address' | 'port' | 'host' | 'path' | 'remark' | 'sni' | 'security' | 'alpn' | 'fingerprint',
- {
- type: 'custom',
- message: err.response._data.detail[key],
- }
- );
- });
- }
- })
- .finally(() => {
- setLoading(false);
- });
- };
-
- return (
- <Modal isOpen={isOpen} onClose={onClose}>
- <ModalOverlay bg="blackAlpha.300" backdropFilter="blur(10px)" />
- <ModalContent mx="3" w="lg" >
- <DialogModalHeader HeaderIcon={isEditingHost ? EditIcon : AddIcon} title={isEditingHost ? t('hostsDialog.editHost') : t('hostsDialog.createHost')} />
- <ModalCloseButton mt={3} />
- <ModalBody pb={4} pt={3}>
- {loading && 'loading...'}
- <form onSubmit={form.handleSubmit((v) => submit(v))}>
- <VStack>
- <HStack w="100%" alignItems="flex-start">
- <FormControl
- position="relative"
- zIndex={10}
- >
- <InputGroup>
- <Input
- {...form.register('remark')}
- size="sm"
- borderRadius="4px"
- placeholder="Remark"
- />
- <InputRightElement>
- <RemarkFieldPopover />
- </InputRightElement>
- </InputGroup>
- </FormControl>
- </HStack>
- <FormControl>
- <InputGroup>
- <Input
- size="sm"
- borderRadius="4px"
- placeholder="Address (e.g. example.com)"
- {...form.register('address')}
- />
- <InputRightElement>
- <RemarkFieldPopover />
- </InputRightElement>
- </InputGroup>
- </FormControl>
- <FormControl>
- <FormLabel
- display="flex"
- pb={1}
- alignItems="center"
- justifyContent="space-between"
- gap={1}
- m="0"
- >
- <span>{t('hostsDialog.port')}</span>
- <Popover isLazy placement="right">
- <PopoverTrigger>
- <InfoIcon />
- </PopoverTrigger>
- <Portal>
- <PopoverContent p={2}>
- <PopoverArrow />
- <PopoverCloseButton />
- <Text fontSize="xs" pr={5}>
- {t('hostsDialog.port.info')}
- </Text>
- </PopoverContent>
- </Portal>
- </Popover>
- </FormLabel>
- <Input
- size="sm"
- borderRadius="4px"
- placeholder={String(selectedInbound?.port || '8080')}
- type="number"
- {...form.register('port')}
- />
- </FormControl>
- <FormControl>
- <FormLabel
- display="flex"
- pb={1}
- alignItems="center"
- gap={1}
- justifyContent="space-between"
- m="0"
- >
- <span>{t('hostsDialog.sni')}</span>
- <Popover isLazy placement="right">
- <PopoverTrigger>
- <InfoIcon />
- </PopoverTrigger>
- <Portal>
- <PopoverContent p={2}>
- <PopoverArrow />
- <PopoverCloseButton />
- <Text fontSize="xs" pr={5}>
- {t('hostsDialog.sni.info')}
- </Text>
- <Text fontSize="xs" mt="2">
- <Trans
- i18nKey="hostsDialog.host.wildcard"
- components={{
- badge: <Badge />,
- }}
- />
- </Text>
- <Text fontSize="xs">
- <Trans
- i18nKey="hostsDialog.host.multiHost"
- components={{
- badge: <Badge />,
- }}
- />
- </Text>
- </PopoverContent>
- </Portal>
- </Popover>
- </FormLabel>
- <Input
- size="sm"
- borderRadius="4px"
- placeholder="SNI (e.g. example.com)"
- {...form.register('sni')}
- />
- </FormControl>
- <FormControl>
- <FormLabel
- display="flex"
- pb={1}
- alignItems="center"
- gap={1}
- justifyContent="space-between"
- m="0"
- >
- <span>{t('hostsDialog.host')}</span>
-
- <Popover isLazy placement="right">
- <PopoverTrigger>
- <InfoIcon />
- </PopoverTrigger>
- <Portal>
- <PopoverContent p={2}>
- <PopoverArrow />
- <PopoverCloseButton />
- <Text fontSize="xs" pr={5}>
- {t('hostsDialog.host.info')}
- </Text>
- <Text fontSize="xs" mt="2">
- <Trans
- i18nKey="hostsDialog.host.wildcard"
- components={{
- badge: <Badge />,
- }}
- />
- </Text>
- <Text fontSize="xs">
- <Trans
- i18nKey="hostsDialog.host.multiHost"
- components={{
- badge: <Badge />,
- }}
- />
- </Text>
- </PopoverContent>
- </Portal>
- </Popover>
- </FormLabel>
- <Input
- size="sm"
- borderRadius="4px"
- placeholder="Host (e.g. example.com)"
- {...form.register('host')}
- />
- </FormControl>
- <FormControl>
- <FormLabel
- display="flex"
- pb={1}
- alignItems="center"
- gap={1}
- justifyContent="space-between"
- m="0"
- >
- <span>{t('hostsDialog.path')}</span>
- <Popover isLazy placement="right">
- <PopoverTrigger>
- <InfoIcon />
- </PopoverTrigger>
- <Portal>
- <PopoverContent p={2}>
- <PopoverArrow />
- <PopoverCloseButton />
- <Text fontSize="xs" pr={5}>
- {t('hostsDialog.path.info')}
- </Text>
- </PopoverContent>
- </Portal>
- </Popover>
- </FormLabel>
- <Input
- size="sm"
- borderRadius="4px"
- placeholder="path (e.g. /vless)"
- {...form.register('path')}
- />
- </FormControl>
- <FormControl height="66px">
- <FormLabel
- display="flex"
- pb={1}
- alignItems="center"
- gap={1}
- justifyContent="space-between"
- m="0"
- >
- <span>{t('hostsDialog.security')}</span>
- <Popover isLazy placement="right">
- <PopoverTrigger>
- <InfoIcon />
- </PopoverTrigger>
- <Portal>
- <PopoverContent p={2}>
- <PopoverArrow />
- <PopoverCloseButton />
- <Text fontSize="xs" pr={5}>
- {t('hostsDialog.security.info')}
- </Text>
- </PopoverContent>
- </Portal>
- </Popover>
- </FormLabel>
- <Select size="sm" {...form.register('security')} >
- {proxyHostSecurity.map((s) => {
- return (
- <option key={s.value} value={s.value}>
- {s.title}
- </option>
- );
- })}
- </Select>
- </FormControl>
- {/* TODO: Add ALPN and fingerprint fields smooth entrance and
- * pushing down animation when security field is TLS
- * - Insertion and pushing down the below element
- * - Slowly increasing the opacity
- * Related issue: #95
- */}
- <FormControl height="66px">
- <FormLabel
- display="flex"
- pb={1}
- alignItems="center"
- gap={1}
- justifyContent="space-between"
- m="0"
- >
- <span>{t('hostsDialog.alpn')}</span>
- </FormLabel>
- <Select
- size="sm"
- {...form.register('alpn')}
- >
- {proxyALPN.map((s) => {
- return (
- <option key={s.value} value={s.value}>
- {s.title}
- </option>
- );
- })}
- </Select>
- </FormControl>
- <FormControl height="66px">
- <FormLabel
- display="flex"
- pb={1}
- alignItems="center"
- gap={1}
- justifyContent="space-between"
- m="0"
- >
- <span>{t('hostsDialog.fingerprint')}</span>
- </FormLabel>
- <Select
- size="sm"
- {...form.register('fingerprint')}
- >
- {proxyFingerprint.map((s) => {
- return (
- <option key={s.value} value={s.value}>
- {s.title}
- </option>
- );
- })}
- </Select>
- </FormControl>
- <Spacer m={2}></Spacer>
- <HStack w="full">
- <Tooltip label={t('delete')} placement="top">
- <IconButton
- colorScheme="red"
- variant="ghost"
- size="sm"
- aria-label="delete host"
- onClick={() => {
- if (selectedHost !== null) {
- onDeletingHost(true, selectedHost);
- onClose();
- }
- }}
- >
- <DeleteIcon />
- </IconButton>
- </Tooltip>
- <Button
- flexGrow={1}
- type="submit"
- colorScheme="primary"
- size="sm"
- px={5}
- w="full"
- isLoading={loading}
- >
- {isEditingHost ? t('hostsDialog.editSubmit') : t('hostsDialog.createSubmit')}
- </Button>
- </HStack>
- {error && (
- <Alert
- status="error"
- display={{ base: 'none', md: 'flex' }}
- >
- <AlertIcon />
- {error}
- </Alert>
- )}
- </VStack>
- </form>
- </ModalBody>
- </ModalContent>
- </Modal>
- );
-};
diff --git a/app/dashboard/src/pages/hosts/dialog/remark-field-popover.tsx b/app/dashboard/src/pages/hosts/dialog/remark-field-popover.tsx
deleted file mode 100644
index 0e665ed..0000000
--- a/app/dashboard/src/pages/hosts/dialog/remark-field-popover.tsx
+++ /dev/null
@@ -1,113 +0,0 @@
-
-import { InfoIcon } from './icons';
-import {
- Badge,
- Box,
- Popover,
- PopoverArrow,
- PopoverBody,
- PopoverCloseButton,
- PopoverContent,
- PopoverTrigger,
- Portal,
- Text,
-} from '@chakra-ui/react';
-import { useTranslation } from 'react-i18next';
-import 'slick-carousel/slick/slick-theme.css';
-import 'slick-carousel/slick/slick.css';
-
-export const RemarkFieldPopover = () => {
- const { t } = useTranslation();
- return (
- <Popover isLazy placement="right">
- <PopoverTrigger>
- <Box mt="-8px">
- <InfoIcon />
- </Box>
- </PopoverTrigger>
- <Portal>
- <PopoverContent>
- <PopoverArrow />
- <PopoverCloseButton />
- <PopoverBody>
- <Box fontSize="xs">
- <Text pr="20px">{t('hostsDialog.desc')}</Text>
- <Text>
- <Badge>
- {'{'}SERVER_IP{'}'}
- </Badge>{' '}
- {t('hostsDialog.currentServer')}
- </Text>
- <Text mt={1}>
- <Badge>
- {'{'}USERNAME{'}'}
- </Badge>{' '}
- {t('hostsDialog.username')}
- </Text>
- <Text mt={1}>
- <Badge>
- {'{'}DATA_USAGE{'}'}
- </Badge>{' '}
- {t('hostsDialog.dataUsage')}
- </Text>
- <Text mt={1}>
- <Badge>
- {'{'}DATA_LEFT{'}'}
- </Badge>{' '}
- {t('hostsDialog.remainingData')}
- </Text>
- <Text mt={1}>
- <Badge>
- {'{'}DATA_LIMIT{'}'}
- </Badge>{' '}
- {t('hostsDialog.dataLimit')}
- </Text>
- <Text mt={1}>
- <Badge>
- {'{'}DAYS_LEFT{'}'}
- </Badge>{' '}
- {t('hostsDialog.remainingDays')}
- </Text>
- <Text mt={1}>
- <Badge>
- {'{'}EXPIRE_DATE{'}'}
- </Badge>{' '}
- {t('hostsDialog.expireDate')}
- </Text>
- <Text mt={1}>
- <Badge>
- {'{'}JALALI_EXPIRE_DATE{'}'}
- </Badge>{' '}
- {t('hostsDialog.jalaliExpireDate')}
- </Text>
- <Text mt={1}>
- <Badge>
- {'{'}TIME_LEFT{'}'}
- </Badge>{' '}
- {t('hostsDialog.remainingTime')}
- </Text>
- <Text mt={1}>
- <Badge>
- {'{'}STATUS_EMOJI{'}'}
- </Badge>{' '}
- {t('hostsDialog.statusEmoji')}
- </Text>
- <Text mt={1}>
- <Badge>
- {'{'}PROTOCOL{'}'}
- </Badge>{' '}
- {t('hostsDialog.proxyProtocol')}
- </Text>
- <Text mt={1}>
- <Badge>
- {'{'}TRANSPORT{'}'}
- </Badge>{' '}
- {t('hostsDialog.proxyMethod')}
- </Text>
- </Box>
- </PopoverBody>
- </PopoverContent>
- </Portal>
- </Popover>
- );
-}
diff --git a/app/dashboard/src/pages/hosts/filters.tsx b/app/dashboard/src/pages/hosts/filters.tsx
deleted file mode 100644
index 898a1ee..0000000
--- a/app/dashboard/src/pages/hosts/filters.tsx
+++ /dev/null
@@ -1,159 +0,0 @@
-import {
- BoxProps,
- Button,
- chakra,
- Grid,
- GridItem,
- HStack,
- IconButton,
- Input,
- InputGroup,
- InputLeftElement,
- InputRightElement,
- Spinner,
- useToast,
-} from '@chakra-ui/react';
-import {
- ArrowPathIcon,
- MagnifyingGlassIcon,
- XMarkIcon,
-} from '@heroicons/react/24/outline';
-import classNames from 'classnames';
-import { useDashboard, useInbounds } from 'stores';
-import debounce from 'lodash.debounce';
-import React, { FC, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-
-const iconProps = {
- baseStyle: {
- w: 4,
- h: 4,
- },
-};
-
-const SearchIcon = chakra(MagnifyingGlassIcon, iconProps);
-const ClearIcon = chakra(XMarkIcon, iconProps);
-export const ReloadIcon = chakra(ArrowPathIcon, iconProps);
-
-export type FilterProps = {} & BoxProps;
-const setSearchField = debounce((tag: string) => {
- useInbounds.getState().onInboundsFilterChange({
- ...useInbounds.getState().inboundsFilters,
- offset: 0,
- tag,
- });
-}, 300);
-
-export const InboundsHostsFilters: FC<FilterProps> = ({ ...props }) => {
- const { loading } = useDashboard();
- const {
- inboundsFilters: filters,
- onInboundsFilterChange,
- refetchHosts,
- onCreatingHost,
- selectedInbound,
- } = useInbounds();
- const toast = useToast();
- const onCreateClick = () => {
- if (selectedInbound) {
- onCreatingHost(true);
- } else {
- toast({
- title: t('hostsTable.inboundIsNotSelectedToCreate'),
- status: 'error',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- }
- }
-
- const { t } = useTranslation();
- const [search, setSearch] = useState('');
- const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
- setSearch(e.target.value);
- setSearchField(e.target.value);
- };
- const clear = () => {
- setSearch('');
- onInboundsFilterChange({
- ...filters,
- offset: 0,
- tag: '',
- });
- };
-
- return (
- <Grid
- id="hosts-filters"
- templateColumns={{
- lg: 'repeat(3, 1fr)',
- md: 'repeat(4, 1fr)',
- base: 'repeat(1, 1fr)',
- }}
- position="sticky"
- top={0}
- mx="-6"
- px="6"
- rowGap={4}
- gap={{
- lg: 4,
- base: 0,
- }}
- bg="var(--chakra-colors-chakra-body-bg)"
- py={4}
- zIndex="docked"
- {...props}
- >
- <GridItem colSpan={{ base: 1, md: 2, lg: 1 }} order={{ base: 2, md: 1 }}>
- <InputGroup>
- <InputLeftElement pointerEvents="none" children={<SearchIcon />} />
- <Input
- placeholder={t('search')}
- value={search}
- borderColor="light-border"
- onChange={onChange}
- />
- <InputRightElement>
- {loading && <Spinner size="xs" />}
- {filters.tag && filters.tag.length > 0 && (
- <IconButton
- onClick={clear}
- aria-label="clear"
- size="xs"
- variant="ghost"
- >
- <ClearIcon />
- </IconButton>
- )}
- </InputRightElement>
- </InputGroup>
- </GridItem>
- <GridItem colSpan={2} order={{ base: 1, md: 2 }}>
- <HStack justifyContent="flex-end" alignItems="center" h="full">
- <IconButton
- aria-label="refresh name"
- disabled={loading}
- onClick={refetchHosts}
- size="sm"
- variant="outline"
- >
- <ReloadIcon
- className={classNames({
- 'animate-spin': loading,
- })}
- />
- </IconButton>
- <Button
- colorScheme="primary"
- size="sm"
- onClick={() => onCreateClick()}
- px={5}
- >
- {t('hostsTable.createHosts')}
- </Button>
- </HStack>
- </GridItem>
- </Grid>
- );
-};
diff --git a/app/dashboard/src/pages/hosts/inbounds-sidebar/index.tsx b/app/dashboard/src/pages/hosts/inbounds-sidebar/index.tsx
deleted file mode 100644
index 1f9736d..0000000
--- a/app/dashboard/src/pages/hosts/inbounds-sidebar/index.tsx
+++ /dev/null
@@ -1,75 +0,0 @@
-import { Box, Table, Thead, Tbody, Th, Td, Tr, HStack } from '@chakra-ui/react';
-import classNames from 'classnames';
-import { InboundCard } from 'components/inbounds-card';
-import { handleSort } from 'components/table';
-import { FC } from 'react';
-import { useTranslation } from 'react-i18next';
-import { useEffect } from 'react';
-import { useInbounds } from 'stores';
-import { InboundType } from 'types';
-
-type InboundsSidebarProps = {
- inbounds: InboundType[];
-}
-
-export const InboundsSidebar: FC<InboundsSidebarProps> = ({
- inbounds,
-}) => {
- const {
- onInboundsFilterChange,
- inboundsFilters: filters,
- selectedInbound,
- selectInbound,
- refetchHosts,
- } = useInbounds();
-
- useEffect(() => {
- selectedInbound === undefined && selectInbound(inbounds[0]);
- }, [selectedInbound, inbounds]);
-
- const { t } = useTranslation();
-
- return (
- <Box w="full">
- <Table orientation="vertical" zIndex="docked" >
- <Thead zIndex="docked" position="relative" >
- <Tr>
- <Th
- minW="120px"
- pl={4}
- pr={4}
- cursor={'pointer'}
- onClick={handleSort.bind(null, filters, 'tag', onInboundsFilterChange)}
- >
- <HStack>
- <span>{t('inbounds')}</span>
- </HStack>
- </Th>
- </Tr>
- </Thead>
- <Tbody>
- {inbounds?.map((inbound, i) => {
- const active = inbounds[i] == selectedInbound
- return (
- <Tr key={i}
- className={classNames('interactive')}
- bg={active ? 'gray.300' : undefined}
- _dark={{ bg: active ? 'gray.700' : undefined }}
- onClick={() => {
- selectInbound(inbound);
- refetchHosts();
- }}>
- <Td>
- <InboundCard
- tag={inbound.tag}
- nodeName={inbound.node.name}
- protocol={inbound.protocol}
- />
- </Td>
- </Tr>);
- })}
- </Tbody>
- </Table>
- </Box>
- )
-}
diff --git a/app/dashboard/src/pages/hosts/index.tsx b/app/dashboard/src/pages/hosts/index.tsx
deleted file mode 100644
index 8229892..0000000
--- a/app/dashboard/src/pages/hosts/index.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { HostsDialog } from './dialog';
-import Page from 'components/page';
-import { pages } from 'stores';
-import { InboundsHostsManager } from './container';
-
-const HostsPage = () => {
- return (
- <Page page={pages.hosts}>
- <HostsDialog />
- <InboundsHostsManager />
- </Page>
- )
-}
-
-export default HostsPage;
diff --git a/app/dashboard/src/pages/hosts/table/index.tsx b/app/dashboard/src/pages/hosts/table/index.tsx
deleted file mode 100644
index 86d1890..0000000
--- a/app/dashboard/src/pages/hosts/table/index.tsx
+++ /dev/null
@@ -1,122 +0,0 @@
-import {
- Box,
- HStack,
- Table,
- TableProps,
- Tbody,
- Td,
- Th,
- Thead,
- Tr,
-} from '@chakra-ui/react';
-import classNames from 'classnames';
-import { FC } from 'react';
-import { useTranslation } from 'react-i18next';
-import {
- EmptySection,
- Sort,
- handleSort,
-} from 'components/table';
-import { useInbounds, HostType } from 'stores';
-
-
-type NodesTableProps = {
- hosts: HostType[];
-} & TableProps;
-
-export const HostsTable: FC<NodesTableProps> = ({ hosts }) => {
- const {
- hostsFilters: filters,
- onHostsFilterChange,
- onEditingHost,
- } = useInbounds();
-
- const { t } = useTranslation();
-
- return (
- <Box id="hosts-table" h="full" overflowX={{ base: 'unset', md: 'unset' }} >
- <Table
- orientation="vertical"
- >
- <Thead zIndex="docked" position="relative">
- <Tr>
- <Th
- minW="120px"
- pl={4}
- pr={4}
- cursor={'pointer'}
- onClick={handleSort.bind(null, filters, 'remark', onHostsFilterChange)}
- >
- <HStack>
- <span>{t('remark')}</span>
- <Sort sort={filters.sort} column="remark" />
- </HStack>
- </Th>
- <Th
- minW="100px"
- cursor={'pointer'}
- pr={0}
- onClick={handleSort.bind(null, filters, 'address', onHostsFilterChange)}
- >
- <HStack>
- <span>{t('hostsTable.address')}</span>
- <Sort sort={filters.sort} column="address" />
- </HStack>
- </Th>
- <Th
- minW="100px"
- cursor={'pointer'}
- pr={0}
- onClick={handleSort.bind(null, filters, 'port', onHostsFilterChange)}
- >
- <HStack>
- <span>{t('hostsTable.port')}</span>
- <Sort sort={filters.sort} column="port" />
- </HStack>
- </Th>
- </Tr>
- </Thead>
- <Tbody overflowY="auto">
- {hosts?.map((host, i) => {
- return (
- <Tr
- key={i}
- className={classNames('interactive', {
- 'last-row': i === hosts.length - 1,
- })}
- onClick={() => onEditingHost(true, host)}
- >
- <Td minW="140px">
- <div className="flex-status">
- {host.remark}
- </div>
- </Td>
- <Td width="400px" minW="150px">
- {host.address}
- </Td>
- <Td width="350px" minW="150px">
- {host.port}
- </Td>
- </Tr>
- );
- })}
- {(hosts?.length === 0 || hosts === undefined) && (
- <Tr>
- <Td colSpan={5}>
- <EmptySection
- isFiltered={/* isFiltered */ false}
- noObjectT="hostsTable.noHost"
- noObjectMatchedT='hostsTable.noHostMatched'
- createObjectT="hostsTable.createHosts"
- />
- </Td>
- </Tr>
- )}
- </Tbody>
- </Table>
- {/* TODO:
- * <Pagination filters={filters} total={hosts === undefined ? 0 : hosts.length} onHostsFilterChange={onFilterChange} pageSizeManager={pageSizeManagers.hosts} />
- */}
- </Box>
- );
-};
diff --git a/app/dashboard/src/pages/login/index.tsx b/app/dashboard/src/pages/login/index.tsx
deleted file mode 100644
index ffb8b50..0000000
--- a/app/dashboard/src/pages/login/index.tsx
+++ /dev/null
@@ -1,148 +0,0 @@
-import {
- Alert,
- AlertDescription,
- AlertIcon,
- Box,
- Button,
- chakra,
- FormControl,
- HStack,
- Text,
- VStack,
-} from '@chakra-ui/react';
-import { ArrowRightStartOnRectangleIcon } from '@heroicons/react/24/outline';
-import { zodResolver } from '@hookform/resolvers/zod';
-import { FC, useEffect, useState } from 'react';
-import { FieldValues, useForm } from 'react-hook-form';
-import { useLocation, useNavigate } from 'react-router-dom';
-import { z } from 'zod';
-import { Footer } from 'components/footer';
-import { Input } from 'components/input';
-import { fetch } from 'service/http';
-import { ReactComponent as Logo } from 'assets/logo.svg';
-import { useTranslation } from 'react-i18next';
-import { Language } from 'components/language';
-import { useAdmin } from 'stores';
-
-const schema = z.object({
- username: z.string().min(1, 'login.fieldRequired'),
- password: z.string().min(1, 'login.fieldRequired'),
-});
-
-export const LogoIcon = chakra(Logo, {
- baseStyle: {
- strokeWidth: '10px',
- w: 12,
- h: 12,
- },
-});
-
-const LoginIcon = chakra(ArrowRightStartOnRectangleIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- strokeWidth: '2px',
- },
-});
-
-export const Login: FC = () => {
- const [error, setError] = useState('');
- const [loading, setLoading] = useState(false);
- const navigate = useNavigate();
- const { setAuthToken, removeAuthToken } = useAdmin();
- const { t } = useTranslation();
- let location = useLocation();
- const {
- register,
- formState: { errors },
- handleSubmit,
- } = useForm({
- resolver: zodResolver(schema),
- });
- useEffect(() => {
- removeAuthToken();
- if (location.pathname !== '/login') {
- navigate('/login', { replace: true });
- }
- }, []);
- const login = (values: FieldValues) => {
- setError('');
- const formData = new FormData();
- formData.append('username', values.username);
- formData.append('password', values.password);
- formData.append('grant_type', 'password');
- setLoading(true);
- fetch('/admins/token', { method: 'post', body: formData })
- .then(({ access_token: token }) => {
- setAuthToken(token);
- navigate('/');
- })
- .catch((err) => {
- setError(err.response._data.detail);
- })
- .finally(setLoading.bind(null, false));
- };
- return (
- <VStack justifyContent="space-between" minH="100vh" p="6" w="full">
- <Box w="full">
- <HStack justifyContent="end" w="full">
- <Language />
- </HStack>
- <HStack w="full" justifyContent="center" alignItems="center">
- <Box w="full" maxW="340px" mt="6">
- <VStack alignItems="center" w="full">
- <LogoIcon />
- <Text fontSize="2xl" fontWeight="semibold">
- {t('login.loginYourAccount')}
- </Text>
- <Text color="gray.600" _dark={{ color: 'gray.400' }}>
- {t('login.welcomeBack')}
- </Text>
- </VStack>
- <Box w="full" maxW="300px" m="auto" pt="4">
- <form onSubmit={handleSubmit(login)}>
- <VStack mt={4} rowGap={2}>
- <FormControl>
- <Input
- w="full"
- placeholder={t('username')}
- {...register('username')}
- error={t(errors?.username?.message as string)}
- />
- </FormControl>
- <FormControl>
- <Input
- w="full"
- type="password"
- placeholder={t('password')}
- {...register('password')}
- error={t(errors?.password?.message as string)}
- />
- </FormControl>
- {error && (
- <Alert status="error" rounded="md">
- <AlertIcon />
- <AlertDescription>{error}</AlertDescription>
- </Alert>
- )}
- <Button
- isLoading={loading}
- type="submit"
- w="full"
- colorScheme="primary"
- >
- {<LoginIcon marginRight={1} />}
- {t('login.login')}
- </Button>
- </VStack>
- </form>
- </Box>
- </Box>
- </HStack>
- </Box>
- <Footer bottom={3} />
- </VStack>
- );
-};
-
-export default Login;
diff --git a/app/dashboard/src/pages/nodes/dialog.tsx b/app/dashboard/src/pages/nodes/dialog.tsx
deleted file mode 100644
index 738da0a..0000000
--- a/app/dashboard/src/pages/nodes/dialog.tsx
+++ /dev/null
@@ -1,241 +0,0 @@
-import {
- Box,
- Button,
- chakra,
- Checkbox,
- FormControl,
- FormLabel,
- HStack,
- Modal,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- ModalOverlay,
- Switch,
- Tooltip,
- useToast,
- VStack, IconButton, Spacer
-} from '@chakra-ui/react';
-import { zodResolver } from '@hookform/resolvers/zod';
-import {
- getNodeCreateDefaultValues,
- NodeCreate,
- NodeCreateSchema,
- useNodes,
-} from 'stores';
-import { FC, useEffect, useState } from 'react';
-import { Controller, useForm } from 'react-hook-form';
-import { useTranslation } from 'react-i18next';
-import 'slick-carousel/slick/slick-theme.css';
-import 'slick-carousel/slick/slick.css';
-import { DialogModalHeader, DeleteIcon, AddIcon, EditIcon } from 'components/dialog';
-import { Input } from 'components/input';
-
-const CustomInput = chakra(Input, {
- baseStyle: {
- bg: 'white',
- _dark: {
- bg: 'gray.700',
- },
- },
-});
-
-export const NodesDialog: FC = () => {
- const { editingNode, isEditingNode, onEditingNode, isAddingNode, refetchNodes, updateNode, addNode, onAddingNode, onDeletingNode } = useNodes();
- const [loading, setLoading] = useState(false);
- const [, setError] = useState<string | null>('');
-
- const { t } = useTranslation();
- const toast = useToast();
- const defaultValueNode: NodeCreate = (isEditingNode === true && editingNode !== null && editingNode !== undefined) ? editingNode : getNodeCreateDefaultValues();
- const form = useForm<NodeCreate>({
- resolver: zodResolver(NodeCreateSchema),
- defaultValues: defaultValueNode,
- });
- const isOpen = isEditingNode || isAddingNode;
- const onClose = () => {
- onAddingNode(false);
- onEditingNode(undefined);
- };
- useEffect(() => {
- if (isOpen) {
- refetchNodes();
- form.reset(defaultValueNode);
- }
- }, [isOpen]);
-
- const submit = async (values: NodeCreate) => {
- setLoading(true);
- const methods = { edited: updateNode, created: addNode };
- const method = isEditingNode ? 'edited' : 'created';
- const { name, port, id, address, usage_coefficient } = values;
- setError(null);
- let body: NodeCreate = {
- id,
- name,
- address,
- port,
- status: values.status,
- usage_coefficient,
- add_as_new_host: values.add_as_new_host,
- };
-
- await methods[method](body)
- .then(() => {
- toast({
- title: t(
- isEditingNode ? 'nodeDialog.editNode' : 'nodeDialog.createNewNode',
- { name: values.name }
- ),
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- refetchNodes();
- onClose();
- })
- .catch((err) => {
- if (err?.response?.status === 409 || err?.response?.status === 400)
- setError(err?.response?._data?.detail);
- if (err?.response?.status === 422) {
- Object.keys(err.response._data.detail).forEach((key) => {
- setError(err?.response._data.detail[key] as string);
- form.setError(
- key as 'address' | 'port' | 'name' | 'status',
- {
- type: 'custom',
- message: err.response._data.detail[key],
- }
- );
- });
- }
- })
- .finally(() => {
- setLoading(false);
- });
- };
-
- return (
- <>
- <Modal isOpen={isOpen} onClose={onClose}>
- <ModalOverlay bg="blackAlpha.300" backdropFilter="blur(10px)" />
- <ModalContent mx="3" w="fit-content" maxW="3xl">
- <DialogModalHeader HeaderIcon={isEditingNode ? EditIcon : AddIcon} title={isEditingNode ? t('nodeDialog.editNode') : t('nodeDialog.addNode')} />
- <ModalCloseButton mt={3} />
- <ModalBody w="440px" pb={6} pt={3}>
- <VStack>
- {loading && 'loading...'}
-
- <form onSubmit={form.handleSubmit((v) => submit(v))}>
- <VStack>
- <HStack w="full">
- <FormControl>
- <CustomInput
- label={t('nodeDialog.nodeName')}
- size="sm"
- placeholder="Marzn-Node-2"
- {...form.register('name')}
- error={form.formState?.errors?.name?.message}
- />
- </FormControl>
- <HStack px={1}>
- <Controller
- name="status"
- control={form.control}
- render={({ field }) => {
- return (
- <Tooltip
- key={field.value}
- placement="top"
- label={
- `${t('usersTable.status')}: ` +
- (field.value !== 'disabled' ? t('active') : t('disabled'))
- }
- textTransform="capitalize"
- >
- <Box mt="6">
- <Switch
- colorScheme="primary"
- isChecked={field.value !== 'disabled'}
- onChange={(e) => {
- if (e.target.checked) {
- field.onChange('none');
- } else {
- field.onChange('disabled');
- }
- }}
- />
- </Box>
- </Tooltip>
- );
- }}
- />
- </HStack>
- </HStack>
- <HStack alignItems="flex-start">
- <Box w="65%">
- <CustomInput
- label={t('nodeDialog.nodeAddress')}
- size="sm"
- placeholder="51.20.12.13"
- {...form.register('address')}
- error={form.formState?.errors?.address?.message}
- />
- </Box>
- <Box w="35%">
- <CustomInput
- label={t('nodeDialog.nodePort')}
- size="sm"
- placeholder="62050"
- {...form.register('port')}
- error={form.formState?.errors?.port?.message}
- />
- </Box>
- </HStack>
- {!editingNode && (
- <FormControl py={1}>
- <Checkbox {...form.register('add_as_new_host')}>
- <FormLabel m={0}>{t('nodeDialog.addHostForEveryInbound')}</FormLabel>
- </Checkbox>
- </FormControl>
- )}
- <Spacer m={2}></Spacer>
- <HStack w="full">
- <Tooltip label={t('delete')} placement="top">
- <IconButton
- colorScheme="red"
- variant="ghost"
- size="sm"
- aria-label="delete node"
- onClick={() => {
- if (editingNode !== null) {
- onDeletingNode(editingNode);
- onClose();
- }
- }}
- >
- <DeleteIcon />
- </IconButton>
- </Tooltip>
- <Button
- flexGrow={1}
- type="submit"
- colorScheme="primary"
- size="sm"
- px={5}
- w="full"
- isLoading={loading}
- >
- {isEditingNode ? t('nodeDialog.updateSubmit') : t('nodeDialog.addSubmit')}
- </Button>
- </HStack>
- </VStack>
- </form>
- </VStack>
- </ModalBody>
- </ModalContent>
- </Modal>
- </>
- );
-}
diff --git a/app/dashboard/src/pages/nodes/filters.tsx b/app/dashboard/src/pages/nodes/filters.tsx
deleted file mode 100644
index 25865c9..0000000
--- a/app/dashboard/src/pages/nodes/filters.tsx
+++ /dev/null
@@ -1,194 +0,0 @@
-import {
- BoxProps,
- Button,
- chakra,
- Grid,
- GridItem,
- HStack,
- IconButton,
- Input,
- InputGroup,
- InputLeftElement,
- InputRightElement,
- Spinner,
- Tooltip,
-} from '@chakra-ui/react';
-import {
- ArrowPathIcon,
- MagnifyingGlassIcon,
- XMarkIcon,
-} from '@heroicons/react/24/outline';
-import classNames from 'classnames';
-import { useNodes, useDashboard } from 'stores';
-import debounce from 'lodash.debounce';
-import React, { FC, useEffect, useState } from 'react';
-import CopyToClipboard from 'react-copy-to-clipboard';
-import { useTranslation } from 'react-i18next';
-import { CopiedIcon, SubscriptionLinkIcon } from 'components/table';
-
-const iconProps = {
- baseStyle: {
- w: 4,
- h: 4,
- },
-};
-
-const SearchIcon = chakra(MagnifyingGlassIcon, iconProps);
-const ClearIcon = chakra(XMarkIcon, iconProps);
-export const ReloadIcon = chakra(ArrowPathIcon, iconProps);
-
-export type FilterProps = {} & BoxProps;
-const setSearchField = debounce((name: string) => {
- useNodes.getState().onFilterChange({
- ...useNodes.getState().nodesFilters,
- offset: 0,
- name,
- });
-}, 300);
-
-export const NodesFilters: FC<FilterProps> = ({ ...props }) => {
- const { loading } = useDashboard();
- const { nodesFilters: filters, onFilterChange, refetchNodes, onAddingNode: onAddNodes } = useNodes();
- const { t } = useTranslation();
- const [search, setSearch] = useState('');
- const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
- setSearch(e.target.value);
- setSearchField(e.target.value);
- };
- const clear = () => {
- setSearch('');
- onFilterChange({
- ...filters,
- offset: 0,
- name: '',
- });
- };
-
- const { certificate, refetchCertificate } = useNodes();
- const [copied, setCopied] = useState([-1, false]);
- useEffect(() => {
- if (copied[1]) {
- setTimeout(() => {
- setCopied([-1, false]);
- }, 1000);
- }
- }, [copied]);
-
- useEffect(() => {
- certificate === '' && refetchCertificate();
- }, [certificate])
-
- return (
- <Grid
- id="nodes-filters"
- templateColumns={{
- lg: 'repeat(3, 1fr)',
- md: 'repeat(4, 1fr)',
- base: 'repeat(1, 1fr)',
- }}
- position="sticky"
- top={0}
- mx="-6"
- px="6"
- rowGap={4}
- gap={{
- lg: 4,
- base: 0,
- }}
- bg="var(--chakra-colors-chakra-body-bg)"
- py={4}
- zIndex="docked"
- {...props}
- >
- <GridItem colSpan={{ base: 1, md: 2, lg: 1 }} order={{ base: 2, md: 1 }}>
- <InputGroup>
- <InputLeftElement pointerEvents="none" children={<SearchIcon />} />
- <Input
- placeholder={t('search')}
- value={search}
- borderColor="light-border"
- onChange={onChange}
- />
- <InputRightElement>
- {loading && <Spinner size="xs" />}
- {filters.name && filters.name.length > 0 && (
- <IconButton
- onClick={clear}
- aria-label="clear"
- size="xs"
- variant="ghost"
- >
- <ClearIcon />
- </IconButton>
- )}
- </InputRightElement>
- </InputGroup>
- </GridItem>
- <GridItem colSpan={2} order={{ base: 1, md: 2 }}>
- <HStack justifyContent="flex-end" alignItems="center" h="full">
- <IconButton
- aria-label="refresh name"
- disabled={loading}
- onClick={refetchNodes}
- size="sm"
- variant="outline"
- >
- <ReloadIcon
- className={classNames({
- 'animate-spin': loading,
- })}
- />
- </IconButton>
- <CopyToClipboard
- text={
- certificate
- }
- onCopy={() => {
- setCopied([0, true]);
- }}
- >
- <div>
- <Tooltip
- label={
- copied[0] == 0 && copied[1]
- ? t('nodesTable.copied')
- : t('nodesTable.copyCertificate')
- }
- placement="top"
- >
- <IconButton
- p="0 !important"
- aria-label="copy certificate"
- bg="transparent"
- _dark={{
- _hover: {
- bg: 'gray.700',
- },
- }}
- size={{
- base: 'sm',
- md: 'md',
- }}
- >
- {copied[0] == 0 && copied[1] ? (
- <CopiedIcon />
- ) : (
- <SubscriptionLinkIcon />
- )}
- </IconButton>
- </Tooltip>
- </div>
- </CopyToClipboard>
- <Button
- colorScheme="primary"
- size="sm"
- onClick={() => onAddNodes(true)}
- px={5}
- >
- {t('nodesTable.addNode')}
- </Button>
- </HStack>
- </GridItem>
- </Grid>
- );
-};
diff --git a/app/dashboard/src/pages/nodes/index.tsx b/app/dashboard/src/pages/nodes/index.tsx
deleted file mode 100644
index 41778c4..0000000
--- a/app/dashboard/src/pages/nodes/index.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-
-import { FC } from 'react';
-import { CoreSettingsModal } from './modals/core-settings';
-import { NodesDialog } from './dialog';
-import { NodesUsage } from './usage';
-import { NodesTable } from './table';
-import { NodesFilters } from './filters';
-import { DeleteNodeModal } from './modals/delete-modal';
-import { pages } from 'stores';
-import Page from 'components/page';
-
-const NodesPage: FC = () => {
- return (
- <Page page={pages.nodes}>
- <NodesUsage />
- <NodesFilters />
- <NodesTable />
- <NodesDialog />
- <DeleteNodeModal />
- <CoreSettingsModal />
- </Page>
- );
-}
-
-export default NodesPage;
diff --git a/app/dashboard/src/pages/nodes/modals/core-settings/content.tsx b/app/dashboard/src/pages/nodes/modals/core-settings/content.tsx
deleted file mode 100644
index 3b2d3e8..0000000
--- a/app/dashboard/src/pages/nodes/modals/core-settings/content.tsx
+++ /dev/null
@@ -1,233 +0,0 @@
-import {
- Box,
- Button,
- CircularProgress,
- FormControl,
- FormLabel,
- HStack,
- IconButton,
- ModalBody,
- ModalFooter,
- Text,
- useToast,
-} from '@chakra-ui/react';
-import { useCoreSettings } from 'stores';
-import debounce from 'lodash.debounce';
-import { FC, useCallback, useEffect, useRef, useState } from 'react';
-import { Controller, useForm } from 'react-hook-form';
-import { useTranslation } from 'react-i18next';
-import { useWebSocket } from 'react-use-websocket/dist/lib/use-websocket';
-import { JsonEditor } from 'components/json-editor';
-import 'components/json-editor/themes.js';
-import { ExitFullScreenIcon, FullScreenIcon } from './icon';
-import { getStatus, getWebsocketUrl } from './helper';
-import { MAX_NUMBER_OF_LOGS } from '.';
-
-let logsTmp: string[] = [];
-
-export const CoreSettingModalContent: FC = () => {
- const {
- fetchCoreSettings,
- updateConfig,
- isLoading,
- config,
- isPostLoading,
- selectedNode,
- } = useCoreSettings();
- const logsDiv = useRef<HTMLDivElement | null>(null);
- const [logs, setLogs] = useState<string[]>([]);
- const { t } = useTranslation();
- const toast = useToast();
- const form = useForm({
- defaultValues: { config: config || {} },
- });
-
- useEffect(() => {
- if (config) form.setValue('config', config);
- }, [config]);
-
- useEffect(() => {
- if (selectedNode) fetchCoreSettings();
- }, [selectedNode]);
- ''.startsWith;
- const scrollShouldStayOnEnd = useRef(true);
- const updateLogs = useCallback(
- debounce((logs: string[]) => {
- const isScrollOnEnd =
- Math.abs(
- (logsDiv.current?.scrollTop || 0) -
- (logsDiv.current?.scrollHeight || 0) +
- (logsDiv.current?.offsetHeight || 0)
- ) < 10;
- if (logsDiv.current && isScrollOnEnd)
- scrollShouldStayOnEnd.current = true;
- else scrollShouldStayOnEnd.current = false;
- if (logs.length < 40) setLogs(logs);
- }, 300),
- []
- );
-
- const { readyState } = useWebSocket(selectedNode?.id ? getWebsocketUrl(selectedNode.id) : '', {
- onMessage: (e: any) => {
- logsTmp.push(e.data);
- if (logsTmp.length > MAX_NUMBER_OF_LOGS)
- logsTmp = logsTmp.splice(0, logsTmp.length - MAX_NUMBER_OF_LOGS);
- updateLogs([...logsTmp]);
- },
- shouldReconnect: () => true,
- reconnectAttempts: 10,
- reconnectInterval: 1000,
- });
-
- useEffect(() => {
- if (logsDiv.current && scrollShouldStayOnEnd.current)
- logsDiv.current.scrollTop = logsDiv.current?.scrollHeight;
- }, [logs]);
-
- useEffect(() => {
- return () => {
- logsTmp = [];
- };
- }, []);
-
- const status = getStatus(readyState.toString());
-
- // const {
- // mutate: handleRestartCore,
- // isPending: isRestarting
- // } = useMutation({ mutationFn: restartCore });
-
- const handleOnSave = ({ config }: any) => {
- updateConfig(config)
- .then(() => {
- toast({
- title: t('core.successMessage'),
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- })
- .catch((e) => {
- let message = t('core.generalErrorMessage');
- if (typeof e.response._data.detail === 'object')
- message =
- e.response._data.detail[Object.keys(e.response._data.detail)[0]];
- if (typeof e.response._data.detail === 'string')
- message = e.response._data.detail;
-
- toast({
- title: message,
- status: 'error',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- });
- };
-
- const editorRef = useRef<HTMLDivElement>(null);
- const [isFullScreen, setFullScreen] = useState(false);
- const handleFullScreen = () => {
- if (document.fullscreenElement) {
- document.exitFullscreen();
- setFullScreen(false);
- } else {
- editorRef.current?.requestFullscreen();
- setFullScreen(true);
- }
- };
- return (
- <form onSubmit={form.handleSubmit(handleOnSave)}>
- <ModalBody>
- <FormControl>
- <HStack justifyContent="space-between" alignItems="flex-start">
- <FormLabel>
- {t('core.configuration')}{' '}
- {isLoading && <CircularProgress isIndeterminate size="15px" />}
- </FormLabel>
- </HStack>
- <Box position="relative" ref={editorRef} minHeight="300px">
- <Controller
- control={form.control}
- name="config"
- render={({ field }) => (
- <JsonEditor json={config} onChange={field.onChange} />
- )}
- />
- <IconButton
- size="xs"
- aria-label="full screen"
- variant="ghost"
- position="absolute"
- top="2"
- right="4"
- onClick={handleFullScreen}
- >
- {!isFullScreen ? <FullScreenIcon /> : <ExitFullScreenIcon />}
- </IconButton>
- </Box>
- </FormControl>
- <FormControl mt="4">
- <HStack justifyContent="space-between">
- <FormLabel>{t('core.logs')}</FormLabel>
- <Text as={FormLabel}>{t(`core.socket.${status}`)}</Text>
- </HStack>
- <Box
- border="1px solid"
- borderColor="gray.300"
- bg="#F9F9F9"
- _dark={{
- borderColor: 'gray.500',
- bg: '#2e3440',
- }}
- borderRadius={5}
- minHeight="200px"
- maxHeight={'250px'}
- p={2}
- overflowY="auto"
- ref={logsDiv}
- >
- {logs.map((message, i) => (
- <Text fontSize="xs" opacity={0.8} key={i} whiteSpace="pre-line">
- {message}
- </Text>
- ))}
- </Box>
- </FormControl>
- </ModalBody>
- <ModalFooter>
- <HStack w="full" justifyContent="space-between">
- <Box>
- {/* <Button */}
- {/* size="sm" */}
- {/* leftIcon={ */}
- {/* <ReloadIcon */}
- {/* className={classNames({ */}
- {/* 'animate-spin': isRestarting, */}
- {/* })} */}
- {/* /> */}
- {/* } */}
- {/* onClick={() => handleRestartCore()} */}
- {/* > */}
- {/* {t(isRestarting ? 'core.restarting' : 'core.restartCore')} */}
- {/* </Button> */}
- </Box>
- <HStack>
- <Button
- size="sm"
- variant="solid"
- colorScheme="primary"
- px="5"
- type="submit"
- isDisabled={isLoading || isPostLoading}
- isLoading={isPostLoading}
- >
- {t('core.save')}
- </Button>
- </HStack>
- </HStack>
- </ModalFooter>
- </form>
- );
-};
diff --git a/app/dashboard/src/pages/nodes/modals/core-settings/helper.ts b/app/dashboard/src/pages/nodes/modals/core-settings/helper.ts
deleted file mode 100644
index 96aa177..0000000
--- a/app/dashboard/src/pages/nodes/modals/core-settings/helper.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { ReadyState } from 'react-use-websocket';
-import { joinPaths } from '@remix-run/router';
-import { getAuthToken } from 'service/auth-storage';
-
-export const getStatus = (status: string) => {
- return {
- [ReadyState.CONNECTING]: 'connecting',
- [ReadyState.OPEN]: 'connected',
- [ReadyState.CLOSING]: 'closed',
- [ReadyState.CLOSED]: 'closed',
- [ReadyState.UNINSTANTIATED]: 'closed',
- }[status];
-};
-
-export const getWebsocketUrl = (node_id: number) => {
- try {
- let baseURL = new URL(
- import.meta.env.VITE_BASE_API.startsWith('/')
- ? window.location.origin + import.meta.env.VITE_BASE_API
- : import.meta.env.VITE_BASE_API
- );
-
- return (
- (baseURL.protocol === 'https:' ? 'wss://' : 'ws://') +
- joinPaths([baseURL.host + baseURL.pathname, `/nodes/${node_id}/logs`]) +
- '?interval=1&token=' +
- getAuthToken()
- );
- } catch (e) {
- console.error('Unable to generate websocket url');
- console.error(e);
- return null;
- }
-};
diff --git a/app/dashboard/src/pages/nodes/modals/core-settings/icon.tsx b/app/dashboard/src/pages/nodes/modals/core-settings/icon.tsx
deleted file mode 100644
index a4818f1..0000000
--- a/app/dashboard/src/pages/nodes/modals/core-settings/icon.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { chakra } from '@chakra-ui/react';
-import {
- ArrowPathIcon,
- ArrowsPointingInIcon,
- ArrowsPointingOutIcon,
- Cog6ToothIcon,
-} from '@heroicons/react/24/outline';
-
-export const UsageIcon = chakra(Cog6ToothIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
-
-export const ReloadIcon = chakra(ArrowPathIcon, {
- baseStyle: {
- w: 4,
- h: 4,
- },
-});
-
-export const FullScreenIcon = chakra(ArrowsPointingOutIcon, {
- baseStyle: {
- w: 4,
- h: 4,
- },
-});
-export const ExitFullScreenIcon = chakra(ArrowsPointingInIcon, {
- baseStyle: {
- w: 3,
- h: 3,
- },
-});
diff --git a/app/dashboard/src/pages/nodes/modals/core-settings/index.tsx b/app/dashboard/src/pages/nodes/modals/core-settings/index.tsx
deleted file mode 100644
index d40cdb7..0000000
--- a/app/dashboard/src/pages/nodes/modals/core-settings/index.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import {
- HStack,
- Modal,
- ModalCloseButton,
- ModalContent,
- ModalHeader,
- ModalOverlay,
- Text
-} from '@chakra-ui/react';
-import { Icon } from 'components/icon';
-import { FC } from 'react';
-import { useTranslation } from 'react-i18next';
-import { useCoreSettings } from 'stores';
-import { CoreSettingModalContent } from './content';
-import { UsageIcon } from './icon';
-
-export const MAX_NUMBER_OF_LOGS = 500;
-
-
-export const CoreSettingsModal: FC = () => {
- const { selectedNode } = useCoreSettings();
- const onClose = useCoreSettings.setState.bind(null, { selectedNode: null });
- const { t } = useTranslation();
-
- return (
- <Modal isOpen={selectedNode !== null} onClose={onClose} size="3xl">
- <ModalOverlay bg="blackAlpha.300" backdropFilter="blur(10px)" />
- <ModalContent mx="3" w="full">
- <ModalHeader pt={6}>
- <HStack gap={2}>
- <Icon color="primary">
- <UsageIcon color="white" />
- </Icon>
- <Text fontWeight="semibold" fontSize="lg">
- {t('core.title')}
- </Text>
- </HStack>
- </ModalHeader>
- <ModalCloseButton mt={3} />
- <CoreSettingModalContent />
- </ModalContent>
- </Modal>
- );
-};
diff --git a/app/dashboard/src/pages/nodes/modals/delete-modal.tsx b/app/dashboard/src/pages/nodes/modals/delete-modal.tsx
deleted file mode 100644
index 7b61390..0000000
--- a/app/dashboard/src/pages/nodes/modals/delete-modal.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import {
- useToast,
-} from '@chakra-ui/react';
-import { useNodes } from 'stores';
-import { FC, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-import { DeleteModal } from 'components/delete-modal';
-
-export const DeleteNodeModal: FC = () => {
- const { deleteNode, refetchNodes, deletingNode, onDeletingNode } = useNodes();
- const { t } = useTranslation();
- const toast = useToast();
- const [loading, setLoading] = useState(false);
- const onClose = () => {
- onDeletingNode(undefined);
- };
-
- const onDelete = () => {
- if (deletingNode) {
- setLoading(true);
- deleteNode(deletingNode)
- .then(() => {
- refetchNodes();
- toast({
- title: t('deleteNode.deleteSuccess', { name: deletingNode.name }),
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- })
- .then(onClose)
- .finally(setLoading.bind(null, false));
- }
- };
-
- return (
- <DeleteModal
- onDelete={onDelete}
- loading={loading}
- isOpen={!!deletingNode}
- onClose={onClose}
- deletingObjectName={deletingNode?.name}
- deleteObjectTitleT={'deleteNode.title'}
- deleteObjectPromptT={'deleteNode.prompt'}
- />
- );
-};
diff --git a/app/dashboard/src/pages/nodes/table/action-buttons.tsx b/app/dashboard/src/pages/nodes/table/action-buttons.tsx
deleted file mode 100644
index c340f60..0000000
--- a/app/dashboard/src/pages/nodes/table/action-buttons.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-
-import { t } from 'i18next';
-import { Cog6ToothIcon } from '@heroicons/react/24/outline';
-import { chakra, HStack, IconButton, Tooltip } from '@chakra-ui/react';
-import { NodeType, useCoreSettings } from 'stores';
-import { FC } from 'react';
-
-const iconProps = {
- baseStyle: {
- w: 4,
- h: 4,
- },
-};
-const CoreSettingsIcon = chakra(Cog6ToothIcon, iconProps);
-
-type ActionButtonsProps = {
- node: NodeType,
-};
-
-export const ActionButtons: FC<ActionButtonsProps> = ({ node }) => {
- return (
- <HStack
- justifyContent="flex-end"
- onClick={(e) => {
- e.preventDefault();
- e.stopPropagation();
- }}
- >
- <Tooltip
- label={
- t('nodesTable.coreSettings')
- }
- placement="top"
- >
- <IconButton
- p="0 !important"
- aria-label="core settings"
- bg="transparent"
- _dark={{
- _hover: {
- bg: 'gray.700',
- },
- }}
- size={{
- base: 'sm',
- md: 'md',
- }}
- onClick={() => {
- useCoreSettings.setState({ selectedNode: node });
- }}
- >
- <CoreSettingsIcon />
- </IconButton>
- </Tooltip>
- </HStack >
- );
-};
diff --git a/app/dashboard/src/pages/nodes/table/index.tsx b/app/dashboard/src/pages/nodes/table/index.tsx
deleted file mode 100644
index a306c13..0000000
--- a/app/dashboard/src/pages/nodes/table/index.tsx
+++ /dev/null
@@ -1,395 +0,0 @@
-
-import {
- Accordion,
- AccordionButton,
- AccordionItem,
- AccordionPanel,
- Box,
- HStack,
- IconButton,
- Table,
- TableProps,
- Tbody,
- Td,
- Text,
- Th,
- Thead,
- Tooltip,
- Tr,
- useBreakpointValue,
- VStack,
-} from '@chakra-ui/react';
-import classNames from 'classnames';
-import { ActionButtons } from './action-buttons';
-import { pageSizeManagers } from 'utils/userPreferenceStorage';
-import { FC, Fragment, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-import { StatusBadge } from 'components/status-badge';
-import {
- Pagination,
- EmptySection,
- AccordionArrowIcon,
- EditIcon,
- Sort,
- StatusSortSelect,
- handleSort,
-} from 'components/table';
-import { fetchNodes, useNodes } from 'stores';
-import { useQuery } from '@tanstack/react-query';
-import { queryIds } from 'constants/query-ids';
-
-type ExpandedIndex = number | number[];
-
-type NodesTableProps = {} & TableProps;
-
-export const NodesTable: FC<NodesTableProps> = (props) => {
- const {
- nodesFilters: filters,
- onEditingNode,
- onAddingNode,
- onFilterChange,
- } = useNodes();
- const { data: nodes } = useQuery({ queryKey: [queryIds.nodes], queryFn: fetchNodes });
- const total = nodes?.length || 0;
-
- const { t } = useTranslation();
- const [selectedRow, setSelectedRow] = useState<ExpandedIndex | undefined>(
- undefined
- );
-
- const useTable = useBreakpointValue({ base: false, md: true });
-
- // TODO: Find a different mechancism to to detect ftiler
- // const isFiltered = users.length !== total;
-
- const handleStatusFilter = (e: any) => {
- onFilterChange({
- status: e.target.value.length > 0 ? e.target.value : undefined,
- });
- };
-
- const toggleAccordion = (index: number) => {
- setSelectedRow(index === selectedRow ? undefined : index);
- };
-
- const StatusSortSelectNodes = () => (
- <StatusSortSelect
- filters={filters}
- options={['healthy', 'unhealthy', 'disabled']}
- handleStatusFilter={handleStatusFilter}
- />
- );
-
- return (
- <Box id="node-table" overflowX={{ base: 'unset', md: 'unset' }} >
- <Accordion
- allowMultiple
- display={{ base: 'block', md: 'none' }}
- index={selectedRow}
- >
- <Table orientation="vertical" zIndex="docked" {...props}>
- <Thead zIndex="docked" position="relative">
- <Tr>
- <Th
- position="fixed"
- minW="120px"
- pl={4}
- pr={4}
- cursor={'pointer'}
- onClick={handleSort.bind(null, filters, 'name', onFilterChange)}
- >
- <HStack>
- <span>{t('name')}</span>
- <Sort sort={filters.sort} column="name" />
- </HStack>
- </Th>
- <Th
- position="fixed"
- minW="50px"
- pl={0}
- pr={0}
- w="140px"
- cursor={'pointer'}
- >
- <HStack spacing={0} position="relative">
- <Text
- position="absolute"
- _dark={{
- bg: 'gray.750',
- }}
- _light={{
- bg: '#F9FAFB',
- }}
- userSelect="none"
- pointerEvents="none"
- zIndex={1}
- w="100%"
- >
- {t('nodesTable.status')}
- {filters.status ? ': ' + filters.status : ''}
- </Text>
- <StatusSortSelectNodes />
- </HStack>
- </Th>
- <Th
- position="fixed"
- minW="100px"
- cursor={'pointer'}
- pr={0}
- onClick={handleSort.bind(null, filters, 'xray_version', onFilterChange)}
- >
- <HStack>
- <span>{t('nodesTable.xrayVersion')}</span>
- <Sort sort={filters.sort} column="xray_version" />
- </HStack>
- </Th>
- <Th
- position="fixed"
- minW="100px"
- cursor={'pointer'}
- pr={0}
- >
- <span>{t('nodesTable.ipPort')}</span>
- </Th>
- {/* Action buttons (certificate, core settings)*/}
- <Th
- position="fixed"
- minW="32px"
- w="32px"
- p={0}
- cursor={'pointer'}
- ></Th>
- </Tr>
- </Thead>
- <Tbody>
- {!useTable &&
- nodes?.map((node, i) => {
- return (
- <Fragment key={node.name}>
- <Tr
- onClick={toggleAccordion.bind(null, i)}
- cursor="pointer"
- >
- <Td borderBottom={0} minW="100px" pl={4} pr={4}>
- {node.name}
- </Td>
- <Td borderBottom={0} minW="50px" pl={0} pr={0}>
- <StatusBadge
- compact
- showDetail={false}
- status={node.status}
- />
- </Td>
- <Td borderBottom={0} minW="100px" pr={0}>
- {node.xray_version}
- </Td>
- <Td p={0} borderBottom={0} w="32px" minW="32px">
- <AccordionArrowIcon
- color="gray.600"
- _dark={{
- color: 'gray.400',
- }}
- transition="transform .2s ease-out"
- transform={
- selectedRow === i ? 'rotate(180deg)' : '0deg'
- }
- />
- </Td>
- </Tr>
- <Tr
- className="collapsible"
- onClick={toggleAccordion.bind(null, i)}
- >
- <Td p={0} colSpan={4}>
- <AccordionItem border={0}>
- <AccordionButton display="none"></AccordionButton>
- <AccordionPanel
- border={0}
- cursor="pointer"
- px={6}
- py={3}
- >
- <VStack justifyContent="space-between" spacing="4">
- <VStack
- alignItems="flex-start"
- w="full"
- spacing={-1}
- >
- <Text
- textTransform="capitalize"
- fontSize="xs"
- fontWeight="bold"
- color="gray.600"
- _dark={{
- color: 'gray.400',
- }}
- >
- {t('nodesTable.ipPort')}
- </Text>
- <Box width="full" minW="230px">
- {node.address}:{node.port}
- </Box>
- </VStack>
- <HStack w="full" justifyContent="space-between">
- <HStack>
- <ActionButtons node={node} />
- <Tooltip
- label={t('nodesDialog.editNode')}
- placement="top"
- >
- <IconButton
- p="0 !important"
- aria-label="Edit user"
- bg="transparent"
- _dark={{
- _hover: {
- bg: 'gray.700',
- },
- }}
- size={{
- base: 'sm',
- md: 'md',
- }}
- onClick={(e) => {
- e.stopPropagation();
- onEditingNode(node);
- }}
- >
- <EditIcon />
- </IconButton>
- </Tooltip>
- </HStack>
- </HStack>
- </VStack>
- </AccordionPanel>
- </AccordionItem>
- </Td>
- </Tr>
- </Fragment>
- );
- })}
- </Tbody>
- </Table>
- </Accordion>
- <Table
- orientation="vertical"
- display={{ base: 'none', md: 'table' }}
- {...props}
- >
- <Thead zIndex="docked" position="relative">
- <Tr>
- <Th
- minW="200px"
- cursor={'pointer'}
- onClick={handleSort.bind(null, filters, 'name', onFilterChange)}
- >
- <HStack>
- <span>{t('name')}</span>
- <Sort sort={filters.sort} column="name" />
- </HStack>
- </Th>
- <Th
- width="100px"
- minW="70px"
- cursor={'pointer'}
- >
- <HStack spacing={0} position="relative">
- <Text
- position="absolute"
- _dark={{
- bg: 'gray.750',
- }}
- _light={{
- bg: '#F9FAFB',
- }}
- userSelect="none"
- pointerEvents="none"
- zIndex={1}
- w="100%"
- >
- {t('nodesTable.status')}
- {filters.status ? ': ' + filters.status : ''}
- </Text>
- <StatusSortSelectNodes />
- </HStack>
- </Th>
- <Th
- width="100px"
- minW="70px"
- cursor={'pointer'}
- onClick={handleSort.bind(null, filters, 'xray_version', onFilterChange)}
- >
- <HStack>
- <span>{t('nodesTable.xrayVersion')}</span>
- <Sort sort={filters.sort} column="xray_version" />
- </HStack>
- </Th>
- <Th
- width="100px"
- minW="70px"
- cursor={'pointer'}
- onClick={handleSort.bind(null, filters, 'address', onFilterChange)}
- >
- <HStack>
- <span>{t('nodesTable.ipPort')}</span>
- <Sort sort={filters.sort} column="address" />
- </HStack>
- </Th>
- <Th
- width="60px"
- minW="50px"
- />
- </Tr>
- </Thead>
- <Tbody overflowY="auto">
- {useTable &&
- nodes?.map((node, i) => {
- return (
- <Tr
- key={node.name}
- className={classNames('interactive', {
- 'last-row': i === nodes.length - 1,
- })}
- onClick={() => onEditingNode(node)}
- >
- <Td minW="140px">
- <div className="flex-status">
- {node.name}
- </div>
- </Td>
- <Td width="400px" minW="150px">
- <StatusBadge
- status={node.status}
- />
- </Td>
- <Td width="350px" minW="150px">
- {node.xray_version}
- </Td>
- <Td width="350px" minW="150px">
- {node.address}:{node.port}
- </Td>
- <Td width="200px" minW="180px">
- <ActionButtons node={node} />
- </Td>
- </Tr>
- );
- })}
- {nodes?.length == 0 && (
- <Tr>
- <Td colSpan={5}>
- <EmptySection
- isFiltered={/* isFiltered */ false}
- noObjectT="nodesTable.noNode"
- noObjectMatchedT='nodesTable.noNodeMatched'
- createObjectT="addNode"
- onCreateObject={onAddingNode}
- />
- </Td>
- </Tr>
- )}
- </Tbody>
- </Table>
- <Pagination filters={filters} total={total} onFilterChange={onFilterChange} pageSizeManager={pageSizeManagers.nodes} />
- </Box>
- );
-};
diff --git a/app/dashboard/src/pages/nodes/usage.tsx b/app/dashboard/src/pages/nodes/usage.tsx
deleted file mode 100644
index 757eeda..0000000
--- a/app/dashboard/src/pages/nodes/usage.tsx
+++ /dev/null
@@ -1,86 +0,0 @@
-import {
- Box,
- CircularProgress,
- VStack,
- chakra,
- useColorMode,
-} from '@chakra-ui/react';
-import { ChartPieIcon } from '@heroicons/react/24/outline';
-import { FilterUsageType } from 'types/filter';
-import { useNodes } from 'stores';
-import dayjs from 'dayjs';
-import { FC, Suspense, useEffect, useState } from 'react';
-import ReactApexChart from 'react-apexcharts';
-import { useTranslation } from 'react-i18next';
-import { Icon } from 'components/icon';
-import { UsageFilter, createUsageConfig } from 'components/usage-filter';
-import { StatisticsCardWide } from 'components/statistics-card';
-
-const UsageIcon = chakra(ChartPieIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
-
-export type NodesUsageProps = {};
-
-export const NodesUsage: FC<NodesUsageProps> = () => {
- const { isShowingNodesUsage } = useNodes();
- const { fetchNodesUsage } = useNodes();
- const { t } = useTranslation();
- const { colorMode } = useColorMode();
-
- const usageTitle = t('userDialog.total');
- const [usage, setUsage] = useState(createUsageConfig(colorMode, usageTitle));
- const [usageFilter, setUsageFilter] = useState('1m');
- const fetchUsageWithFilter = (query: FilterUsageType) => {
- fetchNodesUsage(query).then((data: any) => {
- const labels = [];
- const series = [];
- for (const key in data.usages) {
- const entry = data.usages[key];
- series.push(entry.uplink + entry.downlink);
- labels.push(entry.node_name);
- }
- setUsage(createUsageConfig(colorMode, usageTitle, series, labels));
- });
- };
-
- useEffect(() => {
- if (isShowingNodesUsage) {
- fetchUsageWithFilter({
- start: dayjs().utc().subtract(30, 'day').format('YYYY-MM-DDTHH:00:00'),
- });
- }
- }, [isShowingNodesUsage]);
-
- return (
- <StatisticsCardWide
- title={t('header.nodesUsage')}
- icon={<Icon color="primary">
- <UsageIcon color="white" /> </Icon>}
- content={
- <VStack gap={4}>
- <UsageFilter
- defaultValue={usageFilter}
- onChange={(filter, query) => {
- setUsageFilter(filter);
- fetchUsageWithFilter(query);
- }}
- />
- <Box justifySelf="center" w="full" maxW="300px" mt="4">
- <Suspense fallback={<CircularProgress isIndeterminate />}>
- <ReactApexChart
- options={usage.options}
- series={usage.series}
- type="donut"
- height="500px"
- />
- </Suspense>
- </Box>
- </VStack>
-
- } />
- );
-};
diff --git a/app/dashboard/src/pages/routes.tsx b/app/dashboard/src/pages/routes.tsx
deleted file mode 100644
index 663b68b..0000000
--- a/app/dashboard/src/pages/routes.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import { lazy } from 'react';
-import { createHashRouter } from 'react-router-dom';
-import { fetchAdminLoader } from 'service/http';
-import { pages } from 'stores';
-
-const ConsoleLayout = lazy(() => import('layouts/console-layout'));
-const Home = lazy(() => import('./home'));
-const Hosts = lazy(() => import('./hosts'));
-const Users = lazy(() => import('./users'));
-const Login = lazy(() => import('./login'));
-const Nodes = lazy(() => import('./nodes'));
-const Services = lazy(() => import('./services'));
-
-export const router = createHashRouter([
- {
- path: '/',
- errorElement: <Login />,
- loader: fetchAdminLoader,
- element: <ConsoleLayout />,
- children: [
- {
- path: pages.home.path,
- element: <Home />,
- },
- {
- path: pages.users.path,
- element: <Users />,
- },
- {
- path: pages.services.path,
- element: <Services />,
- },
- {
- path: pages.nodes.path,
- element: <Nodes />,
- },
- {
- path: pages.hosts.path,
- element: <Hosts />,
- },
- ],
- },
- {
- path: '/login/',
- element: <Login />,
- },
-]);
diff --git a/app/dashboard/src/pages/services/dialog/default-values.ts b/app/dashboard/src/pages/services/dialog/default-values.ts
deleted file mode 100644
index 371860c..0000000
--- a/app/dashboard/src/pages/services/dialog/default-values.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-import { FormType } from './form-schema';
-
-export const getDefaultValues = (): FormType => {
- return {
- name: '',
- inbounds: [],
- };
-};
diff --git a/app/dashboard/src/pages/services/dialog/form-schema.ts b/app/dashboard/src/pages/services/dialog/form-schema.ts
deleted file mode 100644
index 79fb2b1..0000000
--- a/app/dashboard/src/pages/services/dialog/form-schema.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-
-import { z } from 'zod';
-import { ServiceCreate } from 'types';
-
-export type FormType = Pick<ServiceCreate, 'name' | 'inbounds'>;
-export const schema = z.object({
- name: z.string().min(1, { message: 'Name is required' }),
- inbounds: z.array(z.number()).nonempty({ message: 'At least one inbounds is required' }),
-});
diff --git a/app/dashboard/src/pages/services/dialog/inbounds-field.tsx b/app/dashboard/src/pages/services/dialog/inbounds-field.tsx
deleted file mode 100644
index a2a2ecc..0000000
--- a/app/dashboard/src/pages/services/dialog/inbounds-field.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { FormControl, FormLabel, FormErrorMessage, Center, Spinner } from '@chakra-ui/react';
-import { Inbounds, InboundType } from 'types';
-import { TFunction } from 'i18next';
-import { Controller } from 'react-hook-form';
-import { InboundsSelectList } from './inbounds-select-list';
-import { InboundCard } from 'components/inbounds-card';
-
-
-interface InboundsFieldProps {
- form: any;
- inbounds: Inbounds;
- t: TFunction<'translation', undefined, 'translation'>;
-}
-
-export const InboundsField = ({ form, t, inbounds }: InboundsFieldProps) => {
- return inbounds.length === 0 ? (
- <Center><Spinner /></Center>
- ) : (
- <FormControl
- isInvalid={
- !!form.formState.errors.services?.message
- }
- >
- <FormLabel>{t('inbounds')}</FormLabel>
- <Controller
- control={form.control}
- name="inbounds"
- render={() => {
- return (
- <InboundsSelectList
- list={inbounds}
- renderCheckboxContent={(inbound: InboundType) => (
- <InboundCard tag={inbound.tag} protocol={inbound.protocol} nodeName={inbound.node.name} />
- )}
- />
- );
- }}
- />
- <FormErrorMessage>
- {t(form.formState.errors.services?.message as string)}
- </FormErrorMessage>
- </FormControl>
- );
-}
diff --git a/app/dashboard/src/pages/services/dialog/inbounds-select-list.tsx b/app/dashboard/src/pages/services/dialog/inbounds-select-list.tsx
deleted file mode 100644
index 84222e9..0000000
--- a/app/dashboard/src/pages/services/dialog/inbounds-select-list.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-
-import {
- Stack,
-} from '@chakra-ui/react';
-import { ListCheckBox } from 'components/list-check-box';
-import { Inbounds, InboundType } from 'types';
-import { forwardRef, Fragment, ReactNode } from 'react';
-import {
- useFormContext,
-} from 'react-hook-form';
-
-interface InboundsSelectListProps {
- list: Inbounds;
- renderCheckboxContent: (inbound: InboundType) => ReactNode;
-}
-
-export const InboundsSelectList = forwardRef<HTMLDivElement, InboundsSelectListProps>(
- function({ list, renderCheckboxContent }, ref) {
- const form = useFormContext();
-
- const handleInboundToggle = (inboundId: number) => {
- const currentInbounds = form.getValues('inbounds');
- const isSelected = currentInbounds.includes(inboundId);
-
- let updatedInbounds = currentInbounds.filter((id: number) => id !== inboundId);
-
- if (!isSelected) {
- updatedInbounds = [...currentInbounds, inboundId];
- }
-
- form.setValue('inbounds', updatedInbounds, { shouldValidate: true });
- };
-
- return (
- <Stack spacing={3} ref={ref}>
- {list.map((inbound: InboundType) => (
- <Fragment key={inbound.id}>
- <ListCheckBox
- isChecked={form.getValues('inbounds').includes(inbound.id)}
- onChange={() => handleInboundToggle(inbound.id)}
- value={String(inbound.id)}
- renderContent={() => renderCheckboxContent(inbound)}
- />
- </Fragment>
- ))}
- </Stack>
- );
- }
-);
diff --git a/app/dashboard/src/pages/services/dialog/index.tsx b/app/dashboard/src/pages/services/dialog/index.tsx
deleted file mode 100644
index 4f31a3d..0000000
--- a/app/dashboard/src/pages/services/dialog/index.tsx
+++ /dev/null
@@ -1,224 +0,0 @@
-
-import {
- Alert,
- AlertIcon,
- Flex,
- Button,
- Tooltip,
- HStack,
- Spinner,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- Modal,
- VStack,
- useToast,
- ModalOverlay,
- IconButton,
-} from '@chakra-ui/react';
-import { zodResolver } from '@hookform/resolvers/zod';
-import { FC, useEffect, useState } from 'react';
-import { FormProvider, useForm } from 'react-hook-form';
-import { useTranslation } from 'react-i18next';
-import {
- AddIcon,
- DialogModalHeader,
- DialogModalFooter,
- DeleteIcon,
- EditIcon
-} from 'components/dialog';
-import { getDefaultValues } from './default-values';
-import { schema, FormType } from './form-schema';
-import { InboundsField } from './inbounds-field';
-import { NameField } from './name-field';
-import { InboundType, Service, ServiceCreate } from 'types';
-import { fetchInbounds, useInbounds, useServices } from 'stores';
-import { useQuery } from '@tanstack/react-query';
-import { queryIds } from 'constants/query-ids';
-
-const formatService = (service: Service): FormType => {
- const inbounds: number[] = service.inbounds.map((inbound: number | InboundType): number => {
- return (typeof inbound !== 'number') ? inbound.id : inbound;
- });
- return {
- ...service,
- inbounds,
- };
-};
-
-export type ServiceDialogProps = {};
-
-export const ServiceDialog: FC<ServiceDialogProps> = () => {
- const {
- editingService,
- isCreatingNewService,
- onCreateService,
- editService,
- onEditingService,
- createService,
- onDeletingService,
- } = useServices();
- const { refetchInbounds } = useInbounds();
- const {
- data: inbounds,
- } = useQuery({ queryKey: [queryIds.inbounds], queryFn: () => fetchInbounds() });
- const isEditing = !!editingService;
- const isOpen = isCreatingNewService || isEditing;
- const [loading, setLoading] = useState(false);
- const [error, setError] = useState<string | null>('');
- const toast = useToast();
- const { t } = useTranslation();
-
- const form = useForm<FormType>({
- defaultValues: getDefaultValues(),
- resolver: zodResolver(schema),
- });
-
- useEffect(() => {
- if (isOpen) {
- refetchInbounds();
- form.reset();
- }
- }, [isOpen]);
-
-
- useEffect(() => {
- if (editingService) {
- form.reset(formatService(editingService));
- }
- }, [editingService]);
-
- const submit = async (values: FormType) => {
- setLoading(true);
- const methods = { edited: editService, created: createService };
- const method = isEditing ? 'edited' : 'created';
- setError(null);
- const { inbounds, name } = values;
-
- let body: ServiceCreate = { name, inbounds, id: editingService?.id };
-
- await methods[method](body)
- .then(() => {
- toast({
- title: t(
- isEditing ? 'serviceDialog.serviceEdited' : 'serviceDialog.serviceCreated',
- { name: values.name }
- ),
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- onClose();
- })
- .catch((err) => {
- if (err?.response?.status === 409 || err?.response?.status === 400)
- setError(err?.response?._data?.detail);
- if (err?.response?.status === 422) {
- Object.keys(err.response._data.detail).forEach((key) => {
- setError(err?.response._data.detail[key] as string);
- form.setError(key as 'name' | 'inbounds', { type: 'custom', message: err.response._data.detail[key], });
- });
- }
- })
- .finally(() => {
- setLoading(false);
- });
- };
-
- const onClose = () => {
- form.reset(getDefaultValues());
- onCreateService(false);
- onEditingService(null);
- setError(null);
- };
-
- const disabled = loading;
-
- return (
- <Modal isOpen={isOpen} onClose={onClose} size="lg">
- <ModalOverlay bg="blackAlpha.300" backdropFilter="blur(10px)" />
- <FormProvider {...form} formState={form.formState}>
- <ModalContent mx="3">
- <form onSubmit={form.handleSubmit(submit)}>
- <DialogModalHeader HeaderIcon={isEditing ? EditIcon : AddIcon} title={isEditing ? t('serviceDialog.editServiceTitle') : t('serviceDialog.createNewService')} />
- <ModalCloseButton mt={3} disabled={disabled} />
- <ModalBody>
- <VStack justifyContent="space-between">
- <Flex
- flexDirection="column"
- gridAutoRows="min-content"
- w="full"
- >
- <NameField form={form} disabled={disabled} isEditing={isEditing} t={t} />
- <InboundsField t={t} inbounds={inbounds || []} form={form} />
- </Flex>
- {error && (
- <Alert
- status="error"
- display={{ base: 'none', md: 'flex' }}
- >
- <AlertIcon />
- {error}
- </Alert>
- )}
- </VStack>
- {error && (
- <Alert
- mt="3"
- status="error"
- display={{ base: 'flex', md: 'none' }}
- >
- <AlertIcon />
- {error}
- </Alert>
- )}
- </ModalBody>
- <DialogModalFooter>
- <HStack
- justifyContent="flex-start"
- w={{
- base: 'full',
- sm: 'unset',
- }}
- >
- {isEditing && editingService !== null && (
- <>
- <Tooltip label={t('delete')} placement="top">
- <IconButton
- aria-label="Delete"
- size="sm"
- onClick={() => {
- onDeletingService(editingService);
- onClose();
- }}
- >
- <DeleteIcon />
- </IconButton>
- </Tooltip>
- </>
- )}
- </HStack>
- <HStack
- w="full"
- maxW={{ md: '50%', base: 'full' }}
- justify="end"
- >
- <Button
- type="submit"
- size="sm"
- px="8"
- colorScheme="primary"
- leftIcon={loading ? <Spinner size="xs" /> : undefined}
- disabled={false}
- >
- {isEditing ? t('serviceDialog.editService') : t('createService')}
- </Button>
- </HStack>
- </DialogModalFooter>
- </form>
- </ModalContent>
- </FormProvider>
- </Modal >
- );
-};
diff --git a/app/dashboard/src/pages/services/dialog/name-field.tsx b/app/dashboard/src/pages/services/dialog/name-field.tsx
deleted file mode 100644
index 240d677..0000000
--- a/app/dashboard/src/pages/services/dialog/name-field.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-
-import { HStack, Input, Tooltip, Box, Switch, FormControl, FormLabel } from '@chakra-ui/react';
-import { TFunction } from 'i18next';
-import { Controller } from 'react-hook-form';
-
-interface NameFieldProps {
- form: any;
- isEditing: boolean;
- t: TFunction<'translation', undefined, 'translation'>;
- disabled: boolean;
-}
-
-export const NameField = ({ form, isEditing, t, disabled }: NameFieldProps) => {
- return (
- <FormControl mb={'10px'}>
- <FormLabel>{t('name')}</FormLabel>
- <HStack>
- <Input
- size="sm"
- type="text"
- borderRadius="6px"
- error={form.formState.errors.name?.message}
- disabled={disabled}
- {...form.register('name')}
- />
- {isEditing && (
- <HStack px={1}>
- <Controller
- name="status"
- control={form.control}
- render={({ field }) => {
- return (
- <Tooltip
- placement="top"
- label={'status: ' + field.value}
- textTransform="capitalize"
- >
- <Box>
- <Switch
- colorScheme="primary"
- disabled={
- field.value !== 'active' &&
- field.value !== 'disabled'
- }
- isChecked={field.value === 'active'}
- onChange={(e) => {
- if (e.target.checked) {
- field.onChange('active');
- } else {
- field.onChange('disabled');
- }
- }}
- />
- </Box>
- </Tooltip>
- );
- }}
- />
- </HStack>
- )}
- </HStack>
- </FormControl>
- )
-}
diff --git a/app/dashboard/src/pages/services/filters.tsx b/app/dashboard/src/pages/services/filters.tsx
deleted file mode 100644
index e846b0a..0000000
--- a/app/dashboard/src/pages/services/filters.tsx
+++ /dev/null
@@ -1,137 +0,0 @@
-import {
- BoxProps,
- Button,
- chakra,
- Grid,
- GridItem,
- HStack,
- IconButton,
- Input,
- InputGroup,
- InputLeftElement,
- InputRightElement,
- Spinner,
-} from '@chakra-ui/react';
-import {
- ArrowPathIcon,
- MagnifyingGlassIcon,
- XMarkIcon,
-} from '@heroicons/react/24/outline';
-import classNames from 'classnames';
-import { useDashboard, useServices } from 'stores';
-import debounce from 'lodash.debounce';
-import React, { FC, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-
-const iconProps = {
- baseStyle: {
- w: 4,
- h: 4,
- },
-};
-
-const SearchIcon = chakra(MagnifyingGlassIcon, iconProps);
-const ClearIcon = chakra(XMarkIcon, iconProps);
-export const ReloadIcon = chakra(ArrowPathIcon, iconProps);
-
-export type FilterProps = {} & BoxProps;
-const setSearchField = debounce((name: string) => {
- useServices.getState().onFilterChange({
- ...useServices.getState().servicesFilters,
- offset: 0,
- name,
- });
-}, 300);
-
-export const ServicesFilters: FC<FilterProps> = ({ ...props }) => {
- const { loading } =
- useDashboard();
- const { servicesFilters: filters, refetchServices, onFilterChange, onCreateService } = useServices();
- const { t } = useTranslation();
- const [search, setSearch] = useState('');
- const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
- setSearch(e.target.value);
- setSearchField(e.target.value);
- };
- const clear = () => {
- setSearch('');
- onFilterChange({
- ...filters,
- offset: 0,
- name: '',
- });
- };
- return (
- <Grid
- id="users-filters"
- templateColumns={{
- lg: 'repeat(3, 1fr)',
- md: 'repeat(4, 1fr)',
- base: 'repeat(1, 1fr)',
- }}
- position="sticky"
- top={0}
- mx="-6"
- px="6"
- rowGap={4}
- gap={{
- lg: 4,
- base: 0,
- }}
- bg="var(--chakra-colors-chakra-body-bg)"
- py={4}
- zIndex="docked"
- {...props}
- >
- <GridItem colSpan={{ base: 1, md: 2, lg: 1 }} order={{ base: 2, md: 1 }}>
- <InputGroup>
- <InputLeftElement pointerEvents="none" children={<SearchIcon />} />
- <Input
- placeholder={t('search')}
- value={search}
- borderColor="light-border"
- onChange={onChange}
- />
- <InputRightElement>
- {loading && <Spinner size="xs" />}
- {filters.name && filters.name.length > 0 && (
- <IconButton
- onClick={clear}
- aria-label="clear"
- size="xs"
- variant="ghost"
- >
- <ClearIcon />
- </IconButton>
- )}
- </InputRightElement>
- </InputGroup>
- </GridItem>
- <GridItem colSpan={2} order={{ base: 1, md: 2 }}>
- <HStack justifyContent="flex-end" alignItems="center" h="full">
- <IconButton
- aria-label="refresh services"
- disabled={loading}
- onClick={refetchServices}
- size="sm"
- variant="outline"
- >
- <ReloadIcon
- className={classNames({
- 'animate-spin': loading,
- })}
- />
- </IconButton>
- <Button
- colorScheme="primary"
- size="sm"
- onClick={() => onCreateService(true)}
- px={5}
- >
- {t('createService')}
- </Button>
- </HStack>
- </GridItem>
- </Grid>
- );
-};
diff --git a/app/dashboard/src/pages/services/index.tsx b/app/dashboard/src/pages/services/index.tsx
deleted file mode 100644
index 105566c..0000000
--- a/app/dashboard/src/pages/services/index.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-
-import { FC } from 'react';
-import { ServicesFilters } from './filters';
-import { ServicesTable } from './table';
-import { pages } from 'stores';
-import { ServiceDialog } from './dialog';
-import { DeleteServiceModal } from './modals/delete-modal';
-import Page from 'components/page';
-
-
-const ServicesPage: FC = () => {
- return (
- <Page page={pages.services}>
- <ServiceDialog />
- <DeleteServiceModal />
- <ServicesFilters />
- <ServicesTable />
- </Page>
- )
-}
-
-export default ServicesPage;
diff --git a/app/dashboard/src/pages/services/modals/delete-modal.tsx b/app/dashboard/src/pages/services/modals/delete-modal.tsx
deleted file mode 100644
index e8d8d0f..0000000
--- a/app/dashboard/src/pages/services/modals/delete-modal.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import {
- useToast,
-} from '@chakra-ui/react';
-import { useServices } from 'stores';
-import { FC, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-import { DeleteModal } from 'components/delete-modal';
-
-export const DeleteServiceModal: FC = () => {
- const { deleteService, refetchServices, deletingService, onDeletingService } = useServices();
- const { t } = useTranslation();
- const toast = useToast();
- const [loading, setLoading] = useState(false);
- const onClose = () => {
- onDeletingService(null);
- };
-
- const onDelete = () => {
- if (deletingService) {
- setLoading(true);
- deleteService(deletingService)
- .then(() => {
- refetchServices();
- toast({
- title: t('deleteService.deleteSuccess', { name: deletingService.name }),
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- })
- .then(onClose)
- .finally(setLoading.bind(null, false));
- }
- };
-
- return (
- <DeleteModal
- deleteObjectTitleT={'deleteService.title'}
- deleteObjectPromptT={'deleteService.prompt'}
- onDelete={onDelete}
- loading={loading}
- isOpen={!!deletingService}
- onClose={onClose}
- deletingObjectName={deletingService?.name}
- />
- );
-};
diff --git a/app/dashboard/src/pages/services/table.tsx b/app/dashboard/src/pages/services/table.tsx
deleted file mode 100644
index 281e6b4..0000000
--- a/app/dashboard/src/pages/services/table.tsx
+++ /dev/null
@@ -1,136 +0,0 @@
-
-import {
- Box,
- HStack,
- Table,
- TableProps,
- Tbody,
- Td,
- Th,
- Thead,
- Tr,
-} from '@chakra-ui/react';
-
-import classNames from 'classnames';
-import { FC } from 'react';
-import { useTranslation } from 'react-i18next';
-import {
- EmptySection,
- handleSort,
- Pagination,
- Sort
-} from 'components/table';
-import { fetchServices, useServices } from 'stores';
-import { pageSizeManagers } from 'utils/userPreferenceStorage';
-import { useQuery } from '@tanstack/react-query';
-import { queryIds } from 'constants/query-ids';
-
-type ServicesTableProps = {} & TableProps;
-
-export const ServicesTable: FC<ServicesTableProps> = (props) => {
- const {
- servicesFilters: filters,
- onEditingService,
- onCreateService,
- onFilterChange,
- } = useServices();
- const { data: services } = useQuery({
- queryKey: [queryIds.services],
- queryFn: () => { return fetchServices(filters) }
- });
- const { t } = useTranslation();
-
- return (
- <Box id="services-table" h="45vh" overflowX={{ base: 'unset', md: 'unset' }} >
- <Table orientation="vertical" zIndex="docked" {...props}>
- <Thead zIndex="docked" position="relative">
- <Tr>
- <Th
- position="sticky"
- minW="200px"
- pl={4}
- pr={4}
- cursor={'pointer'}
- onClick={handleSort.bind(null, filters, 'name', onFilterChange)}
- >
- <HStack>
- <span>{t('services')}</span>
- <Sort sort={filters.sort} column="name" />
- </HStack>
- </Th>
- <Th
- position="sticky"
- minW="50px"
- cursor={'pointer'}
- pr={0}
- onClick={handleSort.bind(null, filters, 'users_number', onFilterChange)}
- >
- <HStack>
- <span>{t('servicesTable.usersNumber')}</span>
- <Sort sort={filters.sort} column="users_number" />
- </HStack>
- </Th>
- <Th
- position="sticky"
- minW="50px"
- cursor={'pointer'}
- pr={0}
- onClick={handleSort.bind(null, filters, 'inbounds_number', onFilterChange)}
- >
- <HStack>
- <span>{t('servicesTable.inboundsNumber')}</span>
- <Sort sort={filters.sort} column="inbounds_number" />
- </HStack>
- </Th>
- </Tr>
- </Thead>
- <Tbody>
- {services?.map((service, i) => {
- return (
- <Tr
- cursor="pointer"
- key={service.id}
- className={classNames('interactive', {
- 'last-row': i === (services.length - 1),
- })}
- onClick={(e) => {
- e.stopPropagation();
- onEditingService(service);
- }}
- >
- <Td borderBottom={0} minW="100px" pl={4} pr={4}>
- {service.name}
- </Td>
- <Td borderBottom={0} minW="50px" pl={6} pr={6}>
- {service.users.length}
- </Td>
- <Td borderBottom={0} minW="50px" pr={0}>
- {service.inbounds.length}
- </Td>
- </Tr>
- );
- })}
- {services?.length == 0 && (
- <Tr>
- <Td colSpan={3}>
- <EmptySection
- isFiltered={false}
- createObjectT='createService'
- onCreateObject={onCreateService}
- noObjectT="servicesTable.noService"
- noObjectMatchedT='servicesTable.noServiceMatched'
- />
- </Td>
- </Tr>
- )}
- </Tbody>
- </Table>
- <Pagination
- total={services?.length || 0}
- onFilterChange={onFilterChange}
- filters={filters}
- pageSizeManager={pageSizeManagers.services}
- />
- </Box>
- );
-};
diff --git a/app/dashboard/src/pages/users/dialog/data-limit-field.tsx b/app/dashboard/src/pages/users/dialog/data-limit-field.tsx
deleted file mode 100644
index d225b53..0000000
--- a/app/dashboard/src/pages/users/dialog/data-limit-field.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { FormControl, FormLabel } from '@chakra-ui/react';
-import { Input } from 'components/input';
-import { TFunction } from 'i18next';
-import { Controller } from 'react-hook-form';
-
-
-interface DataLimitFieldProps {
- form: any;
- disabled: boolean;
- t: TFunction<'translation', undefined, 'translation'>;
-}
-
-export const DataLimitField = ({ form, disabled, t }: DataLimitFieldProps) => {
- return (
- <FormControl mb={'10px'}>
- <FormLabel>{t('userDialog.dataLimit')}</FormLabel>
- <Controller
- control={form.control}
- name="data_limit"
- render={({ field }) => {
- return (
- <Input
- endAdornment="GB"
- type="number"
- size="sm"
- borderRadius="6px"
- onChange={field.onChange}
- disabled={disabled}
- error={
- form.formState.errors.data_limit?.message
- }
- value={field.value ? String(field.value) : ''}
- />
- );
- }}
- />
- </FormControl>
- )
-}
diff --git a/app/dashboard/src/pages/users/dialog/default-values.ts b/app/dashboard/src/pages/users/dialog/default-values.ts
deleted file mode 100644
index 3c516d3..0000000
--- a/app/dashboard/src/pages/users/dialog/default-values.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-
-import { FormType } from './form-schema';
-
-export const getDefaultValues = (): FormType => {
-
- return {
- services: [],
- data_limit: 0,
- expire: null,
- username: '',
- data_limit_reset_strategy: 'no_reset',
- status: 'active',
- note: '',
- };
-};
diff --git a/app/dashboard/src/pages/users/dialog/expire-date-field.tsx b/app/dashboard/src/pages/users/dialog/expire-date-field.tsx
deleted file mode 100644
index 7019df8..0000000
--- a/app/dashboard/src/pages/users/dialog/expire-date-field.tsx
+++ /dev/null
@@ -1,91 +0,0 @@
-import {
- FormControl,
- FormHelperText,
- FormLabel,
-} from '@chakra-ui/react';
-import dayjs from 'dayjs';
-import { i18n, TFunction } from 'i18next';
-import ReactDatePicker from 'react-datepicker';
-import { Controller } from 'react-hook-form';
-import { relativeExpiryDate } from 'utils/dateFormatter';
-import { Input } from 'components/input';
-
-interface ExpireDateFieldProps {
- form: any;
- disabled: boolean;
- t: TFunction<'translation', undefined, 'translation'>;
- i18n: i18n;
-}
-
-export const ExpireDateField = ({ form, t, i18n, disabled }: ExpireDateFieldProps) => {
- return (
- <FormControl mb={'10px'}>
- <FormLabel>{t('userDialog.expiryDate')}</FormLabel>
- <Controller
- name="expire"
- control={form.control}
- render={({ field }) => {
- function createDateAsUTC(num: number) {
- return dayjs(
- dayjs(num * 1000).utc()
- // .format("MMMM D, YYYY") // exception with: dayjs.locale(lng);
- ).toDate();
- }
- const { status, time } = relativeExpiryDate(
- field.value
- );
- return (
- <>
- <ReactDatePicker
- locale={i18n.language.toLocaleLowerCase()}
- dateFormat={t('dateFormat')}
- minDate={new Date()}
- selected={
- field.value
- ? createDateAsUTC(field.value)
- : undefined
- }
- onChange={(date: Date) => {
- field.onChange({
- target: {
- value: date
- ? dayjs(
- dayjs(date)
- .set('hour', 23)
- .set('minute', 59)
- .set('second', 59)
- )
- .utc()
- .valueOf() / 1000
- : 0,
- name: 'expire',
- },
- });
- }}
- customInput={
- <Input
- size="sm"
- type="text"
- borderRadius="6px"
- clearable
- disabled={disabled}
- error={
- form.formState.errors.expire?.message
- }
- />
- }
- />
- {field.value ? (
- <FormHelperText>
- {t(status, { time: time })}
- </FormHelperText>
- ) : (
- ''
- )}
- </>
- );
- }}
- />
- </FormControl>
- )
-}
diff --git a/app/dashboard/src/pages/users/dialog/form-schema.ts b/app/dashboard/src/pages/users/dialog/form-schema.ts
deleted file mode 100644
index 9f452c8..0000000
--- a/app/dashboard/src/pages/users/dialog/form-schema.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-
-import { z } from 'zod';
-import { UserCreate } from 'types';
-
-export type FormType = Pick<UserCreate, keyof UserCreate>;
-export const schema = z.object({
- username: z.string().min(1, { message: 'Username is required' }),
- note: z.string().nullable(),
- data_limit: z
- .string()
- .min(0, 'The minimum number is 0')
- .or(z.number())
- .nullable()
- .transform((str) => {
- if (str) return Number((parseFloat(String(str)) * 1073741824).toFixed(5));
- return 0;
- }),
- expire: z.number().nullable(),
- data_limit_reset_strategy: z.string(),
- status: z.string(),
- services: z.array(z.number()).nonempty({ message: 'At least one service is required' }),
-});
diff --git a/app/dashboard/src/pages/users/dialog/icons.ts b/app/dashboard/src/pages/users/dialog/icons.ts
deleted file mode 100644
index 8f02730..0000000
--- a/app/dashboard/src/pages/users/dialog/icons.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-
-import { chakra } from '@chakra-ui/react';
-import {
- ChartPieIcon,
-} from '@heroicons/react/24/outline';
-export const UserUsageIcon = chakra(ChartPieIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
diff --git a/app/dashboard/src/pages/users/dialog/index.tsx b/app/dashboard/src/pages/users/dialog/index.tsx
deleted file mode 100644
index d2ac165..0000000
--- a/app/dashboard/src/pages/users/dialog/index.tsx
+++ /dev/null
@@ -1,372 +0,0 @@
-import {
- Alert,
- Button,
- Tooltip,
- IconButton,
- Spinner,
- AlertIcon,
- Box,
- Collapse,
- Flex,
- Grid,
- GridItem,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- Modal,
- VStack,
- useColorMode,
- useToast,
- ModalOverlay,
- HStack,
-} from '@chakra-ui/react';
-import { zodResolver } from '@hookform/resolvers/zod';
-import dayjs from 'dayjs';
-import { FC, useEffect, useState } from 'react';
-import ReactApexChart from 'react-apexcharts';
-import { FormProvider, useForm, useWatch } from 'react-hook-form';
-import { useTranslation } from 'react-i18next';
-import {
- User,
- FilterUsageType,
- UserCreate,
- Service
-} from 'types';
-import { UsageFilter, createUsageConfig } from 'components/usage-filter';
-import {
- AddIcon,
- EditIcon,
- DialogModalHeader,
- DialogModalFooter,
- DeleteIcon
-} from 'components/dialog';
-import { UserUsageIcon } from './icons';
-import { getDefaultValues } from './default-values';
-import { schema, FormType } from './form-schema';
-import { ServicesField } from './services-field';
-import { UsernameField } from './username-field';
-import { DataLimitField } from './data-limit-field';
-import { PeriodicUsageReset } from './periodic-usage-reset';
-import { ExpireDateField } from './expire-date-field';
-import { NoteField } from './note-field';
-import { useUsers, useServices, fetchServices } from 'stores';
-import { queryIds } from 'constants/query-ids';
-import { useQuery } from '@tanstack/react-query';
-
-const formatUser = (user: User): FormType => {
- const services: number[] = user.services.map((service: number | Service): number => {
- return (typeof service !== 'number') ? service.id : service;
- });
- return {
- ...user,
- services,
- data_limit: user.data_limit
- ? Number((user.data_limit / 1073741824).toFixed(5))
- : user.data_limit,
- };
-};
-
-export type UserDialogProps = {};
-
-export const UserDialog: FC<UserDialogProps> = () => {
- const {
- editingUser,
- isCreatingNewUser,
- onCreateUser,
- editUser,
- fetchUserUsage,
- onEditingUser,
- createUser,
- onDeletingUser,
- } = useUsers();
- const { refetchServices, servicesFilters: filters } = useServices();
- const { data: services } = useQuery({
- queryKey: [queryIds.services],
- initialData: [],
- queryFn: () => {
- return fetchServices(filters);
- }
- });
- const isEditing = !!editingUser;
- const isOpen = isCreatingNewUser || isEditing;
- const [loading, setLoading] = useState(false);
- const [error, setError] = useState<string | null>('');
- const toast = useToast();
- const { t, i18n } = useTranslation();
-
- const { colorMode } = useColorMode();
-
- const [usageVisible, setUsageVisible] = useState(false);
- const handleUsageToggle = () => {
- setUsageVisible((current) => !current);
- };
-
- const form = useForm<FormType>({
- defaultValues: getDefaultValues(),
- resolver: zodResolver(schema),
- });
-
- const [dataLimit] = useWatch({
- control: form.control,
- name: ['data_limit'],
- });
-
- const usageTitle = t('userDialog.total');
- const [usage, setUsage] = useState(createUsageConfig(colorMode, usageTitle));
- const [usageFilter, setUsageFilter] = useState('1m');
- const fetchUsageWithFilter = (query: FilterUsageType) => {
- fetchUserUsage(editingUser!, query).then((data: any) => {
- const labels = [];
- const series = [];
- for (const key in data.usages) {
- series.push(data.usages[key].used_traffic);
- labels.push(data.usages[key].node_name);
- }
- setUsage(createUsageConfig(colorMode, usageTitle, series, labels));
- });
- };
-
- useEffect(() => {
- if (isOpen) {
- refetchServices();
- }
- }, [isOpen]);
-
-
- useEffect(() => {
- if (editingUser) {
- form.reset(formatUser(editingUser));
-
- fetchUsageWithFilter({
- start: dayjs().utc().subtract(30, 'day').format('YYYY-MM-DDTHH:00:00'),
- });
- }
- }, [editingUser]);
-
- const submit = async (values: FormType) => {
- setLoading(true);
- const methods = { edited: editUser, created: createUser };
- const method = isEditing ? 'edited' : 'created';
- setError(null);
- const { services, username, ...rest } = values;
-
- let body: UserCreate = {
- ...rest,
- username,
- services,
- data_limit: values.data_limit,
- data_limit_reset_strategy:
- values.data_limit && values.data_limit > 0
- ? values.data_limit_reset_strategy
- : 'no_reset',
- status:
- values.status === 'active' || values.status === 'disabled'
- ? values.status
- : 'active',
- };
-
- await methods[method](body)
- .then(() => {
- toast({
- title: t(
- isEditing ? 'userDialog.userEdited' : 'userDialog.userCreated',
- { username: values.username }
- ),
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- onClose();
- })
- .catch((err) => {
- if (err?.response?.status === 409 || err?.response?.status === 400)
- setError(err?.response?._data?.detail);
- if (err?.response?.status === 422) {
- Object.keys(err.response._data.detail).forEach((key) => {
- setError(err?.response._data.detail[key] as string);
- form.setError(
- key as 'services' | 'username' | 'data_limit' | 'expire',
- {
- type: 'custom',
- message: err.response._data.detail[key],
- }
- );
- });
- }
- })
- .finally(() => {
- setLoading(false);
- });
- };
-
- const onClose = () => {
- form.reset(getDefaultValues());
- onCreateUser(false);
- onEditingUser(null);
- setError(null);
- setUsageVisible(false);
- setUsageFilter('1m');
- };
-
- const handleResetUsage = () => {
- useUsers.setState({ resetUsageUser: editingUser });
- };
-
- const handleRevokeSubscription = () => {
- useUsers.setState({ revokeSubscriptionUser: editingUser });
- };
-
- const disabled = loading;
-
- return (
- <Modal isOpen={isOpen} onClose={onClose} size="2xl">
- <ModalOverlay bg="blackAlpha.300" backdropFilter="blur(10px)" />
- <FormProvider {...form} formState={form.formState}>
- <ModalContent mx="3">
- <form onSubmit={form.handleSubmit(submit)}>
- <DialogModalHeader HeaderIcon={isEditing ? EditIcon : AddIcon} title={isEditing ? t('userDialog.editUserTitle') : t('createNewUser')} />
- <ModalCloseButton mt={3} disabled={disabled} />
- <ModalBody>
- <Grid
- templateColumns={{
- base: 'repeat(1, 1fr)',
- md: 'repeat(2, 1fr)',
- }}
- gap={3}
- >
- <GridItem>
- <VStack justifyContent="space-between">
- <Flex
- flexDirection="column"
- gridAutoRows="min-content"
- w="full"
- >
- <UsernameField form={form} disabled={disabled} isEditing={isEditing} t={t} />
- <DataLimitField form={form} disabled={disabled} t={t} />
-
- <Collapse
- in={!!(dataLimit && dataLimit > 0)}
- animateOpacity
- style={{ width: '100%' }}
- >
- <PeriodicUsageReset form={form} t={t} />
- </Collapse>
- <ExpireDateField form={form} t={t} i18n={i18n} disabled={disabled} />
- <NoteField form={form} t={t} />
- </Flex>
- {error && (
- <Alert
- status="error"
- display={{ base: 'none', md: 'flex' }}
- >
- <AlertIcon />
- {error}
- </Alert>
- )}
- </VStack>
- </GridItem>
-
- <GridItem>
- <ServicesField t={t} services={services || []} form={form} />
- </GridItem>
-
- {isEditing && usageVisible && (
- <GridItem pt={6} colSpan={{ base: 1, md: 2 }}>
- <VStack gap={4}>
- <UsageFilter
- defaultValue={usageFilter}
- onChange={(filter, query) => {
- setUsageFilter(filter);
- fetchUsageWithFilter(query);
- }}
- />
- <Box
- width={{ base: '100%', md: '70%' }}
- justifySelf="center"
- >
- <ReactApexChart
- options={usage.options}
- series={usage.series}
- type="donut"
- />
- </Box>
- </VStack>
- </GridItem>
- )}
- </Grid>
-
- {error && (
- <Alert
- mt="3"
- status="error"
- display={{ base: 'flex', md: 'none' }}
- >
- <AlertIcon />
- {error}
- </Alert>
- )}
- </ModalBody>
- <DialogModalFooter>
- <HStack
- justifyContent="flex-start"
- w={{
- base: 'full',
- sm: 'unset',
- }}
- >
- {isEditing && editingUser !== null && (
- <>
- <Tooltip label={t('delete')} placement="top">
- <IconButton
- aria-label="Delete"
- size="sm"
- onClick={() => {
- onDeletingUser(editingUser);
- onClose();
- }}
- >
- <DeleteIcon />
- </IconButton>
- </Tooltip>
- <Tooltip label={t('userDialog.usage')} placement="top">
- <IconButton
- aria-label="usage"
- size="sm"
- onClick={handleUsageToggle}
- >
- <UserUsageIcon />
- </IconButton>
- </Tooltip>
- <Button onClick={handleResetUsage} size="sm">
- {t('userDialog.resetUsage')}
- </Button>
- <Button onClick={handleRevokeSubscription} size="sm">
- {t('userDialog.revokeSubscription')}
- </Button>
- </>
- )}
- </HStack>
- <HStack
- w="full"
- maxW={{ md: '50%', base: 'full' }}
- justify="end"
- >
- <Button
- type="submit"
- size="sm"
- px="8"
- colorScheme="primary"
- leftIcon={loading ? <Spinner size="xs" /> : undefined}
- disabled={false}
- >
- {isEditing ? t('userDialog.editUser') : t('createUser')}
- </Button>
- </HStack>
- </DialogModalFooter>
- </form>
- </ModalContent>
- </FormProvider>
- </Modal >
- );
-};
diff --git a/app/dashboard/src/pages/users/dialog/note-field.tsx b/app/dashboard/src/pages/users/dialog/note-field.tsx
deleted file mode 100644
index 618a0f6..0000000
--- a/app/dashboard/src/pages/users/dialog/note-field.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { FormControl, FormLabel, Textarea, FormErrorMessage } from '@chakra-ui/react';
-import { TFunction } from 'i18next';
-
-interface NoteFieldProps {
- form: any;
- t: TFunction<'translation', undefined, 'translation'>;
-}
-
-export const NoteField = ({ t, form }: NoteFieldProps) => {
- return (
- <FormControl
- mb={'10px'}
- isInvalid={!!form.formState.errors.note}
- >
- <FormLabel>{t('userDialog.note')}</FormLabel>
- <Textarea {...form.register('note')} />
- <FormErrorMessage>
- {form.formState.errors?.note?.message}
- </FormErrorMessage>
- </FormControl>
- )
-}
diff --git a/app/dashboard/src/pages/users/dialog/periodic-usage-reset.tsx b/app/dashboard/src/pages/users/dialog/periodic-usage-reset.tsx
deleted file mode 100644
index 5a7d530..0000000
--- a/app/dashboard/src/pages/users/dialog/periodic-usage-reset.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { FormControl, FormLabel, Select } from '@chakra-ui/react';
-import { Controller } from 'react-hook-form';
-import { resetStrategy } from 'constants/Settings';
-import { TFunction } from 'i18next';
-
-
-interface PreiodicUsageResetProps {
- form: any;
- t: TFunction<'translation', undefined, 'translation'>;
-}
-
-export const PeriodicUsageReset = ({ form, t }: PreiodicUsageResetProps) => {
- return (
- <FormControl height="66px">
- <FormLabel>
- {t('userDialog.periodicUsageReset')}
- </FormLabel>
- <Controller
- control={form.control}
- name="data_limit_reset_strategy"
- render={({ field }) => {
- return (
- <Select size="sm" {...field}>
- {resetStrategy.map((s) => {
- return (
- <option key={s.value} value={s.value}>
- {t(
- 'userDialog.resetStrategy' + s.title
- )}
- </option>
- );
- })}
- </Select>
- );
- }}
- />
- </FormControl>
- )
-}
diff --git a/app/dashboard/src/pages/users/dialog/services-field.tsx b/app/dashboard/src/pages/users/dialog/services-field.tsx
deleted file mode 100644
index 7cfd724..0000000
--- a/app/dashboard/src/pages/users/dialog/services-field.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import { FormControl, FormLabel, FormErrorMessage, Center, Spinner, Text, Flex, chakra } from '@chakra-ui/react';
-import { UsersIcon, ServerStackIcon } from '@heroicons/react/24/outline';
-import { IconBaseStyle } from 'constants/IconBaseStyle';
-import { TFunction } from 'i18next';
-import { Controller } from 'react-hook-form';
-import { Service } from 'types';
-import { SystemPropertyStatus } from 'components/system-property-status';
-import { ServicesSelectList } from './services-select-list';
-
-const UsersServiceIcon = chakra(UsersIcon, IconBaseStyle);
-const InboundsServiceIcon = chakra(ServerStackIcon, IconBaseStyle);
-
-interface ServicesFieldProps {
- form: any;
- services: Service[];
- t: TFunction<'translation', undefined, 'translation'>;
-}
-
-export const ServicesField = ({ form, t, services }: ServicesFieldProps) => {
- return services.length === 0 ? (
- <Center><Spinner /></Center>
- ) : (
- <FormControl
- isInvalid={
- !!form.formState.errors.services?.message
- }
- >
- <FormLabel>{t('userDialog.services')}</FormLabel>
- <Controller
- control={form.control}
- name="services"
- render={() => {
- return (
- <ServicesSelectList
- list={services}
- renderCheckboxContent={(service) => (
- <Flex alignItems="center" justifyContent="space-between" flexDir="row" w="full">
- <Text fontSize="sm" color="gray.700" _dark={{ color: 'gray.100' }} fontWeight="medium">
- {service.name}
- </Text>
- <Flex flexDirection="row" alignItems="center">
- <SystemPropertyStatus value={service.users.length} StatusIcon={UsersServiceIcon} />
- <Text color="primary.600" _dark={{ color: 'gray.100' }} mx="8px" fontSize="sm">/</Text>
- <SystemPropertyStatus value={service.inbounds.length} StatusIcon={InboundsServiceIcon} />
- </Flex>
- </Flex>
- )}
- />
- );
- }}
- />
- <FormErrorMessage>
- {t(
- form.formState.errors.services
- ?.message as string
- )}
- </FormErrorMessage>
- </FormControl>
- );
-}
diff --git a/app/dashboard/src/pages/users/dialog/services-select-list.tsx b/app/dashboard/src/pages/users/dialog/services-select-list.tsx
deleted file mode 100644
index ee3e4b4..0000000
--- a/app/dashboard/src/pages/users/dialog/services-select-list.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-
-import {
- Box,
- Flex,
- Stack,
-} from '@chakra-ui/react';
-import { ListCheckBox } from 'components/list-check-box';
-import { forwardRef, ReactNode } from 'react';
-import {
- useFormContext,
-} from 'react-hook-form';
-import { Service } from 'types';
-
-interface ServicesSelectListProps {
- list: Service[];
- renderCheckboxContent: (service: Service) => ReactNode;
-}
-
-export const ServicesSelectList = forwardRef<HTMLDivElement, ServicesSelectListProps>(
- function({ list, renderCheckboxContent }, ref) {
- const form = useFormContext();
-
- const handleServiceToggle = (serviceId: number) => {
- const currentServices = form.getValues('services');
- const isSelected = currentServices.includes(serviceId);
-
- let updatedServices;
-
- if (isSelected) {
- updatedServices = currentServices.filter((id: number) => id !== serviceId);
- } else {
- updatedServices = [...currentServices, serviceId];
- }
-
- form.setValue('services', updatedServices, { shouldValidate: true });
- };
-
- return (
- <Stack spacing={3} ref={ref}>
- {list.map((service: Service) => (
- <Box key={service.id}>
- <Flex align="center">
- <ListCheckBox
- isChecked={form.getValues('services').includes(service.id)}
- onChange={() => handleServiceToggle(service.id)}
- value={String(service.id)}
- renderContent={() => renderCheckboxContent(service)}
- />
- </Flex>
- </Box>
- ))}
- </Stack>
- );
- }
-);
diff --git a/app/dashboard/src/pages/users/dialog/username-field.tsx b/app/dashboard/src/pages/users/dialog/username-field.tsx
deleted file mode 100644
index 05007ca..0000000
--- a/app/dashboard/src/pages/users/dialog/username-field.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import { HStack, Input, Tooltip, Box, Switch, FormControl, FormLabel } from '@chakra-ui/react';
-import { TFunction } from 'i18next';
-import { Controller } from 'react-hook-form';
-
-interface UsernameFieldProps {
- form: any;
- isEditing: boolean;
- t: TFunction<'translation', undefined, 'translation'>;
- disabled: boolean;
-}
-
-export const UsernameField = ({ form, isEditing, t, disabled }: UsernameFieldProps) => {
- return (
- <FormControl mb={'10px'}>
- <FormLabel>{t('username')}</FormLabel>
- <HStack>
- <Input
- size="sm"
- type="text"
- borderRadius="6px"
- error={form.formState.errors.username?.message}
- disabled={disabled || isEditing}
- {...form.register('username')}
- />
- {isEditing && (
- <HStack px={1}>
- <Controller
- name="status"
- control={form.control}
- render={({ field }) => {
- return (
- <Tooltip
- placement="top"
- label={'status: ' + field.value}
- textTransform="capitalize"
- >
- <Box>
- <Switch
- colorScheme="primary"
- disabled={
- field.value !== 'active' &&
- field.value !== 'disabled'
- }
- isChecked={field.value === 'active'}
- onChange={(e) => {
- if (e.target.checked) {
- field.onChange('active');
- } else {
- field.onChange('disabled');
- }
- }}
- />
- </Box>
- </Tooltip>
- );
- }}
- />
- </HStack>
- )}
- </HStack>
- </FormControl>
- )
-}
diff --git a/app/dashboard/src/pages/users/filters.tsx b/app/dashboard/src/pages/users/filters.tsx
deleted file mode 100644
index 4cd071f..0000000
--- a/app/dashboard/src/pages/users/filters.tsx
+++ /dev/null
@@ -1,144 +0,0 @@
-import {
- BoxProps,
- Button,
- chakra,
- Grid,
- GridItem,
- HStack,
- IconButton,
- Input,
- InputGroup,
- InputLeftElement,
- InputRightElement,
- Spinner,
-} from '@chakra-ui/react';
-import {
- ArrowPathIcon,
- MagnifyingGlassIcon,
- XMarkIcon,
-} from '@heroicons/react/24/outline';
-import classNames from 'classnames';
-import { useDashboard, useUsers } from 'stores';
-import debounce from 'lodash.debounce';
-import React, { FC, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-
-const iconProps = {
- baseStyle: {
- w: 4,
- h: 4,
- },
-};
-
-const SearchIcon = chakra(MagnifyingGlassIcon, iconProps);
-const ClearIcon = chakra(XMarkIcon, iconProps);
-export const ReloadIcon = chakra(ArrowPathIcon, iconProps);
-
-export type FilterProps = {} & BoxProps;
-const setSearchField = debounce((username: string) => {
- useUsers.getState().onFilterChange({
- ...useUsers.getState().usersFilters,
- offset: 0,
- username,
- });
-}, 300);
-
-export const UsersFilters: FC<FilterProps> = ({ ...props }) => {
- const { loading, } = useDashboard();
- const { usersFilters: filters, onFilterChange, refetchUsers, onCreateUser, onResetAllUsage } = useUsers();
- const { t } = useTranslation();
- const [search, setSearch] = useState('');
- const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
- setSearch(e.target.value);
- setSearchField(e.target.value);
- };
- const clear = () => {
- setSearch('');
- onFilterChange({
- ...filters,
- offset: 0,
- username: '',
- });
- };
- return (
- <Grid
- id="users-filters"
- templateColumns={{
- lg: 'repeat(3, 1fr)',
- md: 'repeat(4, 1fr)',
- base: 'repeat(1, 1fr)',
- }}
- position="sticky"
- top={0}
- mx="-6"
- px="6"
- rowGap={4}
- gap={{
- lg: 4,
- base: 0,
- }}
- bg="var(--chakra-colors-chakra-body-bg)"
- py={4}
- zIndex="docked"
- {...props}
- >
- <GridItem colSpan={{ base: 1, md: 2, lg: 1 }} order={{ base: 2, md: 1 }}>
- <InputGroup>
- <InputLeftElement pointerEvents="none" children={<SearchIcon />} />
- <Input
- placeholder={t('search')}
- value={search}
- borderColor="light-border"
- onChange={onChange}
- />
- <InputRightElement>
- {loading && <Spinner size="xs" />}
- {filters.username && filters.username.length > 0 && (
- <IconButton
- onClick={clear}
- aria-label="clear"
- size="xs"
- variant="ghost"
- >
- <ClearIcon />
- </IconButton>
- )}
- </InputRightElement>
- </InputGroup>
- </GridItem>
- <GridItem colSpan={2} order={{ base: 1, md: 2 }}>
- <HStack justifyContent="flex-end" alignItems="center" h="full">
- <IconButton
- aria-label="refresh users"
- disabled={loading}
- onClick={refetchUsers}
- size="sm"
- variant="outline"
- >
- <ReloadIcon
- className={classNames({
- 'animate-spin': loading,
- })}
- />
- </IconButton>
- <Button
- colorScheme="red"
- size="sm"
- onClick={() => onResetAllUsage(true)}
- px={5}
- >
- {t('resetAllUsage')}
- </Button>
- <Button
- colorScheme="primary"
- size="sm"
- onClick={() => onCreateUser(true)}
- px={5}
- >
- {t('createUser')}
- </Button>
- </HStack>
- </GridItem>
- </Grid>
- );
-};
diff --git a/app/dashboard/src/pages/users/index.tsx b/app/dashboard/src/pages/users/index.tsx
deleted file mode 100644
index 7e4d74c..0000000
--- a/app/dashboard/src/pages/users/index.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { UserDialog } from './dialog';
-import { UsersTable } from './table';
-import { UsersFilters } from './filters';
-import {
- ResetAllUsageModal,
- DeleteUserModal,
- QRCodeDialog,
- ResetUserUsageModal,
- RevokeSubscriptionModal
-} from './modals';
-import { pages } from 'stores';
-import Page from 'components/page';
-
-const UsersPage = () => {
- return (
- <Page page={pages.users}>
- <UsersFilters />
- <UsersTable />
- <UserDialog />
- <QRCodeDialog />
- <DeleteUserModal />
- <RevokeSubscriptionModal />
- <ResetAllUsageModal />
- <ResetUserUsageModal />
- </Page>
- )
-}
-
-export default UsersPage;
diff --git a/app/dashboard/src/pages/users/modals/delete-modal.tsx b/app/dashboard/src/pages/users/modals/delete-modal.tsx
deleted file mode 100644
index 69b11f4..0000000
--- a/app/dashboard/src/pages/users/modals/delete-modal.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import {
- useToast,
-} from '@chakra-ui/react';
-import { FC, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-import { useUsers } from 'stores';
-import { DeleteModal } from 'components/delete-modal';
-
-type DeleteUserModalProps = {
- deleteCallback?: () => void;
-};
-
-export const DeleteUserModal: FC<DeleteUserModalProps> = () => {
- const [loading, setLoading] = useState(false);
- const { deletingUser, onDeletingUser, deleteUser } = useUsers();
- const { t } = useTranslation();
- const toast = useToast();
- const onClose = () => {
- onDeletingUser(null);
- };
- const onDelete = () => {
- if (deletingUser) {
- setLoading(true);
- deleteUser(deletingUser)
- .then(() => {
- toast({
- title: t('deleteUser.deleteSuccess', { username: deletingUser.username }),
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- })
- .then(onClose)
- .finally(setLoading.bind(null, false));
- }
- };
- return (
- <DeleteModal
- onDelete={onDelete}
- loading={loading}
- isOpen={!!deletingUser}
- onClose={onClose}
- deletingObjectName={deletingUser?.username}
- deleteObjectPromptT={'deleteUser.prompt'}
- deleteObjectTitleT={'deleteUser.title'}
- />
- );
-};
diff --git a/app/dashboard/src/pages/users/modals/index.tsx b/app/dashboard/src/pages/users/modals/index.tsx
deleted file mode 100644
index b90cacb..0000000
--- a/app/dashboard/src/pages/users/modals/index.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export * from './reset-all-usage-modal';
-export * from './delete-modal';
-export * from './qrcode-modals';
-export * from './reset-user-usage-modal';
-export * from './revoke-subscription-modal';
diff --git a/app/dashboard/src/pages/users/modals/qrcode-modals.tsx b/app/dashboard/src/pages/users/modals/qrcode-modals.tsx
deleted file mode 100644
index f1ee343..0000000
--- a/app/dashboard/src/pages/users/modals/qrcode-modals.tsx
+++ /dev/null
@@ -1,175 +0,0 @@
-import {
- Box,
- chakra,
- HStack,
- IconButton,
- Modal,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- ModalHeader,
- ModalOverlay,
- Text,
- VStack,
-} from '@chakra-ui/react';
-import {
- ChevronLeftIcon,
- ChevronRightIcon,
- QrCodeIcon,
-} from '@heroicons/react/24/outline';
-import { QRCodeCanvas } from 'qrcode.react';
-import { FC, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-import Slider from 'react-slick';
-import 'slick-carousel/slick/slick-theme.css';
-import 'slick-carousel/slick/slick.css';
-import { Icon } from 'components/icon';
-import { useUsers } from 'stores';
-
-const QRCode = chakra(QRCodeCanvas);
-const NextIcon = chakra(ChevronRightIcon, {
- baseStyle: {
- w: 6,
- h: 6,
- color: 'gray.600',
- _dark: {
- color: 'white',
- },
- },
-});
-const PrevIcon = chakra(ChevronLeftIcon, {
- baseStyle: {
- w: 6,
- h: 6,
- color: 'gray.600',
- _dark: {
- color: 'white',
- },
- },
-});
-const QRIcon = chakra(QrCodeIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
-
-export const QRCodeDialog: FC = () => {
- const { QRcodeLinks, setQRCode, setSubLink, subscribeUrl } = useUsers();
- const isOpen = QRcodeLinks !== null;
- const [index, setIndex] = useState(0);
- const { t } = useTranslation();
- const onClose = () => {
- setQRCode(null);
- setSubLink(null);
- };
-
- const subscribeQrLink = String(subscribeUrl).startsWith('/')
- ? window.location.origin + subscribeUrl
- : String(subscribeUrl);
-
- return (
- <Modal isOpen={isOpen} onClose={onClose}>
- <ModalOverlay bg="blackAlpha.300" backdropFilter="blur(10px)" />
- <ModalContent mx="3" w="fit-content" maxW="3xl">
- <ModalHeader pt={6}>
- <Icon color="primary">
- <QRIcon color="white" />
- </Icon>
- </ModalHeader>
- <ModalCloseButton mt={3} />
- {QRcodeLinks && (
- <ModalBody
- gap={{
- base: '20px',
- lg: '50px',
- }}
- pr={{
- lg: '60px',
- }}
- px={{
- base: '50px',
- }}
- display="flex"
- justifyContent="center"
- flexDirection={{
- base: 'column',
- lg: 'row',
- }}
- >
- {subscribeUrl && (
- <VStack>
- <QRCode
- mx="auto"
- size={300}
- p="2"
- level={'L'}
- includeMargin={false}
- value={subscribeQrLink}
- bg="white"
- />
- <Text display="block" textAlign="center" pb={3} mt={1}>
- {t('qrcodeDialog.sublink')}
- </Text>
- </VStack>
- )}
- <Box w="300px">
- <Slider
- centerPadding="0px"
- centerMode={true}
- slidesToShow={1}
- slidesToScroll={1}
- dots={false}
- afterChange={setIndex}
- onInit={() => setIndex(0)}
- nextArrow={
- <IconButton
- size="sm"
- position="absolute"
- display="flex !important"
- _before={{ content: '""' }}
- aria-label="next"
- mr="-4"
- >
- <NextIcon />
- </IconButton>
- }
- prevArrow={
- <IconButton
- size="sm"
- position="absolute"
- display="flex !important"
- _before={{ content: '""' }}
- aria-label="prev"
- ml="-4"
- >
- <PrevIcon />
- </IconButton>
- }
- >
- {QRcodeLinks.map((link, i) => {
- return (
- <HStack key={i}>
- <QRCode
- mx="auto"
- size={300}
- p="2"
- level={'L'}
- includeMargin={false}
- value={link}
- bg="white"
- />
- </HStack>
- );
- })}
- </Slider>
- <Text display="block" textAlign="center" pb={3} mt={1}>
- {index + 1} / {QRcodeLinks.length}
- </Text>
- </Box>
- </ModalBody>
- )}
- </ModalContent>
- </Modal>
- );
-};
diff --git a/app/dashboard/src/pages/users/modals/reset-all-usage-modal.tsx b/app/dashboard/src/pages/users/modals/reset-all-usage-modal.tsx
deleted file mode 100644
index ef4159d..0000000
--- a/app/dashboard/src/pages/users/modals/reset-all-usage-modal.tsx
+++ /dev/null
@@ -1,105 +0,0 @@
-import {
- Button,
- chakra,
- Modal,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- ModalFooter,
- ModalHeader,
- ModalOverlay,
- Spinner,
- Text,
- useToast,
-} from '@chakra-ui/react';
-import { FC, useState } from 'react';
-import { DocumentMinusIcon } from '@heroicons/react/24/outline';
-import { Icon } from 'components/icon';
-import { useTranslation } from 'react-i18next';
-import { useUsers } from 'stores';
-
-export const ResetIcon = chakra(DocumentMinusIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
-
-type DeleteUserModalProps = {};
-
-export const ResetAllUsageModal: FC<DeleteUserModalProps> = () => {
- const [loading, setLoading] = useState(false);
- const { isResetingAllUsage, onResetAllUsage, resetAllUsage } = useUsers();
- const { t } = useTranslation();
- const toast = useToast();
- const onClose = () => {
- onResetAllUsage(false);
- };
- const onReset = () => {
- setLoading(true);
- resetAllUsage()
- .then(() => {
- toast({
- title: t('resetAllUsage.success'),
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- })
- .catch(() => {
- toast({
- title: t('resetAllUsage.error'),
- status: 'error',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- })
- .finally(() => {
- setLoading(false);
- });
- };
- return (
- <Modal isCentered isOpen={isResetingAllUsage} onClose={onClose} size="sm">
- <ModalOverlay bg="blackAlpha.300" backdropFilter="blur(10px)" />
- <ModalContent mx="3">
- <ModalHeader pt={6}>
- <Icon color="red">
- <ResetIcon />
- </Icon>
- </ModalHeader>
- <ModalCloseButton mt={3} />
- <ModalBody>
- <Text fontWeight="semibold" fontSize="lg">
- {t('resetAllUsage.title')}
- </Text>
- {isResetingAllUsage && (
- <Text
- mt={1}
- fontSize="sm"
- _dark={{ color: 'gray.400' }}
- color="gray.600"
- >
- {t('resetAllUsage.prompt')}
- </Text>
- )}
- </ModalBody>
- <ModalFooter display="flex">
- <Button size="sm" onClick={onClose} mr={3} w="full" variant="outline">
- {t('cancel')}
- </Button>
- <Button
- size="sm"
- w="full"
- colorScheme="red"
- onClick={onReset}
- leftIcon={loading ? <Spinner size="xs" /> : undefined}
- >
- {t('reset')}
- </Button>
- </ModalFooter>
- </ModalContent>
- </Modal>
- );
-};
diff --git a/app/dashboard/src/pages/users/modals/reset-user-usage-modal.tsx b/app/dashboard/src/pages/users/modals/reset-user-usage-modal.tsx
deleted file mode 100644
index b043c23..0000000
--- a/app/dashboard/src/pages/users/modals/reset-user-usage-modal.tsx
+++ /dev/null
@@ -1,110 +0,0 @@
-import {
- Button,
- chakra,
- Modal,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- ModalFooter,
- ModalHeader,
- ModalOverlay,
- Spinner,
- Text,
- useToast,
-} from '@chakra-ui/react';
-import { FC, useState } from 'react';
-import { ArrowPathIcon } from '@heroicons/react/24/outline';
-import { Icon } from 'components/icon';
-import { useTranslation, Trans } from 'react-i18next';
-import { useUsers } from 'stores';
-
-const ResetIcon = chakra(ArrowPathIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
-
-type DeleteUserModalProps = {};
-
-export const ResetUserUsageModal: FC<DeleteUserModalProps> = () => {
- const [loading, setLoading] = useState(false);
- const { resetUsageUser: user, resetDataUsage } = useUsers();
- const { t } = useTranslation();
- const toast = useToast();
- const onClose = () => {
- useUsers.setState({ resetUsageUser: null });
- };
- const onReset = () => {
- if (user) {
- setLoading(true);
- resetDataUsage(user)
- .then(() => {
- toast({
- title: t('resetUserUsage.success', { username: user.username }),
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- })
- .catch(() => {
- toast({
- title: t('resetUserUsage.error'),
- status: 'error',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- })
- .finally(() => {
- setLoading(false);
- });
- }
- };
- return (
- <Modal isCentered isOpen={!!user} onClose={onClose} size="sm">
- <ModalOverlay bg="blackAlpha.300" backdropFilter="blur(10px)" />
- <ModalContent mx="3">
- <ModalHeader pt={6}>
- <Icon color="blue">
- <ResetIcon />
- </Icon>
- </ModalHeader>
- <ModalCloseButton mt={3} />
- <ModalBody>
- <Text fontWeight="semibold" fontSize="lg">
- {t('resetUserUsage.title')}
- </Text>
- {user && (
- <Text
- mt={1}
- fontSize="sm"
- _dark={{ color: 'gray.400' }}
- color="gray.600"
- >
- <Trans
- components={{ b: <b /> }}>
- {t('resetUserUsage.prompt', { username: user.username })}
- </Trans>
- </Text>
- )}
- </ModalBody>
- <ModalFooter display="flex">
- <Button size="sm" onClick={onClose} mr={3} w="full" variant="outline">
- {t('cancel')}
- </Button>
- <Button
- size="sm"
- w="full"
- colorScheme="blue"
- onClick={onReset}
- leftIcon={loading ? <Spinner size="xs" /> : undefined}
- >
- {t('reset')}
- </Button>
- </ModalFooter>
- </ModalContent>
- </Modal>
- );
-};
diff --git a/app/dashboard/src/pages/users/modals/revoke-subscription-modal.tsx b/app/dashboard/src/pages/users/modals/revoke-subscription-modal.tsx
deleted file mode 100644
index cff25ab..0000000
--- a/app/dashboard/src/pages/users/modals/revoke-subscription-modal.tsx
+++ /dev/null
@@ -1,109 +0,0 @@
-import {
- Button,
- chakra,
- Modal,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- ModalFooter,
- ModalHeader,
- ModalOverlay,
- Spinner,
- Text,
- useToast,
-} from '@chakra-ui/react';
-import { ArrowPathIcon } from '@heroicons/react/24/outline';
-import { useUsers } from 'stores';
-import { FC, useState } from 'react';
-import { Trans, useTranslation } from 'react-i18next';
-import { Icon } from 'components/icon';
-
-const ResetIcon = chakra(ArrowPathIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
-});
-
-export type RevokeSubscriptionModalProps = {};
-
-export const RevokeSubscriptionModal: FC<RevokeSubscriptionModalProps> = () => {
- const [loading, setLoading] = useState(false);
- const { revokeSubscriptionUser: user, revokeSubscription } = useUsers();
- const { t } = useTranslation();
- const toast = useToast();
- const onClose = () => {
- useUsers.setState({ revokeSubscriptionUser: null });
- };
- const onReset = () => {
- if (user) {
- setLoading(true);
- revokeSubscription(user)
- .then(() => {
- toast({
- title: t('revokeUserSub.success', { username: user.username }),
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- })
- .catch(() => {
- toast({
- title: t('revokeUserSub.error'),
- status: 'error',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- })
- .finally(() => {
- setLoading(false);
- });
- }
- };
- return (
- <Modal isCentered isOpen={!!user} onClose={onClose} size="sm">
- <ModalOverlay bg="blackAlpha.300" backdropFilter="blur(10px)" />
- <ModalContent mx="3">
- <ModalHeader pt={6}>
- <Icon color="blue">
- <ResetIcon />
- </Icon>
- </ModalHeader>
- <ModalCloseButton mt={3} />
- <ModalBody>
- <Text fontWeight="semibold" fontSize="lg">
- {t('revokeUserSub.title')}
- </Text>
- {user && (
- <Text
- mt={1}
- fontSize="sm"
- _dark={{ color: 'gray.400' }}
- color="gray.600"
- >
- <Trans components={{ b: <b /> }}>
- {t('revokeUserSub.prompt', { username: user.username })}
- </Trans>
- </Text>
- )}
- </ModalBody>
- <ModalFooter display="flex">
- <Button size="sm" onClick={onClose} mr={3} w="full" variant="outline">
- {t('cancel')}
- </Button>
- <Button
- size="sm"
- w="full"
- colorScheme="blue"
- onClick={onReset}
- leftIcon={loading ? <Spinner size="xs" /> : undefined}
- >
- {t('revoke')}
- </Button>
- </ModalFooter>
- </ModalContent>
- </Modal>
- );
-};
diff --git a/app/dashboard/src/pages/users/table/action-buttons.tsx b/app/dashboard/src/pages/users/table/action-buttons.tsx
deleted file mode 100644
index b44941d..0000000
--- a/app/dashboard/src/pages/users/table/action-buttons.tsx
+++ /dev/null
@@ -1,144 +0,0 @@
-
-import { t } from 'i18next';
-import CopyToClipboard from 'react-copy-to-clipboard';
-import { User } from 'types';
-import {
- CopiedIcon,
- CopyIcon,
- QRIcon,
- SubscriptionLinkIcon
-} from 'components/table';
-import {
- HStack,
- IconButton,
- Tooltip,
-} from '@chakra-ui/react';
-import { FC, useEffect, useState } from 'react';
-import { useUsers } from 'stores';
-
-type ActionButtonsProps = {
- user: User;
-};
-
-export const ActionButtons: FC<ActionButtonsProps> = ({ user }) => {
- const { setQRCode, setSubLink } = useUsers();
-
- const proxyLinks = user.links.join('\r\n');
-
- const [copied, setCopied] = useState([-1, false]);
- useEffect(() => {
- if (copied[1]) {
- setTimeout(() => {
- setCopied([-1, false]);
- }, 1000);
- }
- }, [copied]);
- return (
- <HStack
- justifyContent="flex-end"
- onClick={(e) => {
- e.preventDefault();
- e.stopPropagation();
- }}
- >
- <CopyToClipboard
- text={
- user.subscription_url.startsWith('/')
- ? window.location.origin + user.subscription_url
- : user.subscription_url
- }
- onCopy={() => {
- setCopied([0, true]);
- }}
- >
- <div>
- <Tooltip
- label={
- copied[0] == 0 && copied[1]
- ? t('usersTable.copied')
- : t('usersTable.copyLink')
- }
- placement="top"
- >
- <IconButton
- p="0 !important"
- aria-label="copy subscription link"
- bg="transparent"
- _dark={{
- _hover: {
- bg: 'gray.700',
- },
- }}
- size={{
- base: 'sm',
- md: 'md',
- }}
- >
- {copied[0] == 0 && copied[1] ? (
- <CopiedIcon />
- ) : (
- <SubscriptionLinkIcon />
- )}
- </IconButton>
- </Tooltip>
- </div>
- </CopyToClipboard>
- <CopyToClipboard
- text={proxyLinks}
- onCopy={() => {
- setCopied([1, true]);
- }}
- >
- <div>
- <Tooltip
- label={
- copied[0] == 1 && copied[1]
- ? t('usersTable.copied')
- : t('usersTable.copyConfigs')
- }
- placement="top"
- >
- <IconButton
- p="0 !important"
- aria-label="copy configs"
- bg="transparent"
- _dark={{
- _hover: {
- bg: 'gray.700',
- },
- }}
- size={{
- base: 'sm',
- md: 'md',
- }}
- >
- {copied[0] == 1 && copied[1] ? <CopiedIcon /> : <CopyIcon />}
- </IconButton>
- </Tooltip>
- </div>
- </CopyToClipboard>
- <Tooltip label="QR Code" placement="top">
- <IconButton
- p="0 !important"
- aria-label="qr code"
- bg="transparent"
- _dark={{
- _hover: {
- bg: 'gray.700',
- },
- }}
- size={{
- base: 'sm',
- md: 'md',
- }}
- onClick={() => {
- setQRCode(user.links);
- setSubLink(user.subscription_url);
- }}
- >
- <QRIcon />
- </IconButton>
- </Tooltip>
- </HStack >
- );
-};
diff --git a/app/dashboard/src/pages/users/table/index.tsx b/app/dashboard/src/pages/users/table/index.tsx
deleted file mode 100644
index 123ada5..0000000
--- a/app/dashboard/src/pages/users/table/index.tsx
+++ /dev/null
@@ -1,411 +0,0 @@
-
-import {
- Accordion,
- AccordionButton,
- AccordionItem,
- AccordionPanel,
- Box,
- HStack,
- IconButton,
- Table,
- TableProps,
- Tbody,
- Td,
- Text,
- Th,
- Thead,
- Tooltip,
- Tr,
- useBreakpointValue,
- VStack,
-} from '@chakra-ui/react';
-import classNames from 'classnames';
-import { statusColors } from 'constants/Settings';
-import { FC, Fragment, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-import { OnlineBadge } from 'components/online-badge';
-import { OnlineStatus } from 'components/online-status';
-import { StatusBadge } from 'components/status-badge';
-import {
- Pagination,
- EmptySection,
- AccordionArrowIcon,
- handleSort,
- EditIcon,
- StatusSortSelect,
- Sort,
-} from 'components/table';
-import { UsageSlider, UsageSliderCompact } from './usage-slider';
-import { fetchUsers, useUsers } from 'stores';
-import { ActionButtons } from './action-buttons';
-import { pageSizeManagers } from 'utils/userPreferenceStorage';
-import { useQuery } from '@tanstack/react-query';
-import { User } from 'types';
-import { queryIds } from 'constants/query-ids';
-
-type ExpandedIndex = number | number[];
-
-type UsersTableProps = {} & TableProps;
-
-export const UsersTable: FC<UsersTableProps> = (props) => {
- const {
- usersFilters: filters,
- onEditingUser,
- onCreateUser,
- onFilterChange,
- } = useUsers();
- const { data } = useQuery({
- queryKey: [queryIds.users],
- queryFn: () => { return fetchUsers(filters) },
- initialData: { total: 0, users: [] },
- });
- const { t } = useTranslation();
- const [selectedRow, setSelectedRow] = useState<ExpandedIndex | undefined>(
- undefined
- );
- const useTable = useBreakpointValue({ base: false, md: true });
-
- const handleStatusFilter = (e: any) => {
- onFilterChange({
- status: e.target.value.length > 0 ? e.target.value : undefined,
- });
- };
- const isFiltered = data?.total !== data?.users.length;
- const toggleAccordion = (index: number) => {
- setSelectedRow(index === selectedRow ? undefined : index);
- };
- return (
- <Box id="users-table" overflowX={{ base: 'unset', md: 'unset' }}>
- <Accordion
- allowMultiple
- display={{ base: 'block', md: 'none' }}
- index={selectedRow}
- >
- <Table orientation="vertical" zIndex="docked" {...props}>
- <Thead zIndex="docked" position="relative">
- <Tr>
- <Th
- position="sticky"
- minW="120px"
- pl={4}
- pr={4}
- cursor={'pointer'}
- onClick={handleSort.bind(null, filters, 'username', onFilterChange)}
- >
- <HStack>
- <span>{t('users')}</span>
- <Sort sort={filters.sort} column="username" />
- </HStack>
- </Th>
- <Th
- position="sticky"
- minW="50px"
- pl={0}
- pr={0}
- w="140px"
- cursor={'pointer'}
- >
- <HStack spacing={0} position="relative">
- <Text
- position="absolute"
- _dark={{
- bg: 'gray.750',
- }}
- _light={{
- bg: '#F9FAFB',
- }}
- userSelect="none"
- pointerEvents="none"
- zIndex={1}
- w="100%"
- >
- {t('usersTable.status')}
- {filters.status ? ': ' + filters.status : ''}
- </Text>
- <StatusSortSelect filters={filters} handleStatusFilter={handleStatusFilter} options={['active', 'disabled', 'limited', 'expired', 'on_hold']} />
- </HStack>
- </Th>
- <Th
- position="sticky"
- minW="100px"
- cursor={'pointer'}
- pr={0}
- onClick={handleSort.bind(null, filters, 'used_traffic', onFilterChange)}
- >
- <HStack>
- <span>{t('usersTable.dataUsage')}</span>
- <Sort sort={filters.sort} column="used_traffic" />
- </HStack>
- </Th>
- <Th
- position="sticky"
- minW="32px"
- w="32px"
- p={0}
- cursor={'pointer'}
- ></Th>
- </Tr>
- </Thead>
- <Tbody>
- {!useTable &&
- data?.users.map((user, i) => {
- return (
- <Fragment key={user.username}>
- <Tr
- onClick={toggleAccordion.bind(null, i)}
- cursor="pointer"
- >
- <Td borderBottom={0} minW="100px" pl={4} pr={4}>
- <div className="flex-status">
- <OnlineBadge lastOnline={user.online_at} />
- {user.username}
- </div>
- </Td>
- <Td borderBottom={0} minW="50px" pl={0} pr={0}>
- <StatusBadge
- compact
- showDetail={false}
- expiryDate={user.expire}
- status={user.status}
- />
- </Td>
- <Td borderBottom={0} minW="100px" pr={0}>
- <UsageSliderCompact
- totalUsedTraffic={user.lifetime_used_traffic}
- dataLimitResetStrategy={
- user.data_limit_reset_strategy
- }
- used={user.used_traffic}
- total={user.data_limit}
- colorScheme={statusColors[user.status].bandWidthColor}
- />
- </Td>
- <Td p={0} borderBottom={0} w="32px" minW="32px">
- <AccordionArrowIcon
- color="gray.600"
- _dark={{
- color: 'gray.400',
- }}
- transition="transform .2s ease-out"
- transform={
- selectedRow === i ? 'rotate(180deg)' : '0deg'
- }
- />
- </Td>
- </Tr>
- <Tr
- className="collapsible"
- onClick={toggleAccordion.bind(null, i)}
- >
- <Td p={0} colSpan={4}>
- <AccordionItem border={0}>
- <AccordionButton display="none"></AccordionButton>
- <AccordionPanel
- border={0}
- cursor="pointer"
- px={6}
- py={3}
- >
- <VStack justifyContent="space-between" spacing="4">
- <VStack
- alignItems="flex-start"
- w="full"
- spacing={-1}
- >
- <Text
- textTransform="capitalize"
- fontSize="xs"
- fontWeight="bold"
- color="gray.600"
- _dark={{
- color: 'gray.400',
- }}
- >
- {t('usersTable.dataUsage')}
- </Text>
- <Box width="full" minW="230px">
- <UsageSlider
- totalUsedTraffic={
- user.lifetime_used_traffic
- }
- dataLimitResetStrategy={
- user.data_limit_reset_strategy
- }
- used={user.used_traffic}
- total={user.data_limit}
- colorScheme={
- statusColors[user.status].bandWidthColor
- }
- />
- </Box>
- </VStack>
- <HStack w="full" justifyContent="space-between">
- <Box width="full">
- <StatusBadge
- compact
- expiryDate={user.expire}
- status={user.status}
- />
- <OnlineStatus lastOnline={user.online_at} />
- </Box>
- <HStack>
- <ActionButtons user={user} />
- <Tooltip
- label={t('userDialog.editUser')}
- placement="top"
- >
- <IconButton
- p="0 !important"
- aria-label="Edit user"
- bg="transparent"
- _dark={{
- _hover: {
- bg: 'gray.700',
- },
- }}
- size={{
- base: 'sm',
- md: 'md',
- }}
- onClick={(e) => {
- e.stopPropagation();
- onEditingUser(user);
- }}
- >
- <EditIcon />
- </IconButton>
- </Tooltip>
- </HStack>
- </HStack>
- </VStack>
- </AccordionPanel>
- </AccordionItem>
- </Td>
- </Tr>
- </Fragment>
- );
- })}
- </Tbody>
- </Table>
- </Accordion>
- <Table
- orientation="vertical"
- display={{ base: 'none', md: 'table' }}
- {...props}
- >
- <Thead zIndex="docked" position="relative">
- <Tr>
- <Th
- position="sticky"
- minW="140px"
- cursor={'pointer'}
- onClick={handleSort.bind(null, filters, 'username', onFilterChange)}
- >
- <HStack>
- <span>{t('username')}</span>
- <Sort sort={filters.sort} column="username" />
- </HStack>
- </Th>
- <Th
- position="sticky"
- width="400px"
- minW="150px"
- cursor={'pointer'}
- >
- <HStack spacing={0} position="relative">
- <Text
- position="absolute"
- _dark={{
- bg: 'gray.750',
- }}
- _light={{
- bg: '#F9FAFB',
- }}
- userSelect="none"
- pointerEvents="none"
- zIndex={1}
- w="100%"
- >
- {t('usersTable.status')}
- {filters.status ? ': ' + filters.status : ''}
- </Text>
- <StatusSortSelect filters={filters} handleStatusFilter={handleStatusFilter} options={['active', 'disabled', 'limited', 'expired', 'on_hold']} />
- </HStack>
- </Th>
- <Th
- position="sticky"
- width="350px"
- minW="230px"
- cursor={'pointer'}
- onClick={handleSort.bind(null, filters, 'used_traffic', onFilterChange)}
- >
- <HStack>
- <span>{t('usersTable.dataUsage')}</span>
- <Sort sort={filters.sort} column="used_traffic" />
- </HStack>
- </Th>
- <Th
- position="sticky"
- width="200px"
- minW="180px"
- />
- </Tr>
- </Thead>
- <Tbody>
- {useTable &&
- data?.users.map((user: User, i) => {
- return (
- <Tr
- key={user.username}
- className={classNames('interactive', {
- 'last-row': i === data?.users.length - 1,
- })}
- onClick={() => onEditingUser(user)}
- >
- <Td minW="140px">
- <div className="flex-status">
- <OnlineBadge lastOnline={user.online_at} />
- {user.username}
- <OnlineStatus lastOnline={user.online_at} />
- </div>
- </Td>
- <Td width="400px" minW="150px">
- <StatusBadge
- expiryDate={user.expire}
- status={user.status}
- />
- </Td>
- <Td width="350px" minW="230px">
- <UsageSlider
- totalUsedTraffic={user.lifetime_used_traffic}
- dataLimitResetStrategy={user.data_limit_reset_strategy}
- used={user.used_traffic}
- total={user.data_limit}
- colorScheme={statusColors[user.status].bandWidthColor}
- />
- </Td>
- <Td width="200px" minW="180px">
- <ActionButtons user={user} />
- </Td>
- </Tr>
- );
- })}
- {data?.users.length == 0 && (
- <Tr>
- <Td colSpan={4}>
- <EmptySection
- isFiltered={isFiltered}
- noObjectT="usersTable.noUser"
- noObjectMatchedT='usersTable.noUserMatched'
- createObjectT="createUser"
- onCreateObject={onCreateUser}
- />
- </Td>
- </Tr>
- )}
- </Tbody>
- </Table>
- <Pagination filters={filters} total={data?.total || 0} onFilterChange={onFilterChange} pageSizeManager={pageSizeManagers.users} />
- </Box>
- );
-};
diff --git a/app/dashboard/src/pages/users/table/usage-slider.tsx b/app/dashboard/src/pages/users/table/usage-slider.tsx
deleted file mode 100644
index cf17e65..0000000
--- a/app/dashboard/src/pages/users/table/usage-slider.tsx
+++ /dev/null
@@ -1,106 +0,0 @@
-import { HStack, Text, SliderTrack, SliderFilledTrack, Slider, SliderProps } from '@chakra-ui/react';
-import { resetStrategy } from 'constants/Settings';
-import { formatBytes } from 'utils/formatByte';
-import { useTranslation } from 'react-i18next';
-import { FC } from 'react';
-
-export const UsageSliderCompact: FC<UsageSliderProps> = (props) => {
- const { used, total } = props;
- const isUnlimited = total === 0 || total === null;
- return (
- <HStack
- justifyContent="space-between"
- fontSize="xs"
- fontWeight="medium"
- color="gray.600"
- _dark={{
- color: 'gray.400',
- }}
- >
- <Text>
- {formatBytes(used)} /{' '}
- {isUnlimited ? (
- <Text as="span" fontFamily="system-ui">
- ∞
- </Text>
- ) : (
- formatBytes(total)
- )}
- </Text>
- </HStack>
- );
-};
-
-type UsageSliderProps = {
- used: number;
- total: number | null;
- dataLimitResetStrategy: string | null;
- totalUsedTraffic: number;
-} & SliderProps;
-
-const getResetStrategy = (strategy: string): string => {
- for (var i = 0; i < resetStrategy.length; i++) {
- const entry = resetStrategy[i];
- if (entry.value == strategy) {
- return entry.title;
- }
- }
- return 'No';
-};
-
-export const UsageSlider: FC<UsageSliderProps> = (props) => {
- const {
- used,
- total,
- dataLimitResetStrategy,
- totalUsedTraffic,
- ...restOfProps
- } = props;
- const isUnlimited = total === 0 || total === null;
- const isReached = !isUnlimited && (used / total) * 100 >= 100;
- const { t } = useTranslation();
- return (
- <>
- <Slider
- orientation="horizontal"
- value={isUnlimited ? 100 : Math.min((used / total) * 100, 100)}
- colorScheme={isReached ? 'red' : 'primary'}
- {...restOfProps}
- >
- <SliderTrack h="6px" borderRadius="full">
- <SliderFilledTrack borderRadius="full" />
- </SliderTrack>
- </Slider>
- <HStack
- justifyContent="space-between"
- fontSize="xs"
- fontWeight="medium"
- color="gray.600"
- _dark={{
- color: 'gray.400',
- }}
- >
- <Text>
- {formatBytes(used)} /{' '}
- {isUnlimited ? (
- <Text as="span" fontFamily="system-ui">
- ∞
- </Text>
- ) : (
- formatBytes(total) +
- (dataLimitResetStrategy && dataLimitResetStrategy !== 'no_reset'
- ? ' ' +
- t(
- 'userDialog.resetStrategy' +
- getResetStrategy(dataLimitResetStrategy)
- )
- : '')
- )}
- </Text>
- <Text>
- {t('usersTable.total')}: {formatBytes(totalUsedTraffic)}
- </Text>
- </HStack>
- </>
- );
-};
diff --git a/app/dashboard/src/service/auth-storage.ts b/app/dashboard/src/service/auth-storage.ts
deleted file mode 100644
index c242f5c..0000000
--- a/app/dashboard/src/service/auth-storage.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export const getAuthToken = () => {
- return localStorage.getItem('token');
-};
-
-export const setAuthToken = (token: string) => {
- localStorage.setItem('token', token);
-};
-
-export const removeAuthToken = () => {
- localStorage.removeItem('token');
-};
diff --git a/app/dashboard/src/service/http.ts b/app/dashboard/src/service/http.ts
deleted file mode 100644
index f2268f1..0000000
--- a/app/dashboard/src/service/http.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { FetchOptions, $fetch as ohMyFetch } from 'ohmyfetch';
-import { getAuthToken } from 'service/auth-storage';
-
-export const $fetch = ohMyFetch.create({
- baseURL: import.meta.env.VITE_BASE_API,
-});
-
-export const fetcher = <T = any>(
- url: string,
- ops: FetchOptions<'json'> = {}
-) => {
- const token = getAuthToken();
- if (token) {
- ops['headers'] = {
- ...(ops?.headers || {}),
- Authorization: `Bearer ${getAuthToken()}`,
- };
- }
- return $fetch<T>(url, ops);
-};
-
-export const fetch = fetcher;
-
-export const fetchAdminLoader = () => {
- return fetch('/admins', {
- headers: {
- Authorization: `Bearer ${getAuthToken()}`,
- },
- });
-};
diff --git a/app/dashboard/src/service/react-query.ts b/app/dashboard/src/service/react-query.ts
deleted file mode 100644
index 6d46de5..0000000
--- a/app/dashboard/src/service/react-query.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { QueryClient } from '@tanstack/react-query';
-
-export const queryClient = new QueryClient();
diff --git a/app/dashboard/src/stores/admin.store.ts b/app/dashboard/src/stores/admin.store.ts
deleted file mode 100644
index 2494d8a..0000000
--- a/app/dashboard/src/stores/admin.store.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { create } from 'zustand';
-import { subscribeWithSelector } from 'zustand/middleware';
-
-type AdminStateType = {
- isLoggedIn: boolean,
- getAuthToken: () => string | null;
- setAuthToken: (token: string) => void;
- removeAuthToken: () => void;
-}
-
-export const useAdmin = create(
- subscribeWithSelector<AdminStateType>((set,) => ({
- isLoggedIn: false,
- getAuthToken: () => {
- return localStorage.getItem('token');
- },
- setAuthToken: (token: string) => {
- localStorage.setItem('token', token);
- set({ isLoggedIn: true });
- },
-
- removeAuthToken: () => {
- localStorage.removeItem('token');
- set({ isLoggedIn: false });
- },
- }))
-)
diff --git a/app/dashboard/src/stores/core-settings.store.ts b/app/dashboard/src/stores/core-settings.store.ts
deleted file mode 100644
index 16ca112..0000000
--- a/app/dashboard/src/stores/core-settings.store.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { fetch } from 'service/http';
-import { create } from 'zustand';
-import { NodeType } from './nodes.store';
-
-type CoreSettingsStore = {
- isLoading: boolean;
- isPostLoading: boolean;
- fetchCoreSettings: () => void;
- updateConfig: (json: string) => Promise<void>;
- restartCore: () => Promise<void>;
- config: string;
- selectedNode: NodeType | null;
- isEditingCore: boolean;
-};
-
-export const useCoreSettings = create<CoreSettingsStore>((set, get) => ({
- isLoading: true,
- isPostLoading: false,
- isEditingCore: false,
- config: '',
- selectedNode: null,
- fetchCoreSettings: () => {
- set({ isLoading: true });
- Promise.all([
- fetch(`/nodes/${get().selectedNode?.id}/xray_config`).then((config) => set({ config })),
- ]).finally(() => set({ isLoading: false }));
- },
- updateConfig: async (body) => {
- set({ isPostLoading: true });
- return fetch(`/nodes/${get().selectedNode?.id}/xray_config`, { method: 'PUT', body }).finally(() => {
- set({ isPostLoading: false });
- });
- },
- restartCore: () => {
- return fetch('/core/restart', { method: 'POST' });
- },
-}));
diff --git a/app/dashboard/src/stores/dashboard.store.ts b/app/dashboard/src/stores/dashboard.store.ts
deleted file mode 100644
index 89dc0e3..0000000
--- a/app/dashboard/src/stores/dashboard.store.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { create } from 'zustand';
-import { subscribeWithSelector } from 'zustand/middleware';
-import { PageType, Pages } from 'types';
-import { chakra } from '@chakra-ui/react';
-import { CubeIcon, HomeIcon, ServerIcon, ServerStackIcon, UsersIcon } from '@heroicons/react/24/outline';
-import { IconBaseStyle } from 'constants/IconBaseStyle';
-
-const UsersSidebarItemIcon = chakra(UsersIcon, IconBaseStyle);
-const ServicesSidebarItemIcon = chakra(ServerStackIcon, IconBaseStyle);
-const NodesSidebarItemIcon = chakra(CubeIcon, IconBaseStyle);
-const HostSidebarItemIcon = chakra(ServerIcon, IconBaseStyle);
-const HomeSidebarItemIcon = chakra(HomeIcon, IconBaseStyle);
-
-
-export const pages: Pages = {
- home: {
- name: 'home',
- path: '/',
- itemIcon: HomeSidebarItemIcon,
- },
- users: {
- name: 'users',
- path: '/users',
- itemIcon: UsersSidebarItemIcon,
- },
- services: {
- name: 'services',
- path: '/services',
- itemIcon: ServicesSidebarItemIcon,
- },
- nodes: {
- name: 'nodes',
- path: '/nodes',
- itemIcon: NodesSidebarItemIcon,
- },
- hosts: {
- name: 'hosts',
- path: '/hosts',
- itemIcon: HostSidebarItemIcon,
- },
-};
-
-type DashboardStateType = {
- version: string | null;
- loading: boolean;
- activePage: PageType;
- isCollapsed: boolean;
- collapseSidebar: () => void;
- expandSidebar: () => void;
- activatePage: (pageId: PageType) => void;
-};
-
-export const useDashboard = create(
- subscribeWithSelector<DashboardStateType>((set,) => ({
- version: null,
- loading: true,
- activePage: pages.home,
- isCollapsed: false,
- expandSidebar: () => {
- set({ isCollapsed: false })
- },
- collapseSidebar: () => {
- set({ isCollapsed: true })
- },
- activatePage: (page) => {
- set({ activePage: page });
- },
- }))
-);
diff --git a/app/dashboard/src/stores/inbounds.store.ts b/app/dashboard/src/stores/inbounds.store.ts
deleted file mode 100644
index 7b6974b..0000000
--- a/app/dashboard/src/stores/inbounds.store.ts
+++ /dev/null
@@ -1,175 +0,0 @@
-import { create } from 'zustand';
-import { subscribeWithSelector } from 'zustand/middleware';
-import { useDashboard } from './dashboard.store';
-import { fetch } from 'service/http';
-import { Inbounds, InboundType } from 'types/inbounds';
-import { z } from 'zod';
-import { HostsFilterType, InboundsFilterType } from 'types';
-import { pageSizeManagers } from 'utils/userPreferenceStorage';
-import { queryClient } from 'service/react-query';
-import { queryIds } from 'constants/query-ids';
-
-export const hostSchema = z.object({
- remark: z.string().min(1, 'Remark is required'),
- address: z.string().min(1, 'Address is required'),
- port: z.coerce.number()
- .gte(1, 'Port must be more than 1')
- .lte(65535, 'Port can not be more than 65535')
- .or(z.string().nullable()),
- path: z.string(),
- sni: z.string(),
- host: z.string(),
- security: z.enum(['inbound_default', 'none', 'tls']),
- alpn: z.string().optional(),
- fingerprint: z.string().optional(),
-});
-
-export type HostSchema = z.infer<typeof hostSchema>;
-export type HostType = HostSchema & { id?: number };
-export type Hosts = HostType[];
-
-export const fetchInbounds = async () => {
- useDashboard.setState({ loading: true });
- return fetch('/inbounds')
- .then((inbounds: Inbounds) => inbounds)
- .finally(() => {
- useDashboard.setState({ loading: false });
- });
-};
-
-export const fetchInboundHosts = async (id: number | undefined): Promise<Hosts> => {
- if (id !== undefined) {
- useDashboard.setState({ loading: true });
- return fetch(`/inbounds/${id}/hosts`)
- .then((hosts: Hosts) => {
- return hosts
- })
- .finally(() => {
- useDashboard.setState({ loading: false });
- });
- } else { return [] }
-};
-
-type InboundsStateType = {
- // Loading
- loading: boolean;
- setLoading: (value: boolean) => void;
- // Inbounds
- selectedInbound: InboundType | undefined;
- selectInbound: (inbound: InboundType) => void;
- refetchInbounds: () => void;
- // Hosts
- refetchHosts: () => void;
- hostsFilters: HostsFilterType;
- inboundsFilters: InboundsFilterType;
- onHostsFilterChange: (filters: Partial<HostsFilterType>) => void;
- onInboundsFilterChange: (filters: Partial<InboundsFilterType>) => void;
- selectedHost: HostType | null;
- selectHost: (host: HostType) => void;
- isEditingHost: boolean;
- onEditingHost: (isEditingHost: boolean, host: HostType | null) => void;
- editHost: (inboundId: number | undefined, host: HostType) => Promise<boolean | void>;
- isCreatingHost: boolean;
- onCreatingHost: (isCreatingHost: boolean) => void;
- createHost: (inboundId: number | undefined, host: HostSchema) => Promise<boolean | void>;
- isDeletingHost: boolean;
- onDeletingHost: (isDeletingHost: boolean, host: HostType) => void;
- deleteHost: (hostId: number) => void;
-};
-
-export const useInbounds = create(
- subscribeWithSelector<InboundsStateType>((set, get) => ({
- selectedHost: null,
- selectedInbound: undefined,
- loading: false,
- isDeletingHost: false,
- isCreatingHost: false,
- isEditingHost: false,
- hostsFilters: {
- name: '',
- limit: pageSizeManagers.hosts.getPageSize(),
- sort: '-created_at',
- },
- inboundsFilters: {
- name: '',
- limit: pageSizeManagers.inbounds.getPageSize(),
- sort: '-created_at',
- },
- onHostsFilterChange: (filters) => {
- set({
- hostsFilters: {
- ...get().hostsFilters,
- ...filters,
- },
- });
- },
- onInboundsFilterChange: (filters) => {
- set({
- hostsFilters: {
- ...get().inboundsFilters,
- ...filters,
- },
- });
- },
- setLoading: (value) => {
- set({ loading: value })
- },
- refetchInbounds: () => {
- queryClient.invalidateQueries({ queryKey: [queryIds.inbounds] });
- },
- refetchHosts: async () => {
- queryClient.invalidateQueries({ queryKey: [queryIds.hosts] });
- },
- selectInbound: (host): void => {
- set({ selectedInbound: host })
- },
- selectHost: (host: HostType): void => {
- set({ selectedHost: host })
- },
- onEditingHost: (isEditingHost: boolean, host: HostType | null) => {
- set({ isEditingHost, selectedHost: host });
- },
- editHost: async (hostId: number | undefined, body: HostSchema): Promise<boolean | void> => {
- if (hostId !== undefined) {
- useDashboard.setState({ loading: true });
- return fetch(`/inbounds/hosts/${hostId}`, { method: 'PUT', body })
- .then(() => true)
- .catch(() => false)
- .finally(() => {
- useDashboard.setState({ loading: false });
- get().refetchHosts();
- });
- }
- },
- onCreatingHost: (isCreatingHost: boolean) => {
- set({ isCreatingHost });
- },
- createHost: async (inboundId: number | undefined, body: HostSchema): Promise<boolean | void> => {
- if (inboundId !== undefined) {
- useDashboard.setState({ loading: true });
- return fetch(`/inbounds/${inboundId}/hosts`, { method: 'POST', body })
- .then(() => true)
- .catch(() => false)
- .finally(() => {
- useDashboard.setState({ loading: false });
- get().refetchHosts();
- });
- }
- },
- onDeletingHost: (isDeletingHost: boolean, host: HostType | null) => {
- set({ isDeletingHost, selectedHost: host });
- },
- deleteHost: async (hostId: number): Promise<boolean> => {
- useDashboard.setState({ loading: true });
- return fetch(`/inbounds/hosts/${hostId}`, { method: 'DELETE' })
- .then(() => {
- get().refetchHosts();
- return true;
- })
- .catch(() => false)
- .finally(() => {
- useDashboard.setState({ loading: false });
- });
- },
- }))
-);
diff --git a/app/dashboard/src/stores/index.ts b/app/dashboard/src/stores/index.ts
deleted file mode 100644
index afc1b15..0000000
--- a/app/dashboard/src/stores/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export * from './admin.store';
-export * from './inbounds.store';
-export * from './users.store';
-export * from './services.store';
-export * from './core-settings.store';
-export * from './dashboard.store';
-export * from './nodes.store';
diff --git a/app/dashboard/src/stores/nodes.store.ts b/app/dashboard/src/stores/nodes.store.ts
deleted file mode 100644
index e54e883..0000000
--- a/app/dashboard/src/stores/nodes.store.ts
+++ /dev/null
@@ -1,185 +0,0 @@
-import { useQuery } from '@tanstack/react-query';
-import { fetch } from 'service/http';
-import { create } from 'zustand';
-import { z } from 'zod';
-import { FilterUsageType, NodesFilterType } from 'types/filter';
-import { pageSizeManagers } from 'utils/userPreferenceStorage';
-import { useDashboard } from './dashboard.store';
-import { queryClient } from 'service/react-query';
-import { queryIds } from 'constants/query-ids';
-
-export const NodeSchema = z.object({
- name: z.string().min(1),
- address: z.string().min(1),
- port: z
- .number()
- .min(1)
- .or(z.string().transform((v) => parseFloat(v))),
- xray_version: z.string().nullable().optional(),
- id: z.number().nullable().optional(),
- status: z
- .enum(['healthy', 'unhealthy', 'disabled']),
- message: z.string().nullable().optional(),
- usage_coefficient: z.number().default(1),
- add_as_new_host: z.boolean(),
-});
-
-export const NodeCreateSchema = z.object({
- name: z.string().min(1),
- address: z.string().min(1),
- port: z
- .number()
- .min(1)
- .or(z.string().transform((v) => parseFloat(v))),
- id: z.number().nullable().optional(),
- status: z
- .enum(['none', 'disabled']),
- usage_coefficient: z.number().default(1),
- add_as_new_host: z.boolean().optional(),
-});
-
-export type NodeType = z.infer<typeof NodeSchema>;
-export type NodeCreate = z.infer<typeof NodeCreateSchema>;
-
-export const getNodeDefaultValues = (): NodeType => ({
- name: '',
- address: '',
- status: 'unhealthy',
- port: 62050,
- xray_version: '',
- add_as_new_host: false,
- usage_coefficient: 1,
-});
-
-export const getNodeCreateDefaultValues = (): NodeCreate => ({
- name: '',
- address: '',
- status: 'none',
- port: 62050,
- add_as_new_host: false,
- usage_coefficient: 1,
- id: 0,
-});
-
-export const FetchNodesQueryKey = 'fetch-nodes-query-key';
-
-export async function fetchNodes(): Promise<NodeType[]> {
- useDashboard.setState({ loading: true })
- return fetch('/nodes').then((nodes) => {
- return nodes;
- }).finally(() => {
- useDashboard.setState({ loading: false })
- });
-}
-
-export type NodeStore = {
- certificate: string,
- deletingNode?: NodeCreate | null;
- editingNode: NodeCreate | null;
- isAddingNode: boolean;
- isShowingNodesUsage: boolean;
- isEditingNode: boolean;
- nodesFilters: NodesFilterType;
- refetchNodes: () => void;
- refetchCertificate: () => void;
- fetchNodesUsage: (query: FilterUsageType) => Promise<void>;
- addNode: (node: NodeCreate) => Promise<unknown>;
- deleteNode: (node: NodeCreate) => Promise<unknown>;
- updateNode: (node: NodeCreate) => Promise<unknown>;
- reconnectNode: (node: NodeType) => Promise<unknown>;
- onDeletingNode: (node: NodeCreate | undefined) => void;
- onEditingNode: (node: NodeType | undefined) => void;
- onAddingNode: (isAddingNode: boolean) => void;
- onFilterChange: (filters: Partial<NodesFilterType>) => void;
- onShowingNodesUsage: (isShowingNodesUsage: boolean) => void;
-};
-
-// TODO: Refactor all useQuery for inbounds, hosts,
-// services and uses to be a custom hook like this.
-export const useNodesQuery = () => {
- return useQuery({
- queryKey: [FetchNodesQueryKey],
- queryFn: fetchNodes,
- refetchInterval: useNodes.getState().editingNode ? 3000 : undefined,
- refetchOnWindowFocus: false,
- });
-};
-
-export const useNodes = create<NodeStore>((set, get) => ({
- certificate: '',
- editingNode: null,
- deletingNode: null,
- isAddingNode: false,
- isEditingNode: false,
- isShowingNodesUsage: false,
- isEditingCore: false,
- nodesFilters: {
- name: '',
- limit: pageSizeManagers.nodes.getPageSize(),
- sort: '-created_at',
- },
- onFilterChange: (filters) => {
- set({
- nodesFilters: {
- ...get().nodesFilters,
- ...filters,
- },
- });
- get().refetchNodes();
- },
- addNode: async (body) => {
- return fetch('/nodes', { method: 'POST', body }).then(() => { get().refetchCertificate() });
- },
- refetchNodes: () => {
- queryClient.invalidateQueries({ queryKey: [queryIds.nodes] });
- },
- refetchCertificate: () => {
- fetch('/nodes/settings').then((res) => {
- set({ certificate: res.certificate });
- })
- },
- fetchNodesUsage: (query: FilterUsageType) => {
- return fetch('/nodes/usage', { query });
- },
- updateNode: (body) => {
- console.log('update: ' + body.id)
- return fetch(`/nodes/${body.id}`, {
- method: 'PUT',
- body,
- });
- },
- onDeletingNode: (node: NodeCreate | undefined) => {
- if (node !== undefined) {
- set({ deletingNode: node });
- }
- else {
- set({ deletingNode: undefined });
- }
- },
- reconnectNode: (body) => {
- return fetch(`/nodes/${body.id}/reconnect`, {
- method: 'POST',
- });
- },
- deleteNode: () => {
- return fetch(`/nodes/${get().deletingNode?.id}`, {
- method: 'DELETE',
- });
- },
- onEditingNode: (editingNode: NodeType | undefined) => {
- if (editingNode !== undefined) {
- const { status, ...rest } = editingNode;
- set({ editingNode: { ...rest, status: (status === 'healthy' || status === 'unhealthy') ? 'none' : 'disabled' }, isEditingNode: true });
- }
- else {
- set({ editingNode: undefined, isEditingNode: false });
-
- }
- },
- onAddingNode: (isAddingNode: boolean) => {
- set({ isAddingNode });
- },
- onShowingNodesUsage: (isShowingNodesUsage: boolean) => {
- set({ isShowingNodesUsage });
- },
-}));
diff --git a/app/dashboard/src/stores/services.store.ts b/app/dashboard/src/stores/services.store.ts
deleted file mode 100644
index b76f795..0000000
--- a/app/dashboard/src/stores/services.store.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-import { queryClient } from 'service/react-query';
-import { Service, ServiceCreate } from 'types/service';
-import { pageSizeManagers } from 'utils/userPreferenceStorage';
-import { create } from 'zustand';
-import { subscribeWithSelector } from 'zustand/middleware';
-import { fetch } from 'service/http';
-import { ServicesFilterType } from 'types/filter';
-import { useDashboard, useUsers } from 'stores';
-import { queryIds } from 'constants/query-ids';
-
-type ServicesStateType = {
- isCreatingNewService: boolean;
- editingService: Service | null | undefined;
- deletingService: Service | null;
- servicesFilters: ServicesFilterType;
- onCreateService: (isOpen: boolean) => void;
- onEditingService: (service: Service | null) => void;
- onDeletingService: (service: Service | null) => void;
- refetchServices: () => void;
- deleteService: (service: Service) => Promise<void>;
- createService: (service: ServiceCreate) => Promise<void>;
- editService: (service: ServiceCreate) => Promise<void>;
- onFilterChange: (filters: Partial<ServicesFilterType>) => void;
-};
-
-export const fetchServices = async (query: ServicesFilterType): Promise<Service[]> => {
- for (const key in query) {
- if (!query[key as keyof ServicesFilterType]) delete query[key as keyof ServicesFilterType];
- }
-
- useDashboard.setState({ loading: true });
-
- return fetch('/services')
- .then((services) => {
- return services;
- })
- .finally(() => {
- useDashboard.setState({ loading: false });
- });
-};
-
-export const useServices = create(
- subscribeWithSelector<ServicesStateType>((set, get) => ({
- editingService: null,
- deletingService: null,
- isCreatingNewService: false,
- servicesFilters: {
- name: '',
- limit: pageSizeManagers.services.getPageSize(),
- sort: '-created_at',
- },
- onFilterChange: (filters) => {
- set({
- servicesFilters: {
- ...get().servicesFilters,
- ...filters,
- },
- });
- get().refetchServices();
- },
- refetchServices: () => {
- queryClient.invalidateQueries({ queryKey: [queryIds.services] });
- },
- onCreateService: (isCreatingNewService) => set({ isCreatingNewService }),
- onEditingService: (editingService) => {
- set({ editingService });
- },
- onDeletingService: (deletingService) => {
- set({ deletingService });
- },
- deleteService: async (service: Service) => {
- set({ editingService: null });
- return fetch(`/services/${service.id}`, { method: 'DELETE' }).then(() => {
- set({ deletingService: null });
- get().refetchServices();
- useUsers.getState().refetchUsers();
- });
- },
- createService: async (body: ServiceCreate) => {
- return fetch('/services', { method: 'POST', body }).then(() => {
- set({ editingService: null });
- get().refetchServices();
- });
- },
- editService: async (body: ServiceCreate) => {
- return fetch(`/services/${body.id}`, { method: 'PUT', body }).then(
- () => {
- get().onEditingService(null);
- get().refetchServices();
- }
- );
- },
- }))
-);
diff --git a/app/dashboard/src/stores/users.store.ts b/app/dashboard/src/stores/users.store.ts
deleted file mode 100644
index e8c2238..0000000
--- a/app/dashboard/src/stores/users.store.ts
+++ /dev/null
@@ -1,155 +0,0 @@
-import { User, UserCreate } from 'types/user';
-import { subscribeWithSelector } from 'zustand/middleware';
-import { create } from 'zustand';
-import { pageSizeManagers } from 'utils/userPreferenceStorage';
-import { fetch } from 'service/http';
-import { useServices, useDashboard } from 'stores';
-import { StatisticsQueryKey } from 'components/statistics-card';
-import { queryClient } from 'service/react-query';
-import { UsersFilterType, FilterUsageType } from 'types/filter';
-import { queryIds } from 'constants/query-ids';
-
-type UsersStateType = {
- isCreatingNewUser: boolean;
- editingUser: User | null | undefined;
- deletingUser: User | null;
- usersFilters: UsersFilterType;
- resetUsageUser: User | null;
- revokeSubscriptionUser: User | null;
- isResetingAllUsage: boolean;
- subscribeUrl: string | null;
- QRcodeLinks: string[] | null;
- setQRCode: (links: string[] | null) => void;
- setSubLink: (subscribeURL: string | null) => void;
- onResetAllUsage: (isResetingAllUsage: boolean) => void;
- resetAllUsage: () => Promise<void>;
- resetDataUsage: (user: User) => Promise<void>;
- revokeSubscription: (user: User) => Promise<void>;
- onCreateUser: (isOpen: boolean) => void;
- onEditingUser: (user: User | null) => void;
- onDeletingUser: (user: User | null) => void;
- refetchUsers: () => void;
- onFilterChange: (filters: Partial<UsersFilterType>) => void;
- deleteUser: (user: User) => Promise<void>;
- createUser: (user: UserCreate) => Promise<void>;
- editUser: (user: UserCreate) => Promise<void>;
- fetchUserUsage: (user: User, query: FilterUsageType) => Promise<void>;
-}
-
-type UserResponse = {
- total: number,
- users: User[]
-}
-
-export const fetchUsers = async (query: UsersFilterType): Promise<UserResponse> => {
- for (const key in query) {
- if (!query[key as keyof UsersFilterType]) delete query[key as keyof UsersFilterType];
- }
- useDashboard.setState({ loading: true });
- return fetch('/users', { query })
- .then((users) => {
- for (let i = 0; i < users.users.length; i++) {
- users.users[i].service = users.users[i].service_ids;
- }
- return users;
- })
- .finally(() => {
- useDashboard.setState({ loading: false });
- });
-};
-
-export const useUsers = create(subscribeWithSelector<UsersStateType>((set, get) => ({
- editingUser: null,
- deletingUser: null,
- isCreatingNewUser: false,
- resetUsageUser: null,
- revokeSubscriptionUser: null,
- isResetingAllUsage: false,
- usersFilters: {
- username: '',
- limit: pageSizeManagers.users.getPageSize(),
- sort: '-created_at',
- },
- QRcodeLinks: null,
- subscribeUrl: null,
- setQRCode: (QRcodeLinks) => {
- set({ QRcodeLinks });
- },
- setSubLink: (subscribeUrl) => {
- set({ subscribeUrl });
- },
- refetchUsers: () => {
- queryClient.invalidateQueries({ queryKey: [queryIds.users] });
- },
- resetAllUsage: async () => {
- return fetch('/users/reset', { method: 'POST' }).then(() => {
- get().onResetAllUsage(false);
- get().refetchUsers();
- });
- },
- onResetAllUsage: (isResetingAllUsage) => set({ isResetingAllUsage }),
- onCreateUser: (isCreatingNewUser) => set({ isCreatingNewUser }),
- onEditingUser: (editingUser) => {
- set({ editingUser });
- },
- onDeletingUser: (deletingUser) => {
- set({ deletingUser });
- },
- onFilterChange: (filters) => {
- set({
- usersFilters: {
- ...get().usersFilters,
- ...filters,
- },
- });
- get().refetchUsers();
- },
- deleteUser: async (user: User) => {
- set({ editingUser: null });
- return fetch(`/users/${user.username}`, { method: 'DELETE' }).then(() => {
- set({ deletingUser: null });
- get().refetchUsers();
- queryClient.invalidateQueries({ queryKey: [StatisticsQueryKey] });
- });
- },
- createUser: async (body: UserCreate) => {
- return fetch('/users', { method: 'POST', body }).then(() => {
- set({ editingUser: null });
- get().refetchUsers();
- useServices.getState().refetchServices();
- queryClient.invalidateQueries({ queryKey: [StatisticsQueryKey] });
- });
- },
- editUser: async (body: UserCreate) => {
- return fetch(`/users/${body.username}`, { method: 'PUT', body }).then(
- () => {
- get().onEditingUser(null);
- get().refetchUsers();
- }
- );
- },
-
- fetchUserUsage: (body: User, query: FilterUsageType) => {
- for (const key in query) {
- if (!query[key as keyof FilterUsageType])
- delete query[key as keyof FilterUsageType];
- }
- return fetch(`/users/${body.username}/usage`, { method: 'GET', query });
- },
- resetDataUsage: async (user) => {
- return fetch(`/users/${user.username}/reset`, { method: 'POST' }).then(
- () => {
- set({ resetUsageUser: null });
- get().refetchUsers();
- }
- );
- },
- revokeSubscription: async (user) => {
- return fetch(`/users/${user.username}/revoke_sub`, {
- method: 'POST',
- }).then((user) => {
- set({ revokeSubscriptionUser: null, editingUser: user });
- get().refetchUsers();
- });
- },
-})));
diff --git a/app/dashboard/src/types/chakra-icon.ts b/app/dashboard/src/types/chakra-icon.ts
deleted file mode 100644
index 1d2f2e9..0000000
--- a/app/dashboard/src/types/chakra-icon.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-
-import { SVGProps, ForwardRefExoticComponent } from 'react';
-import { ChakraComponent } from '@chakra-ui/react';
-
-export type ChakraIcon = ChakraComponent<ForwardRefExoticComponent<SVGProps<SVGSVGElement>>>;
diff --git a/app/dashboard/src/types/filter.ts b/app/dashboard/src/types/filter.ts
deleted file mode 100644
index 0f413a5..0000000
--- a/app/dashboard/src/types/filter.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-export type FilterType = {
- limit?: number;
- offset?: number;
- sort: string;
-}
-
-export type UsersFilterType = FilterType & {
- username?: string;
- status?: 'active' | 'disabled' | 'limited' | 'expired' | 'on_hold';
-};
-
-export type FilterUsageType = {
- start?: string;
- end?: string;
-};
-
-export type ServicesFilterType = FilterType & {
- name?: string;
- users?: number;
- inbounds?: number;
-};
-
-export type NodesFilterType = FilterType & {
- name?: string;
- address?: string;
- port?: number;
- xray_version?: number;
- status?: 'healthy' | 'disabled' | 'healthy';
-}
-
-export type HostsFilterType = FilterType & {
- name?: string;
- address?: string;
- port?: number;
- security?: number;
-}
-
-export type InboundsFilterType = FilterType & {
- tag?: string;
-}
diff --git a/app/dashboard/src/types/inbounds.ts b/app/dashboard/src/types/inbounds.ts
deleted file mode 100644
index 349729c..0000000
--- a/app/dashboard/src/types/inbounds.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { ProtocolType } from './protocol';
-import { NodeType } from 'stores';
-
-export type InboundType = {
- id: number;
- tag: string;
- protocol: ProtocolType;
- network: string;
- node: NodeType;
- tls: string;
- port?: number;
-};
-
-export type Inbounds = InboundType[];
diff --git a/app/dashboard/src/types/index.ts b/app/dashboard/src/types/index.ts
deleted file mode 100644
index 0a04667..0000000
--- a/app/dashboard/src/types/index.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export * from './inbounds';
-export * from './user';
-export * from './service';
-export * from './page';
-export * from './protocol';
-export * from './filter';
-export * from './proxy-hosts';
-export * from './chakra-icon';
diff --git a/app/dashboard/src/types/page.ts b/app/dashboard/src/types/page.ts
deleted file mode 100644
index 6559857..0000000
--- a/app/dashboard/src/types/page.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { ChakraIcon } from 'types'
-
-export type PageType = {
- path: string;
- name: string;
- itemIcon: ChakraIcon;
-}
-
-export interface Pages {
- home: PageType;
- users: PageType;
- services: PageType;
- nodes: PageType;
- hosts: PageType;
-}
diff --git a/app/dashboard/src/types/protocol.ts b/app/dashboard/src/types/protocol.ts
deleted file mode 100644
index d01bfe8..0000000
--- a/app/dashboard/src/types/protocol.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-
-export type ProtocolType = 'vmess' | 'vless' | 'trojan' | 'shadowsocks';
-
diff --git a/app/dashboard/src/types/proxy-hosts.ts b/app/dashboard/src/types/proxy-hosts.ts
deleted file mode 100644
index 513aca3..0000000
--- a/app/dashboard/src/types/proxy-hosts.ts
+++ /dev/null
@@ -1 +0,0 @@
-export type ProxyHostSecurity = 'inbound_default' | 'none' | 'tls'
diff --git a/app/dashboard/src/types/service.ts b/app/dashboard/src/types/service.ts
deleted file mode 100644
index 4331754..0000000
--- a/app/dashboard/src/types/service.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-
-export type Service = {
- id: number;
- name: string;
- users: number[];
- inbounds: number[];
-}
-
-export type ServiceCreate = {
- id: number | undefined;
- name: string;
- inbounds: number[];
-}
diff --git a/app/dashboard/src/types/user.ts b/app/dashboard/src/types/user.ts
deleted file mode 100644
index a31a45e..0000000
--- a/app/dashboard/src/types/user.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-export type Status =
- | 'active'
- | 'disabled'
- | 'limited'
- | 'expired'
- | 'on_hold'
- | 'error'
- | 'connecting'
- | 'healthy'
- | 'unhealthy'
- | 'connected';
-export type ProxyKeys = ('vmess' | 'vless' | 'trojan' | 'shadowsocks')[];
-export type ProxyType = {
- vmess?: {
- id?: string;
- };
- vless?: {
- id?: string;
- flow?: string;
- };
- trojan?: {
- password?: string;
- };
- shadowsocks?: {
- password?: string;
- method?: string;
- };
-};
-
-export type DataLimitResetStrategy =
- | 'no_reset'
- | 'day'
- | 'week'
- | 'month'
- | 'year';
-
-type serviceId = number;
-
-export type User = {
- expire: number | null;
- data_limit: number | null;
- data_limit_reset_strategy: DataLimitResetStrategy;
- lifetime_used_traffic: number;
- username: string;
- used_traffic: number;
- status: Status;
- links: string[];
- subscription_url: string;
- services: serviceId[];
- note: string;
- online_at: string;
-};
-
-export type UserCreate = Pick<
-
- User,
- | 'services'
- | 'expire'
- | 'data_limit'
- | 'data_limit_reset_strategy'
- | 'username'
- | 'status'
- | 'note'
->;
diff --git a/app/dashboard/src/utils/color.ts b/app/dashboard/src/utils/color.ts
deleted file mode 100644
index 82c028a..0000000
--- a/app/dashboard/src/utils/color.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-export function generateDistinctColors(numColors: number) {
- const hueStep = 360 / numColors;
- const saturation = 90;
- const lightness = 47;
- const colors = [];
-
- for (let i = 0; i < numColors; i++) {
- const hue = ((i * hueStep) % 360) + 140;
- const color = hslToHex(hue, saturation, lightness);
- colors.push(color);
- }
-
- return colors;
-}
-
-function hslToHex(h: number, s: number, l: number) {
- h /= 360;
- s /= 100;
- l /= 100;
-
- let r, g, b;
-
- if (s === 0) {
- r = g = b = l;
- } else {
- const hueToRgb = (p: number, q: number, t: number) => {
- if (t < 0) t += 1;
- if (t > 1) t -= 1;
- if (t < 1 / 6) return p + (q - p) * 6 * t;
- if (t < 1 / 2) return q;
- if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
- return p;
- };
-
- const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
- const p = 2 * l - q;
-
- r = Math.round(hueToRgb(p, q, h + 1 / 3) * 255);
- g = Math.round(hueToRgb(p, q, h) * 255);
- b = Math.round(hueToRgb(p, q, h - 1 / 3) * 255);
- }
-
- const toHex = (c: number) => {
- const hex = c.toString(16);
- return hex.length === 1 ? '0' + hex : hex;
- };
-
- return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
-}
diff --git a/app/dashboard/src/utils/dateFormatter.ts b/app/dashboard/src/utils/dateFormatter.ts
deleted file mode 100644
index 8fd284a..0000000
--- a/app/dashboard/src/utils/dateFormatter.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import dayjs from 'dayjs';
-
-export const relativeExpiryDate = (expiryDate: number | null | undefined) => {
- let dateInfo = { status: '', time: '' };
- if (expiryDate) {
- if (
- dayjs(expiryDate * 1000)
- .utc()
- .isAfter(dayjs().utc())
- ) {
- dateInfo.status = 'expires';
- } else {
- dateInfo.status = 'expired';
- }
- const durationSlots: string[] = [];
- const duration = dayjs.duration(
- dayjs(expiryDate * 1000)
- .utc()
- .diff(dayjs())
- );
- if (duration.years() != 0) {
- durationSlots.push(
- Math.abs(duration.years()) +
- ' year' +
- (Math.abs(duration.years()) != 1 ? 's' : '')
- );
- }
- if (duration.months() != 0) {
- durationSlots.push(
- Math.abs(duration.months()) +
- ' month' +
- (Math.abs(duration.months()) != 1 ? 's' : '')
- );
- }
- if (duration.days() != 0) {
- durationSlots.push(
- Math.abs(duration.days()) +
- ' day' +
- (Math.abs(duration.days()) != 1 ? 's' : '')
- );
- }
- if (durationSlots.length === 0) {
- if (duration.hours() != 0) {
- durationSlots.push(
- Math.abs(duration.hours()) +
- ' hour' +
- (Math.abs(duration.hours()) != 1 ? 's' : '')
- );
- }
- if (duration.minutes() != 0) {
- durationSlots.push(
- Math.abs(duration.minutes()) +
- ' min' +
- (Math.abs(duration.minutes()) != 1 ? 's' : '')
- );
- }
- }
- dateInfo.time = durationSlots.join(', ');
- }
- return dateInfo;
-};
diff --git a/app/dashboard/src/utils/formatByte.tsx b/app/dashboard/src/utils/formatByte.tsx
deleted file mode 100644
index c377830..0000000
--- a/app/dashboard/src/utils/formatByte.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-export function formatBytes(bytes: number, decimals = 2, asArray = false) {
- if (!+bytes) return '0 B';
-
- const k = 1024;
- const dm = decimals < 0 ? 0 : decimals;
- const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
-
- const i = Math.floor(Math.log(bytes) / Math.log(k));
- if (!asArray)
- return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
- else return [parseFloat((bytes / Math.pow(k, i)).toFixed(dm)), sizes[i]];
-}
-
-export const numberWithCommas = (x: number) => {
- if (x !== null) return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
-};
diff --git a/app/dashboard/src/utils/themeColor.ts b/app/dashboard/src/utils/themeColor.ts
deleted file mode 100644
index e010b0d..0000000
--- a/app/dashboard/src/utils/themeColor.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { ColorMode } from '@chakra-ui/react';
-
-export const updateThemeColor = (colorMode: ColorMode) => {
- const el = document.querySelector('meta[name="theme-color"]');
- el?.setAttribute('content', colorMode == 'dark' ? '#1A202C' : '#3B81F6');
-};
diff --git a/app/dashboard/src/utils/toastHandler.ts b/app/dashboard/src/utils/toastHandler.ts
deleted file mode 100644
index 00a896f..0000000
--- a/app/dashboard/src/utils/toastHandler.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { CreateToastFnReturn } from '@chakra-ui/react';
-import { UseFormReturn } from 'react-hook-form';
-
-export const generateErrorMessage = (
- e: any,
- toast: CreateToastFnReturn,
- form?: UseFormReturn<any>
-) => {
- if (e.response && e.response._data) {
- if (typeof e.response._data.detail === 'string')
- return toast({
- title: e.response._data.detail,
- status: 'error',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
- if (typeof e.response._data.detail === 'object')
- if (form) {
- Object.keys(e.response._data.detail).forEach((errorKey) =>
- form.setError(errorKey, {
- message: e.response._data.detail[errorKey],
- })
- );
- return;
- }
- }
- return toast({
- title: 'Something went wrong!',
- status: 'error',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
-};
-
-export const generateSuccessMessage = (
- message: string,
- toast: CreateToastFnReturn
-) => {
- return toast({
- title: message,
- status: 'success',
- isClosable: true,
- position: 'top',
- duration: 3000,
- });
-};
diff --git a/app/dashboard/src/utils/userPreferenceStorage.ts b/app/dashboard/src/utils/userPreferenceStorage.ts
deleted file mode 100644
index 9547945..0000000
--- a/app/dashboard/src/utils/userPreferenceStorage.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-export class PageSizeManager {
- private localStorageKey: string;
- private defaultPageSize: number;
-
- constructor(localStorageKey: string, defaultPageSize: number) {
- this.localStorageKey = `marzneshin-num-${localStorageKey}-per-page`;
- this.defaultPageSize = defaultPageSize;
- }
-
- private getStoredPageSize(): string | null {
- return localStorage.getItem(this.localStorageKey);
- }
-
- getPageSize(): number {
- const storedPageSize = this.getStoredPageSize();
- const parsedPageSize = parseInt(storedPageSize || '', 10);
- return isNaN(parsedPageSize) ? this.defaultPageSize : parsedPageSize;
- }
-
- setPageSize(value: string): void {
- localStorage.setItem(this.localStorageKey, value);
- }
-}
-
-export const pageSizeManagers = {
- users: new PageSizeManager('users', 10),
- inbounds: new PageSizeManager('inbounds', 10),
- nodes: new PageSizeManager('nodes', 10),
- hosts: new PageSizeManager('hosts', 10),
- services: new PageSizeManager('services', 10),
-}
diff --git a/app/dashboard/src/vite-env.d.ts b/app/dashboard/src/vite-env.d.ts
deleted file mode 100644
index b1f45c7..0000000
--- a/app/dashboard/src/vite-env.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-/// <reference types="vite/client" />
-/// <reference types="vite-plugin-svgr/client" />
diff --git a/app/dashboard/tsconfig.json b/app/dashboard/tsconfig.json
deleted file mode 100644
index 86213d4..0000000
--- a/app/dashboard/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "compilerOptions": {
- "target": "ESNext",
- "useDefineForClassFields": true,
- "lib": [
- "DOM",
- "DOM.Iterable",
- "ESNext"
- ],
- "allowJs": false,
- "skipLibCheck": true,
- "esModuleInterop": false,
- "allowSyntheticDefaultImports": true,
- "strict": true,
- "forceConsistentCasingInFileNames": true,
- "module": "ESNext",
- "moduleResolution": "Node",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "noEmit": true,
- "jsx": "react-jsx",
- "baseUrl": "./src"
- },
- "include": [
- "src"
- ],
- "references": [
- {
- "path": "./tsconfig.node.json"
- }
- ]
-}
diff --git a/app/dashboard/tsconfig.node.json b/app/dashboard/tsconfig.node.json
deleted file mode 100644
index 9d31e2a..0000000
--- a/app/dashboard/tsconfig.node.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "compilerOptions": {
- "composite": true,
- "module": "ESNext",
- "moduleResolution": "Node",
- "allowSyntheticDefaultImports": true
- },
- "include": ["vite.config.ts"]
-}
diff --git a/app/dashboard/vite.config.ts b/app/dashboard/vite.config.ts
deleted file mode 100644
index d59af4c..0000000
--- a/app/dashboard/vite.config.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import react from '@vitejs/plugin-react';
-import { defineConfig, splitVendorChunkPlugin } from 'vite';
-import svgr from 'vite-plugin-svgr';
-import { visualizer } from 'rollup-plugin-visualizer';
-import tsconfigPaths from 'vite-tsconfig-paths';
-
-// https://vitejs.dev/config/
-export default defineConfig({
- build: {
- chunkSizeWarningLimit: 100,
- rollupOptions: {
- onwarn(warning, warn) {
- if (warning.code === 'MODULE_LEVEL_DIRECTIVE') {
- return
- }
- warn(warning)
- }
- }
- },
- plugins: [
- tsconfigPaths(),
- react({
- include: '**/*.tsx',
- }),
- svgr(),
- visualizer(),
- splitVendorChunkPlugin(),
- ],
-});
diff --git a/makefile b/makefile
index 7e31509..05baf39 100644
--- a/makefile
+++ b/makefile
@@ -3,26 +3,25 @@ start:
alembic upgrade head
python main.py
-install-deps:
- npm install --prefix './app/dashboard'
+dashboard-deps:
+ pnpm install --prefix ./dashboard
-dashboard-build: install-deps
- VITE_BASE_API=/api/ npm run build --prefix './app/dashboard' --if-present -- --outDir dist --base '/dashboard/'
- cp ./app/dashboard/dist/index.html ./app/dashboard/dist/404.html
+dashboard-build:
+ cd dashboard; VITE_BASE_API=/api/ npm run build --if-present -- --outDir dist --base '/dashboard/'
dashboard-dev:
VITE_BASE_API=http://0.0.0.0:8000/api/ npm run dev \
- --prefix './app/dashboard/' \
+ --prefix './dashboard/' \
-- --host 0.0.0.0 \
--base /dashboard/ \
--clearScreen false
dashboard-preview:
VITE_BASE_API=http://0.0.0.0:8000/api/ npm run preview \
- --prefix './app/dashboard/' \
+ --prefix './dashboard/' \
-- --host 0.0.0.0 \
--base /dashboard/ \
--clearScreen false
dashboard-cleanup:
- rm -rf app/dashboard/node_modules/
+ rm -rf ./dashboard/node_modules/