diff --git a/.github/workflows/dashboard-ci.yml b/.github/workflows/dashboard-ci.yml
@@ -32,7 +32,7 @@ jobs:
run: npm ci
- name: Lint Dashboard
- run: npm ci
+ run: npm run lint
- name: Build Dashboard
run: npm run build --if-present -- --outDir build --base '/dashboard/'
diff --git a/app/dashboard/.eslintignore b/app/dashboard/.eslintignore
@@ -0,0 +1,65 @@
+# 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
@@ -0,0 +1,39 @@
+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
@@ -0,0 +1,50 @@
+{
+ "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/.prettierignore b/app/dashboard/.prettierignore
@@ -0,0 +1,5 @@
+.cache
+package.json
+package-lock.json
+public
+dist
diff --git a/app/dashboard/chakra.config.ts b/app/dashboard/chakra.config.ts
@@ -1,33 +1,33 @@
-import { extendTheme } from "@chakra-ui/react";
+import { extendTheme } from '@chakra-ui/react';
export const theme = extendTheme({
- shadows: { outline: "0 0 0 2px var(--chakra-colors-primary-200)" },
+ 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`,
+ body: 'Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif',
},
colors: {
- "light-border": "#d2d2d4",
+ 'light-border': '#d2d2d4',
primary: {
- 50: "#9cb7f2",
- 100: "#88a9ef",
- 200: "#749aec",
- 300: "#618ce9",
- 400: "#4d7de7",
- 500: "#396fe4",
- 600: "#3364cd",
- 700: "#2e59b6",
- 800: "#284ea0",
- 900: "#224389",
+ 50: '#9cb7f2',
+ 100: '#88a9ef',
+ 200: '#749aec',
+ 300: '#618ce9',
+ 400: '#4d7de7',
+ 500: '#396fe4',
+ 600: '#3364cd',
+ 700: '#2e59b6',
+ 800: '#284ea0',
+ 900: '#224389',
},
gray: {
- 750: "#222C3B",
+ 750: '#222C3B',
},
},
components: {
Alert: {
baseStyle: {
container: {
- borderRadius: "6px",
- fontSize: "sm",
+ borderRadius: '6px',
+ fontSize: 'sm',
},
},
},
@@ -35,52 +35,52 @@ export const theme = extendTheme({
baseStyle: {
field: {
_dark: {
- borderColor: "gray.600",
- borderRadius: "6px",
+ borderColor: 'gray.600',
+ borderRadius: '6px',
},
_light: {
- borderRadius: "6px",
+ borderRadius: '6px',
},
},
},
},
FormHelperText: {
baseStyle: {
- fontSize: "xs",
+ fontSize: 'xs',
},
},
FormLabel: {
baseStyle: {
- fontSize: "sm",
- fontWeight: "medium",
- mb: "1",
- _dark: { color: "gray.300" },
+ fontSize: 'sm',
+ fontWeight: 'medium',
+ mb: '1',
+ _dark: { color: 'gray.300' },
},
},
Input: {
baseStyle: {
addon: {
_dark: {
- borderColor: "gray.600",
+ borderColor: 'gray.600',
_placeholder: {
- color: "gray.500",
+ color: 'gray.500',
},
},
},
field: {
_focusVisible: {
- boxShadow: "none",
- borderColor: "primary.200",
- outlineColor: "primary.200",
+ boxShadow: 'none',
+ borderColor: 'primary.200',
+ outlineColor: 'primary.200',
},
_dark: {
- borderColor: "gray.600",
+ borderColor: 'gray.600',
_disabled: {
- color: "gray.400",
- borderColor: "gray.500",
+ color: 'gray.400',
+ borderColor: 'gray.500',
},
_placeholder: {
- color: "gray.500",
+ color: 'gray.500',
},
},
},
@@ -89,75 +89,75 @@ export const theme = extendTheme({
Table: {
baseStyle: {
table: {
- borderCollapse: "separate",
+ borderCollapse: 'separate',
borderSpacing: 0,
},
thead: {
- borderBottomColor: "light-border",
+ borderBottomColor: 'light-border',
},
th: {
- background: "#F9FAFB",
- borderColor: "light-border !important",
- borderBottomColor: "light-border !important",
- borderTop: "1px solid ",
- borderTopColor: "light-border !important",
+ 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",
+ borderLeft: '1px solid',
+ borderColor: 'light-border !important',
},
_last: {
- borderRight: "1px solid",
- borderColor: "light-border !important",
+ borderRight: '1px solid',
+ borderColor: 'light-border !important',
},
_dark: {
- borderColor: "gray.600 !important",
- background: "gray.750",
+ borderColor: 'gray.600 !important',
+ background: 'gray.750',
},
},
td: {
- transition: "all .1s ease-out",
- borderColor: "light-border",
- borderBottomColor: "light-border !important",
+ transition: 'all .1s ease-out',
+ borderColor: 'light-border',
+ borderBottomColor: 'light-border !important',
_first: {
- borderLeft: "1px solid",
- borderColor: "light-border",
+ borderLeft: '1px solid',
+ borderColor: 'light-border',
_dark: {
- borderColor: "gray.600",
+ borderColor: 'gray.600',
},
},
_last: {
- borderRight: "1px solid",
- borderColor: "light-border",
+ borderRight: '1px solid',
+ borderColor: 'light-border',
_dark: {
- borderColor: "gray.600",
+ borderColor: 'gray.600',
},
},
_dark: {
- borderColor: "gray.600",
- borderBottomColor: "gray.600 !important",
+ borderColor: 'gray.600',
+ borderBottomColor: 'gray.600 !important',
},
},
tr: {
- "&.interactive": {
- cursor: "pointer",
+ '&.interactive': {
+ cursor: 'pointer',
_hover: {
- "& > td": {
- bg: "gray.200",
+ '& > td': {
+ bg: 'gray.200',
},
_dark: {
- "& > td": {
- bg: "gray.750",
+ '& > td': {
+ bg: 'gray.750',
},
},
},
},
_last: {
- "& > td": {
+ '& > td': {
_first: {
- borderBottomLeftRadius: "8px",
+ borderBottomLeftRadius: '8px',
},
_last: {
- borderBottomRightRadius: "8px",
+ borderBottomRightRadius: '8px',
},
},
},
diff --git a/app/dashboard/package-lock.json b/app/dashboard/package-lock.json
@@ -1,11 +1,11 @@
{
- "name": "marzban-dashboard",
+ "name": "marzneshin-dashboard",
"version": "0.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
- "name": "marzban-dashboard",
+ "name": "marzneshin-dashboard",
"version": "0.0.0",
"hasInstallScript": true,
"dependencies": {
@@ -19,6 +19,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",
@@ -58,14 +60,28 @@
"@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",
"sass": "^1.57.1",
"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.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@@ -701,6 +717,21 @@
"@esbuild/win32-x64": "0.17.19"
}
},
+ "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.0.14",
"resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.0.14.tgz",
@@ -2219,6 +2250,72 @@
"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/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/js": {
+ "version": "8.56.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
+ "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
"node_modules/@fastify/busboy": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz",
@@ -2262,6 +2359,36 @@
"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/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.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
@@ -2367,6 +2494,50 @@
"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/@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.6",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
@@ -2636,6 +2807,18 @@
"integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
"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.0",
"resolved": "https://registry.npmjs.org/@types/jsoneditor/-/jsoneditor-9.9.0.tgz",
@@ -2752,137 +2935,617 @@
"integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
"devOptional": true
},
- "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==",
+ "node_modules/@types/semver": {
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
+ "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.1.tgz",
+ "integrity": "sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==",
"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"
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.19.1",
+ "@typescript-eslint/type-utils": "6.19.1",
+ "@typescript-eslint/utils": "6.19.1",
+ "@typescript-eslint/visitor-keys": "6.19.1",
+ "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": "^14.18.0 || >=16.0.0"
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "vite": "^3.0.0"
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/@zag-js/element-size": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.3.2.tgz",
- "integrity": "sha512-bVvvigUGvAuj7PCkE5AbzvTJDTw5f3bg9nQdv+ErhVN8SfPPppLJEmmWdxqsRzrHXgx8ypJt/+Ty0kjtISVDsQ=="
+ "node_modules/@typescript-eslint/eslint-plugin/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/@zag-js/focus-visible": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.2.2.tgz",
- "integrity": "sha512-0j2gZq8HiZ51z4zNnSkF1iSkqlwRDvdH+son3wHdoz+7IUdMN/5Exd4TxMJ+gq2Of1DiXReYLL9qqh2PdQ4wgA=="
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
},
- "node_modules/ace-builds": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.20.0.tgz",
- "integrity": "sha512-JUvWbRXz7tL3EkcM5CpVyyuu9mvVRo594ZRgwHzb9arb9s2o5gTg94Lrk3zQZzM1udq6fRSDnmU2RClJPt9aNw=="
+ "node_modules/@typescript-eslint/eslint-plugin/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/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.1.tgz",
+ "integrity": "sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==",
+ "dev": true,
"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"
+ "@typescript-eslint/scope-manager": "6.19.1",
+ "@typescript-eslint/types": "6.19.1",
+ "@typescript-eslint/typescript-estree": "6.19.1",
+ "@typescript-eslint/visitor-keys": "6.19.1",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
},
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "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==",
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz",
+ "integrity": "sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.19.1",
+ "@typescript-eslint/visitor-keys": "6.19.1"
+ },
"engines": {
- "node": ">=8"
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "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==",
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.1.tgz",
+ "integrity": "sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==",
+ "dev": true,
"dependencies": {
- "color-convert": "^1.9.0"
+ "@typescript-eslint/typescript-estree": "6.19.1",
+ "@typescript-eslint/utils": "6.19.1",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
},
"engines": {
- "node": ">=4"
+ "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/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.1.tgz",
+ "integrity": "sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==",
+ "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.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz",
+ "integrity": "sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==",
"dev": true,
"dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
+ "@typescript-eslint/types": "6.19.1",
+ "@typescript-eslint/visitor-keys": "6.19.1",
+ "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": ">= 8"
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/apexcharts": {
- "version": "3.40.0",
- "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.40.0.tgz",
- "integrity": "sha512-dSi3BUfCJkFd67uFp+xffrJVd3lDT7AAUUyRp0qPYiglJ76CeZLddVhM3FAk1P9GCzf8VewqGYUPCYQvXm+b9A==",
+ "node_modules/@typescript-eslint/typescript-estree/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": {
- "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"
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/aria-hidden": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
- "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
+ "node_modules/@typescript-eslint/typescript-estree/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": {
- "tslib": "^2.0.0"
+ "yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
- "node_modules/autoprefixer": {
- "version": "10.4.13",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz",
- "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==",
+ "node_modules/@typescript-eslint/typescript-estree/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,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/autoprefixer"
- }
- ],
"dependencies": {
- "browserslist": "^4.21.4",
- "caniuse-lite": "^1.0.30001426",
- "fraction.js": "^4.2.0",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.0.0",
- "postcss-value-parser": "^4.2.0"
+ "brace-expansion": "^2.0.1"
},
- "bin": {
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.1.tgz",
+ "integrity": "sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==",
+ "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.19.1",
+ "@typescript-eslint/types": "6.19.1",
+ "@typescript-eslint/typescript-estree": "6.19.1",
+ "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/utils/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/@typescript-eslint/utils/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/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/@typescript-eslint/visitor-keys": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz",
+ "integrity": "sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.19.1",
+ "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/@zag-js/element-size": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.3.2.tgz",
+ "integrity": "sha512-bVvvigUGvAuj7PCkE5AbzvTJDTw5f3bg9nQdv+ErhVN8SfPPppLJEmmWdxqsRzrHXgx8ypJt/+Ty0kjtISVDsQ=="
+ },
+ "node_modules/@zag-js/focus-visible": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.2.2.tgz",
+ "integrity": "sha512-0j2gZq8HiZ51z4zNnSkF1iSkqlwRDvdH+son3wHdoz+7IUdMN/5Exd4TxMJ+gq2Of1DiXReYLL9qqh2PdQ4wgA=="
+ },
+ "node_modules/ace-builds": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.20.0.tgz",
+ "integrity": "sha512-JUvWbRXz7tL3EkcM5CpVyyuu9mvVRo594ZRgwHzb9arb9s2o5gTg94Lrk3zQZzM1udq6fRSDnmU2RClJPt9aNw=="
+ },
+ "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/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.40.0",
+ "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.40.0.tgz",
+ "integrity": "sha512-dSi3BUfCJkFd67uFp+xffrJVd3lDT7AAUUyRp0qPYiglJ76CeZLddVhM3FAk1P9GCzf8VewqGYUPCYQvXm+b9A==",
+ "dependencies": {
+ "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/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.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ },
+ "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.findlastindex": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
+ "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.2.1"
+ },
+ "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.tosorted": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz",
+ "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.2.1"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
+ "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "is-array-buffer": "^3.0.2",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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.13",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz",
+ "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-lite": "^1.0.30001426",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
"autoprefixer": "bin/autoprefixer"
},
"engines": {
@@ -2892,6 +3555,17 @@
"postcss": "^8.1.0"
}
},
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "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",
@@ -2992,6 +3666,19 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
+ "node_modules/call-bind": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+ "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.1",
+ "set-function-length": "^1.1.1"
+ },
+ "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",
@@ -3261,6 +3948,21 @@
"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",
@@ -3347,6 +4049,19 @@
"node-fetch": "2.6.7"
}
},
+ "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",
@@ -3393,6 +4108,24 @@
}
}
},
+ "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.1",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
+ "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/define-lazy-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -3401,6 +4134,22 @@
"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/dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz",
@@ -3424,6 +4173,29 @@
"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.311",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz",
@@ -3460,6 +4232,116 @@
"is-arrayish": "^0.2.1"
}
},
+ "node_modules/es-abstract": {
+ "version": "1.22.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
+ "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "arraybuffer.prototype.slice": "^1.0.2",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.5",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.2",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.12",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "safe-array-concat": "^1.0.1",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.8",
+ "string.prototype.trimend": "^1.0.7",
+ "string.prototype.trimstart": "^1.0.7",
+ "typed-array-buffer": "^1.0.0",
+ "typed-array-byte-length": "^1.0.0",
+ "typed-array-byte-offset": "^1.0.0",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
+ "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
+ "dependencies": {
+ "asynciterator.prototype": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.1",
+ "es-set-tostringtag": "^2.0.1",
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "globalthis": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "iterator.prototype": "^1.1.2",
+ "safe-array-concat": "^1.0.1"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
+ "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.2",
+ "has-tostringtag": "^1.0.0",
+ "hasown": "^2.0.0"
+ },
+ "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.15.18",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
@@ -3635,205 +4517,645 @@
"dev": true,
"optional": true,
"os": [
- "linux"
+ "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-linux-arm64": {
+ "node_modules/esbuild-openbsd-64": {
"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==",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
+ "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
"cpu": [
- "arm64"
+ "x64"
],
"dev": true,
"optional": true,
"os": [
- "linux"
+ "openbsd"
],
"engines": {
"node": ">=12"
}
},
- "node_modules/esbuild-linux-mips64le": {
+ "node_modules/esbuild-sunos-64": {
"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==",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
+ "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
"cpu": [
- "mips64el"
+ "x64"
],
"dev": true,
"optional": true,
"os": [
- "linux"
+ "sunos"
],
"engines": {
"node": ">=12"
}
},
- "node_modules/esbuild-linux-ppc64le": {
+ "node_modules/esbuild-windows-32": {
"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==",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
+ "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
"cpu": [
- "ppc64"
+ "ia32"
],
"dev": true,
"optional": true,
"os": [
- "linux"
+ "win32"
],
"engines": {
"node": ">=12"
}
},
- "node_modules/esbuild-linux-riscv64": {
+ "node_modules/esbuild-windows-64": {
"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==",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
+ "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
"cpu": [
- "riscv64"
+ "x64"
],
"dev": true,
"optional": true,
"os": [
- "linux"
+ "win32"
],
"engines": {
"node": ">=12"
}
},
- "node_modules/esbuild-linux-s390x": {
+ "node_modules/esbuild-windows-arm64": {
"version": "0.15.18",
- "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
- "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
+ "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
"cpu": [
- "s390x"
+ "arm64"
],
"dev": true,
"optional": true,
"os": [
- "linux"
+ "win32"
],
"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"
- ],
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "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.56.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
+ "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.56.0",
+ "@humanwhocodes/config-array": "^0.11.13",
+ "@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,
- "optional": true,
- "os": [
- "netbsd"
- ],
+ "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-import-resolver-node/node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "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-module-utils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
+ "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+ "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/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-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.33.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
+ "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "array.prototype.tosorted": "^1.1.1",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.0.12",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "object.hasown": "^1.1.2",
+ "object.values": "^1.1.6",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.4",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.8"
+ },
+ "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/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/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-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/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": ">=12"
+ "node": ">=10.13.0"
}
},
- "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"
- ],
+ "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": ">=12"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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"
- ],
+ "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": ">=12"
+ "node": ">=8"
}
},
- "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"
- ],
+ "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": ">=12"
+ "node": ">=8"
}
},
- "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"
- ],
+ "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"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "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"
- ],
+ "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": ">=12"
+ "node": ">=0.10"
}
},
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "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": ">=6"
+ "node": ">=4.0"
}
},
- "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==",
+ "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": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=4.0"
}
},
"node_modules/estree-walker": {
@@ -3842,16 +5164,70 @@
"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.16.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
+ "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
+ "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",
@@ -3869,6 +5245,39 @@
"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.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ=="
+ },
"node_modules/focus-lock": {
"version": "0.11.6",
"resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz",
@@ -3880,6 +5289,14 @@
"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.2.0",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
@@ -3963,9 +5380,37 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "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/gensync": {
"version": "1.0.0-beta.2",
@@ -3984,6 +5429,20 @@
"node": "6.* || 8.* || >= 10.*"
}
},
+ "node_modules/get-intrinsic": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+ "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "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",
@@ -3992,6 +5451,21 @@
"node": ">=6"
}
},
+ "node_modules/get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/github-buttons": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.24.0.tgz",
@@ -4034,31 +5508,136 @@
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true,
"engines": {
- "node": ">=4"
+ "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/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/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "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/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/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "node_modules/has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"dependencies": {
- "function-bind": "^1.1.1"
+ "has-symbols": "^1.0.2"
},
"engines": {
- "node": ">= 0.4.0"
+ "node": ">= 0.4"
+ },
+ "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==",
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
"engines": {
- "node": ">=4"
+ "node": ">= 0.4"
}
},
"node_modules/hey-listen": {
@@ -4120,6 +5699,14 @@
"cross-fetch": "3.1.5"
}
},
+ "node_modules/ignore": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
+ "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/immutable": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz",
@@ -4141,6 +5728,14 @@
"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/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -4155,6 +5750,19 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
+ "node_modules/internal-slot": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
+ "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.2",
+ "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",
@@ -4163,11 +5771,49 @@
"loose-envify": "^1.0.0"
}
},
+ "node_modules/is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ },
+ "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",
@@ -4180,12 +5826,52 @@
"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.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "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": "^1.0.3"
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -4209,11 +5895,21 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
"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",
@@ -4222,11 +5918,24 @@
"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==",
- "dev": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -4234,6 +5943,25 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "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",
@@ -4243,6 +5971,135 @@
"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-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.2",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "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.12",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
+ "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "dependencies": {
+ "which-typed-array": "^1.1.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "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.2",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "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",
@@ -4254,6 +6111,28 @@
"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",
@@ -4283,6 +6162,17 @@
"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/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -4295,6 +6185,11 @@
"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",
@@ -4310,6 +6205,11 @@
"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",
@@ -4354,6 +6254,40 @@
"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/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",
@@ -4367,6 +6301,20 @@
"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.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
@@ -4377,6 +6325,11 @@
"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",
@@ -4431,8 +6384,30 @@
"resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz",
"integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==",
"dependencies": {
- "@babel/runtime": "^7.12.5",
- "remove-accents": "0.4.2"
+ "@babel/runtime": "^7.12.5",
+ "remove-accents": "0.4.2"
+ }
+ },
+ "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": {
@@ -4451,6 +6426,15 @@
"node": "*"
}
},
+ "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/mobius1-selectr": {
"version": "2.4.13",
"resolved": "https://registry.npmjs.org/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz",
@@ -4487,6 +6471,11 @@
"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/node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@@ -4543,6 +6532,108 @@
"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.1",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
+ "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1"
+ }
+ },
+ "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",
@@ -4583,6 +6674,50 @@
"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/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -4611,6 +6746,14 @@
"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",
@@ -4619,6 +6762,14 @@
"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",
@@ -4688,21 +6839,42 @@
"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": "2.8.8",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
- "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz",
+ "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==",
"dev": true,
+ "peer": true,
"bin": {
- "prettier": "bin-prettier.js"
+ "prettier": "bin/prettier.cjs"
},
"engines": {
- "node": ">=10.13.0"
+ "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/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -4729,6 +6901,25 @@
"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/react": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
@@ -5106,11 +7297,46 @@
"node": ">=8.10.0"
}
},
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
+ "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "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.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
"integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
},
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
+ "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "set-function-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/remove-accents": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz",
@@ -5153,6 +7379,15 @@
"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",
@@ -5215,6 +7450,61 @@
"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.0",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz",
+ "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "get-intrinsic": "^1.2.2",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz",
+ "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "get-intrinsic": "^1.2.2",
+ "is-regex": "^1.1.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/sass": {
"version": "1.58.3",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz",
@@ -5244,11 +7534,79 @@
"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/set-function-length": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz",
+ "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==",
+ "dependencies": {
+ "define-data-property": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.2",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
+ "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "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.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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",
@@ -5299,6 +7657,67 @@
"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",
@@ -5310,6 +7729,26 @@
"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-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.1.3",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz",
@@ -5426,6 +7865,27 @@
"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/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.1",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
@@ -5461,6 +7921,18 @@
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
+ "node_modules/ts-api-utils": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
+ "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
"node_modules/tsconfck": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.0.3.tgz",
@@ -5480,10 +7952,117 @@
}
}
},
+ "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.5.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
- "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+ "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.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/typed-array-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+ "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+ "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/typescript": {
"version": "4.9.5",
@@ -5503,6 +8082,20 @@
"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.27.2",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz",
@@ -5740,6 +8333,92 @@
"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.1",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "dependencies": {
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-weakmap": "^2.0.1",
+ "is-weakset": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
+ "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.4",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -5838,6 +8517,17 @@
"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",
@@ -5884,6 +8574,11 @@
}
},
"dependencies": {
+ "@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=="
+ },
"@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@@ -6345,6 +9040,12 @@
"@esbuild/win32-ia32": "0.17.19",
"@esbuild/win32-x64": "0.17.19"
}
+ },
+ "prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true
}
}
},
@@ -7405,6 +10106,50 @@
"dev": true,
"optional": true
},
+ "@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==",
+ "requires": {
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "@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=="
+ },
+ "@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ }
+ }
+ },
+ "@eslint/js": {
+ "version": "8.56.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
+ "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A=="
+ },
"@fastify/busboy": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz",
@@ -7437,6 +10182,26 @@
"integrity": "sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ==",
"requires": {}
},
+ "@humanwhocodes/config-array": {
+ "version": "0.11.14",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+ "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+ "requires": {
+ "@humanwhocodes/object-schema": "^2.0.2",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ }
+ },
+ "@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
+ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw=="
+ },
"@jridgewell/gen-mapping": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
@@ -7533,6 +10298,35 @@
"tslib": "^2.3.1"
}
},
+ "@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==",
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@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=="
+ },
+ "@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==",
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@pkgr/core": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
+ "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
+ "dev": true
+ },
"@popperjs/core": {
"version": "2.11.6",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
@@ -7678,6 +10472,18 @@
"integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
"dev": true
},
+ "@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
+ },
+ "@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
+ },
"@types/jsoneditor": {
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/@types/jsoneditor/-/jsoneditor-9.9.0.tgz",
@@ -7746,53 +10552,261 @@
"integrity": "sha512-otTJsJpofYAeaIeOwV5xBUGpo6exXG2HX7X4nseToCB2VgPEBxGBHCm/FecZ676doNR7HCSTVtmohxfG2b3/yQ==",
"dev": true,
"requires": {
- "@types/react": "*"
+ "@types/react": "*"
+ }
+ },
+ "@types/react-datepicker": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-4.8.0.tgz",
+ "integrity": "sha512-20uzZsIf4moPAjjHDfPvH8UaOHZBxrkiQZoLS3wgKq8Xhp+95gdercLEdoA7/I8nR9R5Jz2qQkdMIM+Lq4AS1A==",
+ "dev": true,
+ "requires": {
+ "@popperjs/core": "^2.9.2",
+ "@types/react": "*",
+ "date-fns": "^2.0.1",
+ "react-popper": "^2.2.5"
+ }
+ },
+ "@types/react-dom": {
+ "version": "18.0.11",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz",
+ "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-json-editor-ajrm": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/@types/react-json-editor-ajrm/-/react-json-editor-ajrm-2.5.3.tgz",
+ "integrity": "sha512-hHf3FU1HjL6Lm3rK2iWUJtoYpZ1qDCSffnLAQXCf++TP1Ms18rnB06gBK3psQ8NEW6CfrfRNlirIL3D/P80QVg==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-slick": {
+ "version": "0.23.10",
+ "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.10.tgz",
+ "integrity": "sha512-ZiqdencANDZy6sWOWJ54LDvebuXFEhDlHtXU9FFipQR2BcYU2QJxZhvJPW6YK7cocibUiNn+YvDTbt1HtCIBVA==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/scheduler": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
+ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
+ "devOptional": true
+ },
+ "@types/semver": {
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
+ "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+ "dev": true
+ },
+ "@typescript-eslint/eslint-plugin": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.1.tgz",
+ "integrity": "sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.19.1",
+ "@typescript-eslint/type-utils": "6.19.1",
+ "@typescript-eslint/utils": "6.19.1",
+ "@typescript-eslint/visitor-keys": "6.19.1",
+ "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"
+ },
+ "dependencies": {
+ "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,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.1.tgz",
+ "integrity": "sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "6.19.1",
+ "@typescript-eslint/types": "6.19.1",
+ "@typescript-eslint/typescript-estree": "6.19.1",
+ "@typescript-eslint/visitor-keys": "6.19.1",
+ "debug": "^4.3.4"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz",
+ "integrity": "sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "6.19.1",
+ "@typescript-eslint/visitor-keys": "6.19.1"
}
},
- "@types/react-datepicker": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-4.8.0.tgz",
- "integrity": "sha512-20uzZsIf4moPAjjHDfPvH8UaOHZBxrkiQZoLS3wgKq8Xhp+95gdercLEdoA7/I8nR9R5Jz2qQkdMIM+Lq4AS1A==",
+ "@typescript-eslint/type-utils": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.1.tgz",
+ "integrity": "sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==",
"dev": true,
"requires": {
- "@popperjs/core": "^2.9.2",
- "@types/react": "*",
- "date-fns": "^2.0.1",
- "react-popper": "^2.2.5"
+ "@typescript-eslint/typescript-estree": "6.19.1",
+ "@typescript-eslint/utils": "6.19.1",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
}
},
- "@types/react-dom": {
- "version": "18.0.11",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz",
- "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==",
+ "@typescript-eslint/types": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.1.tgz",
+ "integrity": "sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz",
+ "integrity": "sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==",
"dev": true,
"requires": {
- "@types/react": "*"
+ "@typescript-eslint/types": "6.19.1",
+ "@typescript-eslint/visitor-keys": "6.19.1",
+ "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"
+ },
+ "dependencies": {
+ "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,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "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,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ },
+ "semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
}
},
- "@types/react-json-editor-ajrm": {
- "version": "2.5.3",
- "resolved": "https://registry.npmjs.org/@types/react-json-editor-ajrm/-/react-json-editor-ajrm-2.5.3.tgz",
- "integrity": "sha512-hHf3FU1HjL6Lm3rK2iWUJtoYpZ1qDCSffnLAQXCf++TP1Ms18rnB06gBK3psQ8NEW6CfrfRNlirIL3D/P80QVg==",
+ "@typescript-eslint/utils": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.1.tgz",
+ "integrity": "sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==",
"dev": true,
"requires": {
- "@types/react": "*"
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.19.1",
+ "@typescript-eslint/types": "6.19.1",
+ "@typescript-eslint/typescript-estree": "6.19.1",
+ "semver": "^7.5.4"
+ },
+ "dependencies": {
+ "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,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
}
},
- "@types/react-slick": {
- "version": "0.23.10",
- "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.10.tgz",
- "integrity": "sha512-ZiqdencANDZy6sWOWJ54LDvebuXFEhDlHtXU9FFipQR2BcYU2QJxZhvJPW6YK7cocibUiNn+YvDTbt1HtCIBVA==",
+ "@typescript-eslint/visitor-keys": {
+ "version": "6.19.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz",
+ "integrity": "sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==",
"dev": true,
"requires": {
- "@types/react": "*"
+ "@typescript-eslint/types": "6.19.1",
+ "eslint-visitor-keys": "^3.4.1"
}
},
- "@types/scheduler": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
- "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
- "devOptional": true
+ "@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=="
},
"@vitejs/plugin-react": {
"version": "2.2.0",
@@ -7824,6 +10838,17 @@
"resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.20.0.tgz",
"integrity": "sha512-JUvWbRXz7tL3EkcM5CpVyyuu9mvVRo594ZRgwHzb9arb9s2o5gTg94Lrk3zQZzM1udq6fRSDnmU2RClJPt9aNw=="
},
+ "acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg=="
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "requires": {}
+ },
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -7871,6 +10896,11 @@
"svg.select.js": "^3.0.1"
}
},
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
"aria-hidden": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
@@ -7879,6 +10909,102 @@
"tslib": "^2.0.0"
}
},
+ "array-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ }
+ },
+ "array-includes": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
+ "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
+ "requires": {
+ "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"
+ }
+ },
+ "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
+ },
+ "array.prototype.findlastindex": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
+ "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.2.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "array.prototype.tosorted": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz",
+ "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.2.1"
+ }
+ },
+ "arraybuffer.prototype.slice": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
+ "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
+ "requires": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "is-array-buffer": "^3.0.2",
+ "is-shared-array-buffer": "^1.0.2"
+ }
+ },
+ "asynciterator.prototype": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
+ "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
+ "requires": {
+ "has-symbols": "^1.0.3"
+ }
+ },
"autoprefixer": {
"version": "10.4.13",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz",
@@ -7893,6 +11019,11 @@
"postcss-value-parser": "^4.2.0"
}
},
+ "available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw=="
+ },
"babel-plugin-macros": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
@@ -7964,6 +11095,16 @@
"update-browserslist-db": "^1.0.10"
}
},
+ "call-bind": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+ "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+ "requires": {
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.1",
+ "set-function-length": "^1.1.1"
+ }
+ },
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -8165,6 +11306,14 @@
"chalk": "^2.4.2",
"clear-any-console": "^1.16.0",
"prettier": "^2.0.5"
+ },
+ "dependencies": {
+ "prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true
+ }
}
},
"cliui": {
@@ -8244,6 +11393,16 @@
"node-fetch": "2.6.7"
}
},
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
"css-box-model": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz",
@@ -8275,11 +11434,36 @@
"ms": "2.1.2"
}
},
+ "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=="
+ },
+ "define-data-property": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
+ "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+ "requires": {
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ }
+ },
"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=="
},
+ "define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "requires": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ }
+ },
"dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz",
@@ -8300,6 +11484,23 @@
"resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
},
+ "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,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
"electron-to-chromium": {
"version": "1.4.311",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz",
@@ -8330,6 +11531,101 @@
"is-arrayish": "^0.2.1"
}
},
+ "es-abstract": {
+ "version": "1.22.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
+ "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
+ "requires": {
+ "array-buffer-byte-length": "^1.0.0",
+ "arraybuffer.prototype.slice": "^1.0.2",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.5",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.2",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.12",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "safe-array-concat": "^1.0.1",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.8",
+ "string.prototype.trimend": "^1.0.7",
+ "string.prototype.trimstart": "^1.0.7",
+ "typed-array-buffer": "^1.0.0",
+ "typed-array-byte-length": "^1.0.0",
+ "typed-array-byte-offset": "^1.0.0",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.13"
+ }
+ },
+ "es-iterator-helpers": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
+ "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
+ "requires": {
+ "asynciterator.prototype": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.1",
+ "es-set-tostringtag": "^2.0.1",
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "globalthis": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "iterator.prototype": "^1.1.2",
+ "safe-array-concat": "^1.0.1"
+ }
+ },
+ "es-set-tostringtag": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
+ "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
+ "requires": {
+ "get-intrinsic": "^1.2.2",
+ "has-tostringtag": "^1.0.0",
+ "hasown": "^2.0.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
"esbuild": {
"version": "0.15.18",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
@@ -8458,57 +11754,373 @@
"dev": true,
"optional": true
},
- "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==",
+ "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==",
+ "dev": true,
+ "optional": true
+ },
+ "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==",
+ "dev": true,
+ "optional": true
+ },
+ "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==",
+ "dev": true,
+ "optional": true
+ },
+ "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==",
+ "dev": true,
+ "optional": true
+ },
+ "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==",
+ "dev": true,
+ "optional": true
+ },
+ "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==",
+ "dev": true,
+ "optional": true
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+ },
+ "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=="
+ },
+ "eslint": {
+ "version": "8.56.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
+ "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+ "requires": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.56.0",
+ "@humanwhocodes/config-array": "^0.11.13",
+ "@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"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "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=="
+ },
+ "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==",
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "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,
- "optional": true
+ "requires": {}
},
- "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==",
+ "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,
- "optional": true
+ "requires": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ }
+ }
},
- "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==",
+ "eslint-module-utils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
+ "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
"dev": true,
- "optional": true
+ "requires": {
+ "debug": "^3.2.7"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
},
- "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==",
- "dev": true,
- "optional": true
+ "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,
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ }
+ }
},
- "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==",
+ "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,
- "optional": true
+ "requires": {
+ "prettier-linter-helpers": "^1.0.0",
+ "synckit": "^0.8.6"
+ }
},
- "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==",
+ "eslint-plugin-react": {
+ "version": "7.33.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
+ "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
+ "requires": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "array.prototype.tosorted": "^1.1.1",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.0.12",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "object.hasown": "^1.1.2",
+ "object.values": "^1.1.6",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.4",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.8"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ }
+ }
+ },
+ "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,
- "optional": true
+ "requires": {}
},
- "escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+ "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==",
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
},
- "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=="
+ "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=="
+ },
+ "espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "requires": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ }
+ },
+ "esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "requires": {
+ "estraverse": "^5.1.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "requires": {
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
},
"estree-walker": {
"version": "2.0.2",
@@ -8516,16 +12128,61 @@
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"dev": true
},
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ },
"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=="
},
+ "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
+ },
+ "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,
+ "requires": {
+ "@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"
+ }
+ },
"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=="
},
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
+ },
+ "fastq": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
+ "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "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==",
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -8540,6 +12197,30 @@
"resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
"integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
},
+ "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==",
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "requires": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ=="
+ },
"focus-lock": {
"version": "0.11.6",
"resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz",
@@ -8548,6 +12229,14 @@
"tslib": "^2.0.3"
}
},
+ "for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "requires": {
+ "is-callable": "^1.1.3"
+ }
+ },
"fraction.js": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
@@ -8615,9 +12304,25 @@
"optional": true
},
"function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ }
+ },
+ "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=="
},
"gensync": {
"version": "1.0.0-beta.2",
@@ -8630,11 +12335,31 @@
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
},
+ "get-intrinsic": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+ "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+ "requires": {
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ }
+ },
"get-nonce": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
"integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="
},
+ "get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
+ },
"github-buttons": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.24.0.tgz",
@@ -8668,24 +12393,90 @@
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
},
+ "globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "requires": {
+ "define-properties": "^1.1.3"
+ }
+ },
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
"globrex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
"integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="
},
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"requires": {
- "function-bind": "^1.1.1"
+ "get-intrinsic": "^1.1.3"
}
},
+ "graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="
+ },
+ "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=="
+ },
"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=="
},
+ "has-property-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+ "requires": {
+ "get-intrinsic": "^1.2.2"
+ }
+ },
+ "has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "requires": {
+ "function-bind": "^1.1.2"
+ }
+ },
"hey-listen": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz",
@@ -8731,6 +12522,11 @@
"cross-fetch": "3.1.5"
}
},
+ "ignore": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
+ "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg=="
+ },
"immutable": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz",
@@ -8746,6 +12542,11 @@
"resolve-from": "^4.0.0"
}
},
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="
+ },
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -8760,6 +12561,16 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
+ "internal-slot": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
+ "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
+ "requires": {
+ "get-intrinsic": "^1.2.2",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ }
+ },
"invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@@ -8768,58 +12579,211 @@
"loose-envify": "^1.0.0"
}
},
+ "is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ }
+ },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
},
+ "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==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "requires": {
+ "has-bigints": "^1.0.1"
+ }
+ },
"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,
"requires": {
- "binary-extensions": "^2.0.0"
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "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=="
+ },
+ "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==",
+ "requires": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "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=="
+ },
+ "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==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg=="
+ },
+ "is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA=="
+ },
+ "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
+ },
+ "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==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "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=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-set": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g=="
+ },
+ "is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "requires": {
+ "call-bind": "^1.0.2"
}
},
- "is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
"requires": {
- "has": "^1.0.3"
+ "has-tostringtag": "^1.0.0"
}
},
- "is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
},
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true
+ "is-typed-array": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
+ "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "requires": {
+ "which-typed-array": "^1.1.11"
+ }
},
- "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=="
+ "is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA=="
},
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
+ "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==",
"requires": {
- "is-extglob": "^2.1.1"
+ "call-bind": "^1.0.2"
}
},
- "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
+ "is-weakset": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
},
"is-wsl": {
"version": "2.2.0",
@@ -8829,6 +12793,28 @@
"is-docker": "^2.0.0"
}
},
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "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==",
+ "requires": {
+ "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"
+ }
+ },
"javascript-natural-sort": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
@@ -8855,12 +12841,25 @@
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
+ "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=="
+ },
"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",
@@ -8876,6 +12875,11 @@
"resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz",
"integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg=="
},
+ "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=="
+ },
"json2mq": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
@@ -8911,6 +12915,34 @@
"resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.1.0.tgz",
"integrity": "sha512-idqReg23J0PVRAADmZMc5xQM3xeOX5bTB6OTyMnzq33IXJXmn9iJuWIEvGmrN80rQf4d7uLTMEDwpzujNcI0Rg=="
},
+ "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==",
+ "requires": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ }
+ },
+ "keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "requires": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
"lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@@ -8922,6 +12954,14 @@
"integrity": "sha512-xfi5+iDxTLhu0hbnNubUs+qoQQqxhtEZeObP5ELjUlHnl74bbasY7mOonsGQrAouyrbag3ebNLSse5xX1T7buQ==",
"requires": {}
},
+ "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==",
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
@@ -8932,6 +12972,11 @@
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
},
+ "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=="
+ },
"lodash.mergewith": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
@@ -8981,6 +13026,22 @@
"remove-accents": "0.4.2"
}
},
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
"microseconds": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz",
@@ -8994,6 +13055,12 @@
"brace-expansion": "^1.1.7"
}
},
+ "minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true
+ },
"mobius1-selectr": {
"version": "2.4.13",
"resolved": "https://registry.npmjs.org/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz",
@@ -9018,6 +13085,11 @@
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"dev": true
},
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
+ },
"node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@@ -9054,6 +13126,78 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
},
+ "object-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ=="
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.entries": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
+ "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "object.groupby": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
+ "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1"
+ }
+ },
+ "object.hasown": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz",
+ "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==",
+ "requires": {
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "object.values": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
+ "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
"oblivious-set": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz",
@@ -9088,6 +13232,35 @@
"is-wsl": "^2.2.0"
}
},
+ "optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "requires": {
+ "@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"
+ }
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -9107,11 +13280,21 @@
"lines-and-columns": "^1.1.6"
}
},
+ "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=="
+ },
"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=="
},
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ },
"path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
@@ -9155,11 +13338,26 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
+ },
"prettier": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
- "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
- "dev": true
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz",
+ "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==",
+ "dev": true,
+ "peer": true
+ },
+ "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,
+ "requires": {
+ "fast-diff": "^1.1.2"
+ }
},
"prop-types": {
"version": "15.8.1",
@@ -9182,6 +13380,11 @@
"integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==",
"requires": {}
},
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
+ },
"react": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
@@ -9409,11 +13612,34 @@
"picomatch": "^2.2.1"
}
},
+ "reflect.getprototypeof": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
+ "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "globalthis": "^1.0.3",
+ "which-builtin-type": "^1.1.3"
+ }
+ },
"regenerator-runtime": {
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
"integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
},
+ "regexp.prototype.flags": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
+ "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "set-function-name": "^2.0.0"
+ }
+ },
"remove-accents": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz",
@@ -9444,6 +13670,11 @@
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
},
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+ },
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -9479,6 +13710,35 @@
}
}
},
+ "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==",
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "safe-array-concat": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz",
+ "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==",
+ "requires": {
+ "call-bind": "^1.0.5",
+ "get-intrinsic": "^1.2.2",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ }
+ },
+ "safe-regex-test": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz",
+ "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==",
+ "requires": {
+ "call-bind": "^1.0.5",
+ "get-intrinsic": "^1.2.2",
+ "is-regex": "^1.1.4"
+ }
+ },
"sass": {
"version": "1.58.3",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz",
@@ -9501,7 +13761,57 @@
"semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
+ },
+ "set-function-length": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz",
+ "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==",
+ "requires": {
+ "define-data-property": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.2",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.1"
+ }
+ },
+ "set-function-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
+ "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+ "requires": {
+ "define-data-property": "^1.0.1",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
"slick-carousel": {
@@ -9542,6 +13852,52 @@
"strip-ansi": "^6.0.1"
}
},
+ "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==",
+ "requires": {
+ "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"
+ }
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -9550,6 +13906,17 @@
"ansi-regex": "^5.0.1"
}
},
+ "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
+ },
+ "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=="
+ },
"stylis": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz",
@@ -9638,6 +14005,21 @@
"svg.js": "^2.6.5"
}
},
+ "synckit": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz",
+ "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==",
+ "dev": true,
+ "requires": {
+ "@pkgr/core": "^0.1.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "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=="
+ },
"tiny-invariant": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
@@ -9667,16 +14049,102 @@
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
+ "ts-api-utils": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
+ "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
+ "dev": true,
+ "requires": {}
+ },
"tsconfck": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.0.3.tgz",
"integrity": "sha512-o3DsPZO1+C98KqHMdAbWs30zpxD30kj8r9OLA4ML1yghx4khNDzaaShNalfluh8ZPPhzKe3qyVCP1HiZszSAsw==",
"requires": {}
},
+ "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,
+ "requires": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "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,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ }
+ }
+ },
"tslib": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
- "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "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=="
+ },
+ "typed-array-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+ "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "typed-array-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+ "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "typed-array-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ }
},
"typescript": {
"version": "4.9.5",
@@ -9689,6 +14157,17 @@
"resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.6.tgz",
"integrity": "sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw=="
},
+ "unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
"undici": {
"version": "5.27.2",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz",
@@ -9829,6 +14308,68 @@
"webidl-conversions": "^3.0.0"
}
},
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "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"
+ }
+ },
+ "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==",
+ "requires": {
+ "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"
+ }
+ },
+ "which-collection": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "requires": {
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-weakmap": "^2.0.1",
+ "is-weakset": "^2.0.1"
+ }
+ },
+ "which-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
+ "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.4",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
"wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -9902,6 +14443,11 @@
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="
},
+ "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=="
+ },
"zod": {
"version": "3.22.4",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz",
diff --git a/app/dashboard/package.json b/app/dashboard/package.json
@@ -1,5 +1,5 @@
{
- "name": "marzban-dashboard",
+ "name": "marzneshin-dashboard",
"private": true,
"version": "0.0.0",
"scripts": {
@@ -7,7 +7,8 @@
"build": "tsc && vite build",
"preview": "vite preview --port 3000",
"gen:theme-typings": "chakra-cli tokens ./chakra.config.ts",
- "postinstall": "npm run gen:theme-typings"
+ "postinstall": "npm run gen:theme-typings",
+ "lint": "eslint --ignore-path .eslintignore . --ext ts --ext tsx --ext js --ext jsx"
},
"dependencies": {
"@chakra-ui/icons": "^2.1.1",
@@ -20,6 +21,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",
@@ -59,8 +62,14 @@
"@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",
"sass": "^1.57.1",
"typescript": "^4.9.5",
"vite": "^3.1.0",
diff --git a/app/dashboard/src/App.tsx b/app/dashboard/src/App.tsx
@@ -1,7 +1,7 @@
-import "react-datepicker/dist/react-datepicker.css";
-import "react-loading-skeleton/dist/skeleton.css";
-import { RouterProvider } from "react-router-dom";
-import { router } from "./components/modules/Router";
+import 'react-datepicker/dist/react-datepicker.css';
+import 'react-loading-skeleton/dist/skeleton.css';
+import { RouterProvider } from 'react-router-dom';
+import { router } from './components/modules/Router';
function App() {
return (
diff --git a/app/dashboard/src/components/CoreSettingsModal.tsx b/app/dashboard/src/components/CoreSettingsModal.tsx
@@ -18,28 +18,28 @@ import {
Text,
Tooltip,
useToast,
-} from "@chakra-ui/react";
+} from '@chakra-ui/react';
import {
ArrowPathIcon,
ArrowsPointingInIcon,
ArrowsPointingOutIcon,
Cog6ToothIcon,
-} from "@heroicons/react/24/outline";
-import { joinPaths } from "@remix-run/router";
-import classNames from "classnames";
-import { useCoreSettings } from "contexts/CoreSettingsContext";
-import { useDashboard } from "contexts/DashboardContext";
-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 { useMutation } from "react-query";
-import { ReadyState } from "react-use-websocket";
-import { useWebSocket } from "react-use-websocket/dist/lib/use-websocket";
-import { getAuthToken } from "utils/authStorage";
-import { Icon } from "./Icon";
-import { JsonEditor } from "./JsonEditor";
-import "./JsonEditor/themes.js";
+} from '@heroicons/react/24/outline';
+import { joinPaths } from '@remix-run/router';
+import classNames from 'classnames';
+import { useCoreSettings } from 'contexts/CoreSettingsContext';
+import { useDashboard } from 'contexts/DashboardContext';
+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 { useMutation } from 'react-query';
+import { ReadyState } from 'react-use-websocket';
+import { useWebSocket } from 'react-use-websocket/dist/lib/use-websocket';
+import { getAuthToken } from 'utils/authStorage';
+import { Icon } from './Icon';
+import { JsonEditor } from './JsonEditor';
+import './JsonEditor/themes.js';
export const MAX_NUMBER_OF_LOGS = 500;
@@ -71,30 +71,30 @@ export const ExitFullScreenIcon = chakra(ArrowsPointingInIcon, {
const getStatus = (status: string) => {
return {
- [ReadyState.CONNECTING]: "connecting",
- [ReadyState.OPEN]: "connected",
- [ReadyState.CLOSING]: "closed",
- [ReadyState.CLOSED]: "closed",
- [ReadyState.UNINSTANTIATED]: "closed",
+ [ReadyState.CONNECTING]: 'connecting',
+ [ReadyState.OPEN]: 'connected',
+ [ReadyState.CLOSING]: 'closed',
+ [ReadyState.CLOSED]: 'closed',
+ [ReadyState.UNINSTANTIATED]: 'closed',
}[status];
};
const getWebsocketUrl = () => {
try {
let baseURL = new URL(
- import.meta.env.VITE_BASE_API.startsWith("/")
+ 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, "/core/logs"]) +
- "?interval=1&token=" +
+ (baseURL.protocol === 'https:' ? 'wss://' : 'ws://') +
+ joinPaths([baseURL.host + baseURL.pathname, '/core/logs']) +
+ '?interval=1&token=' +
getAuthToken()
);
} catch (e) {
- console.error("Unable to generate websocket url");
+ console.error('Unable to generate websocket url');
console.error(e);
return null;
}
@@ -121,21 +121,21 @@ const CoreSettingModalContent: FC = () => {
});
useEffect(() => {
- if (config) form.setValue("config", config);
+ if (config) form.setValue('config', config);
}, [config]);
useEffect(() => {
if (isEditingCore) fetchCoreSettings();
}, [isEditingCore]);
- "".startsWith;
+ ''.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)
+ (logsDiv.current?.scrollHeight || 0) +
+ (logsDiv.current?.offsetHeight || 0)
) < 10;
if (logsDiv.current && isScrollOnEnd)
scrollShouldStayOnEnd.current = true;
@@ -177,26 +177,26 @@ const CoreSettingModalContent: FC = () => {
updateConfig(config)
.then(() => {
toast({
- title: t("core.successMessage"),
- status: "success",
+ title: t('core.successMessage'),
+ status: 'success',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
})
.catch((e) => {
- let message = t("core.generalErrorMessage");
- if (typeof e.response._data.detail === "object")
+ 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")
+ if (typeof e.response._data.detail === 'string')
message = e.response._data.detail;
toast({
title: message,
- status: "error",
+ status: 'error',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
});
@@ -218,7 +218,7 @@ const CoreSettingModalContent: FC = () => {
<FormControl>
<HStack justifyContent="space-between" alignItems="flex-start">
<FormLabel>
- {t("core.configuration")}{" "}
+ {t('core.configuration')}{' '}
{isLoading && <CircularProgress isIndeterminate size="15px" />}
</FormLabel>
<HStack gap={0}>
@@ -252,7 +252,7 @@ const CoreSettingModalContent: FC = () => {
</FormControl>
<FormControl mt="4">
<HStack justifyContent="space-between">
- <FormLabel>{t("core.logs")}</FormLabel>
+ <FormLabel>{t('core.logs')}</FormLabel>
<Text as={FormLabel}>{t(`core.socket.${status}`)}</Text>
</HStack>
<Box
@@ -260,12 +260,12 @@ const CoreSettingModalContent: FC = () => {
borderColor="gray.300"
bg="#F9F9F9"
_dark={{
- borderColor: "gray.500",
- bg: "#2e3440",
+ borderColor: 'gray.500',
+ bg: '#2e3440',
}}
borderRadius={5}
minHeight="200px"
- maxHeight={"250px"}
+ maxHeight={'250px'}
p={2}
overflowY="auto"
ref={logsDiv}
@@ -286,13 +286,13 @@ const CoreSettingModalContent: FC = () => {
leftIcon={
<ReloadIcon
className={classNames({
- "animate-spin": isRestarting,
+ 'animate-spin': isRestarting,
})}
/>
}
onClick={() => handleRestartCore()}
>
- {t(isRestarting ? "core.restarting" : "core.restartCore")}
+ {t(isRestarting ? 'core.restarting' : 'core.restartCore')}
</Button>
</Box>
<HStack>
@@ -305,7 +305,7 @@ const CoreSettingModalContent: FC = () => {
isDisabled={isLoading || isPostLoading}
isLoading={isPostLoading}
>
- {t("core.save")}
+ {t('core.save')}
</Button>
</HStack>
</HStack>
@@ -328,7 +328,7 @@ export const CoreSettingsModal: FC = () => {
<UsageIcon color="white" />
</Icon>
<Text fontWeight="semibold" fontSize="lg">
- {t("core.title")}
+ {t('core.title')}
</Text>
</HStack>
</ModalHeader>
diff --git a/app/dashboard/src/components/DeleteNodeModal.tsx b/app/dashboard/src/components/DeleteNodeModal.tsx
@@ -10,17 +10,17 @@ import {
Spinner,
Text,
useToast,
-} from "@chakra-ui/react";
-import { FetchNodesQueryKey, useNodes } from "contexts/NodesContext";
-import { FC } from "react";
-import { Trans, useTranslation } from "react-i18next";
-import { useMutation, useQueryClient } from "react-query";
+} from '@chakra-ui/react';
+import { FetchNodesQueryKey, useNodes } from 'contexts/NodesContext';
+import { FC } from 'react';
+import { Trans, useTranslation } from 'react-i18next';
+import { useMutation, useQueryClient } from 'react-query';
import {
generateErrorMessage,
generateSuccessMessage,
-} from "utils/toastHandler";
-import { DeleteIcon, DeleteUserModalProps } from "./DeleteUserModal";
-import { Icon } from "./Icon";
+} from 'utils/toastHandler';
+import { DeleteIcon, DeleteUserModalProps } from './DeleteUserModal';
+import { Icon } from './Icon';
export const DeleteNodeModal: FC<DeleteUserModalProps> = ({
deleteCallback,
@@ -36,7 +36,7 @@ export const DeleteNodeModal: FC<DeleteUserModalProps> = ({
const { isLoading, mutate: onDelete } = useMutation(deleteNode, {
onSuccess: () => {
generateSuccessMessage(
- t("deleteNode.deleteSuccess", {name: deletingNode && deletingNode.name}),
+ t('deleteNode.deleteSuccess', {name: deletingNode && deletingNode.name}),
toast
);
setDeletingNode(null);
@@ -60,24 +60,24 @@ export const DeleteNodeModal: FC<DeleteUserModalProps> = ({
<ModalCloseButton mt={3} />
<ModalBody>
<Text fontWeight="semibold" fontSize="lg">
- {t("deleteNode.title")}
+ {t('deleteNode.title')}
</Text>
{deletingNode && (
<Text
mt={1}
fontSize="sm"
- _dark={{ color: "gray.400" }}
+ _dark={{ color: 'gray.400' }}
color="gray.600"
>
<Trans components={{ b: <b /> }}>
- {t("deleteNode.prompt", {name: deletingNode.name})}
+ {t('deleteNode.prompt', {name: deletingNode.name})}
</Trans>
</Text>
)}
</ModalBody>
<ModalFooter display="flex">
<Button size="sm" onClick={onClose} mr={3} w="full" variant="outline">
- {t("cancel")}
+ {t('cancel')}
</Button>
<Button
size="sm"
@@ -86,7 +86,7 @@ export const DeleteNodeModal: FC<DeleteUserModalProps> = ({
onClick={() => onDelete()}
leftIcon={isLoading ? <Spinner size="xs" /> : undefined}
>
- {t("delete")}
+ {t('delete')}
</Button>
</ModalFooter>
</ModalContent>
diff --git a/app/dashboard/src/components/DeleteUserModal.tsx b/app/dashboard/src/components/DeleteUserModal.tsx
@@ -11,12 +11,12 @@ import {
Spinner,
Text,
useToast,
-} from "@chakra-ui/react";
-import { TrashIcon } from "@heroicons/react/24/outline";
-import { useDashboard } from "contexts/DashboardContext";
-import { FC, useState } from "react";
-import { Trans, useTranslation } from "react-i18next";
-import { Icon } from "./Icon";
+} from '@chakra-ui/react';
+import { TrashIcon } from '@heroicons/react/24/outline';
+import { useDashboard } from 'contexts/DashboardContext';
+import { FC, useState } from 'react';
+import { Trans, useTranslation } from 'react-i18next';
+import { Icon } from './Icon';
export const DeleteIcon = chakra(TrashIcon, {
baseStyle: {
@@ -43,10 +43,10 @@ export const DeleteUserModal: FC<DeleteUserModalProps> = () => {
deleteUser(user)
.then(() => {
toast({
- title: t("deleteUser.deleteSuccess", { username: user.username }),
- status: "success",
+ title: t('deleteUser.deleteSuccess', { username: user.username }),
+ status: 'success',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
})
@@ -66,24 +66,24 @@ export const DeleteUserModal: FC<DeleteUserModalProps> = () => {
<ModalCloseButton mt={3} />
<ModalBody>
<Text fontWeight="semibold" fontSize="lg">
- {t("deleteUser.title")}
+ {t('deleteUser.title')}
</Text>
{user && (
<Text
mt={1}
fontSize="sm"
- _dark={{ color: "gray.400" }}
+ _dark={{ color: 'gray.400' }}
color="gray.600"
>
<Trans components={{ b: <b /> }}>
- {t("deleteUser.prompt", { username: user.username })}
+ {t('deleteUser.prompt', { username: user.username })}
</Trans>
</Text>
)}
</ModalBody>
<ModalFooter display="flex">
<Button size="sm" onClick={onClose} mr={3} w="full" variant="outline">
- {t("cancel")}
+ {t('cancel')}
</Button>
<Button
size="sm"
@@ -92,7 +92,7 @@ export const DeleteUserModal: FC<DeleteUserModalProps> = () => {
onClick={onDelete}
leftIcon={loading ? <Spinner size="xs" /> : undefined}
>
- {t("delete")}
+ {t('delete')}
</Button>
</ModalFooter>
</ModalContent>
diff --git a/app/dashboard/src/components/Filters.tsx b/app/dashboard/src/components/Filters.tsx
@@ -11,17 +11,17 @@ import {
InputLeftElement,
InputRightElement,
Spinner,
-} from "@chakra-ui/react";
+} from '@chakra-ui/react';
import {
ArrowPathIcon,
MagnifyingGlassIcon,
XMarkIcon,
-} from "@heroicons/react/24/outline";
-import classNames from "classnames";
-import { useDashboard } from "contexts/DashboardContext";
-import debounce from "lodash.debounce";
-import React, { FC, useState } from "react";
-import { useTranslation } from "react-i18next";
+} from '@heroicons/react/24/outline';
+import classNames from 'classnames';
+import { useDashboard } from 'contexts/DashboardContext';
+import debounce from 'lodash.debounce';
+import React, { FC, useState } from 'react';
+import { useTranslation } from 'react-i18next';
const iconProps = {
baseStyle: {
@@ -47,26 +47,26 @@ export const Filters: FC<FilterProps> = ({ ...props }) => {
const { loading, filters, onFilterChange, refetchUsers, onCreateUser } =
useDashboard();
const { t } = useTranslation();
- const [search, setSearch] = useState("");
+ const [search, setSearch] = useState('');
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setSearch(e.target.value);
setSearchField(e.target.value);
};
const clear = () => {
- setSearch("");
+ setSearch('');
onFilterChange({
...filters,
offset: 0,
- username: "",
+ username: '',
});
};
return (
<Grid
id="filters"
templateColumns={{
- lg: "repeat(3, 1fr)",
- md: "repeat(4, 1fr)",
- base: "repeat(1, 1fr)",
+ lg: 'repeat(3, 1fr)',
+ md: 'repeat(4, 1fr)',
+ base: 'repeat(1, 1fr)',
}}
position="sticky"
top={0}
@@ -86,7 +86,7 @@ export const Filters: FC<FilterProps> = ({ ...props }) => {
<InputGroup>
<InputLeftElement pointerEvents="none" children={<SearchIcon />} />
<Input
- placeholder={t("search")}
+ placeholder={t('search')}
value={search}
borderColor="light-border"
onChange={onChange}
@@ -118,7 +118,7 @@ export const Filters: FC<FilterProps> = ({ ...props }) => {
>
<ReloadIcon
className={classNames({
- "animate-spin": loading,
+ 'animate-spin': loading,
})}
/>
</IconButton>
@@ -128,7 +128,7 @@ export const Filters: FC<FilterProps> = ({ ...props }) => {
onClick={() => onCreateUser(true)}
px={5}
>
- {t("createUser")}
+ {t('createUser')}
</Button>
</HStack>
</GridItem>
diff --git a/app/dashboard/src/components/Footer.tsx b/app/dashboard/src/components/Footer.tsx
@@ -1,7 +1,7 @@
-import { BoxProps, HStack, Link, Text } from "@chakra-ui/react";
-import { ORGANIZATION_URL, REPO_URL } from "constants/Project";
-import { useDashboard } from "contexts/DashboardContext";
-import { FC } from "react";
+import { BoxProps, HStack, Link, Text } from '@chakra-ui/react';
+import { ORGANIZATION_URL, REPO_URL } from 'constants/Project';
+import { useDashboard } from 'contexts/DashboardContext';
+import { FC } from 'react';
export const Footer: FC<BoxProps> = (props) => {
const { version } = useDashboard();
@@ -17,8 +17,8 @@ export const Footer: FC<BoxProps> = (props) => {
<Link color="blue.400" href={REPO_URL}>
Marzban
</Link>
- {version ? ` (v${version}), ` : ", "}
- Made with ❤️ in{" "}
+ {version ? ` (v${version}), ` : ', '}
+ Made with ❤️ in{' '}
<Link color="blue.400" href={ORGANIZATION_URL}>
Gozargah
</Link>
diff --git a/app/dashboard/src/components/Header.tsx b/app/dashboard/src/components/Header.tsx
@@ -9,7 +9,7 @@ import {
MenuList,
Text,
useColorMode,
-} from "@chakra-ui/react";
+} from '@chakra-ui/react';
import {
ArrowLeftOnRectangleIcon,
Bars3Icon,
@@ -21,17 +21,17 @@ import {
MoonIcon,
SquaresPlusIcon,
SunIcon,
-} from "@heroicons/react/24/outline";
-import { DONATION_URL, REPO_URL } from "constants/Project";
-import { useDashboard } from "contexts/DashboardContext";
-import differenceInDays from "date-fns/differenceInDays";
-import isValid from "date-fns/isValid";
-import { FC, ReactNode, useState } from "react";
-import GitHubButton from "react-github-btn";
-import { useTranslation } from "react-i18next";
-import { Link } from "react-router-dom";
-import { updateThemeColor } from "utils/themeColor";
-import { Language } from "./Language";
+} from '@heroicons/react/24/outline';
+import { DONATION_URL, REPO_URL } from 'constants/Project';
+import { useDashboard } from 'contexts/DashboardContext';
+import differenceInDays from 'date-fns/differenceInDays';
+import isValid from 'date-fns/isValid';
+import { FC, ReactNode, useState } from 'react';
+import GitHubButton from 'react-github-btn';
+import { useTranslation } from 'react-i18next';
+import { Link } from 'react-router-dom';
+import { updateThemeColor } from 'utils/themeColor';
+import { Language } from './Language';
type HeaderProps = {
actions?: ReactNode;
@@ -55,15 +55,15 @@ const NodesUsageIcon = chakra(ChartPieIcon, iconProps);
const ResetUsageIcon = chakra(DocumentMinusIcon, iconProps);
const NotificationCircle = chakra(Box, {
baseStyle: {
- bg: "yellow.500",
- w: "2",
- h: "2",
- rounded: "full",
- position: "absolute",
+ bg: 'yellow.500',
+ w: '2',
+ h: '2',
+ rounded: 'full',
+ position: 'absolute',
},
});
-const NOTIFICATION_KEY = "marzban-menu-notification";
+const NOTIFICATION_KEY = 'marzban-menu-notification';
export const shouldShowDonation = (): boolean => {
const date = localStorage.getItem(NOTIFICATION_KEY);
@@ -80,7 +80,7 @@ export const shouldShowDonation = (): boolean => {
}
};
-export const Header: FC<HeaderProps> = ({ actions }) => {
+export const Header: FC<HeaderProps> = () => {
const {
onEditingHosts,
onResetAllUsage,
@@ -92,7 +92,7 @@ export const Header: FC<HeaderProps> = ({ actions }) => {
const [showDonationNotif, setShowDonationNotif] = useState(
shouldShowDonation()
);
- const gBtnColor = colorMode === "dark" ? "dark_dimmed" : colorMode;
+ const gBtnColor = colorMode === 'dark' ? 'dark_dimmed' : colorMode;
const handleOnClose = () => {
localStorage.setItem(NOTIFICATION_KEY, new Date().getTime().toString());
@@ -104,19 +104,19 @@ export const Header: FC<HeaderProps> = ({ actions }) => {
gap={2}
justifyContent="space-between"
__css={{
- "& .menuList": {
- direction: "ltr",
+ '& .menuList': {
+ direction: 'ltr',
},
}}
position="relative"
>
<Text as="h1" fontWeight="semibold" fontSize="2xl">
- {t("users")}
+ {t('users')}
</Text>
{showDonationNotif && (
<NotificationCircle top="0" right="0" zIndex={9999} />
)}
- <Box overflow="auto" css={{ direction: "rtl" }}>
+ <Box overflow="auto" css={{ direction: 'rtl' }}>
<HStack alignItems="center">
<Menu>
<MenuButton
@@ -137,7 +137,7 @@ export const Header: FC<HeaderProps> = ({ actions }) => {
icon={<HostsIcon />}
onClick={onEditingHosts.bind(null, true)}
>
- {t("header.hostSettings")}
+ {t('header.hostSettings')}
</MenuItem>
<MenuItem
maxW="170px"
@@ -145,7 +145,7 @@ export const Header: FC<HeaderProps> = ({ actions }) => {
icon={<NodesIcon />}
onClick={onEditingNodes.bind(null, true)}
>
- {t("header.nodeSettings")}
+ {t('header.nodeSettings')}
</MenuItem>
<MenuItem
maxW="170px"
@@ -153,7 +153,7 @@ export const Header: FC<HeaderProps> = ({ actions }) => {
icon={<NodesUsageIcon />}
onClick={onShowingNodesUsage.bind(null, true)}
>
- {t("header.nodesUsage")}
+ {t('header.nodesUsage')}
</MenuItem>
<MenuItem
maxW="170px"
@@ -161,7 +161,7 @@ export const Header: FC<HeaderProps> = ({ actions }) => {
icon={<ResetUsageIcon />}
onClick={onResetAllUsage.bind(null, true)}
>
- {t("resetAllUsage")}
+ {t('resetAllUsage')}
</MenuItem>
<Link to={DONATION_URL} target="_blank">
<MenuItem
@@ -171,7 +171,7 @@ export const Header: FC<HeaderProps> = ({ actions }) => {
position="relative"
onClick={handleOnClose}
>
- {t("header.donation")}{" "}
+ {t('header.donation')}{' '}
{showDonationNotif && (
<NotificationCircle top="3" right="2" />
)}
@@ -179,7 +179,7 @@ export const Header: FC<HeaderProps> = ({ actions }) => {
</Link>
<Link to="/login">
<MenuItem maxW="170px" fontSize="sm" icon={<LogoutIcon />}>
- {t("header.logout")}
+ {t('header.logout')}
</MenuItem>
</Link>
</MenuList>
@@ -203,21 +203,21 @@ export const Header: FC<HeaderProps> = ({ actions }) => {
variant="outline"
aria-label="switch theme"
onClick={() => {
- updateThemeColor(colorMode == "dark" ? "light" : "dark");
+ updateThemeColor(colorMode == 'dark' ? 'light' : 'dark');
toggleColorMode();
}}
>
- {colorMode === "light" ? <DarkIcon /> : <LightIcon />}
+ {colorMode === 'light' ? <DarkIcon /> : <LightIcon />}
</IconButton>
<Box
- css={{ direction: "ltr" }}
+ css={{ direction: 'ltr' }}
display="flex"
alignItems="center"
pr="2"
__css={{
- "& span": {
- display: "inline-flex",
+ '& span': {
+ display: 'inline-flex',
},
}}
>
diff --git a/app/dashboard/src/components/HostsDialog.tsx b/app/dashboard/src/components/HostsDialog.tsx
@@ -33,45 +33,45 @@ import {
VStack,
chakra,
useToast,
-} from "@chakra-ui/react";
-import { InformationCircleIcon, LinkIcon } from "@heroicons/react/24/outline";
-import { zodResolver } from "@hookform/resolvers/zod";
+} from '@chakra-ui/react';
+import { InformationCircleIcon, LinkIcon } from '@heroicons/react/24/outline';
+import { zodResolver } from '@hookform/resolvers/zod';
import {
proxyALPN,
proxyFingerprint,
proxyHostSecurity,
-} from "constants/Proxies";
-import { useHosts } from "contexts/HostsContext";
-import { FC, useEffect, useState } from "react";
+} from 'constants/Proxies';
+import { useHosts } from 'contexts/HostsContext';
+import { FC, useEffect, useState } from 'react';
import {
FormProvider,
useFieldArray,
useForm,
useFormContext,
-} from "react-hook-form";
-import { Trans, useTranslation } from "react-i18next";
-import "slick-carousel/slick/slick-theme.css";
-import "slick-carousel/slick/slick.css";
-import { z } from "zod";
-import { useDashboard } from "../contexts/DashboardContext";
-import { DeleteIcon } from "./DeleteUserModal";
-import { Icon } from "./Icon";
-import { Input as CustomInput } from "./Input";
+} from 'react-hook-form';
+import { Trans, useTranslation } from 'react-i18next';
+import 'slick-carousel/slick/slick-theme.css';
+import 'slick-carousel/slick/slick.css';
+import { z } from 'zod';
+import { useDashboard } from '../contexts/DashboardContext';
+import { DeleteIcon } from './DeleteUserModal';
+import { Icon } from './Icon';
+import { Input as CustomInput } from './Input';
const Select = chakra(ChakraSelect, {
baseStyle: {
- bg: "white",
+ bg: 'white',
_dark: {
- bg: "gray.700",
+ bg: 'gray.700',
},
},
});
const Input = chakra(CustomInput, {
baseStyle: {
- bg: "white",
+ bg: 'white',
_dark: {
- bg: "gray.700",
+ bg: 'gray.700',
},
},
});
@@ -87,8 +87,8 @@ const InfoIcon = chakra(InformationCircleIcon, {
baseStyle: {
w: 4,
h: 4,
- color: "gray.400",
- cursor: "pointer",
+ color: 'gray.400',
+ cursor: 'pointer',
},
});
@@ -96,14 +96,14 @@ const hostsSchema = z.record(
z.string().min(1),
z.array(
z.object({
- remark: z.string().min(1, "Remark is required"),
- address: z.string().min(1, "Address is required"),
+ remark: z.string().min(1, 'Remark is required'),
+ address: z.string().min(1, 'Address is required'),
port: z
.string()
.or(z.number())
.nullable()
.transform((value) => {
- if (typeof value === "number") return value;
+ if (typeof value === 'number') return value;
if (value !== null && !isNaN(parseInt(value)))
return Number(parseInt(value));
return null;
@@ -120,10 +120,10 @@ const hostsSchema = z.record(
const Error = chakra(FormErrorMessage, {
baseStyle: {
- color: "red.400",
- display: "block",
- textAlign: "left",
- w: "100%",
+ color: 'red.400',
+ display: 'block',
+ textAlign: 'left',
+ w: '100%',
},
});
@@ -157,15 +157,15 @@ const AccordionInbound: FC<AccordionInboundType> = ({
const accordionErrors = errors[hostKey];
const handleAddHost = () => {
addHost({
- host: "",
- sni: "",
+ host: '',
+ sni: '',
port: null,
path: null,
- address: "",
- remark: "",
- security: "inbound_default",
- alpn: "",
- fingerprint: "",
+ address: '',
+ remark: '',
+ security: 'inbound_default',
+ alpn: '',
+ fingerprint: '',
});
};
useEffect(() => {
@@ -176,8 +176,8 @@ const AccordionInbound: FC<AccordionInboundType> = ({
return (
<AccordionItem
border="1px solid"
- _dark={{ borderColor: "gray.600" }}
- _light={{ borderColor: "gray.200" }}
+ _dark={{ borderColor: 'gray.600' }}
+ _light={{ borderColor: 'gray.200' }}
borderRadius="4px"
p={1}
w="full"
@@ -190,7 +190,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
flex="1"
textAlign="left"
color="gray.700"
- _dark={{ color: "gray.300" }}
+ _dark={{ color: 'gray.300' }}
>
{hostKey}
</Text>
@@ -202,8 +202,8 @@ const AccordionInbound: FC<AccordionInboundType> = ({
<VStack
key={index}
border="1px solid"
- _dark={{ borderColor: "gray.600", bg: "#273142" }}
- _light={{ borderColor: "gray.200", bg: "#fcfbfb" }}
+ _dark={{ borderColor: 'gray.600', bg: '#273142' }}
+ _light={{ borderColor: 'gray.200', bg: '#fcfbfb' }}
p={2}
w="full"
borderRadius="4px"
@@ -218,7 +218,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
>
<InputGroup>
<Input
- {...form.register(hostKey + "." + index + ".remark")}
+ {...form.register(hostKey + '.' + index + '.remark')}
size="sm"
borderRadius="4px"
placeholder="Remark"
@@ -236,78 +236,78 @@ const AccordionInbound: FC<AccordionInboundType> = ({
<PopoverCloseButton />
<PopoverBody>
<Box fontSize="xs">
- <Text pr="20px">{t("hostsDialog.desc")}</Text>
+ <Text pr="20px">{t('hostsDialog.desc')}</Text>
<Text>
<Badge>
- {"{"}SERVER_IP{"}"}
- </Badge>{" "}
- {t("hostsDialog.currentServer")}
+ {'{'}SERVER_IP{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.currentServer')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}USERNAME{"}"}
- </Badge>{" "}
- {t("hostsDialog.username")}
+ {'{'}USERNAME{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.username')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}DATA_USAGE{"}"}
- </Badge>{" "}
- {t("hostsDialog.dataUsage")}
+ {'{'}DATA_USAGE{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.dataUsage')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}DATA_LEFT{"}"}
- </Badge>{" "}
- {t("hostsDialog.remainingData")}
+ {'{'}DATA_LEFT{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.remainingData')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}DATA_LIMIT{"}"}
- </Badge>{" "}
- {t("hostsDialog.dataLimit")}
+ {'{'}DATA_LIMIT{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.dataLimit')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}DAYS_LEFT{"}"}
- </Badge>{" "}
- {t("hostsDialog.remainingDays")}
+ {'{'}DAYS_LEFT{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.remainingDays')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}EXPIRE_DATE{"}"}
- </Badge>{" "}
- {t("hostsDialog.expireDate")}
+ {'{'}EXPIRE_DATE{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.expireDate')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}JALALI_EXPIRE_DATE{"}"}
- </Badge>{" "}
- {t("hostsDialog.jalaliExpireDate")}
+ {'{'}JALALI_EXPIRE_DATE{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.jalaliExpireDate')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}TIME_LEFT{"}"}
- </Badge>{" "}
- {t("hostsDialog.remainingTime")}
+ {'{'}TIME_LEFT{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.remainingTime')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}STATUS_EMOJI{"}"}
- </Badge>{" "}
- {t("hostsDialog.statusEmoji")}
+ {'{'}STATUS_EMOJI{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.statusEmoji')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}PROTOCOL{"}"}
- </Badge>{" "}
- {t("hostsDialog.proxyProtocol")}
+ {'{'}PROTOCOL{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.proxyProtocol')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}TRANSPORT{"}"}
- </Badge>{" "}
- {t("hostsDialog.proxyMethod")}
+ {'{'}TRANSPORT{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.proxyMethod')}
</Text>
</Box>
</PopoverBody>
@@ -331,7 +331,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
size="sm"
borderRadius="4px"
placeholder="Address (e.g. example.com)"
- {...form.register(hostKey + "." + index + ".address")}
+ {...form.register(hostKey + '.' + index + '.address')}
/>
<InputRightElement>
<Popover isLazy placement="right">
@@ -346,78 +346,78 @@ const AccordionInbound: FC<AccordionInboundType> = ({
<PopoverCloseButton />
<PopoverBody>
<Box fontSize="xs">
- <Text pr="20px">{t("hostsDialog.desc")}</Text>
+ <Text pr="20px">{t('hostsDialog.desc')}</Text>
<Text>
<Badge>
- {"{"}SERVER_IP{"}"}
- </Badge>{" "}
- {t("hostsDialog.currentServer")}
+ {'{'}SERVER_IP{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.currentServer')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}USERNAME{"}"}
- </Badge>{" "}
- {t("hostsDialog.username")}
+ {'{'}USERNAME{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.username')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}DATA_USAGE{"}"}
- </Badge>{" "}
- {t("hostsDialog.dataUsage")}
+ {'{'}DATA_USAGE{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.dataUsage')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}DATA_LEFT{"}"}
- </Badge>{" "}
- {t("hostsDialog.remainingData")}
+ {'{'}DATA_LEFT{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.remainingData')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}DATA_LIMIT{"}"}
- </Badge>{" "}
- {t("hostsDialog.dataLimit")}
+ {'{'}DATA_LIMIT{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.dataLimit')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}DAYS_LEFT{"}"}
- </Badge>{" "}
- {t("hostsDialog.remainingDays")}
+ {'{'}DAYS_LEFT{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.remainingDays')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}EXPIRE_DATE{"}"}
- </Badge>{" "}
- {t("hostsDialog.expireDate")}
+ {'{'}EXPIRE_DATE{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.expireDate')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}JALALI_EXPIRE_DATE{"}"}
- </Badge>{" "}
- {t("hostsDialog.jalaliExpireDate")}
+ {'{'}JALALI_EXPIRE_DATE{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.jalaliExpireDate')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}TIME_LEFT{"}"}
- </Badge>{" "}
- {t("hostsDialog.remainingTime")}
+ {'{'}TIME_LEFT{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.remainingTime')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}STATUS_EMOJI{"}"}
- </Badge>{" "}
- {t("hostsDialog.statusEmoji")}
+ {'{'}STATUS_EMOJI{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.statusEmoji')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}PROTOCOL{"}"}
- </Badge>{" "}
- {t("hostsDialog.proxyProtocol")}
+ {'{'}PROTOCOL{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.proxyProtocol')}
</Text>
<Text mt={1}>
<Badge>
- {"{"}TRANSPORT{"}"}
- </Badge>{" "}
- {t("hostsDialog.proxyMethod")}
+ {'{'}TRANSPORT{'}'}
+ </Badge>{' '}
+ {t('hostsDialog.proxyMethod')}
</Text>
</Box>
</PopoverBody>
@@ -439,15 +439,15 @@ const AccordionInbound: FC<AccordionInboundType> = ({
px={0}
py={1}
borderRadius={3}
- _hover={{ bg: "transparent" }}
+ _hover={{ bg: 'transparent' }}
>
<Text
fontSize="xs"
color="gray.600"
- _dark={{ color: "gray.500" }}
+ _dark={{ color: 'gray.500' }}
pl={1}
>
- {t("hostsDialog.advancedOptions")}
+ {t('hostsDialog.advancedOptions')}
<AccordionIcon fontSize="sm" ml={1} />
</Text>
@@ -478,7 +478,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
gap={1}
m="0"
>
- <span>{t("hostsDialog.port")}</span>
+ <span>{t('hostsDialog.port')}</span>
<Popover isLazy placement="right">
<PopoverTrigger>
<InfoIcon />
@@ -488,7 +488,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
<PopoverArrow />
<PopoverCloseButton />
<Text fontSize="xs" pr={5}>
- {t("hostsDialog.port.info")}
+ {t('hostsDialog.port.info')}
</Text>
</PopoverContent>
</Portal>
@@ -497,9 +497,9 @@ const AccordionInbound: FC<AccordionInboundType> = ({
<Input
size="sm"
borderRadius="4px"
- placeholder={String(inbound.port || "8080")}
+ placeholder={String(inbound.port || '8080')}
type="number"
- {...form.register(hostKey + "." + index + ".port")}
+ {...form.register(hostKey + '.' + index + '.port')}
/>
</FormControl>
<FormControl
@@ -515,7 +515,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
justifyContent="space-between"
m="0"
>
- <span>{t("hostsDialog.sni")}</span>
+ <span>{t('hostsDialog.sni')}</span>
<Popover isLazy placement="right">
<PopoverTrigger>
@@ -526,7 +526,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
<PopoverArrow />
<PopoverCloseButton />
<Text fontSize="xs" pr={5}>
- {t("hostsDialog.sni.info")}
+ {t('hostsDialog.sni.info')}
</Text>
<Text fontSize="xs" mt="2">
<Trans
@@ -552,7 +552,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
size="sm"
borderRadius="4px"
placeholder="SNI (e.g. example.com)"
- {...form.register(hostKey + "." + index + ".sni")}
+ {...form.register(hostKey + '.' + index + '.sni')}
/>
{accordionErrors && accordionErrors[index]?.sni && (
<Error>{accordionErrors[index]?.sni?.message}</Error>
@@ -571,7 +571,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
justifyContent="space-between"
m="0"
>
- <span>{t("hostsDialog.host")}</span>
+ <span>{t('hostsDialog.host')}</span>
<Popover isLazy placement="right">
<PopoverTrigger>
@@ -582,7 +582,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
<PopoverArrow />
<PopoverCloseButton />
<Text fontSize="xs" pr={5}>
- {t("hostsDialog.host.info")}
+ {t('hostsDialog.host.info')}
</Text>
<Text fontSize="xs" mt="2">
<Trans
@@ -608,7 +608,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
size="sm"
borderRadius="4px"
placeholder="Host (e.g. example.com)"
- {...form.register(hostKey + "." + index + ".host")}
+ {...form.register(hostKey + '.' + index + '.host')}
/>
{accordionErrors && accordionErrors[index]?.host && (
<Error>{accordionErrors[index]?.host?.message}</Error>
@@ -628,7 +628,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
justifyContent="space-between"
m="0"
>
- <span>{t("hostsDialog.path")}</span>
+ <span>{t('hostsDialog.path')}</span>
<Popover isLazy placement="right">
<PopoverTrigger>
@@ -639,7 +639,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
<PopoverArrow />
<PopoverCloseButton />
<Text fontSize="xs" pr={5}>
- {t("hostsDialog.path.info")}
+ {t('hostsDialog.path.info')}
</Text>
</PopoverContent>
</Portal>
@@ -649,7 +649,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
size="sm"
borderRadius="4px"
placeholder="path (e.g. /vless)"
- {...form.register(hostKey + "." + index + ".path")}
+ {...form.register(hostKey + '.' + index + '.path')}
/>
{accordionErrors && accordionErrors[index]?.path && (
<Error>{accordionErrors[index]?.path?.message}</Error>
@@ -665,7 +665,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
justifyContent="space-between"
m="0"
>
- <span>{t("hostsDialog.security")}</span>
+ <span>{t('hostsDialog.security')}</span>
<Popover isLazy placement="right">
<PopoverTrigger>
@@ -676,7 +676,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
<PopoverArrow />
<PopoverCloseButton />
<Text fontSize="xs" pr={5}>
- {t("hostsDialog.security.info")}
+ {t('hostsDialog.security.info')}
</Text>
</PopoverContent>
</Portal>
@@ -685,7 +685,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
<Select
size="sm"
{...form.register(
- hostKey + "." + index + ".security",
+ hostKey + '.' + index + '.security',
)}
>
{proxyHostSecurity.map((s) => {
@@ -707,11 +707,11 @@ const AccordionInbound: FC<AccordionInboundType> = ({
justifyContent="space-between"
m="0"
>
- <span>{t("hostsDialog.alpn")}</span>
+ <span>{t('hostsDialog.alpn')}</span>
</FormLabel>
<Select
size="sm"
- {...form.register(hostKey + "." + index + ".alpn")}
+ {...form.register(hostKey + '.' + index + '.alpn')}
>
{proxyALPN.map((s) => {
return (
@@ -732,12 +732,12 @@ const AccordionInbound: FC<AccordionInboundType> = ({
justifyContent="space-between"
m="0"
>
- <span>{t("hostsDialog.fingerprint")}</span>
+ <span>{t('hostsDialog.fingerprint')}</span>
</FormLabel>
<Select
size="sm"
{...form.register(
- hostKey + "." + index + ".fingerprint",
+ hostKey + '.' + index + '.fingerprint',
)}
>
{proxyFingerprint.map((s) => {
@@ -760,10 +760,10 @@ const AccordionInbound: FC<AccordionInboundType> = ({
w="full"
size="sm"
color=""
- fontWeight={"normal"}
+ fontWeight={'normal'}
onClick={handleAddHost}
>
- {t("hostsDialog.addHost")}
+ {t('hostsDialog.addHost')}
</Button>
</VStack>
</AccordionPanel>
@@ -772,8 +772,7 @@ const AccordionInbound: FC<AccordionInboundType> = ({
};
export const HostsDialog: FC = () => {
- const { isEditingHosts, onEditingHosts, refetchUsers, inbounds } =
- useDashboard();
+ const { isEditingHosts, onEditingHosts, refetchUsers } = useDashboard();
const { isLoading, hosts, fetchHosts, isPostLoading, setHosts } = useHosts();
const toast = useToast();
const { t } = useTranslation();
@@ -800,10 +799,10 @@ export const HostsDialog: FC = () => {
setHosts(hosts)
.then(() => {
toast({
- title: t("hostsDialog.savedSuccess"),
- status: "success",
+ title: t('hostsDialog.savedSuccess'),
+ status: 'success',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
refetchUsers();
@@ -812,19 +811,19 @@ export const HostsDialog: FC = () => {
if (err?.response?.status === 409 || err?.response?.status === 400) {
toast({
title: err.response?._data?.detail,
- status: "error",
+ status: 'error',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
}
if (err?.response?.status === 422) {
Object.keys(err.response._data.detail).forEach((key) => {
toast({
- title: err.response._data.detail[key] + " (" + key + ")",
- status: "error",
+ title: err.response._data.detail[key] + ' (' + key + ')',
+ status: 'error',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
});
@@ -854,9 +853,9 @@ export const HostsDialog: FC = () => {
<FormProvider {...form}>
<form onSubmit={form.handleSubmit(handleFormSubmit)}>
<Text mb={3} opacity={0.8} fontSize="sm">
- {t("hostsDialog.title")}
+ {t('hostsDialog.title')}
</Text>
- {isLoading && t("hostsDialog.loading")}
+ {isLoading && t('hostsDialog.loading')}
{!isLoading &&
hosts &&
(Object.keys(hosts).length > 0 ? (
@@ -880,7 +879,7 @@ export const HostsDialog: FC = () => {
</VStack>
</Accordion>
) : (
- "No inbound found. Please check your Xray config file."
+ 'No inbound found. Please check your Xray config file.'
))}
<HStack justifyContent="flex-end" py={2}>
@@ -894,7 +893,7 @@ export const HostsDialog: FC = () => {
isLoading={isPostLoading}
disabled={isPostLoading}
>
- {t("hostsDialog.apply")}
+ {t('hostsDialog.apply')}
</Button>
</HStack>
</form>
diff --git a/app/dashboard/src/components/Icon.tsx b/app/dashboard/src/components/Icon.tsx
@@ -1,5 +1,5 @@
-import { Box, Text } from "@chakra-ui/react";
-import { FC, PropsWithChildren } from "react";
+import { Box, Text } from '@chakra-ui/react';
+import { FC, PropsWithChildren } from 'react';
export type IconType = {
color: string;
@@ -16,33 +16,33 @@ export const Icon: FC<PropsWithChildren<IconType>> = ({ children, color }) => {
alignItems="center"
_before={{
content: '""',
- display: "block",
- position: "absolute",
- top: "0",
- left: "0",
- width: "calc(100%)",
- height: "calc(100%)",
+ display: 'block',
+ position: 'absolute',
+ top: '0',
+ left: '0',
+ width: 'calc(100%)',
+ height: 'calc(100%)',
bg: `${color}.400`,
- opacity: ".5",
- borderRadius: "5px",
- zIndex: "1",
+ 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)",
+ 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",
+ opacity: '.4',
+ borderRadius: '8px',
+ zIndex: '1',
_dark: {
bg: `${color}.400`,
},
diff --git a/app/dashboard/src/components/Input.tsx b/app/dashboard/src/components/Input.tsx
@@ -1,23 +1,23 @@
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";
+ 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: {
@@ -55,7 +55,7 @@ export const Input = React.forwardRef<HTMLInputElement, InputProps>(
className,
startAdornment,
endAdornment,
- type = "text",
+ type = 'text',
placeholder,
onChange,
onBlur,
@@ -72,41 +72,41 @@ export const Input = React.forwardRef<HTMLInputElement, InputProps>(
if (onChange)
onChange({
target: {
- value: "",
+ value: '',
name,
},
});
};
- const { size = "md" } = props;
- const Component = type == "number" ? NumberInputField : ChakraInput;
- const Wrapper = type == "number" ? NumberInput : React.Fragment;
+ const { size = 'md' } = props;
+ const Component = type == 'number' ? NumberInputField : ChakraInput;
+ const Wrapper = type == 'number' ? NumberInput : React.Fragment;
const wrapperProps =
- type == "number"
+ type == 'number'
? {
- keepWithinRange: true,
- precision: 5,
- format: (value: string | number) => {
- return isNaN(parseFloat(String(value)))
- ? value
- : Number(parseFloat(String(value)).toFixed(5)) === 0
+ 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,
- }
+ },
+ min: 0,
+ step,
+ name,
+ type,
+ placeholder,
+ onChange: (v: any) => {
+ if (onChange) onChange(v);
+ },
+ onBlur,
+ value,
+ onClick,
+ disabled,
+ flexGrow: 1,
+ size,
+ }
: {};
return (
<FormControl isInvalid={!!error}>
@@ -116,11 +116,11 @@ export const Input = React.forwardRef<HTMLInputElement, InputProps>(
w="full"
rounded="md"
_focusWithin={{
- outline: "2px solid",
- outlineColor: "primary.200",
+ outline: '2px solid',
+ outlineColor: 'primary.200',
}}
- bg={disabled ? "gray.100" : "transparent"}
- _dark={{ bg: disabled ? "gray.600" : "transparent" }}
+ bg={disabled ? 'gray.100' : 'transparent'}
+ _dark={{ bg: disabled ? 'gray.600' : 'transparent' }}
>
{startAdornment && <InputLeftAddon>{startAdornment}</InputLeftAddon>}
<Wrapper {...wrapperProps}>
@@ -139,19 +139,19 @@ export const Input = React.forwardRef<HTMLInputElement, InputProps>(
disabled={disabled}
flexGrow={1}
_focusVisible={{
- outline: "none",
- borderTopColor: "transparent",
- borderRightColor: "transparent",
- borderBottomColor: "transparent",
+ outline: 'none',
+ borderTopColor: 'transparent',
+ borderRightColor: 'transparent',
+ borderBottomColor: 'transparent',
}}
_disabled={{
- cursor: "not-allowed",
+ cursor: 'not-allowed',
}}
{...props}
- roundedLeft={startAdornment ? "0" : "md"}
- roundedRight={endAdornment ? "0" : "md"}
+ roundedLeft={startAdornment ? '0' : 'md'}
+ roundedRight={endAdornment ? '0' : 'md'}
/>
- {type == "number" && (
+ {type == 'number' && (
<>
<NumberInputStepper>
<NumberIncrementStepper />
diff --git a/app/dashboard/src/components/JsonEditor/index.tsx b/app/dashboard/src/components/JsonEditor/index.tsx
@@ -1,9 +1,9 @@
-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";
+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;
@@ -11,14 +11,14 @@ export type JSONEditorProps = {
mode?: JSONEditorMode;
};
export const JsonEditor = forwardRef<HTMLDivElement, JSONEditorProps>(
- ({ json, onChange, mode = "code" }, ref) => {
+ ({ 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",
+ theme: colorMode === 'dark' ? 'ace/theme/nord_dark' : 'ace/theme/dawn',
};
const jsonEditorContainer = useRef<HTMLDivElement>(null);
@@ -45,7 +45,7 @@ export const JsonEditor = forwardRef<HTMLDivElement, JSONEditorProps>(
border="1px solid"
borderColor="gray.300"
_dark={{
- borderColor: "gray.500",
+ borderColor: 'gray.500',
}}
borderRadius={5}
h="full"
diff --git a/app/dashboard/src/components/JsonEditor/themes.js b/app/dashboard/src/components/JsonEditor/themes.js
@@ -1,22 +1,22 @@
window.ace.define(
- "ace/theme/nord_dark",
- ["require", "exports", "module", "ace/lib/dom"],
- (acequire, exports, module) => {
+ '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");
+ 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, module) => {
+ 'ace/theme/dawn',
+ ['require', 'exports', 'module', 'ace/lib/dom'],
+ (acequire, exports) => {
exports.isDark = false;
- exports.cssClass = "ace-dawn";
+ exports.cssClass = 'ace-dawn';
- const dom = acequire("../lib/dom");
+ const dom = acequire('../lib/dom');
dom.importCssString(exports.cssText, exports.cssClass);
}
);
diff --git a/app/dashboard/src/components/Language.tsx b/app/dashboard/src/components/Language.tsx
@@ -5,10 +5,10 @@ import {
MenuButton,
MenuItem,
MenuList,
-} from "@chakra-ui/react";
-import { LanguageIcon } from "@heroicons/react/24/outline";
-import { FC, ReactNode } from "react";
-import { useTranslation } from "react-i18next";
+} 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;
@@ -21,7 +21,7 @@ const LangIcon = chakra(LanguageIcon, {
},
});
-export const Language: FC<HeaderProps> = ({ actions }) => {
+export const Language: FC<HeaderProps> = () => {
const { i18n } = useTranslation();
var changeLanguage = (lang: string) => {
@@ -41,28 +41,28 @@ export const Language: FC<HeaderProps> = ({ actions }) => {
<MenuItem
maxW="100px"
fontSize="sm"
- onClick={() => changeLanguage("en")}
+ onClick={() => changeLanguage('en')}
>
English
</MenuItem>
<MenuItem
maxW="100px"
fontSize="sm"
- onClick={() => changeLanguage("fa")}
+ onClick={() => changeLanguage('fa')}
>
فارسی
</MenuItem>
<MenuItem
maxW="100px"
fontSize="sm"
- onClick={() => changeLanguage("zh-cn")}
+ onClick={() => changeLanguage('zh-cn')}
>
简体中文
</MenuItem>
<MenuItem
maxW="100px"
fontSize="sm"
- onClick={() => changeLanguage("ru")}
+ onClick={() => changeLanguage('ru')}
>
Русский
</MenuItem>
diff --git a/app/dashboard/src/components/NodesModal.tsx b/app/dashboard/src/components/NodesModal.tsx
@@ -29,14 +29,14 @@ import {
Tooltip,
useToast,
VStack,
-} from "@chakra-ui/react";
+} from '@chakra-ui/react';
import {
EyeIcon,
EyeSlashIcon,
PlusIcon as HeroIconPlusIcon,
SquaresPlusIcon,
-} from "@heroicons/react/24/outline";
-import { zodResolver } from "@hookform/resolvers/zod";
+} from '@heroicons/react/24/outline';
+import { zodResolver } from '@hookform/resolvers/zod';
import {
FetchNodesQueryKey,
getNodeDefaultValues,
@@ -44,38 +44,38 @@ import {
NodeType,
useNodes,
useNodesQuery,
-} from "contexts/NodesContext";
-import { FC, ReactNode, useState } from "react";
-import { Controller, useForm, UseFormReturn } from "react-hook-form";
-import { useTranslation } from "react-i18next";
+} from 'contexts/NodesContext';
+import { FC, ReactNode, useState } from 'react';
+import { Controller, useForm, UseFormReturn } from 'react-hook-form';
+import { useTranslation } from 'react-i18next';
import {
UseMutateFunction,
useMutation,
useQuery,
useQueryClient,
-} from "react-query";
-import "slick-carousel/slick/slick-theme.css";
-import "slick-carousel/slick/slick.css";
-import { Status } from "types/User";
+} from 'react-query';
+import 'slick-carousel/slick/slick-theme.css';
+import 'slick-carousel/slick/slick.css';
+import { Status } from 'types/User';
import {
generateErrorMessage,
generateSuccessMessage,
-} from "utils/toastHandler";
-import { useDashboard } from "../contexts/DashboardContext";
-import { DeleteNodeModal } from "./DeleteNodeModal";
-import { DeleteIcon } from "./DeleteUserModal";
-import { ReloadIcon } from "./Filters";
-import { Icon } from "./Icon";
-import { StatusBadge } from "./StatusBadge";
+} from 'utils/toastHandler';
+import { useDashboard } from '../contexts/DashboardContext';
+import { DeleteNodeModal } from './DeleteNodeModal';
+import { DeleteIcon } from './DeleteUserModal';
+import { ReloadIcon } from './Filters';
+import { Icon } from './Icon';
+import { StatusBadge } from './StatusBadge';
-import { fetch } from "service/http";
-import { Input } from "./Input";
+import { fetch } from 'service/http';
+import { Input } from './Input';
const CustomInput = chakra(Input, {
baseStyle: {
- bg: "white",
+ bg: 'white',
_dark: {
- bg: "gray.700",
+ bg: 'gray.700',
},
},
});
@@ -113,7 +113,7 @@ const NodeAccordion: FC<AccordionInboundType> = ({ toggleAccordion, node }) => {
const { isLoading, mutate } = useMutation(updateNode, {
onSuccess: () => {
- generateSuccessMessage("Node updated successfully", toast);
+ generateSuccessMessage('Node updated successfully', toast);
queryClient.invalidateQueries(FetchNodesQueryKey);
},
onError: (e) => {
@@ -131,16 +131,16 @@ const NodeAccordion: FC<AccordionInboundType> = ({ toggleAccordion, node }) => {
);
const nodeStatus: Status = isReconnecting
- ? "connecting"
+ ? 'connecting'
: node.status
- ? node.status
- : "error";
+ ? node.status
+ : 'error';
return (
<AccordionItem
border="1px solid"
- _dark={{ borderColor: "gray.600" }}
- _light={{ borderColor: "gray.200" }}
+ _dark={{ borderColor: 'gray.600' }}
+ _light={{ borderColor: 'gray.200' }}
borderRadius="4px"
p={1}
w="full"
@@ -154,7 +154,7 @@ const NodeAccordion: FC<AccordionInboundType> = ({ toggleAccordion, node }) => {
flex="1"
textAlign="left"
color="gray.700"
- _dark={{ color: "gray.300" }}
+ _dark={{ color: 'gray.300' }}
>
{node.name}
</Text>
@@ -184,7 +184,7 @@ const NodeAccordion: FC<AccordionInboundType> = ({ toggleAccordion, node }) => {
</AccordionButton>
<AccordionPanel px={2} pb={2}>
<VStack pb={3} alignItems="flex-start">
- {nodeStatus === "error" && (
+ {nodeStatus === 'error' && (
<Alert status="error" size="xs">
<Box>
<HStack w="full">
@@ -200,8 +200,8 @@ const NodeAccordion: FC<AccordionInboundType> = ({ toggleAccordion, node }) => {
disabled={isReconnecting}
>
{isReconnecting
- ? t("nodes.reconnecting")
- : t("nodes.reconnect")}
+ ? t('nodes.reconnecting')
+ : t('nodes.reconnect')}
</Button>
</HStack>
</Box>
@@ -212,9 +212,9 @@ const NodeAccordion: FC<AccordionInboundType> = ({ toggleAccordion, node }) => {
form={form}
mutate={mutate}
isLoading={isLoading}
- submitBtnText={t("nodes.editNode")}
+ submitBtnText={t('nodes.editNode')}
btnLeftAdornment={
- <Tooltip label={t("delete")} placement="top">
+ <Tooltip label={t('delete')} placement="top">
<IconButton
colorScheme="red"
variant="ghost"
@@ -255,7 +255,7 @@ const AddNodeForm: FC<AddNodeFormType> = ({
const { isLoading, mutate } = useMutation(addNode, {
onSuccess: () => {
generateSuccessMessage(
- t("nodes.addNodeSuccess", { name: form.getValues("name") }),
+ t('nodes.addNodeSuccess', { name: form.getValues('name') }),
toast
);
queryClient.invalidateQueries(FetchNodesQueryKey);
@@ -269,8 +269,8 @@ const AddNodeForm: FC<AddNodeFormType> = ({
return (
<AccordionItem
border="1px solid"
- _dark={{ borderColor: "gray.600" }}
- _light={{ borderColor: "gray.200" }}
+ _dark={{ borderColor: 'gray.600' }}
+ _light={{ borderColor: 'gray.200' }}
borderRadius="4px"
p={1}
w="full"
@@ -283,12 +283,12 @@ const AddNodeForm: FC<AddNodeFormType> = ({
flex="1"
textAlign="left"
color="gray.700"
- _dark={{ color: "gray.300" }}
+ _dark={{ color: 'gray.300' }}
display="flex"
gap={1}
>
- <PlusIcon display={"inline-block"} />{" "}
- <span>{t("nodes.addNewMarzbanNode")}</span>
+ <PlusIcon display={'inline-block'} />{' '}
+ <span>{t('nodes.addNewMarzbanNode')}</span>
</Text>
</AccordionButton>
<AccordionPanel px={2} py={4}>
@@ -296,8 +296,8 @@ const AddNodeForm: FC<AddNodeFormType> = ({
form={form}
mutate={mutate}
isLoading={isLoading}
- submitBtnText={t("nodes.addNode")}
- btnProps={{ variant: "solid" }}
+ submitBtnText={t('nodes.addNode')}
+ btnProps={{ variant: 'solid' }}
addAsHost
/>
</AccordionPanel>
@@ -326,13 +326,13 @@ const NodeForm: NodeFormType = ({
}) => {
const { t } = useTranslation();
const [showCertificate, setShowCertificate] = useState(false);
- const { data: nodeSettings, isLoading: nodeSettingsLoading } = useQuery({
- queryKey: "node-settings",
+ const { data: nodeSettings } = useQuery({
+ queryKey: 'node-settings',
queryFn: () =>
fetch<{
min_node_version: string;
certificate: string;
- }>("/node/settings"),
+ }>('/node/settings'),
});
function selectText(node: HTMLElement) {
// @ts-ignore
@@ -348,7 +348,7 @@ const NodeForm: NodeFormType = ({
selection!.removeAllRanges();
selection!.addRange(range);
} else {
- console.warn("Could not select text in node: Unsupported browser.");
+ console.warn('Could not select text in node: Unsupported browser.');
}
}
@@ -362,7 +362,7 @@ const NodeForm: NodeFormType = ({
flexDirection="column"
overflow="hidden"
>
- <span>{t("nodes.connection-hint")}</span>
+ <span>{t('nodes.connection-hint')}</span>
<HStack justify="end" py={2}>
<Button
as="a"
@@ -370,24 +370,24 @@ const NodeForm: NodeFormType = ({
size="xs"
download="ssl_client_cert.pem"
href={URL.createObjectURL(
- new Blob([nodeSettings.certificate], { type: "text/plain" })
+ new Blob([nodeSettings.certificate], { type: 'text/plain' })
)}
>
- {t("nodes.download-certificate")}
+ {t('nodes.download-certificate')}
</Button>
<Tooltip
placement="top"
label={t(
!showCertificate
- ? "nodes.show-certificate"
- : "nodes.show-certificate"
+ ? 'nodes.show-certificate'
+ : 'nodes.show-certificate'
)}
>
<IconButton
aria-label={t(
!showCertificate
- ? "nodes.show-certificate"
- : "nodes.show-certificate"
+ ? 'nodes.show-certificate'
+ : 'nodes.show-certificate'
)}
onClick={setShowCertificate.bind(null, !showCertificate)}
colorScheme="whiteAlpha"
@@ -406,7 +406,7 @@ const NodeForm: NodeFormType = ({
<Text
bg="rgba(255,255,255,.5)"
_dark={{
- bg: "rgba(255,255,255,.2)",
+ bg: 'rgba(255,255,255,.2)',
}}
rounded="md"
p="2"
@@ -429,10 +429,10 @@ const NodeForm: NodeFormType = ({
<HStack w="full">
<FormControl>
<CustomInput
- label={t("nodes.nodeName")}
+ label={t('nodes.nodeName')}
size="sm"
placeholder="Marzban-S2"
- {...form.register("name")}
+ {...form.register('name')}
error={form.formState?.errors?.name?.message}
/>
</FormControl>
@@ -446,20 +446,20 @@ const NodeForm: NodeFormType = ({
key={field.value}
placement="top"
label={
- `${t("usersTable.status")}: ` +
- (field.value !== "disabled" ? t("active") : t("disabled"))
+ `${t('usersTable.status')}: ` +
+ (field.value !== 'disabled' ? t('active') : t('disabled'))
}
textTransform="capitalize"
>
<Box mt="6">
<Switch
colorScheme="primary"
- isChecked={field.value !== "disabled"}
+ isChecked={field.value !== 'disabled'}
onChange={(e) => {
if (e.target.checked) {
- field.onChange("connecting");
+ field.onChange('connecting');
} else {
- field.onChange("disabled");
+ field.onChange('disabled');
}
}}
/>
@@ -473,36 +473,36 @@ const NodeForm: NodeFormType = ({
<HStack alignItems="flex-start">
<Box w="50%">
<CustomInput
- label={t("nodes.nodeAddress")}
+ label={t('nodes.nodeAddress')}
size="sm"
placeholder="51.20.12.13"
- {...form.register("address")}
+ {...form.register('address')}
error={form.formState?.errors?.address?.message}
/>
</Box>
<Box w="25%">
<CustomInput
- label={t("nodes.nodePort")}
+ label={t('nodes.nodePort')}
size="sm"
placeholder="62050"
- {...form.register("port")}
+ {...form.register('port')}
error={form.formState?.errors?.port?.message}
/>
</Box>
<Box w="25%">
<CustomInput
- label={t("nodes.nodeAPIPort")}
+ label={t('nodes.nodeAPIPort')}
size="sm"
placeholder="62051"
- {...form.register("api_port")}
+ {...form.register('api_port')}
error={form.formState?.errors?.api_port?.message}
/>
</Box>
</HStack>
{addAsHost && (
<FormControl py={1}>
- <Checkbox {...form.register("add_as_new_host")}>
- <FormLabel m={0}>{t("nodes.addHostForEveryInbound")}</FormLabel>
+ <Checkbox {...form.register('add_as_new_host')}>
+ <FormLabel m={0}>{t('nodes.addHostForEveryInbound')}</FormLabel>
</Checkbox>
</FormControl>
)}
@@ -558,9 +558,9 @@ export const NodesDialog: FC = () => {
<ModalCloseButton mt={3} />
<ModalBody w="440px" pb={6} pt={3}>
<Text mb={3} opacity={0.8} fontSize="sm">
- {t("nodes.title")}
+ {t('nodes.title')}
</Text>
- {isLoading && "loading..."}
+ {isLoading && 'loading...'}
<Accordion
w="full"
diff --git a/app/dashboard/src/components/NodesUsage.tsx b/app/dashboard/src/components/NodesUsage.tsx
@@ -13,16 +13,16 @@ import {
VStack,
chakra,
useColorMode,
-} from "@chakra-ui/react";
-import { ChartPieIcon } from "@heroicons/react/24/outline";
-import { FilterUsageType, useDashboard } from "contexts/DashboardContext";
-import { useNodes } from "contexts/NodesContext";
-import dayjs from "dayjs";
-import { FC, Suspense, useEffect, useState } from "react";
-import ReactApexChart from "react-apexcharts";
-import { useTranslation } from "react-i18next";
-import { Icon } from "./Icon";
-import { UsageFilter, createUsageConfig } from "./UsageFilter";
+} from '@chakra-ui/react';
+import { ChartPieIcon } from '@heroicons/react/24/outline';
+import { FilterUsageType, useDashboard } from 'contexts/DashboardContext';
+import { useNodes } from 'contexts/NodesContext';
+import dayjs from 'dayjs';
+import { FC, Suspense, useEffect, useState } from 'react';
+import ReactApexChart from 'react-apexcharts';
+import { useTranslation } from 'react-i18next';
+import { Icon } from './Icon';
+import { UsageFilter, createUsageConfig } from './UsageFilter';
const UsageIcon = chakra(ChartPieIcon, {
baseStyle: {
@@ -37,12 +37,13 @@ export const NodesUsage: FC<NodesUsageProps> = () => {
const { isShowingNodesUsage, onShowingNodesUsage } = useDashboard();
const { fetchNodesUsage } = useNodes();
const { t } = useTranslation();
- const [loading, setLoading] = useState(false);
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ const [loading, _] = useState(false);
const { colorMode } = useColorMode();
- const usageTitle = t("userDialog.total");
+ const usageTitle = t('userDialog.total');
const [usage, setUsage] = useState(createUsageConfig(colorMode, usageTitle));
- const [usageFilter, setUsageFilter] = useState("1m");
+ const [usageFilter, setUsageFilter] = useState('1m');
const fetchUsageWithFilter = (query: FilterUsageType) => {
fetchNodesUsage(query).then((data: any) => {
const labels = [];
@@ -59,14 +60,14 @@ export const NodesUsage: FC<NodesUsageProps> = () => {
useEffect(() => {
if (isShowingNodesUsage) {
fetchUsageWithFilter({
- start: dayjs().utc().subtract(30, "day").format("YYYY-MM-DDTHH:00:00"),
+ start: dayjs().utc().subtract(30, 'day').format('YYYY-MM-DDTHH:00:00'),
});
}
}, [isShowingNodesUsage]);
const onClose = () => {
onShowingNodesUsage(false);
- setUsageFilter("1m");
+ setUsageFilter('1m');
};
const disabled = loading;
@@ -81,7 +82,7 @@ export const NodesUsage: FC<NodesUsageProps> = () => {
<UsageIcon color="white" />
</Icon>
<Text fontWeight="semibold" fontSize="lg">
- {t("header.nodesUsage")}
+ {t('header.nodesUsage')}
</Text>
</HStack>
</ModalHeader>
diff --git a/app/dashboard/src/components/OnlineBadge.tsx b/app/dashboard/src/components/OnlineBadge.tsx
@@ -1,31 +1,31 @@
-import {FC} from "react";
+import {FC} from 'react';
type UserStatusProps = {
lastOnline?: string | null;
};
const convertDateFormat = (lastOnline: string | null | undefined): number | null => {
- if (!lastOnline) {
- return null;
- }
+ if (!lastOnline) {
+ return null;
+ }
- const date = new Date(lastOnline + "Z");
- return Math.floor(date.getTime() / 1000);
+ 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);
+ const currentTimeInSeconds = Math.floor(Date.now() / 1000);
+ const unixTime = convertDateFormat(lastOnline);
- if (typeof lastOnline === 'undefined' || lastOnline === null) {
- return <div className="circle pulse orange"></div>;
- }
+ if (typeof lastOnline === 'undefined' || lastOnline === null) {
+ return <div className="circle pulse orange"></div>;
+ }
- const timeDifferenceInSeconds = unixTime ? currentTimeInSeconds - unixTime : Infinity;
+ const timeDifferenceInSeconds = unixTime ? currentTimeInSeconds - unixTime : Infinity;
- if (timeDifferenceInSeconds > 0 && timeDifferenceInSeconds <= 60) {
- return <div className="circle pulse green"></div>;
- }
+ if (timeDifferenceInSeconds > 0 && timeDifferenceInSeconds <= 60) {
+ return <div className="circle pulse green"></div>;
+ }
- return <div className="circle pulse red"></div>;
+ return <div className="circle pulse red"></div>;
};
\ No newline at end of file
diff --git a/app/dashboard/src/components/OnlineStatus.tsx b/app/dashboard/src/components/OnlineStatus.tsx
@@ -1,43 +1,43 @@
-import {FC} from "react";
-import {Text} from "@chakra-ui/react";
-import {relativeExpiryDate} from "utils/dateFormatter";
+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;
- }
+ if (!lastOnline) {
+ return null;
+ }
- const date = new Date(lastOnline + "Z");
- return Math.floor(date.getTime() / 1000);
+ 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 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"};
+ 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>
- );
+ 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/Pagination.tsx b/app/dashboard/src/components/Pagination.tsx
@@ -6,15 +6,15 @@ import {
HStack,
Select,
Text,
-} from "@chakra-ui/react";
+} from '@chakra-ui/react';
import {
ArrowLongLeftIcon,
ArrowLongRightIcon,
-} from "@heroicons/react/24/outline";
-import { useDashboard } from "contexts/DashboardContext";
-import { ChangeEvent, FC } from "react";
-import { useTranslation } from "react-i18next";
-import { setUsersPerPageLimitSize } from "utils/userPreferenceStorage";
+} from '@heroicons/react/24/outline';
+import { useDashboard } from 'contexts/DashboardContext';
+import { ChangeEvent, FC } from 'react';
+import { useTranslation } from 'react-i18next';
+import { setUsersPerPageLimitSize } from 'utils/userPreferenceStorage';
const PrevIcon = chakra(ArrowLongLeftIcon, {
baseStyle: {
@@ -50,7 +50,7 @@ function generatePageItems(total: number, current: number, width: number) {
);
}
if (width % 2 === 0) {
- throw new Error(`Must allow odd number of page items`);
+ throw new Error('Must allow odd number of page items');
}
if (total < width) {
return [...new Array(total).keys()];
@@ -66,11 +66,11 @@ function generatePageItems(total: number, current: number, width: number) {
// replace non-ending items with placeholders
if (items[0] > 0) {
items[0] = 0;
- items[1] = "prev-more";
+ items[1] = 'prev-more';
}
if (items[items.length - 1] < total - 1) {
items[items.length - 1] = total - 1;
- items[items.length - 2] = "next-more";
+ items[items.length - 2] = 'next-more';
}
return items;
}
@@ -112,7 +112,7 @@ export const Pagination: FC = () => {
display="flex"
columnGap={{ lg: 4, md: 0 }}
rowGap={{ md: 0, base: 4 }}
- flexDirection={{ md: "row", base: "column" }}
+ flexDirection={{ md: 'row', base: 'column' }}
>
<Box order={{ base: 2, md: 1 }}>
<HStack>
@@ -127,8 +127,8 @@ export const Pagination: FC = () => {
<option>20</option>
<option>30</option>
</Select>
- <Text whiteSpace={"nowrap"} fontSize="sm">
- {t("itemsPerPage")}
+ <Text whiteSpace={'nowrap'} fontSize="sm">
+ {t('itemsPerPage')}
</Text>
</HStack>
</Box>
@@ -139,15 +139,15 @@ export const Pagination: FC = () => {
onClick={changePage.bind(null, page - 1)}
isDisabled={page === 0 || noPages === 0}
>
- {t("previous")}
+ {t('previous')}
</Button>
{pages.map((pageIndex) => {
- if (typeof pageIndex === "string")
+ if (typeof pageIndex === 'string')
return <Button key={pageIndex}>...</Button>;
return (
<Button
key={pageIndex}
- variant={(pageIndex as number) === page ? "solid" : "outline"}
+ variant={(pageIndex as number) === page ? 'solid' : 'outline'}
onClick={changePage.bind(null, pageIndex)}
>
{(pageIndex as number) + 1}
@@ -160,7 +160,7 @@ export const Pagination: FC = () => {
onClick={changePage.bind(null, page + 1)}
isDisabled={page + 1 === noPages || noPages === 0}
>
- {t("next")}
+ {t('next')}
</Button>
</ButtonGroup>
</HStack>
diff --git a/app/dashboard/src/components/QRCodeDialog.tsx b/app/dashboard/src/components/QRCodeDialog.tsx
@@ -11,29 +11,29 @@ import {
ModalOverlay,
Text,
VStack,
-} from "@chakra-ui/react";
+} 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 { useDashboard } from "../contexts/DashboardContext";
-import { Icon } from "./Icon";
+} 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 { useDashboard } from '../contexts/DashboardContext';
+import { Icon } from './Icon';
const QRCode = chakra(QRCodeCanvas);
const NextIcon = chakra(ChevronRightIcon, {
baseStyle: {
w: 6,
h: 6,
- color: "gray.600",
+ color: 'gray.600',
_dark: {
- color: "white",
+ color: 'white',
},
},
});
@@ -41,9 +41,9 @@ const PrevIcon = chakra(ChevronLeftIcon, {
baseStyle: {
w: 6,
h: 6,
- color: "gray.600",
+ color: 'gray.600',
_dark: {
- color: "white",
+ color: 'white',
},
},
});
@@ -64,7 +64,7 @@ export const QRCodeDialog: FC = () => {
setSubLink(null);
};
- const subscribeQrLink = String(subscribeUrl).startsWith("/")
+ const subscribeQrLink = String(subscribeUrl).startsWith('/')
? window.location.origin + subscribeUrl
: String(subscribeUrl);
@@ -81,20 +81,20 @@ export const QRCodeDialog: FC = () => {
{QRcodeLinks && (
<ModalBody
gap={{
- base: "20px",
- lg: "50px",
+ base: '20px',
+ lg: '50px',
}}
pr={{
- lg: "60px",
+ lg: '60px',
}}
px={{
- base: "50px",
+ base: '50px',
}}
display="flex"
justifyContent="center"
flexDirection={{
- base: "column",
- lg: "row",
+ base: 'column',
+ lg: 'row',
}}
>
{subscribeUrl && (
@@ -103,13 +103,13 @@ export const QRCodeDialog: FC = () => {
mx="auto"
size={300}
p="2"
- level={"L"}
+ level={'L'}
includeMargin={false}
value={subscribeQrLink}
bg="white"
/>
<Text display="block" textAlign="center" pb={3} mt={1}>
- {t("qrcodeDialog.sublink")}
+ {t('qrcodeDialog.sublink')}
</Text>
</VStack>
)}
@@ -154,7 +154,7 @@ export const QRCodeDialog: FC = () => {
mx="auto"
size={300}
p="2"
- level={"L"}
+ level={'L'}
includeMargin={false}
value={link}
bg="white"
diff --git a/app/dashboard/src/components/RadioGroup.tsx b/app/dashboard/src/components/RadioGroup.tsx
@@ -1,537 +0,0 @@
-import {
- Accordion,
- AccordionButton,
- AccordionItem,
- AccordionPanel,
- Badge,
- Box,
- chakra,
- Checkbox,
- FormControl,
- HStack,
- IconButton,
- Input,
- Select,
- SimpleGrid,
- Text,
- useCheckbox,
- useCheckboxGroup,
- UseRadioProps,
- VStack,
-} from "@chakra-ui/react";
-import { EllipsisVerticalIcon } from "@heroicons/react/24/outline";
-import { shadowsocksMethods, XTLSFlows } from "constants/Proxies";
-import {
- InboundType,
- ProtocolType,
- useDashboard,
-} from "contexts/DashboardContext";
-import { t } from "i18next";
-import { FC, forwardRef, PropsWithChildren, useState } from "react";
-import {
- ControllerRenderProps,
- useFormContext,
- useWatch,
-} from "react-hook-form";
-
-const SettingsIcon = chakra(EllipsisVerticalIcon, {
- baseStyle: {
- strokeWidth: "2px",
- w: 5,
- h: 5,
- },
-});
-
-const InboundCard: FC<
- PropsWithChildren<UseRadioProps & { inbound: InboundType }>
-> = ({ inbound, ...props }) => {
- const { getCheckboxProps, getInputProps, getLabelProps, htmlProps } =
- useCheckbox(props);
- const inputProps = getInputProps();
- return (
- <Box as="label">
- <input {...inputProps} />
- <Box
- w="fll"
- position="relative"
- {...htmlProps}
- cursor="pointer"
- borderRadius="sm"
- border="1px solid"
- borderColor={"gray.200"}
- _dark={{
- borderColor: "gray.600",
- }}
- display="flex"
- alignItems="center"
- justifyContent="space-between"
- overflow="hidden"
- _checked={{
- bg: "gray.50",
- outline: "2px",
- boxShadow: "outline",
- outlineColor: "primary.500",
- borderColor: "transparent",
- fontWeight: "medium",
- _dark: {
- bg: "gray.750",
- borderColor: "transparent",
- },
- "& p": {
- opacity: 1,
- },
- }}
- __css={{
- "& p": {
- opacity: 0.8,
- },
- }}
- textTransform="capitalize"
- px={3}
- py={2}
- fontWeight="medium"
- {...getCheckboxProps()}
- >
- <Checkbox
- size="sm"
- w="full"
- maxW="full"
- color="gray.700"
- _dark={{ color: "gray.300" }}
- textTransform="uppercase"
- colorScheme="primary"
- className="inbound-item"
- isChecked={inputProps.checked}
- pointerEvents="none"
- flexGrow={1}
- >
- <HStack
- justify="space-between"
- w="full"
- maxW="calc(100% - 20px)"
- spacing={0}
- gap={2}
- overflow="hidden"
- >
- <Text isTruncated {...getLabelProps()} fontSize="xs">
- {inbound.tag} <Text as="span">({inbound.network})</Text>
- </Text>
- </HStack>
- </Checkbox>
- {inbound.tls && inbound.tls != "none" && (
- <Badge fontSize="xs" opacity=".8" size="xs">
- {inbound.tls}
- </Badge>
- )}
- </Box>
- </Box>
- );
-};
-
-const RadioCard: FC<
- PropsWithChildren<
- UseRadioProps & {
- disabled?: boolean;
- title: string;
- description: string;
- toggleAccordion: () => void;
- isSelected: boolean;
- }
- >
-> = ({
- disabled,
- title,
- description,
- toggleAccordion,
- isSelected,
- ...props
-}) => {
- const form = useFormContext();
- const { inbounds } = useDashboard();
- const { getCheckboxProps, getInputProps, getLabelProps, htmlProps } =
- useCheckbox(props);
-
- const inputProps = getInputProps();
-
- const [inBoundDefaultValue] = useWatch({
- name: [`inbounds.${title}`],
- control: form.control,
- });
-
- const { getCheckboxProps: getInboundCheckboxProps } = useCheckboxGroup({
- value: inBoundDefaultValue,
- onChange: (selectedInbounds) => {
- form.setValue(`inbounds.${title}`, selectedInbounds);
- if (selectedInbounds.length === 0) {
- const selected_proxies = form.getValues("selected_proxies");
- form.setValue(
- `selected_proxies`,
- selected_proxies.filter((p: string) => p !== title)
- );
- toggleAccordion();
- }
- },
- });
-
- const isPartialSelected =
- inBoundDefaultValue &&
- isSelected &&
- (useDashboard.getState().inbounds.get(title as ProtocolType) || [])
- .length !== inBoundDefaultValue.length;
-
- const protocolHasInbound =
- (useDashboard.getState().inbounds.get(title as ProtocolType) || []).length >
- 0;
-
- const shouldBeDisabled = !isSelected && !protocolHasInbound;
-
- return (
- <AccordionItem
- isDisabled={!protocolHasInbound}
- borderRadius="md"
- borderStyle="solid"
- border="1px"
- borderColor="gray.200"
- bg={shouldBeDisabled ? "gray.100" : "transparent"}
- _dark={{
- borderColor: "gray.600",
- bg: shouldBeDisabled ? "#364154" : "transparent",
- }}
- _checked={{
- bg: "gray.50",
- outline: "2px",
- boxShadow: "outline",
- outlineColor: "primary.500",
- borderColor: "transparent",
- }}
- {...getCheckboxProps()}
- >
- <Box as={shouldBeDisabled ? "span" : "label"} position="relative">
- {isPartialSelected && (
- <Box
- position="absolute"
- w="2"
- h="2"
- bg="yellow.500"
- top="-1"
- right="-1"
- rounded="full"
- zIndex={999}
- />
- )}
- <input {...inputProps} />
- <Box
- w="fll"
- position="relative"
- {...htmlProps}
- borderRadius="md"
- cursor={shouldBeDisabled ? "not-allowed" : "pointer"}
- _checked={{
- fontWeight: "medium",
- _dark: {
- bg: "gray.750",
- borderColor: "transparent",
- },
- "& > svg": {
- opacity: 1,
- "&.checked": {
- display: "block",
- },
- "&.unchecked": {
- display: "none",
- },
- },
- "& p": {
- opacity: 1,
- },
- }}
- __css={{
- "& > svg": {
- opacity: 0.3,
- "&.checked": {
- display: "none",
- },
- "&.unchecked": {
- display: "block",
- },
- },
- "& p": {
- opacity: 0.8,
- },
- }}
- textTransform="capitalize"
- px={3}
- py={2}
- fontWeight="medium"
- {...getCheckboxProps()}
- >
- <AccordionButton
- display={
- inputProps.checked && protocolHasInbound ? "block" : "none"
- }
- as="span"
- className="checked"
- color="primary.200"
- position="absolute"
- right="3"
- top="3"
- w="auto"
- p={0}
- onClick={toggleAccordion}
- >
- <IconButton size="sm" aria-label="inbound settings">
- <SettingsIcon />
- </IconButton>
- </AccordionButton>
-
- <Text
- fontSize="sm"
- color={shouldBeDisabled ? "gray.400" : "gray.700"}
- _dark={{ color: shouldBeDisabled ? "gray.500" : "gray.300" }}
- {...getLabelProps()}
- >
- {title}
- </Text>
- <Text
- fontWeight="medium"
- color={shouldBeDisabled ? "gray.400" : "gray.600"}
- _dark={{ color: shouldBeDisabled ? "gray.500" : "gray.400" }}
- fontSize="xs"
- >
- {description}
- </Text>
- </Box>
- </Box>
- <AccordionPanel
- px={2}
- pb={3}
- roundedBottom="5px"
- pt={3}
- _dark={{ bg: inputProps.checked && "gray.750" }}
- >
- <VStack
- w="full"
- rowGap={2}
- borderStyle="solid"
- borderWidth="1px"
- borderRadius="md"
- pl={3}
- pr={3}
- pt={1.5}
- _dark={{ bg: "gray.700" }}
- >
- <VStack alignItems="flex-start" w="full">
- <Text fontSize="sm">{t("inbound")}</Text>
- <SimpleGrid
- gap={2}
- alignItems="flex-start"
- w="full"
- columns={1}
- spacing={1}
- >
- {(
- (inbounds.get(title as ProtocolType) as InboundType[]) || []
- ).map((inbound) => {
- return (
- <InboundCard
- key={inbound.tag}
- {...getInboundCheckboxProps({ value: inbound.tag })}
- inbound={inbound}
- />
- );
- })}
- </SimpleGrid>
- </VStack>
- {title === "vmess" && isSelected && (
- <VStack alignItems="flex-start" w="full">
- <FormControl height="66px">
- <Text fontSize="sm" pb={1}>
- ID
- </Text>
- <Input
- fontSize="xs"
- size="sm"
- borderRadius="6px"
- pl={2}
- pr={2}
- placeholder={t("userDialog.generatedByDefault")}
- {...form.register("proxies.vmess.id")}
- />
- </FormControl>
- </VStack>
- )}
- {title === "vless" && isSelected && (
- <VStack alignItems="flex-start" w="full">
- <FormControl height="66px">
- <Text fontSize="sm" pb={1}>
- ID
- </Text>
- <Input
- fontSize="xs"
- size="sm"
- borderRadius="6px"
- pl={2}
- pr={2}
- placeholder={t("userDialog.generatedByDefault")}
- {...form.register("proxies.vless.id")}
- />
- </FormControl>
- <FormControl height="66px">
- <Text fontSize="sm" pb={1}>
- Flow
- </Text>
- <Select
- fontSize="xs"
- size="sm"
- borderRadius="6px"
- {...form.register("proxies.vless.flow")}
- >
- {XTLSFlows.map((entry) => (
- <option key={entry.title} value={entry.value}>
- {entry.title}
- </option>
- ))}
- </Select>
- </FormControl>
- </VStack>
- )}
- {title === "trojan" && isSelected && (
- <VStack alignItems="flex-start" w="full">
- <FormControl height="66px">
- <Text fontSize="sm" pb={1}>
- {t("password")}
- </Text>
- <Input
- fontSize="xs"
- size="sm"
- borderRadius="6px"
- pl={2}
- pr={2}
- placeholder={t("userDialog.generatedByDefault")}
- {...form.register("proxies.trojan.password")}
- />
- </FormControl>
- </VStack>
- )}
- {title === "shadowsocks" && isSelected && (
- <VStack alignItems="flex-start" w="full">
- <FormControl height="66px">
- <Text fontSize="sm" pb={1}>
- {t("password")}
- </Text>
- <Input
- fontSize="xs"
- size="sm"
- borderRadius="6px"
- pl={2}
- pr={2}
- placeholder={t("userDialog.generatedByDefault")}
- {...form.register("proxies.shadowsocks.password")}
- />
- </FormControl>
- <FormControl height="66px">
- <Text fontSize="sm" pb={1}>
- {t("userDialog.method")}
- </Text>
- <Select
- fontSize="xs"
- size="sm"
- borderRadius="6px"
- {...form.register("proxies.shadowsocks.method")}
- >
- {shadowsocksMethods.map((method) => (
- <option key={method} value={method}>
- {method}
- </option>
- ))}
- </Select>
- </FormControl>
- </VStack>
- )}
- </VStack>
- </AccordionPanel>
- </AccordionItem>
- );
-};
-
-export type RadioListType = {
- title: string;
- description: string;
-};
-
-export type RadioGroupProps = ControllerRenderProps & {
- list: RadioListType[];
- disabled?: boolean;
-};
-
-export const RadioGroup = forwardRef<any, RadioGroupProps>(
- ({ name, list, onChange, disabled, ...props }, ref) => {
- const form = useFormContext();
- const [expandedAccordions, setExpandedAccordions] = useState<number[]>([]);
-
- const toggleAccordion = (i: number) => {
- if (expandedAccordions.includes(i))
- expandedAccordions.splice(expandedAccordions.indexOf(i), 1);
- else expandedAccordions.push(i);
- setExpandedAccordions([...expandedAccordions]);
- };
-
- const { getCheckboxProps } = useCheckboxGroup({
- value: props.value,
- onChange: (value) => {
- // active all inbounds when a proxy selected
- const selectedItem = value.filter((el) => !props.value.includes(el));
- if (selectedItem[0]) {
- form.setValue(
- `inbounds.${selectedItem[0]}`,
- useDashboard
- .getState()
- .inbounds.get(selectedItem[0] as ProtocolType)
- ?.map((i) => i.tag)
- );
- }
-
- setExpandedAccordions(
- expandedAccordions.filter((i) => {
- return value.find((title) => title === list[i].title);
- })
- );
-
- onChange({
- target: {
- value,
- name,
- },
- });
- },
- });
-
- return (
- <Accordion allowToggle index={expandedAccordions}>
- <SimpleGrid
- ref={ref}
- gap={2}
- alignItems="flex-start"
- columns={1}
- spacing={1}
- >
- {list.map((value, index) => {
- return (
- <RadioCard
- toggleAccordion={toggleAccordion.bind(null, index)}
- disabled={disabled}
- key={value.title}
- title={value.title}
- description={value.description}
- isSelected={
- !!(props.value as string[]).find((v) => v === value.title)
- }
- {...getCheckboxProps({ value: value.title })}
- />
- );
- })}
- </SimpleGrid>
- </Accordion>
- );
- }
-);
diff --git a/app/dashboard/src/components/ResetAllUsageModal.tsx b/app/dashboard/src/components/ResetAllUsageModal.tsx
@@ -11,12 +11,12 @@ import {
Spinner,
Text,
useToast,
-} from "@chakra-ui/react";
-import { FC, useState } from "react";
-import { DocumentMinusIcon } from "@heroicons/react/24/outline";
-import { Icon } from "./Icon";
-import { useDashboard } from "contexts/DashboardContext";
-import { useTranslation } from "react-i18next";
+} from '@chakra-ui/react';
+import { FC, useState } from 'react';
+import { DocumentMinusIcon } from '@heroicons/react/24/outline';
+import { Icon } from './Icon';
+import { useDashboard } from 'contexts/DashboardContext';
+import { useTranslation } from 'react-i18next';
export const ResetIcon = chakra(DocumentMinusIcon, {
baseStyle: {
@@ -40,19 +40,19 @@ export const ResetAllUsageModal: FC<DeleteUserModalProps> = () => {
resetAllUsage()
.then(() => {
toast({
- title: t("resetAllUsage.success"),
- status: "success",
+ title: t('resetAllUsage.success'),
+ status: 'success',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
})
.catch(() => {
toast({
- title: t("resetAllUsage.error"),
- status: "error",
+ title: t('resetAllUsage.error'),
+ status: 'error',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
})
@@ -72,22 +72,22 @@ export const ResetAllUsageModal: FC<DeleteUserModalProps> = () => {
<ModalCloseButton mt={3} />
<ModalBody>
<Text fontWeight="semibold" fontSize="lg">
- {t("resetAllUsage.title")}
+ {t('resetAllUsage.title')}
</Text>
{isResetingAllUsage && (
<Text
mt={1}
fontSize="sm"
- _dark={{ color: "gray.400" }}
+ _dark={{ color: 'gray.400' }}
color="gray.600"
>
- {t("resetAllUsage.prompt")}
+ {t('resetAllUsage.prompt')}
</Text>
)}
</ModalBody>
<ModalFooter display="flex">
<Button size="sm" onClick={onClose} mr={3} w="full" variant="outline">
- {t("cancel")}
+ {t('cancel')}
</Button>
<Button
size="sm"
@@ -96,7 +96,7 @@ export const ResetAllUsageModal: FC<DeleteUserModalProps> = () => {
onClick={onReset}
leftIcon={loading ? <Spinner size="xs" /> : undefined}
>
- {t("reset")}
+ {t('reset')}
</Button>
</ModalFooter>
</ModalContent>
diff --git a/app/dashboard/src/components/ResetUserUsageModal.tsx b/app/dashboard/src/components/ResetUserUsageModal.tsx
@@ -1,5 +1,4 @@
import {
- Box,
Button,
chakra,
Modal,
@@ -11,14 +10,13 @@ import {
ModalOverlay,
Spinner,
Text,
- Toast,
useToast,
-} from "@chakra-ui/react";
-import { FC, useEffect, useRef, useState } from "react";
-import { ArrowPathIcon } from "@heroicons/react/24/outline";
-import { Icon } from "./Icon";
-import { useDashboard } from "contexts/DashboardContext";
-import { useTranslation, Trans } from "react-i18next";
+} from '@chakra-ui/react';
+import { FC, useState } from 'react';
+import { ArrowPathIcon } from '@heroicons/react/24/outline';
+import { Icon } from './Icon';
+import { useDashboard } from 'contexts/DashboardContext';
+import { useTranslation, Trans } from 'react-i18next';
export const ResetIcon = chakra(ArrowPathIcon, {
baseStyle: {
@@ -43,19 +41,19 @@ export const ResetUserUsageModal: FC<DeleteUserModalProps> = () => {
resetDataUsage(user)
.then(() => {
toast({
- title: t("resetUserUsage.success", {username: user.username}),
- status: "success",
+ title: t('resetUserUsage.success', { username: user.username }),
+ status: 'success',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
})
.catch(() => {
toast({
- title: t("resetUserUsage.error"),
- status: "error",
+ title: t('resetUserUsage.error'),
+ status: 'error',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
})
@@ -76,25 +74,25 @@ export const ResetUserUsageModal: FC<DeleteUserModalProps> = () => {
<ModalCloseButton mt={3} />
<ModalBody>
<Text fontWeight="semibold" fontSize="lg">
- {t("resetUserUsage.title")}
+ {t('resetUserUsage.title')}
</Text>
{user && (
<Text
mt={1}
fontSize="sm"
- _dark={{ color: "gray.400" }}
+ _dark={{ color: 'gray.400' }}
color="gray.600"
>
<Trans
- components={{b: <b /> }}>
- {t("resetUserUsage.prompt", {username: user.username})}
+ 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")}
+ {t('cancel')}
</Button>
<Button
size="sm"
@@ -103,7 +101,7 @@ export const ResetUserUsageModal: FC<DeleteUserModalProps> = () => {
onClick={onReset}
leftIcon={loading ? <Spinner size="xs" /> : undefined}
>
- {t("reset")}
+ {t('reset')}
</Button>
</ModalFooter>
</ModalContent>
diff --git a/app/dashboard/src/components/RevokeSubscriptionModal.tsx b/app/dashboard/src/components/RevokeSubscriptionModal.tsx
@@ -11,12 +11,12 @@ import {
Spinner,
Text,
useToast,
-} from "@chakra-ui/react";
-import { ArrowPathIcon } from "@heroicons/react/24/outline";
-import { useDashboard } from "contexts/DashboardContext";
-import { FC, useState } from "react";
-import { Trans, useTranslation } from "react-i18next";
-import { Icon } from "./Icon";
+} from '@chakra-ui/react';
+import { ArrowPathIcon } from '@heroicons/react/24/outline';
+import { useDashboard } from 'contexts/DashboardContext';
+import { FC, useState } from 'react';
+import { Trans, useTranslation } from 'react-i18next';
+import { Icon } from './Icon';
export const ResetIcon = chakra(ArrowPathIcon, {
baseStyle: {
@@ -41,19 +41,19 @@ export const RevokeSubscriptionModal: FC<RevokeSubscriptionModalProps> = () => {
revokeSubscription(user)
.then(() => {
toast({
- title: t("revokeUserSub.success", { username: user.username }),
- status: "success",
+ title: t('revokeUserSub.success', { username: user.username }),
+ status: 'success',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
})
.catch(() => {
toast({
- title: t("revokeUserSub.error"),
- status: "error",
+ title: t('revokeUserSub.error'),
+ status: 'error',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
})
@@ -74,24 +74,24 @@ export const RevokeSubscriptionModal: FC<RevokeSubscriptionModalProps> = () => {
<ModalCloseButton mt={3} />
<ModalBody>
<Text fontWeight="semibold" fontSize="lg">
- {t("revokeUserSub.title")}
+ {t('revokeUserSub.title')}
</Text>
{user && (
<Text
mt={1}
fontSize="sm"
- _dark={{ color: "gray.400" }}
+ _dark={{ color: 'gray.400' }}
color="gray.600"
>
<Trans components={{ b: <b /> }}>
- {t("revokeUserSub.prompt", { username: user.username })}
+ {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")}
+ {t('cancel')}
</Button>
<Button
size="sm"
@@ -100,7 +100,7 @@ export const RevokeSubscriptionModal: FC<RevokeSubscriptionModalProps> = () => {
onClick={onReset}
leftIcon={loading ? <Spinner size="xs" /> : undefined}
>
- {t("revoke")}
+ {t('revoke')}
</Button>
</ModalFooter>
</ModalContent>
diff --git a/app/dashboard/src/components/Statistics.tsx b/app/dashboard/src/components/Statistics.tsx
@@ -1,22 +1,22 @@
-import { Box, BoxProps, Card, chakra, HStack, Text } from "@chakra-ui/react";
+import { Box, BoxProps, Card, chakra, HStack, Text } from '@chakra-ui/react';
import {
ChartBarIcon,
ChartPieIcon,
UsersIcon,
-} from "@heroicons/react/24/outline";
-import { useDashboard } from "contexts/DashboardContext";
-import { FC, PropsWithChildren, ReactElement, ReactNode } from "react";
-import { useTranslation } from "react-i18next";
-import { useQuery } from "react-query";
-import { fetch } from "service/http";
-import { formatBytes, numberWithCommas } from "utils/formatByte";
+} from '@heroicons/react/24/outline';
+import { useDashboard } from 'contexts/DashboardContext';
+import { FC, PropsWithChildren, ReactElement, ReactNode } from 'react';
+import { useTranslation } from 'react-i18next';
+import { useQuery } from 'react-query';
+import { fetch } from 'service/http';
+import { formatBytes, numberWithCommas } from 'utils/formatByte';
const TotalUsersIcon = chakra(UsersIcon, {
baseStyle: {
w: 5,
h: 5,
- position: "relative",
- zIndex: "2",
+ position: 'relative',
+ zIndex: '2',
},
});
@@ -24,8 +24,8 @@ const NetworkIcon = chakra(ChartBarIcon, {
baseStyle: {
w: 5,
h: 5,
- position: "relative",
- zIndex: "2",
+ position: 'relative',
+ zIndex: '2',
},
});
@@ -33,8 +33,8 @@ const MemoryIcon = chakra(ChartPieIcon, {
baseStyle: {
w: 5,
h: 5,
- position: "relative",
- zIndex: "2",
+ position: 'relative',
+ zIndex: '2',
},
});
@@ -55,7 +55,7 @@ const StatisticCard: FC<PropsWithChildren<StatisticCardProps>> = ({
borderWidth="1px"
borderColor="light-border"
bg="#F9FAFB"
- _dark={{ borderColor: "gray.600", bg: "gray.750" }}
+ _dark={{ borderColor: 'gray.600', bg: 'gray.750' }}
borderStyle="solid"
boxShadow="none"
borderRadius="12px"
@@ -70,30 +70,30 @@ const StatisticCard: FC<PropsWithChildren<StatisticCardProps>> = ({
position="relative"
color="white"
_before={{
- content: `""`,
- position: "absolute",
+ content: '""',
+ position: 'absolute',
top: 0,
left: 0,
- bg: "primary.400",
- display: "block",
- w: "full",
- h: "full",
- borderRadius: "5px",
- opacity: ".5",
- z: "1",
+ 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",
+ 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}
@@ -101,7 +101,7 @@ const StatisticCard: FC<PropsWithChildren<StatisticCardProps>> = ({
<Text
color="gray.600"
_dark={{
- color: "gray.300",
+ color: 'gray.300',
}}
fontWeight="medium"
textTransform="capitalize"
@@ -116,12 +116,12 @@ const StatisticCard: FC<PropsWithChildren<StatisticCardProps>> = ({
</Card>
);
};
-export const StatisticsQueryKey = "statistics-query-key";
+export const StatisticsQueryKey = 'statistics-query-key';
export const Statistics: FC<BoxProps> = (props) => {
const { version } = useDashboard();
const { data: systemData } = useQuery({
queryKey: StatisticsQueryKey,
- queryFn: () => fetch("/system"),
+ queryFn: () => fetch('/system'),
refetchInterval: 5000,
onSuccess: ({ version: currentVersion }) => {
if (version !== currentVersion)
@@ -136,11 +136,11 @@ export const Statistics: FC<BoxProps> = (props) => {
columnGap={{ lg: 4, md: 0 }}
rowGap={{ lg: 0, base: 4 }}
display="flex"
- flexDirection={{ lg: "row", base: "column" }}
+ flexDirection={{ lg: 'row', base: 'column' }}
{...props}
>
<StatisticCard
- title={t("activeUsers")}
+ title={t('activeUsers')}
content={
systemData && (
<HStack alignItems="flex-end">
@@ -160,7 +160,7 @@ export const Statistics: FC<BoxProps> = (props) => {
icon={<TotalUsersIcon />}
/>
<StatisticCard
- title={t("dataUsage")}
+ title={t('dataUsage')}
content={
systemData &&
formatBytes(
@@ -170,7 +170,7 @@ export const Statistics: FC<BoxProps> = (props) => {
icon={<NetworkIcon />}
/>
<StatisticCard
- title={t("memoryUsage")}
+ title={t('memoryUsage')}
content={
systemData && (
<HStack alignItems="flex-end">
@@ -182,7 +182,7 @@ export const Statistics: FC<BoxProps> = (props) => {
display="inline-block"
pb="5px"
>
- {formatBytes(systemData.mem_used, 1, true)[1]} /{" "}
+ {formatBytes(systemData.mem_used, 1, true)[1]} /{' '}
{formatBytes(systemData.mem_total, 1)}
</Text>
</HStack>
diff --git a/app/dashboard/src/components/StatusBadge.tsx b/app/dashboard/src/components/StatusBadge.tsx
@@ -1,10 +1,10 @@
-import { Badge, Text } from "@chakra-ui/react";
+import { Badge, Text } from '@chakra-ui/react';
-import { statusColors } from "constants/UserSettings";
-import { FC } from "react";
-import { useTranslation } from "react-i18next";
-import { Status as UserStatusType } from "types/User";
-import { relativeExpiryDate } from "utils/dateFormatter";
+import { statusColors } from 'constants/UserSettings';
+import { FC } from 'react';
+import { useTranslation } from 'react-i18next';
+import { Status as UserStatusType } from 'types/User';
+import { relativeExpiryDate } from 'utils/dateFormatter';
type UserStatusProps = {
expiryDate?: number | null;
@@ -38,8 +38,8 @@ export const StatusBadge: FC<UserStatusProps> = ({
{showDetail && (
<Text
textTransform="capitalize"
- fontSize={compact ? ".7rem" : ".875rem"}
- lineHeight={compact ? "1rem" : "1.25rem"}
+ fontSize={compact ? '.7rem' : '.875rem'}
+ lineHeight={compact ? '1rem' : '1.25rem'}
fontWeight="medium"
letterSpacing="tighter"
>
@@ -56,7 +56,7 @@ export const StatusBadge: FC<UserStatusProps> = ({
ml="2"
color="gray.600"
_dark={{
- color: "gray.400",
+ color: 'gray.400',
}}
>
{t(dateInfo.status, { time: dateInfo.time })}
diff --git a/app/dashboard/src/components/Textarea.tsx b/app/dashboard/src/components/Textarea.tsx
@@ -9,10 +9,10 @@ import {
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";
+} 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: {
@@ -66,12 +66,12 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
if (onChange)
onChange({
target: {
- value: "",
+ value: '',
name,
},
});
};
- const { size = "md" } = props;
+ const { size = 'md' } = props;
return (
<FormControl isInvalid={!!error}>
@@ -81,11 +81,11 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
w="full"
rounded="md"
_focusWithin={{
- outline: "2px solid",
- outlineColor: "primary.200",
+ outline: '2px solid',
+ outlineColor: 'primary.200',
}}
- bg={disabled ? "gray.100" : "transparent"}
- _dark={{ bg: disabled ? "gray.600" : "transparent" }}
+ bg={disabled ? 'gray.100' : 'transparent'}
+ _dark={{ bg: disabled ? 'gray.600' : 'transparent' }}
>
{startAdornment && <InputLeftAddon>{startAdornment}</InputLeftAddon>}
{/* @ts-ignore */}
@@ -102,17 +102,17 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
disabled={disabled}
flexGrow={1}
_focusVisible={{
- outline: "none",
- borderTopColor: "transparent",
- borderRightColor: "transparent",
- borderBottomColor: "transparent",
+ outline: 'none',
+ borderTopColor: 'transparent',
+ borderRightColor: 'transparent',
+ borderBottomColor: 'transparent',
}}
_disabled={{
- cursor: "not-allowed",
+ cursor: 'not-allowed',
}}
{...props}
- roundedLeft={startAdornment ? "0" : "md"}
- roundedRight={endAdornment ? "0" : "md"}
+ roundedLeft={startAdornment ? '0' : 'md'}
+ roundedRight={endAdornment ? '0' : 'md'}
/>
{endAdornment && (
<InputRightAddon
diff --git a/app/dashboard/src/components/UsageFilter.tsx b/app/dashboard/src/components/UsageFilter.tsx
@@ -13,21 +13,20 @@ import {
UseRadioProps,
VStack,
useBreakpointValue,
- useColorMode,
useDisclosure,
useOutsideClick,
useRadio,
useRadioGroup,
-} from "@chakra-ui/react";
-import { CalendarIcon, ChevronRightIcon } from "@heroicons/react/24/outline";
-import { ApexOptions } from "apexcharts";
-import { FilterUsageType } from "contexts/DashboardContext";
-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";
+} from '@chakra-ui/react';
+import { CalendarIcon, ChevronRightIcon } from '@heroicons/react/24/outline';
+import { ApexOptions } from 'apexcharts';
+import { FilterUsageType } from 'contexts/DashboardContext';
+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;
@@ -36,7 +35,7 @@ const FilterItem: FC<UseRadioProps & { border?: boolean } & any> = ({
...props
}) => {
const { getInputProps, getRadioProps } = useRadio(props);
- const fontSize = useBreakpointValue({ base: "xs", md: "sm" });
+ const fontSize = useBreakpointValue({ base: 'xs', md: 'sm' });
return (
<Box as="label">
<input {...getInputProps()} />
@@ -48,15 +47,15 @@ const FilterItem: FC<UseRadioProps & { border?: boolean } & any> = ({
textAlign="center"
cursor="pointer"
fontSize={fontSize}
- borderWidth={border ? "1px" : "0px"}
+ borderWidth={border ? '1px' : '0px'}
borderRadius="md"
_checked={{
- bg: "primary.500",
- color: "white",
- borderColor: "primary.500",
+ bg: 'primary.500',
+ color: 'white',
+ borderColor: 'primary.500',
}}
_focus={{
- boxShadow: "outline",
+ boxShadow: 'outline',
}}
px={3}
py={1}
@@ -78,65 +77,63 @@ export const UsageFilter: FC<UsageFilterProps> = ({
...props
}) => {
const { t, i18n } = useTranslation();
- const { colorMode } = useColorMode();
const filterOptions = useBreakpointValue({
- base: ["7h", "1d", "3d", "1w"],
- md: ["7h", "1d", "3d", "1w", "1m", "3m"],
+ base: ['7h', '1d', '3d', '1w'],
+ md: ['7h', '1d', '3d', '1w', '1m', '3m'],
})!;
const filterOptionTypes = {
- h: "hour",
- d: "day",
- w: "week",
- m: "month",
- y: "year",
+ 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"] },
+ { 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"] },
+ { 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,
- setValue: setDefaultFilter,
} = useRadioGroup({
- name: "filter",
+ name: 'filter',
defaultValue: defaultValue,
onChange: (value: string) => {
- if (value === "custom") {
+ if (value === 'custom') {
return;
}
closeCustom();
if (filterOptions.indexOf(value) >= 0) {
- setCustomLabel(t("userDialog.custom"));
+ setCustomLabel(t('userDialog.custom'));
setCustom(false);
} else {
- setCustomLabel(t("userDialog.custom") + ` (${value})`);
+ 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
+ value[value.length - 1] as keyof typeof filterOptionTypes
];
onChange(value, {
start: dayjs()
.utc()
.subtract(num, unit as ManipulateType)
- .format("YYYY-MM-DDTHH:00:00"),
+ .format('YYYY-MM-DDTHH:00:00'),
});
},
});
@@ -149,12 +146,12 @@ export const UsageFilter: FC<UsageFilterProps> = ({
const customRef = useRef(null);
useOutsideClick({ ref: customRef, handler: closeCustom });
- const [customLabel, setCustomLabel] = useState(t("userDialog.custom"));
+ 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 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]) => {
@@ -167,9 +164,9 @@ export const UsageFilter: FC<UsageFilterProps> = ({
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"),
+ onChange('custom', {
+ start: dayjs(start).format('YYYY-MM-DDT00:00:00'),
+ end: dayjs(end).format('YYYY-MM-DDT23:59:59'),
});
}
}
@@ -184,7 +181,7 @@ export const UsageFilter: FC<UsageFilterProps> = ({
display="flex"
borderWidth="1px"
borderRadius="md"
- minW={{ base: "320px", md: "400px" }}
+ minW={{ base: '320px', md: '400px' }}
>
{filterOptions.map((value) => {
return (
@@ -205,9 +202,9 @@ export const UsageFilter: FC<UsageFilterProps> = ({
fontSize={fontSize}
px={3}
py={1}
- bg={custom ? "primary.500" : "unset"}
- color={custom ? "white" : "unset"}
- borderColor={custom ? "primary.500" : "unset"}
+ bg={custom ? 'primary.500' : 'unset'}
+ color={custom ? 'white' : 'unset'}
+ borderColor={custom ? 'primary.500' : 'unset'}
>
<HStack>
<Text>{customLabel}</Text>
@@ -224,19 +221,19 @@ export const UsageFilter: FC<UsageFilterProps> = ({
borderRadius="md"
px={3}
py={1}
- minW={{ base: "320px", md: "400px" }}
+ minW={{ base: '320px', md: '400px' }}
borderWidth="1px"
>
- <Text w="full" color={startDate ? "unset" : "gray.500"}>
+ <Text w="full" color={startDate ? 'unset' : 'gray.500'}>
{startDate
- ? dayjs(startDate).format("YYYY-MM-DD (00:00)")
- : t("userDialog.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"}>
+ <Text w="full" color={endDate ? 'unset' : 'gray.500'}>
{endDate
- ? dayjs(endDate).format("YYYY-MM-DD (23:59)")
- : t("userDialog.endDate")}
+ ? dayjs(endDate).format('YYYY-MM-DD (23:59)')
+ : t('userDialog.endDate')}
</Text>
<Icon as={CalendarIcon} boxSize="18px" />
</HStack>
@@ -250,14 +247,14 @@ export const UsageFilter: FC<UsageFilterProps> = ({
zIndex="1"
backgroundColor="white"
_dark={{
- backgroundColor: "gray.700",
+ backgroundColor: 'gray.700',
}}
- display={isCustomOpen ? "unset" : "none"}
+ display={isCustomOpen ? 'unset' : 'none'}
>
<Tabs onChange={(index) => setTabIndex(index)}>
<TabList>
- <Tab fontSize={fontSize}>{t("userDialog.relative")}</Tab>
- <Tab fontSize={fontSize}>{t("userDialog.absolute")}</Tab>
+ <Tab fontSize={fontSize}>{t('userDialog.relative')}</Tab>
+ <Tab fontSize={fontSize}>{t('userDialog.absolute')}</Tab>
</TabList>
<TabPanels>
@@ -267,12 +264,12 @@ export const UsageFilter: FC<UsageFilterProps> = ({
<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)}
+ {t('userDialog.' + row.title)}
</Text>
{row.options.map((value: string) => {
return (
<FilterItem
- key={value + ".custom"}
+ key={value + '.custom'}
border={true}
{...getRadioProps({ value })}
>
@@ -320,26 +317,26 @@ export function createUsageConfig(
options: {
labels: labels,
chart: {
- width: "100%",
- height: "100%",
- type: "donut",
+ width: '100%',
+ height: '100%',
+ type: 'donut',
animations: {
enabled: false,
},
},
title: {
text: `${title}${total}`,
- align: "center",
+ align: 'center',
style: {
- fontWeight: "var(--chakra-fontWeights-medium)",
+ fontWeight: 'var(--chakra-fontWeights-medium)',
color:
- colorMode === "dark" ? "var(--chakra-colors-gray-300)" : undefined,
+ colorMode === 'dark' ? 'var(--chakra-colors-gray-300)' : undefined,
},
},
legend: {
- position: "bottom",
+ position: 'bottom',
labels: {
- colors: colorMode === "dark" ? "#CBD5E0" : undefined,
+ colors: colorMode === 'dark' ? '#CBD5E0' : undefined,
useSeriesColors: false,
},
},
@@ -348,19 +345,19 @@ export function createUsageConfig(
colors: undefined,
},
dataLabels: {
- formatter: (val, { seriesIndex, w }) => {
+ formatter: (_, { seriesIndex, w }) => {
return formatBytes(w.config.series[seriesIndex], 1);
},
},
tooltip: {
- custom: ({ series, seriesIndex, dataPointIndex, w }) => {
+ 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 + "%";
+ Math.round((series[seriesIndex] / total) * 1000) / 10 + '%';
return `
<div style="
background-color: ${w.globals.colors[seriesIndex]};
diff --git a/app/dashboard/src/components/UserDialog/DataLimitField.tsx b/app/dashboard/src/components/UserDialog/DataLimitField.tsx
@@ -7,34 +7,33 @@ import { Controller } from 'react-hook-form';
interface DataLimitFieldProps {
form: any;
disabled: boolean;
- t: TFunction<"translation", undefined, "translation">;
+ 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) : ""}
- />
- );
- }}
+ 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>
- )
-}
+ );
+ }}
+ />
+ </FormControl>
+ )
+}
\ No newline at end of file
diff --git a/app/dashboard/src/components/UserDialog/DefaultValues.ts b/app/dashboard/src/components/UserDialog/DefaultValues.ts
@@ -1,15 +1,15 @@
-import { FormType } from "./FormSchema";
+import { FormType } from './FormSchema';
export const getDefaultValues = (): FormType => {
- return {
- services: [],
- data_limit: 0,
- expire: null,
- username: "",
- data_limit_reset_strategy: "no_reset",
- status: "active",
- note: "",
- };
+ return {
+ services: [],
+ data_limit: 0,
+ expire: null,
+ username: '',
+ data_limit_reset_strategy: 'no_reset',
+ status: 'active',
+ note: '',
+ };
};
diff --git a/app/dashboard/src/components/UserDialog/ExpireDateField.tsx b/app/dashboard/src/components/UserDialog/ExpireDateField.tsx
@@ -1,91 +1,91 @@
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 "../Input";
+ 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 '../Input';
interface ExpireDateFieldProps {
form: any;
disabled: boolean;
- t: TFunction<"translation", undefined, "translation">;
+ 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>
- ) : (
- ""
- )}
- </>
- );
+ 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',
+ },
+ });
}}
- />
- </FormControl>
- )
+ 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/components/UserDialog/FormSchema.ts b/app/dashboard/src/components/UserDialog/FormSchema.ts
@@ -1,22 +1,22 @@
-import { z } from "zod";
-import { UserCreate } from "types/User";
+import { z } from 'zod';
+import { UserCreate } from 'types/User';
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" }),
+ 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/components/UserDialog/ModalFooter.tsx b/app/dashboard/src/components/UserDialog/ModalFooter.tsx
@@ -1,107 +1,107 @@
import React from 'react';
import {
- Button,
- Tooltip,
- HStack,
- IconButton,
- Spinner,
-} from "@chakra-ui/react";
-import { DeleteIcon } from "../DeleteUserModal";
-import { UserUsageIcon } from "./UserDialogIcons";
+ Button,
+ Tooltip,
+ HStack,
+ IconButton,
+ Spinner,
+} from '@chakra-ui/react';
+import { DeleteIcon } from '../DeleteUserModal';
+import { UserUsageIcon } from './UserDialogIcons';
import { useTranslation } from 'react-i18next';
import { User } from 'types/User';
import { ModalFooter } from '@chakra-ui/react';
interface UserDialogFooterProps {
- isEditing: boolean;
- onDeletingUser: (user: User) => void;
- handleUsageToggle: () => void;
- handleResetUsage: () => void;
- handleRevokeSubscription: () => void;
- loading: boolean;
- editingUser: User | null;
- onClose: () => void;
+ isEditing: boolean;
+ onDeletingUser: (user: User) => void;
+ handleUsageToggle: () => void;
+ handleResetUsage: () => void;
+ handleRevokeSubscription: () => void;
+ loading: boolean;
+ editingUser: User | null;
+ onClose: () => void;
}
export const UserDialogModalFooter: React.FC<UserDialogFooterProps> = ({
- isEditing,
- onClose, editingUser,
- onDeletingUser,
- handleUsageToggle,
- handleResetUsage,
- handleRevokeSubscription,
- loading,
+ isEditing,
+ onClose, editingUser,
+ onDeletingUser,
+ handleUsageToggle,
+ handleResetUsage,
+ handleRevokeSubscription,
+ loading,
}) => {
- const { t, i18n } = useTranslation();
- return (
+ const { t } = useTranslation();
+ return (
- <ModalFooter mt="3">
- <HStack
- justifyContent="space-between"
- w="full"
- gap={3}
- flexDirection={{
- base: "column",
- sm: "row",
- }}
- >
- <HStack
- justifyContent="flex-start"
- w={{
- base: "full",
- sm: "unset",
- }}
+ <ModalFooter mt="3">
+ <HStack
+ justifyContent="space-between"
+ w="full"
+ gap={3}
+ flexDirection={{
+ base: 'column',
+ sm: 'row',
+ }}
+ >
+ <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();
+ }}
>
- {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"
+ <DeleteIcon />
+ </IconButton>
+ </Tooltip>
+ <Tooltip label={t('userDialog.usage')} placement="top">
+ <IconButton
+ aria-label="usage"
+ size="sm"
+ onClick={handleUsageToggle}
>
- <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>
- </HStack>
- </ModalFooter >
- );
+ <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>
+ </HStack>
+ </ModalFooter >
+ );
};
diff --git a/app/dashboard/src/components/UserDialog/ModalHeader.tsx b/app/dashboard/src/components/UserDialog/ModalHeader.tsx
@@ -1,19 +1,19 @@
-import { Text, HStack, ModalHeader } from "@chakra-ui/react";
-import { ChakraIcon } from "types/ChakraIcon";
-import { Icon } from "../Icon";
+import { Text, HStack, ModalHeader } from '@chakra-ui/react';
+import { ChakraIcon } from 'types/ChakraIcon';
+import { Icon } from '../Icon';
export const UserDialogModalHeader = ({ 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>
- );
+ 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/UserDialog/NoteField.tsx b/app/dashboard/src/components/UserDialog/NoteField.tsx
@@ -3,20 +3,20 @@ import { TFunction } from 'i18next';
interface NoteFieldProps {
form: any;
- t: TFunction<"translation", undefined, "translation">;
+ 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>
- )
+ 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/components/UserDialog/PeriodicUsageReset.tsx b/app/dashboard/src/components/UserDialog/PeriodicUsageReset.tsx
@@ -1,40 +1,39 @@
import { FormControl, FormLabel, Select } from '@chakra-ui/react';
-import { Controller } from "react-hook-form";
-import { resetStrategy } from "constants/UserSettings";
+import { Controller } from 'react-hook-form';
+import { resetStrategy } from 'constants/UserSettings';
import { TFunction } from 'i18next';
interface PreiodicUsageResetProps {
form: any;
- t: TFunction<"translation", undefined, "translation">;
+ 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>
- )
+ 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/components/UserDialog/ServicePropertyStatus.tsx b/app/dashboard/src/components/UserDialog/ServicePropertyStatus.tsx
@@ -1,5 +1,5 @@
-import { Flex } from "@chakra-ui/react";
-import { FC, useState } from "react";
+import { Flex } from '@chakra-ui/react';
+import { FC, useState } from 'react';
import { ChakraIcon } from 'types/ChakraIcon';
@@ -9,11 +9,12 @@ type ServicePropertyStatusProps = {
}
export const ServicePropertyStatus: FC<ServicePropertyStatusProps> = ({ value, StatusIcon }) => {
- const [valueState, _] = useState(value);
- return (
- <Flex flexDirection="row">
- <StatusIcon />
- <span>{valueState}</span>
- </Flex>
- );
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ const [valueState, _] = useState(value);
+ return (
+ <Flex flexDirection="row">
+ <StatusIcon />
+ <span>{valueState}</span>
+ </Flex>
+ );
};
diff --git a/app/dashboard/src/components/UserDialog/ServicesField.tsx b/app/dashboard/src/components/UserDialog/ServicesField.tsx
@@ -5,41 +5,39 @@ import { Service } from 'types/Service';
import { ServicesSelectList } from './ServicesSelectList';
interface ServicesFieldProps {
- form: any;
- services: Service[];
- disabled: boolean;
- t: TFunction<"translation", undefined, "translation">;
+ form: any;
+ services: Service[];
+ t: TFunction<'translation', undefined, 'translation'>;
}
-export const ServicesField = ({ form, disabled, 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={({ field }) => {
- return (
- <ServicesSelectList
- list={services}
- disabled={disabled}
- {...field}
- />
- );
- }}
+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={({ field }) => {
+ return (
+ <ServicesSelectList
+ list={services}
+ {...field}
/>
- <FormErrorMessage>
- {t(
- form.formState.errors.services
- ?.message as string
- )}
- </FormErrorMessage>
- </FormControl>
- );
+ );
+ }}
+ />
+ <FormErrorMessage>
+ {t(
+ form.formState.errors.services
+ ?.message as string
+ )}
+ </FormErrorMessage>
+ </FormControl>
+ );
}
diff --git a/app/dashboard/src/components/UserDialog/ServicesSelectList.tsx b/app/dashboard/src/components/UserDialog/ServicesSelectList.tsx
@@ -1,28 +1,28 @@
import {
- Box,
- chakra,
- Flex,
- Spacer,
- Stack,
- Text,
-} from "@chakra-ui/react";
-import { ServerStackIcon, UsersIcon } from "@heroicons/react/24/outline";
-import { FC, forwardRef, Ref, useState } from "react";
+ Box,
+ chakra,
+ Flex,
+ Spacer,
+ Stack,
+ Text,
+} from '@chakra-ui/react';
+import { ServerStackIcon, UsersIcon } from '@heroicons/react/24/outline';
+import { forwardRef, Ref } from 'react';
import {
- useFormContext,
-} from "react-hook-form";
-import { Service } from "types/Service";
+ useFormContext,
+} from 'react-hook-form';
+import { Service } from 'types/Service';
import { ServicePropertyStatus } from './ServicePropertyStatus';
const ServiceIconBaseStyle = {
- baseStyle: {
- strokeWidth: "2px",
- color: "primary.500",
- w: 5,
- h: 5,
- mx: "6px",
- },
+ baseStyle: {
+ strokeWidth: '2px',
+ color: 'primary.500',
+ w: 5,
+ h: 5,
+ mx: '6px',
+ },
}
const UsersServiceIcon = chakra(UsersIcon, ServiceIconBaseStyle);
@@ -30,85 +30,85 @@ const UsersServiceIcon = chakra(UsersIcon, ServiceIconBaseStyle);
const InboundsServiceIcon = chakra(ServerStackIcon, ServiceIconBaseStyle);
type CustomCheckboxProps = {
- isChecked: boolean;
- onChange: () => void;
- service: Service;
- value: string;
+ isChecked: boolean;
+ onChange: () => void;
+ service: Service;
+ value: string;
}
const CustomCheckbox = forwardRef(
- ({ isChecked, onChange, service, ...props }: CustomCheckboxProps, ref: Ref<HTMLDivElement>) => (
- <Box
- ref={ref}
- border={isChecked ? '5px' : '2px'}
- 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' : 'white'}
- py="4px"
- px="8px"
- borderRadius="md"
- display="flex"
- alignItems="center"
- justifyContent="center"
- _hover={{
- cursor: 'pointer',
- borderColor: 'primary.300',
- }}
- onClick={onChange}
- {...props}
- >
- <Text fontSize="sm" color="gray.700" fontWeight="medium">
- {service.name}
- </Text>
- <Spacer />
- <Flex flexDirection="row" alignItems="center">
- <ServicePropertyStatus value={service.users.length} StatusIcon={UsersServiceIcon} />
- <Text color="primary.600" mx="8px">/</Text>
- <ServicePropertyStatus value={service.inbounds.length} StatusIcon={InboundsServiceIcon} />
- </Flex>
- </Box>
- )
+ ({ isChecked, onChange, service, ...props }: CustomCheckboxProps, ref: Ref<HTMLDivElement>) => (
+ <Box
+ ref={ref}
+ border={isChecked ? '5px' : '2px'}
+ 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' : 'white'}
+ py="4px"
+ px="8px"
+ borderRadius="md"
+ display="flex"
+ alignItems="center"
+ justifyContent="center"
+ _hover={{
+ cursor: 'pointer',
+ borderColor: 'primary.300',
+ }}
+ onClick={onChange}
+ {...props}
+ >
+ <Text fontSize="sm" color="gray.700" fontWeight="medium">
+ {service.name}
+ </Text>
+ <Spacer />
+ <Flex flexDirection="row" alignItems="center">
+ <ServicePropertyStatus value={service.users.length} StatusIcon={UsersServiceIcon} />
+ <Text color="primary.600" mx="8px">/</Text>
+ <ServicePropertyStatus value={service.inbounds.length} StatusIcon={InboundsServiceIcon} />
+ </Flex>
+ </Box>
+ )
);
interface ServicesSelectListProps {
- list: Service[];
+ list: Service[];
}
export const ServicesSelectList = forwardRef<HTMLDivElement, ServicesSelectListProps>(
- function({ list, ...props }, ref) {
- const form = useFormContext();
+ function({ list }, ref) {
+ const form = useFormContext();
- const handleServiceToggle = (serviceId: number) => {
- const currentServices = form.getValues('services');
- const isSelected = currentServices.includes(serviceId);
+ const handleServiceToggle = (serviceId: number) => {
+ const currentServices = form.getValues('services');
+ const isSelected = currentServices.includes(serviceId);
- let updatedServices;
+ let updatedServices;
- if (isSelected) {
- updatedServices = currentServices.filter((id: number) => id !== serviceId);
- } else {
- updatedServices = [...currentServices, serviceId];
- }
+ if (isSelected) {
+ updatedServices = currentServices.filter((id: number) => id !== serviceId);
+ } else {
+ updatedServices = [...currentServices, serviceId];
+ }
- form.setValue('services', updatedServices, { shouldValidate: true });
- };
+ form.setValue('services', updatedServices, { shouldValidate: true });
+ };
- return (
- <Stack spacing={3} ref={ref}>
- {list.map((service: Service) => (
- <Box key={service.id}>
- <Flex align="center">
- <CustomCheckbox
- isChecked={form.getValues('services').includes(service.id)}
- onChange={() => handleServiceToggle(service.id)}
- service={service}
- value={String(service.id)}
- />
- </Flex>
- </Box>
- ))}
- </Stack>
- );
- });
+ return (
+ <Stack spacing={3} ref={ref}>
+ {list.map((service: Service) => (
+ <Box key={service.id}>
+ <Flex align="center">
+ <CustomCheckbox
+ isChecked={form.getValues('services').includes(service.id)}
+ onChange={() => handleServiceToggle(service.id)}
+ service={service}
+ value={String(service.id)}
+ />
+ </Flex>
+ </Box>
+ ))}
+ </Stack>
+ );
+ });
diff --git a/app/dashboard/src/components/UserDialog/UserDialogIcons.ts b/app/dashboard/src/components/UserDialog/UserDialogIcons.ts
@@ -1,28 +1,28 @@
-import { chakra } from "@chakra-ui/react";
+import { chakra } from '@chakra-ui/react';
import {
- ChartPieIcon,
- PencilIcon,
- UserPlusIcon,
-} from "@heroicons/react/24/outline";
+ ChartPieIcon,
+ PencilIcon,
+ UserPlusIcon,
+} from '@heroicons/react/24/outline';
export const AddUserIcon = chakra(UserPlusIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
+ baseStyle: {
+ w: 5,
+ h: 5,
+ },
});
export const EditUserIcon = chakra(PencilIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
+ baseStyle: {
+ w: 5,
+ h: 5,
+ },
});
export const UserUsageIcon = chakra(ChartPieIcon, {
- baseStyle: {
- w: 5,
- h: 5,
- },
+ baseStyle: {
+ w: 5,
+ h: 5,
+ },
});
diff --git a/app/dashboard/src/components/UserDialog/UsernameField.tsx b/app/dashboard/src/components/UserDialog/UsernameField.tsx
@@ -1,63 +1,63 @@
import { HStack, Input, Tooltip, Box, Switch, FormControl, FormLabel } from '@chakra-ui/react';
import { TFunction } from 'i18next';
-import { Controller } from "react-hook-form";
+import { Controller } from 'react-hook-form';
interface UsernameFieldProps {
form: any;
isEditing: boolean;
- t: TFunction<"translation", undefined, "translation">;
+ 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>
- )
+ 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/components/UserDialog/index.tsx b/app/dashboard/src/components/UserDialog/index.tsx
@@ -1,307 +1,306 @@
import {
- Alert,
- AlertIcon,
- Box,
- Collapse,
- Flex,
- Grid,
- GridItem,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- Modal,
- VStack,
- useColorMode,
- useToast,
- ModalOverlay,
-} from "@chakra-ui/react";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { FilterUsageType, useDashboard } from "contexts/DashboardContext";
-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";
+ Alert,
+ AlertIcon,
+ Box,
+ Collapse,
+ Flex,
+ Grid,
+ GridItem,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ Modal,
+ VStack,
+ useColorMode,
+ useToast,
+ ModalOverlay,
+} from '@chakra-ui/react';
+import { zodResolver } from '@hookform/resolvers/zod';
+import { FilterUsageType, useDashboard } from 'contexts/DashboardContext';
+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,
- UserCreate,
-} from "types/User";
-import { UsageFilter, createUsageConfig } from "../UsageFilter";
-import { AddUserIcon, EditUserIcon } from "./UserDialogIcons";
-import { UserDialogModalHeader } from "./ModalHeader";
-import { UserDialogModalFooter } from "./ModalFooter";
-import { getDefaultValues } from "./DefaultValues";
-import { schema, FormType } from "./FormSchema";
-import { ServicesField } from "./ServicesField";
-import { UsernameField } from "./UsernameField";
-import { DataLimitField } from "./DataLimitField";
-import { PeriodicUsageReset as PeriodicUsageReset } from "./PeriodicUsageReset";
-import { ExpireDateField } from "./ExpireDateField";
-import { NoteField } from "./NoteField";
-import { Service } from "types/Service";
+ User,
+ UserCreate,
+} from 'types/User';
+import { UsageFilter, createUsageConfig } from '../UsageFilter';
+import { AddUserIcon, EditUserIcon } from './UserDialogIcons';
+import { UserDialogModalHeader } from './ModalHeader';
+import { UserDialogModalFooter } from './ModalFooter';
+import { getDefaultValues } from './DefaultValues';
+import { schema, FormType } from './FormSchema';
+import { ServicesField } from './ServicesField';
+import { UsernameField } from './UsernameField';
+import { DataLimitField } from './DataLimitField';
+import { PeriodicUsageReset as PeriodicUsageReset } from './PeriodicUsageReset';
+import { ExpireDateField } from './ExpireDateField';
+import { NoteField } from './NoteField';
+import { Service } from 'types/Service';
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,
- };
+ 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,
- services,
- onCreateUser,
- editUser,
- fetchUserUsage,
- refetchServices,
- onEditingUser,
- createUser,
- onDeletingUser,
- } = useDashboard();
- 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 {
+ editingUser,
+ isCreatingNewUser,
+ services,
+ onCreateUser,
+ editUser,
+ fetchUserUsage,
+ refetchServices,
+ onEditingUser,
+ createUser,
+ onDeletingUser,
+ } = useDashboard();
+ 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 { colorMode } = useColorMode();
- const [usageVisible, setUsageVisible] = useState(false);
- const handleUsageToggle = () => {
- setUsageVisible((current) => !current);
- };
-
- const form = useForm<FormType>({
- defaultValues: getDefaultValues(),
- resolver: zodResolver(schema),
- });
+ const [usageVisible, setUsageVisible] = useState(false);
+ const handleUsageToggle = () => {
+ setUsageVisible((current) => !current);
+ };
- 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));
- });
- };
+ const form = useForm<FormType>({
+ defaultValues: getDefaultValues(),
+ resolver: zodResolver(schema),
+ });
- useEffect(() => {
- if (isOpen) {
- refetchServices();
- }
- }, [isOpen]);
+ 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 (editingUser) {
- form.reset(formatUser(editingUser));
+ useEffect(() => {
+ if (isOpen) {
+ refetchServices();
+ }
+ }, [isOpen]);
- 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;
+ useEffect(() => {
+ if (editingUser) {
+ form.reset(formatUser(editingUser));
- 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",
- };
+ fetchUsageWithFilter({
+ start: dayjs().utc().subtract(30, 'day').format('YYYY-MM-DDTHH:00:00'),
+ });
+ }
+ }, [editingUser]);
- 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 submit = async (values: FormType) => {
+ setLoading(true);
+ const methods = { edited: editUser, created: createUser };
+ const method = isEditing ? 'edited' : 'created';
+ setError(null);
+ const { services, username, ...rest } = values;
- const onClose = () => {
- form.reset(getDefaultValues());
- onCreateUser(false);
- onEditingUser(null);
- setError(null);
- setUsageVisible(false);
- setUsageFilter("1m");
+ 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',
};
- const handleResetUsage = () => {
- useDashboard.setState({ resetUsageUser: editingUser });
- };
+ 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 handleRevokeSubscription = () => {
- useDashboard.setState({ revokeSubscriptionUser: editingUser });
- };
+ const onClose = () => {
+ form.reset(getDefaultValues());
+ onCreateUser(false);
+ onEditingUser(null);
+ setError(null);
+ setUsageVisible(false);
+ setUsageFilter('1m');
+ };
- const disabled = loading;
+ const handleResetUsage = () => {
+ useDashboard.setState({ resetUsageUser: editingUser });
+ };
- 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)}>
- <UserDialogModalHeader HeaderIcon={isEditing ? EditUserIcon : AddUserIcon} 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} />
+ const handleRevokeSubscription = () => {
+ useDashboard.setState({ revokeSubscriptionUser: editingUser });
+ };
- <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} />
+ const disabled = loading;
- </Flex>
- {error && (
- <Alert
- status="error"
- display={{ base: "none", md: "flex" }}
- >
- <AlertIcon />
- {error}
- </Alert>
- )}
- </VStack>
- </GridItem>
+ 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)}>
+ <UserDialogModalHeader HeaderIcon={isEditing ? EditUserIcon : AddUserIcon} 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} />
- <GridItem>
- <ServicesField t={t} services={services} form={form} disabled={disabled} />
- </GridItem>
+ <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>
- {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>
+ <GridItem>
+ <ServicesField t={t} services={services} form={form} />
+ </GridItem>
- {error && (
- <Alert
- mt="3"
- status="error"
- display={{ base: "flex", md: "none" }}
- >
- <AlertIcon />
- {error}
- </Alert>
- )}
- </ModalBody>
- <UserDialogModalFooter
- editingUser={isEditing ? editingUser : null}
- onClose={onClose}
- isEditing={isEditing}
- onDeletingUser={onDeletingUser}
- handleUsageToggle={handleUsageToggle}
- handleResetUsage={handleResetUsage}
- handleRevokeSubscription={handleRevokeSubscription}
- loading={loading}
+ {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"
/>
- </form>
- </ModalContent>
- </FormProvider>
- </Modal >
- );
+ </Box>
+ </VStack>
+ </GridItem>
+ )}
+ </Grid>
+
+ {error && (
+ <Alert
+ mt="3"
+ status="error"
+ display={{ base: 'flex', md: 'none' }}
+ >
+ <AlertIcon />
+ {error}
+ </Alert>
+ )}
+ </ModalBody>
+ <UserDialogModalFooter
+ editingUser={isEditing ? editingUser : null}
+ onClose={onClose}
+ isEditing={isEditing}
+ onDeletingUser={onDeletingUser}
+ handleUsageToggle={handleUsageToggle}
+ handleResetUsage={handleResetUsage}
+ handleRevokeSubscription={handleRevokeSubscription}
+ loading={loading}
+ />
+ </form>
+ </ModalContent>
+ </FormProvider>
+ </Modal >
+ );
};
diff --git a/app/dashboard/src/components/UsersTable.tsx b/app/dashboard/src/components/UsersTable.tsx
@@ -25,7 +25,7 @@ import {
Tr,
useBreakpointValue,
VStack,
-} from "@chakra-ui/react";
+} from '@chakra-ui/react';
import {
CheckIcon,
ChevronDownIcon,
@@ -33,21 +33,21 @@ import {
LinkIcon,
PencilIcon,
QrCodeIcon,
-} from "@heroicons/react/24/outline";
-import { ReactComponent as AddFileIcon } from "assets/add_file.svg";
-import classNames from "classnames";
-import { resetStrategy, statusColors } from "constants/UserSettings";
-import { useDashboard } from "contexts/DashboardContext";
-import { t } from "i18next";
-import { FC, Fragment, useEffect, useState } from "react";
-import CopyToClipboard from "react-copy-to-clipboard";
-import { useTranslation } from "react-i18next";
-import { User } from "types/User";
-import { formatBytes } from "utils/formatByte";
-import { OnlineBadge } from "./OnlineBadge";
-import { OnlineStatus } from "./OnlineStatus";
-import { Pagination } from "./Pagination";
-import { StatusBadge } from "./StatusBadge";
+} from '@heroicons/react/24/outline';
+import { ReactComponent as AddFileIcon } from 'assets/add_file.svg';
+import classNames from 'classnames';
+import { resetStrategy, statusColors } from 'constants/UserSettings';
+import { useDashboard } from 'contexts/DashboardContext';
+import { t } from 'i18next';
+import { FC, Fragment, useEffect, useState } from 'react';
+import CopyToClipboard from 'react-copy-to-clipboard';
+import { useTranslation } from 'react-i18next';
+import { User } from 'types/User';
+import { formatBytes } from 'utils/formatByte';
+import { OnlineBadge } from './OnlineBadge';
+import { OnlineStatus } from './OnlineStatus';
+import { Pagination } from './Pagination';
+import { StatusBadge } from './StatusBadge';
const EmptySectionIcon = chakra(AddFileIcon);
@@ -71,8 +71,8 @@ const QRIcon = chakra(QrCodeIcon, iconProps);
const EditIcon = chakra(PencilIcon, iconProps);
const SortIcon = chakra(ChevronDownIcon, {
baseStyle: {
- width: "15px",
- height: "15px",
+ width: '15px',
+ height: '15px',
},
});
type UsageSliderProps = {
@@ -89,10 +89,10 @@ const getResetStrategy = (strategy: string): string => {
return entry.title;
}
}
- return "No";
+ return 'No';
};
const UsageSliderCompact: FC<UsageSliderProps> = (props) => {
- const { used, total, dataLimitResetStrategy, totalUsedTraffic } = props;
+ const { used, total } = props;
const isUnlimited = total === 0 || total === null;
return (
<HStack
@@ -101,11 +101,11 @@ const UsageSliderCompact: FC<UsageSliderProps> = (props) => {
fontWeight="medium"
color="gray.600"
_dark={{
- color: "gray.400",
+ color: 'gray.400',
}}
>
<Text>
- {formatBytes(used)} /{" "}
+ {formatBytes(used)} /{' '}
{isUnlimited ? (
<Text as="span" fontFamily="system-ui">
∞
@@ -132,7 +132,7 @@ const UsageSlider: FC<UsageSliderProps> = (props) => {
<Slider
orientation="horizontal"
value={isUnlimited ? 100 : Math.min((used / total) * 100, 100)}
- colorScheme={isReached ? "red" : "primary"}
+ colorScheme={isReached ? 'red' : 'primary'}
{...restOfProps}
>
<SliderTrack h="6px" borderRadius="full">
@@ -145,28 +145,28 @@ const UsageSlider: FC<UsageSliderProps> = (props) => {
fontWeight="medium"
color="gray.600"
_dark={{
- color: "gray.400",
+ color: 'gray.400',
}}
>
<Text>
- {formatBytes(used)} /{" "}
+ {formatBytes(used)} /{' '}
{isUnlimited ? (
<Text as="span" fontFamily="system-ui">
∞
</Text>
) : (
formatBytes(total) +
- (dataLimitResetStrategy && dataLimitResetStrategy !== "no_reset"
- ? " " +
- t(
- "userDialog.resetStrategy" +
- getResetStrategy(dataLimitResetStrategy)
- )
- : "")
+ (dataLimitResetStrategy && dataLimitResetStrategy !== 'no_reset'
+ ? ' ' +
+ t(
+ 'userDialog.resetStrategy' +
+ getResetStrategy(dataLimitResetStrategy)
+ )
+ : '')
)}
</Text>
<Text>
- {t("usersTable.total")}: {formatBytes(totalUsedTraffic)}
+ {t('usersTable.total')}: {formatBytes(totalUsedTraffic)}
</Text>
</HStack>
</>
@@ -180,7 +180,7 @@ export const Sort: FC<SortType> = ({ sort, column }) => {
if (sort.includes(column))
return (
<SortIcon
- transform={sort.startsWith("-") ? undefined : "rotate(180deg)"}
+ transform={sort.startsWith('-') ? undefined : 'rotate(180deg)'}
/>
);
return null;
@@ -205,11 +205,11 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
useEffect(() => {
const calcTop = () => {
- const el = document.querySelectorAll("#filters")[0] as HTMLElement;
+ const el = document.querySelectorAll('#filters')[0] as HTMLElement;
setTop(`${el.offsetHeight}px`);
};
- window.addEventListener("scroll", calcTop);
- () => window.removeEventListener("scroll", calcTop);
+ window.addEventListener('scroll', calcTop);
+ () => window.removeEventListener('scroll', calcTop);
}, []);
const isFiltered = users.length !== totalUsers.total;
@@ -217,10 +217,10 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
const handleSort = (column: string) => {
let newSort = filters.sort;
if (newSort.includes(column)) {
- if (newSort.startsWith("-")) {
- newSort = "-created_at";
+ if (newSort.startsWith('-')) {
+ newSort = '-created_at';
} else {
- newSort = "-" + column;
+ newSort = '-' + column;
}
} else {
newSort = column;
@@ -240,10 +240,10 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
};
return (
- <Box id="users-table" overflowX={{ base: "unset", md: "unset" }}>
+ <Box id="users-table" overflowX={{ base: 'unset', md: 'unset' }}>
<Accordion
allowMultiple
- display={{ base: "block", md: "none" }}
+ display={{ base: 'block', md: 'none' }}
index={selectedRow}
>
<Table orientation="vertical" zIndex="docked" {...props}>
@@ -255,11 +255,11 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
minW="120px"
pl={4}
pr={4}
- cursor={"pointer"}
- onClick={handleSort.bind(null, "username")}
+ cursor={'pointer'}
+ onClick={handleSort.bind(null, 'username')}
>
<HStack>
- <span>{t("users")}</span>
+ <span>{t('users')}</span>
<Sort sort={filters.sort} column="username" />
</HStack>
</Th>
@@ -270,24 +270,24 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
pl={0}
pr={0}
w="140px"
- cursor={"pointer"}
+ cursor={'pointer'}
>
<HStack spacing={0} position="relative">
<Text
position="absolute"
_dark={{
- bg: "gray.750",
+ bg: 'gray.750',
}}
_light={{
- bg: "#F9FAFB",
+ bg: '#F9FAFB',
}}
userSelect="none"
pointerEvents="none"
zIndex={1}
w="100%"
>
- {t("usersTable.status")}
- {filters.status ? ": " + filters.status : ""}
+ {t('usersTable.status')}
+ {filters.status ? ': ' + filters.status : ''}
</Text>
<Select
value={filters.sort}
@@ -301,7 +301,7 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
w="auto"
icon={<></>}
_focusVisible={{
- border: "0 !important",
+ border: '0 !important',
}}
onChange={handleStatusFilter}
>
@@ -317,12 +317,12 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
position="sticky"
top={top}
minW="100px"
- cursor={"pointer"}
+ cursor={'pointer'}
pr={0}
- onClick={handleSort.bind(null, "used_traffic")}
+ onClick={handleSort.bind(null, 'used_traffic')}
>
<HStack>
- <span>{t("usersTable.dataUsage")}</span>
+ <span>{t('usersTable.dataUsage')}</span>
<Sort sort={filters.sort} column="used_traffic" />
</HStack>
</Th>
@@ -332,7 +332,7 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
minW="32px"
w="32px"
p={0}
- cursor={"pointer"}
+ cursor={'pointer'}
></Th>
</Tr>
</Thead>
@@ -374,11 +374,11 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
<AccordionArrowIcon
color="gray.600"
_dark={{
- color: "gray.400",
+ color: 'gray.400',
}}
transition="transform .2s ease-out"
transform={
- selectedRow === i ? "rotate(180deg)" : "0deg"
+ selectedRow === i ? 'rotate(180deg)' : '0deg'
}
/>
</Td>
@@ -408,10 +408,10 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
fontWeight="bold"
color="gray.600"
_dark={{
- color: "gray.400",
+ color: 'gray.400',
}}
>
- {t("usersTable.dataUsage")}
+ {t('usersTable.dataUsage')}
</Text>
<Box width="full" minW="230px">
<UsageSlider
@@ -441,7 +441,7 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
<HStack>
<ActionButtons user={user} />
<Tooltip
- label={t("userDialog.editUser")}
+ label={t('userDialog.editUser')}
placement="top"
>
<IconButton
@@ -450,12 +450,12 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
bg="transparent"
_dark={{
_hover: {
- bg: "gray.700",
+ bg: 'gray.700',
},
}}
size={{
- base: "sm",
- md: "md",
+ base: 'sm',
+ md: 'md',
}}
onClick={(e) => {
e.stopPropagation();
@@ -480,46 +480,46 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
</Accordion>
<Table
orientation="vertical"
- display={{ base: "none", md: "table" }}
+ display={{ base: 'none', md: 'table' }}
{...props}
>
<Thead zIndex="docked" position="relative">
<Tr>
<Th
position="sticky"
- top={{ base: "unset", md: top }}
+ top={{ base: 'unset', md: top }}
minW="140px"
- cursor={"pointer"}
- onClick={handleSort.bind(null, "username")}
+ cursor={'pointer'}
+ onClick={handleSort.bind(null, 'username')}
>
<HStack>
- <span>{t("username")}</span>
+ <span>{t('username')}</span>
<Sort sort={filters.sort} column="username" />
</HStack>
</Th>
<Th
position="sticky"
- top={{ base: "unset", md: top }}
+ top={{ base: 'unset', md: top }}
width="400px"
minW="150px"
- cursor={"pointer"}
+ cursor={'pointer'}
>
<HStack spacing={0} position="relative">
<Text
position="absolute"
_dark={{
- bg: "gray.750",
+ bg: 'gray.750',
}}
_light={{
- bg: "#F9FAFB",
+ bg: '#F9FAFB',
}}
userSelect="none"
pointerEvents="none"
zIndex={1}
w="100%"
>
- {t("usersTable.status")}
- {filters.status ? ": " + filters.status : ""}
+ {t('usersTable.status')}
+ {filters.status ? ': ' + filters.status : ''}
</Text>
<Select
fontSize="xs"
@@ -532,7 +532,7 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
w="auto"
icon={<></>}
_focusVisible={{
- border: "0 !important",
+ border: '0 !important',
}}
value={filters.sort}
onChange={handleStatusFilter}
@@ -547,20 +547,20 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
</Th>
<Th
position="sticky"
- top={{ base: "unset", md: top }}
+ top={{ base: 'unset', md: top }}
width="350px"
minW="230px"
- cursor={"pointer"}
- onClick={handleSort.bind(null, "used_traffic")}
+ cursor={'pointer'}
+ onClick={handleSort.bind(null, 'used_traffic')}
>
<HStack>
- <span>{t("usersTable.dataUsage")}</span>
+ <span>{t('usersTable.dataUsage')}</span>
<Sort sort={filters.sort} column="used_traffic" />
</HStack>
</Th>
<Th
position="sticky"
- top={{ base: "unset", md: top }}
+ top={{ base: 'unset', md: top }}
width="200px"
minW="180px"
/>
@@ -572,8 +572,8 @@ export const UsersTable: FC<UsersTableProps> = (props) => {
return (
<Tr
key={user.username}
- className={classNames("interactive", {
- "last-row": i === users.length - 1,
+ className={classNames('interactive', {
+ 'last-row': i === users.length - 1,
})}
onClick={() => onEditingUser(user)}
>
@@ -626,7 +626,7 @@ type ActionButtonsProps = {
const ActionButtons: FC<ActionButtonsProps> = ({ user }) => {
const { setQRCode, setSubLink } = useDashboard();
- const proxyLinks = user.links.join("\r\n");
+ const proxyLinks = user.links.join('\r\n');
const [copied, setCopied] = useState([-1, false]);
useEffect(() => {
@@ -646,7 +646,7 @@ const ActionButtons: FC<ActionButtonsProps> = ({ user }) => {
>
<CopyToClipboard
text={
- user.subscription_url.startsWith("/")
+ user.subscription_url.startsWith('/')
? window.location.origin + user.subscription_url
: user.subscription_url
}
@@ -658,8 +658,8 @@ const ActionButtons: FC<ActionButtonsProps> = ({ user }) => {
<Tooltip
label={
copied[0] == 0 && copied[1]
- ? t("usersTable.copied")
- : t("usersTable.copyLink")
+ ? t('usersTable.copied')
+ : t('usersTable.copyLink')
}
placement="top"
>
@@ -669,12 +669,12 @@ const ActionButtons: FC<ActionButtonsProps> = ({ user }) => {
bg="transparent"
_dark={{
_hover: {
- bg: "gray.700",
+ bg: 'gray.700',
},
}}
size={{
- base: "sm",
- md: "md",
+ base: 'sm',
+ md: 'md',
}}
>
{copied[0] == 0 && copied[1] ? (
@@ -696,8 +696,8 @@ const ActionButtons: FC<ActionButtonsProps> = ({ user }) => {
<Tooltip
label={
copied[0] == 1 && copied[1]
- ? t("usersTable.copied")
- : t("usersTable.copyConfigs")
+ ? t('usersTable.copied')
+ : t('usersTable.copyConfigs')
}
placement="top"
>
@@ -707,12 +707,12 @@ const ActionButtons: FC<ActionButtonsProps> = ({ user }) => {
bg="transparent"
_dark={{
_hover: {
- bg: "gray.700",
+ bg: 'gray.700',
},
}}
size={{
- base: "sm",
- md: "md",
+ base: 'sm',
+ md: 'md',
}}
>
{copied[0] == 1 && copied[1] ? <CopiedIcon /> : <CopyIcon />}
@@ -727,12 +727,12 @@ const ActionButtons: FC<ActionButtonsProps> = ({ user }) => {
bg="transparent"
_dark={{
_hover: {
- bg: "gray.700",
+ bg: 'gray.700',
},
}}
size={{
- base: "sm",
- md: "md",
+ base: 'sm',
+ md: 'md',
}}
onClick={() => {
setQRCode(user.links);
@@ -767,26 +767,26 @@ const EmptySection: FC<EmptySectionProps> = ({ isFiltered }) => {
maxWidth="200px"
_dark={{
'path[fill="#fff"]': {
- fill: "gray.800",
+ fill: 'gray.800',
},
'path[fill="#f2f2f2"], path[fill="#e6e6e6"], path[fill="#ccc"]': {
- fill: "gray.700",
+ fill: 'gray.700',
},
'circle[fill="#3182CE"]': {
- fill: "primary.300",
+ fill: 'primary.300',
},
}}
_light={{
'path[fill="#f2f2f2"], path[fill="#e6e6e6"], path[fill="#ccc"]': {
- fill: "gray.300",
+ fill: 'gray.300',
},
'circle[fill="#3182CE"]': {
- fill: "primary.500",
+ fill: 'primary.500',
},
}}
/>
- <Text fontWeight="medium" color="gray.600" _dark={{ color: "gray.400" }}>
- {isFiltered ? t("usersTable.noUserMatched") : t("usersTable.noUser")}
+ <Text fontWeight="medium" color="gray.600" _dark={{ color: 'gray.400' }}>
+ {isFiltered ? t('usersTable.noUserMatched') : t('usersTable.noUser')}
</Text>
{!isFiltered && (
<Button
@@ -794,7 +794,7 @@ const EmptySection: FC<EmptySectionProps> = ({ isFiltered }) => {
colorScheme="primary"
onClick={() => onCreateUser(true)}
>
- {t("createUser")}
+ {t('createUser')}
</Button>
)}
</Box>
diff --git a/app/dashboard/src/components/modules/Router.tsx b/app/dashboard/src/components/modules/Router.tsx
@@ -1,11 +1,11 @@
-import { createBrowserRouter, createHashRouter } from "react-router-dom";
-import { Dashboard } from "../../pages/Dashboard";
-import { Login } from "../../pages/Login";
-import { fetch } from "../../service/http";
-import { getAuthToken } from "../../utils/authStorage";
+import { createBrowserRouter } from 'react-router-dom';
+import { Dashboard } from '../../pages/Dashboard';
+import { Login } from '../../pages/Login';
+import { fetch } from '../../service/http';
+import { getAuthToken } from '../../utils/authStorage';
const fetchAdminLoader = () => {
- return fetch("/admin", {
+ return fetch('/admin', {
headers: {
Authorization: `Bearer ${getAuthToken()}`,
},
@@ -15,13 +15,13 @@ const fetchAdminLoader = () => {
export const router = createBrowserRouter(
[
{
- path: "/",
+ path: '/',
element: <Dashboard />,
errorElement: <Login />,
loader: fetchAdminLoader,
},
{
- path: "/login/",
+ path: '/login/',
element: <Login />,
},
],
diff --git a/app/dashboard/src/constants/NodesSettings.tsx b/app/dashboard/src/constants/NodesSettings.tsx
@@ -4,15 +4,15 @@ export const statusColors: {
};
} = {
connected: {
- statusColor: "green",
+ statusColor: 'green',
},
disabled: {
- statusColor: "gray",
+ statusColor: 'gray',
},
connecting: {
- statusColor: "orange",
+ statusColor: 'orange',
},
error: {
- statusColor: "red",
+ statusColor: 'red',
},
};
diff --git a/app/dashboard/src/constants/Project.ts b/app/dashboard/src/constants/Project.ts
@@ -1,3 +1,3 @@
-export const REPO_URL = "https://github.com/Gozargah/Marzban";
-export const ORGANIZATION_URL = "https://github.com/Gozargah";
-export const DONATION_URL = "https://github.com/Gozargah/Marzban#donation";
+export const REPO_URL = 'https://github.com/Gozargah/Marzban';
+export const ORGANIZATION_URL = 'https://github.com/Gozargah';
+export const DONATION_URL = 'https://github.com/Gozargah/Marzban#donation';
diff --git a/app/dashboard/src/constants/Proxies.tsx b/app/dashboard/src/constants/Proxies.tsx
@@ -1,66 +1,66 @@
-import { ProxyHostSecurity } from "types/ProxyHosts";
+import { ProxyHostSecurity } from 'types/ProxyHosts';
export const proxyHostSecurity: { title: string; value: ProxyHostSecurity }[] =
[
{
- title: "Inbound's default",
- value: "inbound_default",
+ title: 'Inbound\'s default',
+ value: 'inbound_default',
},
{
- title: "TLS",
- value: "tls",
+ title: 'TLS',
+ value: 'tls',
},
{
- title: "None",
- value: "none",
+ title: 'None',
+ value: 'none',
},
];
export const proxyALPN: { title: string; value: string }[] = [
{
- title: "",
- value: "",
+ title: '',
+ value: '',
},
{
- title: "h2",
- value: "h2",
+ title: 'h2',
+ value: 'h2',
},
{
- title: "http/1.1",
- value: "http/1.1",
+ title: 'http/1.1',
+ value: 'http/1.1',
},
{
- title: "h2, http/1.1",
- value: "h2,http/1.1",
+ title: 'h2, http/1.1',
+ value: 'h2,http/1.1',
},
];
export const proxyFingerprint: { title: string; value: string }[] = [
{
- title: "",
- value: "",
+ title: '',
+ value: '',
},
...[
- "chrome",
- "firefox",
- "safari",
- "ios",
- "android",
- "edge",
- "360",
- "qq",
- "random",
- "randomized",
+ '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" },
+ { title: 'none', value: '' },
+ { title: 'xtls-rprx-vision', value: 'xtls-rprx-vision' },
];
export const shadowsocksMethods = [
- "aes-128-gcm",
- "aes-256-gcm",
- "chacha20-ietf-poly1305",
+ 'aes-128-gcm',
+ 'aes-256-gcm',
+ 'chacha20-ietf-poly1305',
];
diff --git a/app/dashboard/src/constants/UserSettings.tsx b/app/dashboard/src/constants/UserSettings.tsx
@@ -1,16 +1,16 @@
-import { chakra, ChakraComponent} from "@chakra-ui/react";
+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/User";
+} from '@heroicons/react/24/outline';
+import { ForwardRefExoticComponent, SVGProps } from 'react';
+import { DataLimitResetStrategy } from 'types/User';
const iconProps = {
baseStyle: {
- strokeWidth: "2px",
+ strokeWidth: '2px',
w: 4,
h: 4,
},
@@ -24,24 +24,24 @@ const On_holdStatusIcon = chakra(ClockIcon, iconProps);
export const resetStrategy: { title: string; value: DataLimitResetStrategy }[] =
[
{
- title: "No",
- value: "no_reset",
+ title: 'No',
+ value: 'no_reset',
},
{
- title: "Daily",
- value: "day",
+ title: 'Daily',
+ value: 'day',
},
{
- title: "Weekly",
- value: "week",
+ title: 'Weekly',
+ value: 'week',
},
{
- title: "Monthly",
- value: "month",
+ title: 'Monthly',
+ value: 'month',
},
{
- title: "Annually",
- value: "year",
+ title: 'Annually',
+ value: 'year',
},
];
@@ -53,43 +53,43 @@ export const statusColors: {
};
} = {
active: {
- statusColor: "green",
- bandWidthColor: "primary",
+ statusColor: 'green',
+ bandWidthColor: 'primary',
icon: ActiveStatusIcon,
},
connected: {
- statusColor: "green",
- bandWidthColor: "primary",
+ statusColor: 'green',
+ bandWidthColor: 'primary',
icon: ActiveStatusIcon,
},
disabled: {
- statusColor: "gray",
- bandWidthColor: "gray",
+ statusColor: 'gray',
+ bandWidthColor: 'gray',
icon: DisabledStatusIcon,
},
expired: {
- statusColor: "orange",
- bandWidthColor: "orange",
+ statusColor: 'orange',
+ bandWidthColor: 'orange',
icon: ExpiredStatusIcon,
},
on_hold: {
- statusColor: "purple",
- bandWidthColor: "purple",
+ statusColor: 'purple',
+ bandWidthColor: 'purple',
icon: On_holdStatusIcon,
},
connecting: {
- statusColor: "orange",
- bandWidthColor: "orange",
+ statusColor: 'orange',
+ bandWidthColor: 'orange',
icon: ExpiredStatusIcon,
},
limited: {
- statusColor: "red",
- bandWidthColor: "red",
+ statusColor: 'red',
+ bandWidthColor: 'red',
icon: LimitedStatusIcon,
},
error: {
- statusColor: "red",
- bandWidthColor: "red",
+ statusColor: 'red',
+ bandWidthColor: 'red',
icon: LimitedStatusIcon,
},
};
diff --git a/app/dashboard/src/contexts/CoreSettingsContext.tsx b/app/dashboard/src/contexts/CoreSettingsContext.tsx
@@ -1,5 +1,5 @@
-import { fetch } from "service/http";
-import { create } from "zustand";
+import { fetch } from 'service/http';
+import { create } from 'zustand';
type CoreSettingsStore = {
isLoading: boolean;
@@ -19,23 +19,23 @@ export const useCoreSettings = create<CoreSettingsStore>((set) => ({
version: null,
started: false,
logs_websocket: null,
- config: "",
+ config: '',
fetchCoreSettings: () => {
set({ isLoading: true });
Promise.all([
- fetch("/core").then(({ version, started, logs_websocket }) =>
+ fetch('/core').then(({ version, started, logs_websocket }) =>
set({ version, started, logs_websocket })
),
- fetch("/core/config").then((config) => set({ config })),
+ fetch('/core/config').then((config) => set({ config })),
]).finally(() => set({ isLoading: false }));
},
updateConfig: (body) => {
set({ isPostLoading: true });
- return fetch("/core/config", { method: "PUT", body }).finally(() => {
+ return fetch('/core/config', { method: 'PUT', body }).finally(() => {
set({ isPostLoading: false });
});
},
restartCore: () => {
- return fetch("/core/restart", { method: "POST" });
+ return fetch('/core/restart', { method: 'POST' });
},
}));
diff --git a/app/dashboard/src/contexts/DashboardContext.tsx b/app/dashboard/src/contexts/DashboardContext.tsx
@@ -1,20 +1,20 @@
-import { StatisticsQueryKey } from "components/Statistics";
-import { fetch } from "service/http";
-import { User, UserCreate } from "types/User";
-import { Service } from "types/Service";
-import { queryClient } from "utils/react-query";
-import { getUsersPerPageLimitSize } from "utils/userPreferenceStorage";
-import { create } from "zustand";
-import { subscribeWithSelector } from "zustand/middleware";
+import { StatisticsQueryKey } from 'components/Statistics';
+import { fetch } from 'service/http';
+import { User, UserCreate } from 'types/User';
+import { Service } from 'types/Service';
+import { queryClient } from 'utils/react-query';
+import { getUsersPerPageLimitSize } from 'utils/userPreferenceStorage';
+import { create } from 'zustand';
+import { subscribeWithSelector } from 'zustand/middleware';
export type FilterType = {
username?: string;
limit?: number;
offset?: number;
sort: string;
- status?: "active" | "disabled" | "limited" | "expired" | "on_hold";
+ status?: 'active' | 'disabled' | 'limited' | 'expired' | 'on_hold';
};
-export type ProtocolType = "vmess" | "vless" | "trojan" | "shadowsocks";
+export type ProtocolType = 'vmess' | 'vless' | 'trojan' | 'shadowsocks';
export type FilterUsageType = {
start?: string;
@@ -79,7 +79,7 @@ export const fetchUsers = async (query: FilterType): Promise<User[]> => {
if (!query[key as keyof FilterType]) delete query[key as keyof FilterType];
}
useDashboard.setState({ loading: true });
- return fetch("/users", { query })
+ return fetch('/users', { query })
.then((users) => {
for (let i = 0; i < users.users.length; i++) {
users.users[i].service = users.users[i].service_ids;
@@ -94,7 +94,7 @@ export const fetchUsers = async (query: FilterType): Promise<User[]> => {
export const fetchServices = async (): Promise<Service[]> => {
useDashboard.setState({ loading: true });
- return fetch("/services")
+ return fetch('/services')
.then((services) => {
useDashboard.setState({ services });
return services;
@@ -105,7 +105,7 @@ export const fetchServices = async (): Promise<Service[]> => {
};
export const fetchInbounds = async () => {
- return fetch("/inbounds")
+ return fetch('/inbounds')
.then((inbounds: Inbounds) => {
useDashboard.setState({
inbounds: new Map(Object.entries(inbounds)) as Inbounds,
@@ -137,9 +137,9 @@ export const useDashboard = create(
resetUsageUser: null,
revokeSubscriptionUser: null,
filters: {
- username: "",
+ username: '',
limit: getUsersPerPageLimitSize(),
- sort: "-created_at",
+ sort: '-created_at',
},
inbounds: new Map(),
isEditingCore: false,
@@ -150,7 +150,7 @@ export const useDashboard = create(
fetchUsers(get().filters);
},
resetAllUsage: async () => {
- return fetch(`/users/reset`, { method: "POST" }).then(() => {
+ return fetch('/users/reset', { method: 'POST' }).then(() => {
get().onResetAllUsage(false);
get().refetchUsers();
});
@@ -177,14 +177,14 @@ export const useDashboard = create(
},
deleteUser: async (user: User) => {
set({ editingUser: null });
- return fetch(`/user/${user.username}`, { method: "DELETE" }).then(() => {
+ return fetch(`/user/${user.username}`, { method: 'DELETE' }).then(() => {
set({ deletingUser: null });
get().refetchUsers();
queryClient.invalidateQueries(StatisticsQueryKey);
});
},
createUser: async (body: UserCreate) => {
- return fetch(`/user`, { method: "POST", body }).then(() => {
+ return fetch('/user', { method: 'POST', body }).then(() => {
set({ editingUser: null });
get().refetchUsers();
get().refetchServices();
@@ -192,7 +192,7 @@ export const useDashboard = create(
});
},
editUser: async (body: UserCreate) => {
- return fetch(`/user/${body.username}`, { method: "PUT", body }).then(
+ return fetch(`/user/${body.username}`, { method: 'PUT', body }).then(
() => {
get().onEditingUser(null);
get().refetchUsers();
@@ -204,7 +204,7 @@ export const useDashboard = create(
if (!query[key as keyof FilterUsageType])
delete query[key as keyof FilterUsageType];
}
- return fetch(`/user/${body.username}/usage`, { method: "GET", query });
+ return fetch(`/user/${body.username}/usage`, { method: 'GET', query });
},
onEditingHosts: (isEditingHosts: boolean) => {
set({ isEditingHosts });
@@ -219,7 +219,7 @@ export const useDashboard = create(
set({ subscribeUrl });
},
resetDataUsage: async (user) => {
- return fetch(`/user/${user.username}/reset`, { method: "POST" }).then(
+ return fetch(`/user/${user.username}/reset`, { method: 'POST' }).then(
() => {
set({ resetUsageUser: null });
get().refetchUsers();
@@ -228,7 +228,7 @@ export const useDashboard = create(
},
revokeSubscription: async (user) => {
return fetch(`/user/${user.username}/revoke_sub`, {
- method: "POST",
+ method: 'POST',
}).then((user) => {
set({ revokeSubscriptionUser: null, editingUser: user });
get().refetchUsers();
diff --git a/app/dashboard/src/contexts/HostsContext.tsx b/app/dashboard/src/contexts/HostsContext.tsx
@@ -1,5 +1,5 @@
-import { fetch } from "service/http";
-import { create } from "zustand";
+import { fetch } from 'service/http';
+import { create } from 'zustand';
type HostsSchema = Record<
string,
@@ -26,13 +26,13 @@ export const useHosts = create<HostsStore>((set) => ({
hosts: {},
fetchHosts: () => {
set({ isLoading: true });
- fetch("/hosts")
+ fetch('/hosts')
.then((hosts) => set({ hosts }))
.finally(() => set({ isLoading: false }));
},
setHosts: (body) => {
set({ isPostLoading: true });
- return fetch("/hosts", { method: "PUT", body }).finally(() => {
+ return fetch('/hosts', { method: 'PUT', body }).finally(() => {
set({ isPostLoading: false });
});
},
diff --git a/app/dashboard/src/contexts/NodesContext.tsx b/app/dashboard/src/contexts/NodesContext.tsx
@@ -1,8 +1,8 @@
-import { useQuery } from "react-query";
-import { fetch } from "service/http";
-import { z } from "zod";
-import { create } from "zustand";
-import { FilterUsageType, useDashboard } from "./DashboardContext";
+import { useQuery } from 'react-query';
+import { fetch } from 'service/http';
+import { z } from 'zod';
+import { create } from 'zustand';
+import { FilterUsageType, useDashboard } from './DashboardContext';
export const NodeSchema = z.object({
name: z.string().min(1),
@@ -18,7 +18,7 @@ export const NodeSchema = z.object({
xray_version: z.string().nullable().optional(),
id: z.number().nullable().optional(),
status: z
- .enum(["connected", "connecting", "error", "disabled"])
+ .enum(['connected', 'connecting', 'error', 'disabled'])
.nullable()
.optional(),
message: z.string().nullable().optional(),
@@ -28,14 +28,14 @@ export const NodeSchema = z.object({
export type NodeType = z.infer<typeof NodeSchema>;
export const getNodeDefaultValues = (): NodeType => ({
- name: "",
- address: "",
+ name: '',
+ address: '',
port: 62050,
api_port: 62051,
- xray_version: "",
+ xray_version: '',
});
-export const FetchNodesQueryKey = "fetch-nodes-query-key";
+export const FetchNodesQueryKey = 'fetch-nodes-query-key';
export type NodeStore = {
nodes: NodeType[];
@@ -62,17 +62,17 @@ export const useNodesQuery = () => {
export const useNodes = create<NodeStore>((set, get) => ({
nodes: [],
addNode(body) {
- return fetch("/node", { method: "POST", body });
+ return fetch('/node', { method: 'POST', body });
},
fetchNodes() {
- return fetch("/nodes");
+ return fetch('/nodes');
},
fetchNodesUsage(query: FilterUsageType) {
- return fetch("/nodes/usage", { query });
+ return fetch('/nodes/usage', { query });
},
updateNode(body) {
return fetch(`/node/${body.id}`, {
- method: "PUT",
+ method: 'PUT',
body,
});
},
@@ -81,12 +81,12 @@ export const useNodes = create<NodeStore>((set, get) => ({
},
reconnectNode(body) {
return fetch(`/node/${body.id}/reconnect`, {
- method: "POST",
+ method: 'POST',
});
},
deleteNode: () => {
return fetch(`/node/${get().deletingNode?.id}`, {
- method: "DELETE",
+ method: 'DELETE',
});
},
}));
diff --git a/app/dashboard/src/index.tsx b/app/dashboard/src/index.tsx
@@ -1,19 +1,19 @@
-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 "react-query";
-import { queryClient } from "utils/react-query";
-import { updateThemeColor } from "utils/themeColor";
-import { theme } from "../chakra.config";
-import App from "./App";
-import "index.scss";
+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 'react-query';
+import { queryClient } from 'utils/react-query';
+import { updateThemeColor } from 'utils/themeColor';
+import { theme } from '../chakra.config';
+import App from './App';
+import 'index.scss';
dayjs.extend(Timezone);
dayjs.extend(LocalizedFormat);
@@ -21,9 +21,9 @@ dayjs.extend(utc);
dayjs.extend(RelativeTime);
dayjs.extend(Duration);
-updateThemeColor(localStorageManager.get() || "light");
+updateThemeColor(localStorageManager.get() || 'light');
-ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
+ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
<React.StrictMode>
<ChakraProvider theme={theme}>
<QueryClientProvider client={queryClient}>
diff --git a/app/dashboard/src/locales/i18n.ts b/app/dashboard/src/locales/i18n.ts
@@ -1,16 +1,16 @@
-import { joinPaths } from "@remix-run/router";
+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";
+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" {
+declare module 'i18next' {
interface CustomTypeOptions {
returnNull: false;
}
@@ -22,35 +22,35 @@ i18n
.use(HttpApi)
.init(
{
- debug: import.meta.env.NODE_ENV === "development",
+ debug: import.meta.env.NODE_ENV === 'development',
returnNull: false,
- fallbackLng: "en",
+ fallbackLng: 'en',
interpolation: {
escapeValue: false,
},
react: {
useSuspense: false,
},
- load: "languageOnly",
+ load: 'languageOnly',
detection: {
- caches: ["localStorage", "sessionStorage", "cookie"],
+ caches: ['localStorage', 'sessionStorage', 'cookie'],
},
backend: {
- loadPath: joinPaths([import.meta.env.BASE_URL, `locales/{{lng}}.json`]),
+ loadPath: joinPaths([import.meta.env.BASE_URL, 'locales/{{lng}}.json']),
},
},
- function (err, t) {
+ function() {
dayjs.locale(i18n.language);
}
);
-i18n.on("languageChanged", (lng) => {
+i18n.on('languageChanged', (lng) => {
dayjs.locale(lng);
});
// DataPicker
-registerLocale("zh-cn", zh);
-registerLocale("ru", ru);
-registerLocale("fa", fa);
+registerLocale('zh-cn', zh);
+registerLocale('ru', ru);
+registerLocale('fa', fa);
export default i18n;
diff --git a/app/dashboard/src/pages/Dashboard.tsx b/app/dashboard/src/pages/Dashboard.tsx
@@ -1,21 +1,21 @@
-import { Box, VStack } from "@chakra-ui/react";
-import { CoreSettingsModal } from "components/CoreSettingsModal";
-import { DeleteUserModal } from "components/DeleteUserModal";
-import { Filters } from "components/Filters";
-import { Footer } from "components/Footer";
-import { Header } from "components/Header";
-import { HostsDialog } from "components/HostsDialog";
-import { NodesDialog } from "components/NodesModal";
-import { NodesUsage } from "components/NodesUsage";
-import { QRCodeDialog } from "components/QRCodeDialog";
-import { ResetAllUsageModal } from "components/ResetAllUsageModal";
-import { ResetUserUsageModal } from "components/ResetUserUsageModal";
-import { RevokeSubscriptionModal } from "components/RevokeSubscriptionModal";
-import { UserDialog } from "components/UserDialog";
-import { UsersTable } from "components/UsersTable";
-import { fetchInbounds, useDashboard } from "contexts/DashboardContext";
-import { FC, useEffect } from "react";
-import { Statistics } from "../components/Statistics";
+import { Box, VStack } from '@chakra-ui/react';
+import { CoreSettingsModal } from 'components/CoreSettingsModal';
+import { DeleteUserModal } from 'components/DeleteUserModal';
+import { Filters } from 'components/Filters';
+import { Footer } from 'components/Footer';
+import { Header } from 'components/Header';
+import { HostsDialog } from 'components/HostsDialog';
+import { NodesDialog } from 'components/NodesModal';
+import { NodesUsage } from 'components/NodesUsage';
+import { QRCodeDialog } from 'components/QRCodeDialog';
+import { ResetAllUsageModal } from 'components/ResetAllUsageModal';
+import { ResetUserUsageModal } from 'components/ResetUserUsageModal';
+import { RevokeSubscriptionModal } from 'components/RevokeSubscriptionModal';
+import { UserDialog } from 'components/UserDialog';
+import { UsersTable } from 'components/UsersTable';
+import { fetchInbounds, useDashboard } from 'contexts/DashboardContext';
+import { FC, useEffect } from 'react';
+import { Statistics } from '../components/Statistics';
export const Dashboard: FC = () => {
useEffect(() => {
diff --git a/app/dashboard/src/pages/Login.tsx b/app/dashboard/src/pages/Login.tsx
@@ -6,33 +6,32 @@ import {
Button,
chakra,
FormControl,
- FormLabel,
HStack,
Text,
VStack,
-} from "@chakra-ui/react";
-import { ArrowRightOnRectangleIcon } 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 { removeAuthToken, setAuthToken } from "utils/authStorage";
-import { ReactComponent as Logo } from "assets/logo.svg";
-import { useTranslation } from "react-i18next";
-import { Language } from "components/Language";
+} from '@chakra-ui/react';
+import { ArrowRightOnRectangleIcon } 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 { removeAuthToken, setAuthToken } from 'utils/authStorage';
+import { ReactComponent as Logo } from 'assets/logo.svg';
+import { useTranslation } from 'react-i18next';
+import { Language } from 'components/Language';
const schema = z.object({
- username: z.string().min(1, "login.fieldRequired"),
- password: z.string().min(1, "login.fieldRequired"),
+ username: z.string().min(1, 'login.fieldRequired'),
+ password: z.string().min(1, 'login.fieldRequired'),
});
export const LogoIcon = chakra(Logo, {
baseStyle: {
- strokeWidth: "10px",
+ strokeWidth: '10px',
w: 12,
h: 12,
},
@@ -42,12 +41,12 @@ const LoginIcon = chakra(ArrowRightOnRectangleIcon, {
baseStyle: {
w: 5,
h: 5,
- strokeWidth: "2px",
+ strokeWidth: '2px',
},
});
export const Login: FC = () => {
- const [error, setError] = useState("");
+ const [error, setError] = useState('');
const [loading, setLoading] = useState(false);
const navigate = useNavigate();
const { t } = useTranslation();
@@ -61,21 +60,21 @@ export const Login: FC = () => {
});
useEffect(() => {
removeAuthToken();
- if (location.pathname !== "/login") {
- navigate("/login", { replace: true });
+ if (location.pathname !== '/login') {
+ navigate('/login', { replace: true });
}
}, []);
const login = (values: FieldValues) => {
- setError("");
+ setError('');
const formData = new FormData();
- formData.append("username", values.username);
- formData.append("password", values.password);
- formData.append("grant_type", "password");
+ formData.append('username', values.username);
+ formData.append('password', values.password);
+ formData.append('grant_type', 'password');
setLoading(true);
- fetch("/admin/token", { method: "post", body: formData })
+ fetch('/admin/token', { method: 'post', body: formData })
.then(({ access_token: token }) => {
setAuthToken(token);
- navigate("/");
+ navigate('/');
})
.catch((err) => {
setError(err.response._data.detail);
@@ -93,10 +92,10 @@ export const Login: FC = () => {
<VStack alignItems="center" w="full">
<LogoIcon />
<Text fontSize="2xl" fontWeight="semibold">
- {t("login.loginYourAccount")}
+ {t('login.loginYourAccount')}
</Text>
- <Text color="gray.600" _dark={{ color: "gray.400" }}>
- {t("login.welcomeBack")}
+ <Text color="gray.600" _dark={{ color: 'gray.400' }}>
+ {t('login.welcomeBack')}
</Text>
</VStack>
<Box w="full" maxW="300px" m="auto" pt="4">
@@ -105,8 +104,8 @@ export const Login: FC = () => {
<FormControl>
<Input
w="full"
- placeholder={t("username")}
- {...register("username")}
+ placeholder={t('username')}
+ {...register('username')}
error={t(errors?.username?.message as string)}
/>
</FormControl>
@@ -114,8 +113,8 @@ export const Login: FC = () => {
<Input
w="full"
type="password"
- placeholder={t("password")}
- {...register("password")}
+ placeholder={t('password')}
+ {...register('password')}
error={t(errors?.password?.message as string)}
/>
</FormControl>
@@ -132,7 +131,7 @@ export const Login: FC = () => {
colorScheme="primary"
>
{<LoginIcon marginRight={1} />}
- {t("login")}
+ {t('login')}
</Button>
</VStack>
</form>
diff --git a/app/dashboard/src/service/http.ts b/app/dashboard/src/service/http.ts
@@ -1,5 +1,5 @@
-import { FetchOptions, $fetch as ohMyFetch } from "ohmyfetch";
-import { getAuthToken } from "utils/authStorage";
+import { FetchOptions, $fetch as ohMyFetch } from 'ohmyfetch';
+import { getAuthToken } from 'utils/authStorage';
export const $fetch = ohMyFetch.create({
baseURL: import.meta.env.VITE_BASE_API,
@@ -7,11 +7,11 @@ export const $fetch = ohMyFetch.create({
export const fetcher = <T = any>(
url: string,
- ops: FetchOptions<"json"> = {}
+ ops: FetchOptions<'json'> = {}
) => {
const token = getAuthToken();
if (token) {
- ops["headers"] = {
+ ops['headers'] = {
...(ops?.headers || {}),
Authorization: `Bearer ${getAuthToken()}`,
};
diff --git a/app/dashboard/src/types/ChakraIcon.ts b/app/dashboard/src/types/ChakraIcon.ts
@@ -1,5 +1,5 @@
-import { SVGProps, ForwardRefExoticComponent } from "react";
+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/ProxyHosts.ts b/app/dashboard/src/types/ProxyHosts.ts
@@ -1 +1 @@
-export type ProxyHostSecurity = "inbound_default" | "none" | "tls"
+export type ProxyHostSecurity = 'inbound_default' | 'none' | 'tls'
diff --git a/app/dashboard/src/types/User.ts b/app/dashboard/src/types/User.ts
@@ -1,13 +1,13 @@
export type Status =
- | "active"
- | "disabled"
- | "limited"
- | "expired"
- | "on_hold"
- | "error"
- | "connecting"
- | "connected";
-export type ProxyKeys = ("vmess" | "vless" | "trojan" | "shadowsocks")[];
+ | 'active'
+ | 'disabled'
+ | 'limited'
+ | 'expired'
+ | 'on_hold'
+ | 'error'
+ | 'connecting'
+ | 'connected';
+export type ProxyKeys = ('vmess' | 'vless' | 'trojan' | 'shadowsocks')[];
export type ProxyType = {
vmess?: {
id?: string;
@@ -26,11 +26,11 @@ export type ProxyType = {
};
export type DataLimitResetStrategy =
- | "no_reset"
- | "day"
- | "week"
- | "month"
- | "year";
+ | 'no_reset'
+ | 'day'
+ | 'week'
+ | 'month'
+ | 'year';
type serviceId = number;
@@ -52,11 +52,11 @@ export type User = {
export type UserCreate = Pick<
User,
- | "services"
- | "expire"
- | "data_limit"
- | "data_limit_reset_strategy"
- | "username"
- | "status"
- | "note"
+ | 'services'
+ | 'expire'
+ | 'data_limit'
+ | 'data_limit_reset_strategy'
+ | 'username'
+ | 'status'
+ | 'note'
>;
diff --git a/app/dashboard/src/utils/authStorage.ts b/app/dashboard/src/utils/authStorage.ts
@@ -1,11 +1,11 @@
export const getAuthToken = () => {
- return localStorage.getItem("token");
+ return localStorage.getItem('token');
};
export const setAuthToken = (token: string) => {
- localStorage.setItem("token", token);
+ localStorage.setItem('token', token);
};
export const removeAuthToken = () => {
- localStorage.removeItem("token");
+ localStorage.removeItem('token');
};
diff --git a/app/dashboard/src/utils/color.ts b/app/dashboard/src/utils/color.ts
@@ -42,7 +42,7 @@ function hslToHex(h: number, s: number, l: number) {
const toHex = (c: number) => {
const hex = c.toString(16);
- return hex.length === 1 ? "0" + hex : hex;
+ 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
@@ -1,16 +1,16 @@
-import dayjs from "dayjs";
+import dayjs from 'dayjs';
export const relativeExpiryDate = (expiryDate: number | null | undefined) => {
- let dateInfo = { status: "", time: "" };
+ let dateInfo = { status: '', time: '' };
if (expiryDate) {
if (
dayjs(expiryDate * 1000)
.utc()
.isAfter(dayjs().utc())
) {
- dateInfo.status = "expires";
+ dateInfo.status = 'expires';
} else {
- dateInfo.status = "expired";
+ dateInfo.status = 'expired';
}
const durationSlots: string[] = [];
const duration = dayjs.duration(
@@ -21,41 +21,41 @@ export const relativeExpiryDate = (expiryDate: number | null | undefined) => {
if (duration.years() != 0) {
durationSlots.push(
Math.abs(duration.years()) +
- " year" +
- (Math.abs(duration.years()) != 1 ? "s" : "")
+ ' year' +
+ (Math.abs(duration.years()) != 1 ? 's' : '')
);
}
if (duration.months() != 0) {
durationSlots.push(
Math.abs(duration.months()) +
- " month" +
- (Math.abs(duration.months()) != 1 ? "s" : "")
+ ' month' +
+ (Math.abs(duration.months()) != 1 ? 's' : '')
);
}
if (duration.days() != 0) {
durationSlots.push(
Math.abs(duration.days()) +
- " day" +
- (Math.abs(duration.days()) != 1 ? "s" : "")
+ ' 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" : "")
+ ' hour' +
+ (Math.abs(duration.hours()) != 1 ? 's' : '')
);
}
if (duration.minutes() != 0) {
durationSlots.push(
Math.abs(duration.minutes()) +
- " min" +
- (Math.abs(duration.minutes()) != 1 ? "s" : "")
+ ' min' +
+ (Math.abs(duration.minutes()) != 1 ? 's' : '')
);
}
}
- dateInfo.time = durationSlots.join(", ");
+ dateInfo.time = durationSlots.join(', ');
}
return dateInfo;
};
diff --git a/app/dashboard/src/utils/formatByte.tsx b/app/dashboard/src/utils/formatByte.tsx
@@ -1,9 +1,9 @@
export function formatBytes(bytes: number, decimals = 2, asArray = false) {
- if (!+bytes) return "0 B";
+ 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 sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
if (!asArray)
@@ -12,5 +12,5 @@ export function formatBytes(bytes: number, decimals = 2, asArray = false) {
}
export const numberWithCommas = (x: number) => {
- if (x !== null) return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+ if (x !== null) return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
};
diff --git a/app/dashboard/src/utils/react-query.ts b/app/dashboard/src/utils/react-query.ts
@@ -1,3 +1,3 @@
-import { QueryClient } from "react-query";
+import { QueryClient } from 'react-query';
export const queryClient = new QueryClient();
diff --git a/app/dashboard/src/utils/themeColor.ts b/app/dashboard/src/utils/themeColor.ts
@@ -1,6 +1,6 @@
-import { ColorMode } from "@chakra-ui/react";
+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");
+ el?.setAttribute('content', colorMode == 'dark' ? '#1A202C' : '#3B81F6');
};
diff --git a/app/dashboard/src/utils/toastHandler.ts b/app/dashboard/src/utils/toastHandler.ts
@@ -1,5 +1,5 @@
-import { CreateToastFnReturn } from "@chakra-ui/react";
-import { UseFormReturn } from "react-hook-form";
+import { CreateToastFnReturn } from '@chakra-ui/react';
+import { UseFormReturn } from 'react-hook-form';
export const generateErrorMessage = (
e: any,
@@ -7,15 +7,15 @@ export const generateErrorMessage = (
form?: UseFormReturn<any>
) => {
if (e.response && e.response._data) {
- if (typeof e.response._data.detail === "string")
+ if (typeof e.response._data.detail === 'string')
return toast({
title: e.response._data.detail,
- status: "error",
+ status: 'error',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
- if (typeof e.response._data.detail === "object")
+ if (typeof e.response._data.detail === 'object')
if (form) {
Object.keys(e.response._data.detail).forEach((errorKey) =>
form.setError(errorKey, {
@@ -26,10 +26,10 @@ export const generateErrorMessage = (
}
}
return toast({
- title: "Something went wrong!",
- status: "error",
+ title: 'Something went wrong!',
+ status: 'error',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
};
@@ -40,9 +40,9 @@ export const generateSuccessMessage = (
) => {
return toast({
title: message,
- status: "success",
+ status: 'success',
isClosable: true,
- position: "top",
+ position: 'top',
duration: 3000,
});
};
diff --git a/app/dashboard/src/utils/userPreferenceStorage.ts b/app/dashboard/src/utils/userPreferenceStorage.ts
@@ -1,4 +1,4 @@
-const NUM_USERS_PER_PAGE_LOCAL_STORAGE_KEY = "marzban-num-users-per-page";
+const NUM_USERS_PER_PAGE_LOCAL_STORAGE_KEY = 'marzban-num-users-per-page';
const NUM_USERS_PER_PAGE_DEFAULT = 10;
export const getUsersPerPageLimitSize = () => {
const numUsersPerPage =
diff --git a/app/dashboard/vite.config.ts b/app/dashboard/vite.config.ts
@@ -1,15 +1,15 @@
-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";
+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({
plugins: [
tsconfigPaths(),
react({
- include: "**/*.tsx",
+ include: '**/*.tsx',
}),
svgr(),
visualizer(),