diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 81% rename from .eslintrc.js rename to .eslintrc.cjs index 757b92405..2a26f562a 100644 --- a/.eslintrc.js +++ b/.eslintrc.cjs @@ -2,24 +2,27 @@ module.exports = { root: true, env: { node: true, + es2022: true, }, extends: [ 'plugin:vue/vue3-essential', 'eslint:recommended', '@vue/typescript/recommended', '@vue/prettier', - '@vue/prettier/@typescript-eslint', + '@vue/eslint-config-typescript', ], parserOptions: { - ecmaVersion: 2020, + ecmaVersion: 2022, }, ignorePatterns: ['dist', 'node_modules', '/src/assets/fonts', '/src/assets/iconfont'], rules: { + // FIXME:FIXME:FIXME: can not get node env now 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-empty-function': 'off', '@typescript-eslint/no-empty-function': [1], '@typescript-eslint/no-explicit-any': 'off', + 'vue/multi-word-component-names': 'off', }, overrides: [ { diff --git a/.github/workflows/build_emqx_for_test.yaml b/.github/workflows/build_emqx_for_test.yaml index 0b406be90..9a8a62503 100644 --- a/.github/workflows/build_emqx_for_test.yaml +++ b/.github/workflows/build_emqx_for_test.yaml @@ -15,13 +15,12 @@ jobs: OTP_VSN: '26.2.5-3' ELIXIR_VSN: '1.15.7' - steps: - name: checkout emqx code uses: actions/checkout@v3 with: repository: emqx/emqx - ref: release-58 + ref: release-59 - name: build and export to Docker id: build @@ -31,7 +30,7 @@ jobs: - name: export docker image run: | docker save $_EMQX_DOCKER_IMAGE_TAG | gzip > $EMQX_NAME-docker.tar.gz - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: '${{ env.EMQX_NAME }}-docker' path: '${{ env.EMQX_NAME }}-docker.tar.gz' diff --git a/.github/workflows/build_enterprise_package.yaml b/.github/workflows/build_enterprise_package.yaml index e14213efb..c2b006f22 100644 --- a/.github/workflows/build_enterprise_package.yaml +++ b/.github/workflows/build_enterprise_package.yaml @@ -3,26 +3,28 @@ name: build enterprise package on: pull_request: branches: - - 'enterprise' + - '**enterprise**' - 'dev/e/*' push: branches: - - 'enterprise' + - '**enterprise**' - 'dev/e/*' workflow_call: jobs: build: runs-on: ubuntu-20.04 - container: node:16.20 + container: node:20.17 steps: - uses: actions/checkout@v2 + - name: Install pnpm + run: npm install -g pnpm - name: install zip run: apt-get update && apt-get install -y zip - name: build run: | - yarn - yarn build:enterprise + pnpm install + pnpm build:enterprise - name: create package run: | touch dist/version @@ -31,7 +33,7 @@ jobs: PACKAGE_NAME=$(echo ${GITHUB_REF##*/}) # Extract tag from GITHUB_REF zip -rq emqx-enterprise-dashboard-$PACKAGE_NAME.zip ./dist echo "PACKAGE_NAME=$PACKAGE_NAME" >> $GITHUB_ENV - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: emqx-enterprise-dashboard path: dist/ diff --git a/.github/workflows/build_oss_package.yaml b/.github/workflows/build_oss_package.yaml index d303fdaf0..d6ffaf893 100644 --- a/.github/workflows/build_oss_package.yaml +++ b/.github/workflows/build_oss_package.yaml @@ -14,15 +14,17 @@ on: jobs: build: runs-on: ubuntu-20.04 - container: node:16.20 + container: node:20.17 steps: - uses: actions/checkout@v2 + - name: Install pnpm + run: npm install -g pnpm - name: install zip run: apt-get update && apt-get install -y zip - name: build run: | - yarn - yarn build + pnpm install + pnpm build - name: create package run: | touch dist/version @@ -31,7 +33,7 @@ jobs: PACKAGE_NAME=$(echo ${GITHUB_REF##*/}) # Extract tag from GITHUB_REF zip -rq emqx-dashboard-$PACKAGE_NAME.zip ./dist echo "PACKAGE_NAME=$PACKAGE_NAME" >> $GITHUB_ENV - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: emqx-dashboard path: dist/ diff --git a/.github/workflows/check_newest_schema.yaml b/.github/workflows/check_newest_schema.yaml index f3cc5dc93..ba5065c23 100644 --- a/.github/workflows/check_newest_schema.yaml +++ b/.github/workflows/check_newest_schema.yaml @@ -8,7 +8,7 @@ on: type: string env: - IS_CI: "true" + IS_CI: 'true' EMQX_NAME: ${{ inputs.emqx-name }} jobs: @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: ${{ env.EMQX_NAME }}-docker path: /tmp @@ -34,17 +34,23 @@ jobs: - name: checkout dashboard code uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '20.17' - name: run script that checks schemas run: | - yarn - yarn orval + npm install -g pnpm + pnpm install + pnpm orval - name: check for changes run: | git_diff=$(git diff) if [ -n "$git_diff" ]; then - git diff + git diff src/types/schemas echo "Detected differences in the repository. Uploading mismatched schemas." exit 1 else @@ -53,7 +59,7 @@ jobs: - name: upload schemas if: failure() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: newest-schemas path: ./src/types/schemas/*.ts diff --git a/.github/workflows/check_package_version.yaml b/.github/workflows/check_package_version.yaml index dbd12bebe..d0fa66a00 100644 --- a/.github/workflows/check_package_version.yaml +++ b/.github/workflows/check_package_version.yaml @@ -8,7 +8,7 @@ on: type: string env: - IS_CI: "true" + IS_CI: 'true' EMQX_NAME: ${{ inputs.emqx-name }} jobs: @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: ${{ env.EMQX_NAME }}-docker path: /tmp @@ -35,13 +35,16 @@ jobs: - name: checkout dashboard code uses: actions/checkout@v3 + - name: Install pnpm + run: npm install -g pnpm + - name: install dep run: | - yarn + pnpm install - name: run script that checks the version of the package run: | - node ./scripts/checkPackageVersion.js + node ./scripts/checkPackageVersion.cjs - name: check for script errors if: ${{ failure() }} diff --git a/.github/workflows/project_test.yaml b/.github/workflows/project_test.yaml index 8cbbf7e99..81aa92c26 100644 --- a/.github/workflows/project_test.yaml +++ b/.github/workflows/project_test.yaml @@ -4,7 +4,7 @@ on: pull_request: branches: - 'dev/*' - - 'enterprise' + - '**enterprise**' jobs: set_version: diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml index 691cbdc86..1150d93f7 100644 --- a/.github/workflows/tag.yaml +++ b/.github/workflows/tag.yaml @@ -15,7 +15,7 @@ jobs: - name: check branch and set output id: set-output run: | - if [[ "${{ github.base_ref }}" == enterprise ]]; then + if [[ "${{ github.ref_name }}" == e* ]]; then echo "emqx-name=emqx-enterprise" >> "$GITHUB_OUTPUT" else echo "emqx-name=emqx" >> "$GITHUB_OUTPUT" @@ -56,9 +56,17 @@ jobs: if: startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-latest steps: + - name: Generate GitHub App token + id: app-token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ vars.AUTH_APP_ID }} + private-key: ${{ secrets.AUTH_APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + - name: Create PR in emqx/emqx env: - GH_TOKEN: ${{ secrets.CI_GITHUB_TOKEN_EMQX_RW }} + GH_TOKEN: ${{ steps.app-token.outputs.token }} EMQX_NAME: emqx VERSION: ${{ github.ref_name }} run: | @@ -74,9 +82,17 @@ jobs: if: (github.ref == 'refs/heads/enterprise') || startsWith(github.ref, 'refs/tags/e') runs-on: ubuntu-latest steps: + - name: Generate GitHub App token + id: app-token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ vars.AUTH_APP_ID }} + private-key: ${{ secrets.AUTH_APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + - name: Create PR in emqx/emqx env: - GH_TOKEN: ${{ secrets.CI_GITHUB_TOKEN_EMQX_RW }} + GH_TOKEN: ${{ steps.app-token.outputs.token }} EMQX_NAME: emqx-enterprise VERSION: ${{ github.ref_name }} run: | diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 000000000..d0a778429 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index b6a7d89c6..209e3ef4b 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16 +20 diff --git a/.prettierignore b/.prettierignore index 08067886e..f47ed7add 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,8 @@ # Ignore files: /src/assets/fonts /src/assets/iconfont +/src/auto-imports.d.ts +/src/components.d.ts +/src/types/schemas/* # Ignore all HTML files: *.html diff --git a/README.md b/README.md index 4366370f7..b4a8ff2b8 100644 --- a/README.md +++ b/README.md @@ -79,31 +79,31 @@ To set up for local development, follow these steps: 2. Install the dependencies: ```shell - yarn + pnpm install ``` 3. To start the development server, run: ```shell - yarn serve + pnpm dev ``` 4. For production compilation and minification: ```shell - yarn build + pnpm build ``` 5. Lint and fix files: ```shell - yarn lint + pnpm lint ``` Or, format the code with Prettier: ```shell - yarn format + pnpm format ``` ## ☁️ Development with Cloud Host @@ -125,11 +125,11 @@ To set up for development with a cloud host: 3. Start the development server: ```shell - yarn serve + pnpm serve ``` ## ⚙️ Vue.js Customize Configuration -Refer to the [Configuration Reference](https://cli.vuejs.org/config/) for more information. +Refer to the [Configuring Vite](https://vitejs.dev/config/#configuring-vite) for more information. After the completion of setup, the CI will run automatically and deploy upon successful execution. diff --git a/assets/overview-light.png b/assets/overview-light.png index e42600e0a..ab109aa39 100644 Binary files a/assets/overview-light.png and b/assets/overview-light.png differ diff --git a/auto-import.config.js b/auto-import.config.js new file mode 100644 index 000000000..337cc7960 --- /dev/null +++ b/auto-import.config.js @@ -0,0 +1,92 @@ +export default { + // targets to transform + include: [ + /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx + /\.vue$/, + /\.vue\?vue/, // .vue + ], + + // global imports to register + imports: [ + // presets + 'vue', + // custom + { + 'vue-router': [ + 'useRouter', + 'onBeforeRouteLeave', + 'useRoute', + 'createRouter', + 'createWebHashHistory', + 'onBeforeRouteUpdate', + ], + axios: [ + // default imports + ['default', 'axios'], // import { default as axios } from 'axios', + ], + lodash: [ + ['default', '_'], + 'get', + 'pick', + 'isFunction', + 'isString', + 'isPlainObject', + 'throttle', + 'cloneDeep', + 'escape', + 'isObject', + 'isUndefined', + 'omit', + 'round', + 'set', + 'escapeRegExp', + 'isEqual', + 'debounce', + 'snakeCase', + 'isArray', + 'chunk', + 'isRegExp', + 'orderBy', + 'assign', + 'merge', + 'camelCase', + 'mergeWith', + 'startCase', + 'groupBy', + 'isNumber', + 'lowerCase', + 'uniq', + ], + vuex: ['useStore', 'createStore'], + 'vue-i18n': ['useI18n'], + 'element-plus': ['ElMessage', 'ElMessageBox', 'ElNotification'], + }, + { + from: 'vue-router', + imports: ['RouteLocationRaw', 'RouteRecordRaw'], + type: true, + }, + { + from: 'vue-i18n', + imports: ['ComposerTranslation'], + type: true, + }, + ], + dts: 'src/auto-imports.d.ts', + vueTemplate: true, + dirs: [ + 'src/hooks/**', + 'src/common/constants.ts', + 'src/common/tools.ts', + { + glob: 'src/hooks/**', + types: true, // enable import the types + }, + ], +} + +export const autoImportComponentsConfig = { + dts: 'src/components.d.ts', + dirs: ['src/components/**'], + extensions: ['vue', 'tsx', 'jsx'], +} diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index c1b783eac..000000000 --- a/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: ['@vue/cli-plugin-babel/preset'], -} diff --git a/index.html b/index.html new file mode 100644 index 000000000..c799c3452 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + EMQX Dashboard + + +
+ + + \ No newline at end of file diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index b5e3f8a52..000000000 --- a/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - testEnvironment: 'node', -} diff --git a/orval.config.ts b/orval.config.ts index 00f43bb3f..8761f7841 100644 --- a/orval.config.ts +++ b/orval.config.ts @@ -1,8 +1,10 @@ /* eslint-disable @typescript-eslint/no-var-requires */ -const { camelCase } = require('lodash') -const filterTargetSchema = require('./scripts/transformer/filterTagsSchema.js') +import { camelCase } from 'lodash' +import { loadEnv } from 'vite' +import filterTargetSchema from './scripts/transformer/filterTagsSchema.js' -const baseURL = process.env.HOST_URL || 'http://localhost:18083' +const envVariables = loadEnv('development', process.cwd(), '') +const baseURL = envVariables.HOST_URL || 'http://localhost:18083' const swaggerURL = `${baseURL}/api-docs/swagger.json` const tagArr = [ @@ -59,10 +61,10 @@ const configs = tagArr.reduce((obj: Record, tag: string) => { override: { header: false }, }, hooks: { - afterAllFilesWrite: ['prettier --write', `yarn remove-orval-client ${filePath}`], + afterAllFilesWrite: ['prettier --write', `pnpm remove-orval-client ${filePath}`], }, } return obj }, {}) -module.exports = configs +export default configs diff --git a/package.json b/package.json index bb6d8ddc7..52402eb25 100644 --- a/package.json +++ b/package.json @@ -1,33 +1,37 @@ { "name": "emqx-dashboard5", - "version": "5.8.1", + "version": "5.9.0", "private": true, + "type": "module", "scripts": { - "serve": "vue-cli-service serve", - "serve:enterprise": "VUE_APP_VERSION=enterprise vue-cli-service serve", - "build": "vue-cli-service build", - "build:enterprise": "VUE_APP_VERSION=enterprise vue-cli-service build", - "test:unit": "vue-cli-service test:unit", - "lint": "vue-cli-service lint", + "dev": "vite", + "dev:enterprise": "VITE_APP_VERSION=enterprise vite", + "build": "vite build", + "build:enterprise": "VITE_APP_VERSION=enterprise vite build", + "lint": "eslint --ext .js,.vue --ignore-path .gitignore --fix src", "format": "prettier --write \"src/**/*.js\" \"src/**/*.ts\" \"src/**/*.tsx\" \"src/**/*.vue\" \"src/**/*.scss\"", "escape": "node ./scripts/escapeI18N.js", "checkI18n": "node ./scripts/checkUselessI18n.js", "remove-orval-client": "node ./scripts/removeOrvalClient.js", - "orval:api": "source ./.env.development.local && yarn orval --input $HOST_URL\\api-docs/swagger.json", - "orval:local": "yarn orval --input ./swagger.json" + "orval:api": "source ./.env.development.local && pnpm orval --input $HOST_URL\\api-docs/swagger.json", + "orval:local": "pnpm orval --input ./swagger.json", + "prepare": "husky" }, "dependencies": { "@element-plus/icons-vue": "^1.1.0", - "@emqx/shared-ui-i18n": "~0.0.25", - "@emqx/shared-ui-utils": "^0.0.14", + "@emqx/shared-ui-i18n": "~0.0.39", + "@emqx/shared-ui-utils": "~0.0.16", "@highlightjs/vue-plugin": "^2.1.0", "@vue-flow/core": "^1.20.1", + "async-validator": "4.2.5", + "avsc": "5.7.7", "axios": "^1.4.0", "compare-versions": "^6.0.0-rc.3", "copy-to-clipboard": "^3.3.1", "crypto-js": "^4.1.1", + "dayjs": "^1.11.13", "echarts": "^5.2.1", - "element-plus": "~2.3.0", + "element-plus": "^2.9.4", "github-markdown-css": "^5.7.0", "highlight.js": "10.7.3", "hocon-parser": "^1.0.1", @@ -35,13 +39,13 @@ "json-to-avro": "^1.1.1", "lodash": "^4.17.21", "marked": "^4.0.9", - "moment": "^2.29.1", "monaco-editor": "^0.30.0", "mqtt": "^4.2.8", "nprogress": "^0.2.0", "qs": "^6.12.1", "sortablejs": "^1.14.0", - "vue": "~3.2.16", + "vite-plugin-node-polyfills": "^0.22.0", + "vue": "^3.2.16", "vue-i18n": "^9.2.0-beta.19", "vue-router": "^4.0.0-0", "vuex": "^4.0.0-0", @@ -49,37 +53,32 @@ }, "devDependencies": { "@types/crypto-js": "^4.1.1", - "@types/jest": "^29.5.4", "@types/lodash": "^4.14.191", "@types/marked": "^4.0.1", + "@types/nprogress": "^0.2.3", "@types/sortablejs": "^1.10.7", "@types/utf8": "^3.0.1", - "@typescript-eslint/eslint-plugin": "^4.18.0", - "@typescript-eslint/parser": "^4.18.0", - "@vue/babel-plugin-jsx": "^1.1.1", - "@vue/cli-plugin-babel": "~4.5.0", - "@vue/cli-plugin-eslint": "~4.5.0", - "@vue/cli-plugin-router": "~4.5.0", - "@vue/cli-plugin-typescript": "~4.5.0", - "@vue/cli-plugin-vuex": "~4.5.0", - "@vue/cli-service": "~4.5.0", - "@vue/eslint-config-prettier": "^6.0.0", - "@vue/eslint-config-typescript": "^7.0.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "@vitejs/plugin-vue": "^5.0.0", + "@vitejs/plugin-vue-jsx": "^4.0.0", + "@vue/eslint-config-prettier": "^9.0.0", + "@vue/eslint-config-typescript": "^13.0.0", "@vue/test-utils": "^2.0.0-0", - "eslint": "^6.7.2", - "eslint-plugin-prettier": "^3.3.1", - "eslint-plugin-vue": "^7.0.0", + "eslint": "^8.57.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-vue": "^9.28.0", "esm": "^3.2.25", - "husky": "^7.0.4", - "jest": "^29.6.4", - "lint-staged": "^12.1.7", - "monaco-editor-webpack-plugin": "^6.0.0", + "husky": "^9.1.5", + "lint-staged": "^15.2.10", "orval": "^6.17.0", - "prettier": "^2.2.1", - "sass": "^1.26.5", - "sass-loader": "^8.0.2", - "typescript": "~4.1.5", - "webpack": "^4.36.0" + "prettier": "^3.3.3", + "sass": "^1.84.0", + "typescript": "~5.5.4", + "unplugin-auto-import": "^19.1.0", + "unplugin-vue-components": "^28.4.0", + "vite": "^5.0.0", + "vue-tsc": "^2.2.4" }, "husky": { "hooks": { @@ -87,8 +86,12 @@ } }, "lint-staged": { - "*.{vue,js,scss}": [ - "prettier --write \"src/**/*.js\" \"src/**/*.ts\" \"src/**/*.vue\" \"src/**/*.scss\"" + "*.{js,ts,vue}": [ + "eslint --fix", + "prettier --write" + ], + "*.scss": [ + "prettier --write" ] } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..d9cdfcc5f --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,7312 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@element-plus/icons-vue': + specifier: ^1.1.0 + version: 1.1.4(vue@3.5.4(typescript@5.5.4)) + '@emqx/shared-ui-i18n': + specifier: ~0.0.39 + version: 0.0.39 + '@emqx/shared-ui-utils': + specifier: ~0.0.16 + version: 0.0.16(vue@3.5.4(typescript@5.5.4)) + '@highlightjs/vue-plugin': + specifier: ^2.1.0 + version: 2.1.0(highlight.js@10.7.3)(vue@3.5.4(typescript@5.5.4)) + '@vue-flow/core': + specifier: ^1.20.1 + version: 1.41.1(vue@3.5.4(typescript@5.5.4)) + async-validator: + specifier: 4.2.5 + version: 4.2.5 + avsc: + specifier: 5.7.7 + version: 5.7.7 + axios: + specifier: ^1.4.0 + version: 1.7.7 + compare-versions: + specifier: ^6.0.0-rc.3 + version: 6.1.1 + copy-to-clipboard: + specifier: ^3.3.1 + version: 3.3.3 + crypto-js: + specifier: ^4.1.1 + version: 4.2.0 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + echarts: + specifier: ^5.2.1 + version: 5.5.1 + element-plus: + specifier: ^2.9.4 + version: 2.9.4(vue@3.5.4(typescript@5.5.4)) + github-markdown-css: + specifier: ^5.7.0 + version: 5.7.0 + highlight.js: + specifier: 10.7.3 + version: 10.7.3 + hocon-parser: + specifier: ^1.0.1 + version: 1.0.1 + js-base64: + specifier: ^3.7.2 + version: 3.7.7 + json-to-avro: + specifier: ^1.1.1 + version: 1.1.1 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + marked: + specifier: ^4.0.9 + version: 4.3.0 + monaco-editor: + specifier: ^0.30.0 + version: 0.30.1 + mqtt: + specifier: ^4.2.8 + version: 4.3.8 + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + qs: + specifier: ^6.12.1 + version: 6.13.0 + sortablejs: + specifier: ^1.14.0 + version: 1.15.3 + vite-plugin-node-polyfills: + specifier: ^0.22.0 + version: 0.22.0(rollup@4.21.3)(vite@5.4.4(@types/node@22.5.4)(sass@1.84.0)) + vue: + specifier: ^3.2.16 + version: 3.5.4(typescript@5.5.4) + vue-i18n: + specifier: ^9.2.0-beta.19 + version: 9.14.0(vue@3.5.4(typescript@5.5.4)) + vue-router: + specifier: ^4.0.0-0 + version: 4.4.4(vue@3.5.4(typescript@5.5.4)) + vuex: + specifier: ^4.0.0-0 + version: 4.1.0(vue@3.5.4(typescript@5.5.4)) + xss: + specifier: ^1.0.14 + version: 1.0.15 + devDependencies: + '@types/crypto-js': + specifier: ^4.1.1 + version: 4.2.2 + '@types/lodash': + specifier: ^4.14.191 + version: 4.17.7 + '@types/marked': + specifier: ^4.0.1 + version: 4.3.2 + '@types/nprogress': + specifier: ^0.2.3 + version: 0.2.3 + '@types/sortablejs': + specifier: ^1.10.7 + version: 1.15.8 + '@types/utf8': + specifier: ^3.0.1 + version: 3.0.3 + '@typescript-eslint/eslint-plugin': + specifier: ^7.18.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': + specifier: ^7.18.0 + version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@vitejs/plugin-vue': + specifier: ^5.0.0 + version: 5.1.3(vite@5.4.4(@types/node@22.5.4)(sass@1.84.0))(vue@3.5.4(typescript@5.5.4)) + '@vitejs/plugin-vue-jsx': + specifier: ^4.0.0 + version: 4.0.1(vite@5.4.4(@types/node@22.5.4)(sass@1.84.0))(vue@3.5.4(typescript@5.5.4)) + '@vue/eslint-config-prettier': + specifier: ^9.0.0 + version: 9.0.0(eslint@8.57.0)(prettier@3.3.3) + '@vue/eslint-config-typescript': + specifier: ^13.0.0 + version: 13.0.0(eslint-plugin-vue@9.28.0(eslint@8.57.0))(eslint@8.57.0)(typescript@5.5.4) + '@vue/test-utils': + specifier: ^2.0.0-0 + version: 2.4.6 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-plugin-prettier: + specifier: ^5.0.0 + version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3) + eslint-plugin-vue: + specifier: ^9.28.0 + version: 9.28.0(eslint@8.57.0) + esm: + specifier: ^3.2.25 + version: 3.2.25 + husky: + specifier: ^9.1.5 + version: 9.1.6 + lint-staged: + specifier: ^15.2.10 + version: 15.2.10 + orval: + specifier: ^6.17.0 + version: 6.31.0(openapi-types@12.1.3)(typescript@5.5.4) + prettier: + specifier: ^3.3.3 + version: 3.3.3 + sass: + specifier: ^1.84.0 + version: 1.84.0 + typescript: + specifier: ~5.5.4 + version: 5.5.4 + unplugin-auto-import: + specifier: ^19.1.0 + version: 19.1.0(@vueuse/core@10.11.1(vue@3.5.4(typescript@5.5.4))) + unplugin-vue-components: + specifier: ^28.4.0 + version: 28.4.0(@babel/parser@7.25.6)(vue@3.5.4(typescript@5.5.4)) + vite: + specifier: ^5.0.0 + version: 5.4.4(@types/node@22.5.4)(sass@1.84.0) + vue-tsc: + specifier: ^2.2.4 + version: 2.2.4(typescript@5.5.4) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@apidevtools/json-schema-ref-parser@9.0.6': + resolution: {integrity: sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==} + + '@apidevtools/openapi-schemas@2.1.0': + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + + '@apidevtools/swagger-methods@3.0.2': + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + + '@apidevtools/swagger-parser@10.1.0': + resolution: {integrity: sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==} + peerDependencies: + openapi-types: '>=7' + + '@asyncapi/specs@4.3.1': + resolution: {integrity: sha512-EfexhJu/lwF8OdQDm28NKLJHFkx0Gb6O+rcezhZYLPIoNYKXJMh2J1vFGpwmfAcTTh+ffK44Oc2Hs1Q4sLBp+A==} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.4': + resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-member-expression-to-functions@7.24.8': + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.25.0': + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.25.6': + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.4': + resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.25.2': + resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@element-plus/icons-vue@1.1.4': + resolution: {integrity: sha512-Iz/nHqdp1sFPmdzRwHkEQQA3lKvoObk8azgABZ81QUOpW9s/lUyQVUSh0tNtEPZXQlKwlSh7SPgoVxzrE0uuVQ==} + peerDependencies: + vue: ^3.2.0 + + '@element-plus/icons-vue@2.3.1': + resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} + peerDependencies: + vue: ^3.2.0 + + '@emqx/shared-ui-i18n@0.0.39': + resolution: {integrity: sha512-3JVBpHi8LkoVaFszXYE7KgKfTzaURol85IcQBpFXXH1v2MW2Dnea7z8VyMGVbJ0PVAipaLDquwjDFZ7PZ4vtXQ==} + + '@emqx/shared-ui-utils@0.0.16': + resolution: {integrity: sha512-MAF8Ta8phj+1BCuAT+wbUqLIGdYV6yAww0GtvL6t+ezJcxjyXsS50HT+W8MOTv82A6GnI1Oj3ZS41PfcNOHJFw==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@floating-ui/core@1.6.7': + resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} + + '@floating-ui/dom@1.6.10': + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + + '@floating-ui/utils@0.2.7': + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + + '@highlightjs/vue-plugin@2.1.0': + resolution: {integrity: sha512-E+bmk4ncca+hBEYRV2a+1aIzIV0VSY/e5ArjpuSN9IO7wBJrzUE2u4ESCwrbQD7sAy+jWQjkV5qCCWgc+pu7CQ==} + peerDependencies: + highlight.js: ^11.0.1 + vue: ^3 + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@ibm-cloud/openapi-ruleset-utilities@1.3.2': + resolution: {integrity: sha512-pDZ+YTawZBAMgxfGG0JeCizh7Brmz8h4WRQaJvfJaRfgfdFmp5xZ64oqvnpJQ16XjCdNMBkTB6NJCZjQzq1gpQ==} + engines: {node: '>=16.0.0'} + + '@ibm-cloud/openapi-ruleset@1.21.1': + resolution: {integrity: sha512-l0Sj8LkOwIGB5vABqiToW3Uvr6mwmI2Rc2QOAu2G6jKL3BtVYCAXS8adN3BOSzUUWZSaaimF3dnDYvv7HRXrSg==} + engines: {node: '>=16.0.0'} + + '@intlify/core-base@9.14.0': + resolution: {integrity: sha512-zJn0imh9HIsZZUtt9v8T16PeVstPv6bP2YzlrYJwoF8F30gs4brZBwW2KK6EI5WYKFi3NeqX6+UU4gniz5TkGg==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@9.14.0': + resolution: {integrity: sha512-sXNsoMI0YsipSXW8SR75drmVK56tnJHoYbPXUv2Cf9lz6FzvwsosFm6JtC1oQZI/kU+n7qx0qRrEWkeYFTgETA==} + engines: {node: '>= 16'} + + '@intlify/shared@9.14.0': + resolution: {integrity: sha512-r+N8KRQL7LgN1TMTs1A2svfuAU0J94Wu9wWdJVJqYsoMMLIeJxrPjazihfHpmJqfgZq0ah3Y9Q4pgWV2O90Fyg==} + engines: {node: '>= 16'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@jsep-plugin/regex@1.0.3': + resolution: {integrity: sha512-XfZgry4DwEZvSFtS/6Y+R48D7qJYJK6R9/yJFyUFHCIUMEEHuJ4X95TDgJp5QkmzfLYvapMPzskV5HpIDrREug==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/ternary@1.1.3': + resolution: {integrity: sha512-qtLGzCNzPVJ3kdH6/zoLWDPjauHIKiLSBAR71Wa0+PWvGA8wODUQvRgxtpUA5YqAYL3CQ8S4qXhd/9WuWTZirg==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@orval/angular@6.31.0': + resolution: {integrity: sha512-cVV/vh6biGUe5FMR0kaOL+pYkD5lM/oHpyHVU19d2eY/hxKCG58/CagUNVDxbowcSalzGpt7NbZOqpauc2cNOA==} + + '@orval/axios@6.31.0': + resolution: {integrity: sha512-OqWFJ6bDKftsSW3VI7Ouqcb3W4hDhkk8XzDkb/iisn3Dn1rkSE/wafdlHCm+62VQps4esYXaP1+7/HSk/2+Y8A==} + + '@orval/core@6.31.0': + resolution: {integrity: sha512-ubOPpxzLgOCGbAQsq/dzfe/MIgB4LYWRyuwgnkV2GkL8Zq7cIWfmZU09GTJZQ6cO35OclFfbbyNve0cRMfSBeA==} + + '@orval/fetch@6.31.0': + resolution: {integrity: sha512-K4pD0TqRX3n1QgsfdzcCLxZPj4WFr4xd51VS5PhtK7wewy+EwaTp5AZeeMT+o8dL4HQcwLsKaXA1HH1YiAuOrA==} + + '@orval/hono@6.31.0': + resolution: {integrity: sha512-mM5WISLugu1quNkNUqYwp+StV/Z5/STm33VdPTWkoZyPJtV4NmEUZKPsowk0EN7sBF2kW+aYcp8lsNMXxXfHaw==} + + '@orval/mock@6.31.0': + resolution: {integrity: sha512-UBag0IyL0eDVdXWgIMS/YxDF57Q3XC4VRDqcuZ1lB77rfBZ4UiVqTJleczQoIqMGkdtJJlBABgWzRRts1K4img==} + + '@orval/query@6.31.0': + resolution: {integrity: sha512-aVyvSU5IbpRQnVbhChNlLX2XDnmoT1cDJ59NEFS3byhiJf1EG5XlzVve98je/BHAsVROrUC8+o6XoIjCtYbW5Q==} + + '@orval/swr@6.31.0': + resolution: {integrity: sha512-J9W/kym9jc94GizbTozpuY76yaZRN98rf3ahj+2+eW8+NRW1dVFui32Gew1qj9rcCSA54BwRMONgEn3Xqx6W6A==} + + '@orval/zod@6.31.0': + resolution: {integrity: sha512-v6wqGZf4s3tpWrnmMHlEBfhTLeebu5W3HmhP8vQ5BPkm8AB2asiZqzK3Ne9Y19Rvyx6X4FGnhnalKYkz+XxJ8Q==} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.21.3': + resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.21.3': + resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.21.3': + resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.21.3': + resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.21.3': + resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.21.3': + resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.21.3': + resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.21.3': + resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.21.3': + resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.21.3': + resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.21.3': + resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.21.3': + resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} + cpu: [x64] + os: [win32] + + '@stoplight/better-ajv-errors@1.0.3': + resolution: {integrity: sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==} + engines: {node: ^12.20 || >= 14.13} + peerDependencies: + ajv: '>=8' + + '@stoplight/json-ref-readers@1.2.2': + resolution: {integrity: sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ==} + engines: {node: '>=8.3.0'} + + '@stoplight/json-ref-resolver@3.1.6': + resolution: {integrity: sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A==} + engines: {node: '>=8.3.0'} + + '@stoplight/json@3.21.7': + resolution: {integrity: sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A==} + engines: {node: '>=8.3.0'} + + '@stoplight/ordered-object-literal@1.0.5': + resolution: {integrity: sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==} + engines: {node: '>=8'} + + '@stoplight/path@1.3.2': + resolution: {integrity: sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==} + engines: {node: '>=8'} + + '@stoplight/spectral-core@1.18.3': + resolution: {integrity: sha512-YY8x7X2SWJIhGTLPol+eFiQpWPz0D0mJdkK2i4A0QJG68KkNhypP6+JBC7/Kz3XWjqr0L/RqAd+N5cQLPOKZGQ==} + engines: {node: ^12.20 || >= 14.13} + + '@stoplight/spectral-formats@1.6.0': + resolution: {integrity: sha512-X27qhUfNluiduH0u/QwJqhOd8Wk5YKdxVmKM03Aijlx0AH1H5mYt3l9r7t2L4iyJrsBaFPnMGt7UYJDGxszbNA==} + engines: {node: '>=12'} + + '@stoplight/spectral-functions@1.8.0': + resolution: {integrity: sha512-ZrAkYA/ZGbuQ6EyG1gisF4yQ5nWP/+glcqVoGmS6kH6ekaynz2Yp6FL0oIamWj3rWedFUN7ppwTRUdo+9f/uCw==} + engines: {node: '>=12'} + + '@stoplight/spectral-parsers@1.0.4': + resolution: {integrity: sha512-nCTVvtX6q71M8o5Uvv9kxU31Gk1TRmgD6/k8HBhdCmKG6FWcwgjiZouA/R3xHLn/VwTI/9k8SdG5Mkdy0RBqbQ==} + engines: {node: ^12.20 || >=14.13} + + '@stoplight/spectral-ref-resolver@1.0.4': + resolution: {integrity: sha512-5baQIYL0NJTSVy8v6RxOR4U51xOUYM8wJri1YvlAT6bPN8m0EIxMwfVYi0xUZEMVeHcWx869nIkoqyWmOutF2A==} + engines: {node: '>=12'} + + '@stoplight/spectral-rulesets@1.19.1': + resolution: {integrity: sha512-rfGK87Y1JJCEeLC8MVdLkjUkRH+Y6VnSF388D+UWihfU9xuq2eNB9phWpTFkG+AG4HLRyGx963BmO6PyM9dBag==} + engines: {node: '>=12'} + + '@stoplight/spectral-runtime@1.1.2': + resolution: {integrity: sha512-fr5zRceXI+hrl82yAVoME+4GvJie8v3wmOe9tU+ZLRRNonizthy8qDi0Z/z4olE+vGreSDcuDOZ7JjRxFW5kTw==} + engines: {node: '>=12'} + + '@stoplight/types@12.5.0': + resolution: {integrity: sha512-dwqYcDrGmEyUv5TWrDam5TGOxU72ufyQ7hnOIIDdmW5ezOwZaBFoR5XQ9AsH49w7wgvOqB2Bmo799pJPWnpCbg==} + engines: {node: '>=8'} + + '@stoplight/types@13.20.0': + resolution: {integrity: sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==} + engines: {node: ^12.20 || >=14.13} + + '@stoplight/types@13.6.0': + resolution: {integrity: sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ==} + engines: {node: ^12.20 || >=14.13} + + '@stoplight/types@14.1.1': + resolution: {integrity: sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==} + engines: {node: ^12.20 || >=14.13} + + '@stoplight/yaml-ast-parser@0.0.50': + resolution: {integrity: sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ==} + + '@stoplight/yaml@4.3.0': + resolution: {integrity: sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==} + engines: {node: '>=10.8'} + + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + + '@types/crypto-js@4.2.2': + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} + + '@types/es-aggregate-error@1.0.6': + resolution: {integrity: sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + + '@types/marked@4.3.2': + resolution: {integrity: sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==} + + '@types/node@22.5.4': + resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} + + '@types/nprogress@0.2.3': + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} + + '@types/sortablejs@1.15.8': + resolution: {integrity: sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==} + + '@types/urijs@1.19.25': + resolution: {integrity: sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg==} + + '@types/utf8@3.0.3': + resolution: {integrity: sha512-+lqLGxWZsEe4Z6OrzBI7Ym4SMUTaMS5yOrHZ0/IL0bpIye1Qbs4PpobJL2mLDbftUXlPFZR7fu6d1yM+bHLX1w==} + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-vue-jsx@4.0.1': + resolution: {integrity: sha512-7mg9HFGnFHMEwCdB6AY83cVK4A6sCqnrjFYF4WIlebYAQVVJ/sC/CiTruVdrRlhrFoeZ8rlMxY9wYpPTIRhhAg==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@5.1.3': + resolution: {integrity: sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.11': + resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} + + '@volar/source-map@2.4.11': + resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} + + '@volar/typescript@2.4.11': + resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} + + '@vue-flow/core@1.41.1': + resolution: {integrity: sha512-/w/FHXxnOE1QFsEQMVJGD4DGinlhj8ZDJmumWMFNJztk94d28iK8BWRQD4Cy305Jnt29sf3owHgliGXHIZDLTg==} + peerDependencies: + vue: ^3.3.0 + + '@vue/babel-helper-vue-transform-on@1.2.5': + resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==} + + '@vue/babel-plugin-jsx@1.2.5': + resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.2.5': + resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.5.4': + resolution: {integrity: sha512-oNwn+BAt3n9dK9uAYvI+XGlutwuTq/wfj4xCBaZCqwwVIGtD7D6ViihEbyYZrDHIHTDE3Q6oL3/hqmAyFEy9DQ==} + + '@vue/compiler-dom@3.5.4': + resolution: {integrity: sha512-yP9RRs4BDLOLfldn6ah+AGCNovGjMbL9uHvhDHf5wan4dAHLnFGOkqtfE7PPe4HTXIqE7l/NILdYw53bo1C8jw==} + + '@vue/compiler-sfc@3.5.4': + resolution: {integrity: sha512-P+yiPhL+NYH7m0ZgCq7AQR2q7OIE+mpAEgtkqEeH9oHSdIRvUO+4X6MPvblJIWcoe4YC5a2Gdf/RsoyP8FFiPQ==} + + '@vue/compiler-ssr@3.5.4': + resolution: {integrity: sha512-acESdTXsxPnYr2C4Blv0ggx5zIFMgOzZmYU2UgvIff9POdRGbRNBHRyzHAnizcItvpgerSKQbllUc9USp3V7eg==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/eslint-config-prettier@9.0.0': + resolution: {integrity: sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==} + peerDependencies: + eslint: '>= 8.0.0' + prettier: '>= 3.0.0' + + '@vue/eslint-config-typescript@13.0.0': + resolution: {integrity: sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + eslint-plugin-vue: ^9.0.0 + typescript: '>=4.7.4' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/language-core@2.2.4': + resolution: {integrity: sha512-eGGdw7eWUwdIn9Fy/irJ7uavCGfgemuHQABgJ/hU1UgZFnbTg9VWeXvHQdhY+2SPQZWJqWXvRWIg67t4iWEa+Q==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.4': + resolution: {integrity: sha512-HKKbEuP7tYSGCq4e4nK6ZW6l5hyG66OUetefBp4budUyjvAYsnQDf+bgFzg2RAgnH0CInyqXwD9y47jwJEHrQw==} + + '@vue/runtime-core@3.5.4': + resolution: {integrity: sha512-f3ek2sTA0AFu0n+w+kCtz567Euqqa3eHewvo4klwS7mWfSj/A+UmYTwsnUFo35KeyAFY60JgrCGvEBsu1n/3LA==} + + '@vue/runtime-dom@3.5.4': + resolution: {integrity: sha512-ofyc0w6rbD5KtjhP1i9hGOKdxGpvmuB1jprP7Djlj0X7R5J/oLwuNuE98GJ8WW31Hu2VxQHtk/LYTAlW8xrJdw==} + + '@vue/server-renderer@3.5.4': + resolution: {integrity: sha512-FbjV6DJLgKRetMYFBA1UXCroCiED/Ckr53/ba9wivyd7D/Xw9fpo0T6zXzCnxQwyvkyrL7y6plgYhWhNjGxY5g==} + peerDependencies: + vue: 3.5.4 + + '@vue/shared@3.5.4': + resolution: {integrity: sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA==} + + '@vue/test-utils@2.4.6': + resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} + + '@vueuse/core@10.11.1': + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/metadata@10.11.1': + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@10.11.1': + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-errors@3.0.0: + resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} + peerDependencies: + ajv: ^8.0.1 + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + alien-signals@1.0.4: + resolution: {integrity: sha512-DJqqQD3XcsaQcQ1s+iE2jDUZmmQpXwHiR6fCAim/w87luaW+vmLY8fMlrdkmRwzaFXhkxf3rqPCR59tKVv1MDw==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + avsc@5.7.7: + resolution: {integrity: sha512-9cYNccliXZDByFsFliVwk5GvTq058Fj513CiR4E60ndDwmuXzTJEp/Bp8FyuRmGyYupLjHLs+JA9/CBoVS4/NQ==} + engines: {node: '>=0.11'} + + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + + browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001660: + resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commist@1.1.0: + resolution: {integrity: sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dependency-graph@0.11.0: + resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} + engines: {node: '>= 0.6.0'} + + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + domain-browser@4.23.0: + resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} + engines: {node: '>=10'} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + echarts@5.5.1: + resolution: {integrity: sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + electron-to-chromium@1.5.20: + resolution: {integrity: sha512-74mdl6Fs1HHzK9SUX4CKFxAtAe3nUns48y79TskHNAG6fGOlLfyKA4j855x+0b5u8rWJIrlaG9tcTPstMlwjIw==} + + element-plus@2.9.4: + resolution: {integrity: sha512-sGnW0wd9zf6lEGixXV2gfwx3X6VTMkP52qTkX7zbURJ2oariyslrKTBh2txt1sdn1pUvj2l0KY3OfSXoZGmDOw==} + peerDependencies: + vue: ^3.2.0 + + elliptic@6.5.7: + resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-aggregate-error@1.0.13: + resolution: {integrity: sha512-KkzhUUuD2CUMqEc8JEqsXEMDHzDPE8RCjZeUBitsnB1eNcAJWQPiciKsMXe3Yytj4Flw1XLl46Qcf9OxvZha7A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + 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 + + eslint-plugin-vue@9.28.0: + resolution: {integrity: sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-memoize@2.5.2: + resolution: {integrity: sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + github-markdown-css@5.7.0: + resolution: {integrity: sha512-GoYhaqELL4YUjz4tZ00PQ4JzFQkMfrBVuEeRB8W74HoikHWNiaGqSgynpwJEc+xom5uf04qoD/tUSS6ziZltaQ==} + engines: {node: '>=10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.0.4: + resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} + engines: {node: '>=4'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + help-me@3.0.0: + resolution: {integrity: sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==} + + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hocon-parser@1.0.1: + resolution: {integrity: sha512-qMKuQh6pLPQc0gXsl91hAJEjD4JghV1VukO5gKOzjolCnupCbGHpERzMCkZLwVDLq7sL8xR6P4iWhcM1my3HtA==} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + + https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.1.6: + resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} + engines: {node: '>=18'} + hasBin: true + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + immutable@5.0.3: + resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-sdsl@4.3.0: + resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsep@1.3.9: + resolution: {integrity: sha512-i1rBX5N7VPl0eYb6+mHNp52sEuaS2Wi8CDYx1X5sn9naevL78+265XJqy1qENEk7mRKwS06NHpUqiBwR7qeodw==} + engines: {node: '>= 10.16.0'} + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-to-avro@1.1.1: + resolution: {integrity: sha512-w3QC4kF0Sg8Dki89EXBY0NsECdTZfTTYMKiLUDsSneBwA7/s3Qs4e+YH1/2IAglUndXTxeKCisSV2+RfO66Kuw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@2.2.1: + resolution: {integrity: sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonpath-plus@6.0.1: + resolution: {integrity: sha512-EvGovdvau6FyLexFH2OeXfIITlgIbgZoAZe3usiySeaIDm5QS+A10DKNpaPBBqqRSZr2HN6HVNXxtwUAr2apEw==} + engines: {node: '>=10.0.0'} + + jsonpath-plus@7.1.0: + resolution: {integrity: sha512-gTaNRsPWO/K2KY6MrqaUFClF9kmuM6MFH5Dhg1VYDODgFbByw1yb7xu3hrViE/sz+dGOeMWgCzwUwQtAnCTE9g==} + engines: {node: '>=12.0.0'} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + leven@2.1.0: + resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} + engines: {node: '>=0.10.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lint-staged@15.2.10: + resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.4: + resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} + engines: {node: '>=18.0.0'} + + local-pkg@1.0.0: + resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.isempty@4.4.0: + resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.omit@4.5.0: + resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} + + lodash.omitby@4.6.0: + resolution: {integrity: sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ==} + + lodash.topath@4.5.2: + resolution: {integrity: sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.uniqby@4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + + lodash.uniqwith@4.5.0: + resolution: {integrity: sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@6.2.0: + resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==} + engines: {node: '>=10'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + monaco-editor@0.30.1: + resolution: {integrity: sha512-B/y4+b2O5G2gjuxIFtCE2EkM17R2NM7/3F8x0qcPsqy4V83bitJTIO4TIeZpYlzu/xy6INiY/+84BEm6+7Cmzg==} + + mqtt-packet@6.10.0: + resolution: {integrity: sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==} + + mqtt@4.3.8: + resolution: {integrity: sha512-2xT75uYa0kiPEF/PE0VPdavmEkoBzMT/UL9moid0rAvlCtV48qBwxD62m7Ld/4j8tSkIO1E/iqRl/S72SEOhOw==} + engines: {node: '>=10.0.0'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + nimma@0.2.2: + resolution: {integrity: sha512-V52MLl7BU+tH2Np9tDrIXK8bql3MVUadnMIl/0/oZSGC9keuro0O9UUv9QKp0aMvtN8HRew4G7byY7H4eWsxaQ==} + engines: {node: ^12.20 || >=14.13} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + node-stdlib-browser@1.2.0: + resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==} + engines: {node: '>=10'} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + number-allocator@1.0.14: + resolution: {integrity: sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==} + + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + openapi3-ts@4.2.2: + resolution: {integrity: sha512-+9g4actZKeb3czfi9gVQ4Br2Ju3KwhCAQJBNaKgye5KggqcBLIhFHH+nIkcm0BUX00TrAJl6dH4JWgM4G4JWrw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + orval@6.31.0: + resolution: {integrity: sha512-515KTDQ4VRJCT+4DsMrK/QROWRq4PXrjgxAoEx3jmP7j+aQBGbx8WhidIF6aX1UgbTxw47Lq7QVp9mbnD0lnWA==} + hasBin: true + + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + papaparse@5.4.1: + resolution: {integrity: sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pony-cause@1.1.1: + resolution: {integrity: sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g==} + engines: {node: '>=12.0.0'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.4.45: + resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.1: + resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + engines: {node: '>= 14.18.0'} + + reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + reinterval@1.1.0: + resolution: {integrity: sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rollup@4.21.3: + resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@1.1.1: + resolution: {integrity: sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==} + + sass@1.84.0: + resolution: {integrity: sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==} + engines: {node: '>=14.0.0'} + hasBin: true + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-eval@1.0.0: + resolution: {integrity: sha512-kpKJR+bqTscgC0xuAl2xHN6bB12lHjC2DCUfqjAx19bQyO3R2EVLOurm3H9AUltv/uFVcSCVNc6faegR+8NYLw==} + engines: {node: '>=12'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + sortablejs@1.15.3: + resolution: {integrity: sha512-zdK3/kwwAK1cJgy1rwl1YtNTbRmc8qW/+vgXf75A7NHag5of4pyI6uK86ktmQETyWRH7IGaE73uZOOBcGxgqZg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + + synckit@0.9.1: + resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} + engines: {node: ^14.18.0 || >=16.0.0} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tsconfck@2.1.2: + resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unimport@4.1.2: + resolution: {integrity: sha512-oVUL7PSlyVV3QRhsdcyYEMaDX8HJyS/CnUonEJTYA3//bWO+o/4gG8F7auGWWWkrrxBQBYOO8DKe+C53ktpRXw==} + engines: {node: '>=18.12.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin-auto-import@19.1.0: + resolution: {integrity: sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^3.2.2 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + + unplugin-utils@0.2.4: + resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} + engines: {node: '>=18.12.0'} + + unplugin-vue-components@28.4.0: + resolution: {integrity: sha512-fnamX2RiKM30nPK4tihEas+bHnbLICo6MmOiP4jGg7fAlgNEuaLvN9yx96JwZDOYfLQcrNzikDdPhZ8k6pkhMg==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + + unplugin@2.2.0: + resolution: {integrity: sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==} + engines: {node: '>=18.12.0'} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urijs@1.19.11: + resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} + + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + + vite-plugin-node-polyfills@0.22.0: + resolution: {integrity: sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + + vite@5.4.4: + resolution: {integrity: sha512-RHFCkULitycHVTtelJ6jQLd+KSAAzOgEYorV32R2q++M6COBjKJR6BxqClwp5sf0XaBDjVMuJ9wnNfyAJwjMkA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-component-type-helpers@2.1.6: + resolution: {integrity: sha512-ng11B8B/ZADUMMOsRbqv0arc442q7lifSubD0v8oDXIFoMg/mXwAPUunrroIDkY+mcD0dHKccdaznSVp8EoX3w==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-i18n@9.14.0: + resolution: {integrity: sha512-LxmpRuCt2rI8gqU+kxeflRZMQn4D5+4M3oP3PWZdowW/ePJraHqhF7p4CuaME52mUxdw3Mmy2yAUKgfZYgCRjA==} + engines: {node: '>= 16'} + peerDependencies: + vue: ^3.0.0 + + vue-router@4.4.4: + resolution: {integrity: sha512-3MlnDqwRwZwCQVbtVfpsU+nrNymNjnXSsQtXName5925NVC1+326VVfYH9vSrA0N13teGEo8z5x7gbRnGjCDiQ==} + peerDependencies: + vue: ^3.2.0 + + vue-tsc@2.2.4: + resolution: {integrity: sha512-3EVHlxtpMXcb5bCaK7QDFTbEkMusDfVk0HVRrkv5hEb+Clpu9a96lKUXJAeD/akRlkoA4H8MCHgBDN19S6FnzA==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.4: + resolution: {integrity: sha512-3yAj2gkmiY+i7+22A1PWM+kjOVXjU74UPINcTiN7grIVPyFFI0lpGwHlV/4xydDmobaBn7/xmi+YG8HeSlCTcg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vuex@4.1.0: + resolution: {integrity: sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==} + peerDependencies: + vue: ^3.2.0 + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} + hasBin: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zrender@5.6.0: + resolution: {integrity: sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@apidevtools/json-schema-ref-parser@9.0.6': + dependencies: + '@jsdevtools/ono': 7.1.3 + call-me-maybe: 1.0.2 + js-yaml: 3.14.1 + + '@apidevtools/openapi-schemas@2.1.0': {} + + '@apidevtools/swagger-methods@3.0.2': {} + + '@apidevtools/swagger-parser@10.1.0(openapi-types@12.1.3)': + dependencies: + '@apidevtools/json-schema-ref-parser': 9.0.6 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + + '@asyncapi/specs@4.3.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.1.0 + + '@babel/compat-data@7.25.4': {} + + '@babel/core@7.25.2': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.25.6': + dependencies: + '@babel/types': 7.25.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.24.7': + dependencies: + '@babel/types': 7.25.6 + + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/traverse': 7.25.6 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.24.8': + dependencies: + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.24.7': + dependencies: + '@babel/types': 7.25.6 + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + dependencies: + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helpers@7.25.6': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.0 + + '@babel/parser@7.25.6': + dependencies: + '@babel/types': 7.25.6 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + + '@babel/traverse@7.25.6': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.25.6': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@ctrl/tinycolor@3.6.1': {} + + '@element-plus/icons-vue@1.1.4(vue@3.5.4(typescript@5.5.4))': + dependencies: + vue: 3.5.4(typescript@5.5.4) + + '@element-plus/icons-vue@2.3.1(vue@3.5.4(typescript@5.5.4))': + dependencies: + vue: 3.5.4(typescript@5.5.4) + + '@emqx/shared-ui-i18n@0.0.39': {} + + '@emqx/shared-ui-utils@0.0.16(vue@3.5.4(typescript@5.5.4))': + dependencies: + '@emqx/shared-ui-constants': link:../constants + '@emqx/shared-ui-i18n': link:../i18n + json-bigint: 1.0.0 + papaparse: 5.4.1 + vue-i18n: 9.14.0(vue@3.5.4(typescript@5.5.4)) + transitivePeerDependencies: + - vue + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.7 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@exodus/schemasafe@1.3.0': {} + + '@floating-ui/core@1.6.7': + dependencies: + '@floating-ui/utils': 0.2.7 + + '@floating-ui/dom@1.6.10': + dependencies: + '@floating-ui/core': 1.6.7 + '@floating-ui/utils': 0.2.7 + + '@floating-ui/utils@0.2.7': {} + + '@highlightjs/vue-plugin@2.1.0(highlight.js@10.7.3)(vue@3.5.4(typescript@5.5.4))': + dependencies: + highlight.js: 10.7.3 + vue: 3.5.4(typescript@5.5.4) + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@ibm-cloud/openapi-ruleset-utilities@1.3.2': {} + + '@ibm-cloud/openapi-ruleset@1.21.1': + dependencies: + '@ibm-cloud/openapi-ruleset-utilities': 1.3.2 + '@stoplight/spectral-formats': 1.6.0 + '@stoplight/spectral-functions': 1.8.0 + '@stoplight/spectral-rulesets': 1.19.1 + chalk: 4.1.2 + lodash: 4.17.21 + loglevel: 1.9.2 + loglevel-plugin-prefix: 0.8.4 + minimatch: 6.2.0 + validator: 13.12.0 + transitivePeerDependencies: + - encoding + + '@intlify/core-base@9.14.0': + dependencies: + '@intlify/message-compiler': 9.14.0 + '@intlify/shared': 9.14.0 + + '@intlify/message-compiler@9.14.0': + dependencies: + '@intlify/shared': 9.14.0 + source-map-js: 1.2.1 + + '@intlify/shared@9.14.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jsdevtools/ono@7.1.3': {} + + '@jsep-plugin/regex@1.0.3(jsep@1.3.9)': + dependencies: + jsep: 1.3.9 + + '@jsep-plugin/ternary@1.1.3(jsep@1.3.9)': + dependencies: + jsep: 1.3.9 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@one-ini/wasm@0.1.1': {} + + '@orval/angular@6.31.0(openapi-types@12.1.3)': + dependencies: + '@orval/core': 6.31.0(openapi-types@12.1.3) + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + + '@orval/axios@6.31.0(openapi-types@12.1.3)': + dependencies: + '@orval/core': 6.31.0(openapi-types@12.1.3) + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + + '@orval/core@6.31.0(openapi-types@12.1.3)': + dependencies: + '@apidevtools/swagger-parser': 10.1.0(openapi-types@12.1.3) + '@ibm-cloud/openapi-ruleset': 1.21.1 + acorn: 8.12.1 + ajv: 8.17.1 + chalk: 4.1.2 + compare-versions: 6.1.1 + debug: 4.3.7 + esbuild: 0.19.12 + esutils: 2.0.3 + fs-extra: 11.2.0 + globby: 11.1.0 + lodash.get: 4.4.2 + lodash.isempty: 4.4.0 + lodash.omit: 4.5.0 + lodash.uniq: 4.5.0 + lodash.uniqby: 4.7.0 + lodash.uniqwith: 4.5.0 + micromatch: 4.0.8 + openapi3-ts: 4.2.2 + swagger2openapi: 7.0.8 + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + + '@orval/fetch@6.31.0(openapi-types@12.1.3)': + dependencies: + '@orval/core': 6.31.0(openapi-types@12.1.3) + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + + '@orval/hono@6.31.0(openapi-types@12.1.3)': + dependencies: + '@orval/core': 6.31.0(openapi-types@12.1.3) + '@orval/zod': 6.31.0(openapi-types@12.1.3) + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + + '@orval/mock@6.31.0(openapi-types@12.1.3)': + dependencies: + '@orval/core': 6.31.0(openapi-types@12.1.3) + lodash.get: 4.4.2 + lodash.omit: 4.5.0 + openapi3-ts: 4.2.2 + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + + '@orval/query@6.31.0(openapi-types@12.1.3)': + dependencies: + '@orval/core': 6.31.0(openapi-types@12.1.3) + lodash.omitby: 4.6.0 + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + + '@orval/swr@6.31.0(openapi-types@12.1.3)': + dependencies: + '@orval/core': 6.31.0(openapi-types@12.1.3) + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + + '@orval/zod@6.31.0(openapi-types@12.1.3)': + dependencies: + '@orval/core': 6.31.0(openapi-types@12.1.3) + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@rollup/plugin-inject@5.0.5(rollup@4.21.3)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.21.3) + estree-walker: 2.0.2 + magic-string: 0.30.11 + optionalDependencies: + rollup: 4.21.3 + + '@rollup/pluginutils@5.1.0(rollup@4.21.3)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.3 + + '@rollup/rollup-android-arm-eabi@4.21.3': + optional: true + + '@rollup/rollup-android-arm64@4.21.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.21.3': + optional: true + + '@rollup/rollup-darwin-x64@4.21.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.21.3': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.21.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.21.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.21.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.21.3': + optional: true + + '@stoplight/better-ajv-errors@1.0.3(ajv@8.17.1)': + dependencies: + ajv: 8.17.1 + jsonpointer: 5.0.1 + leven: 3.1.0 + + '@stoplight/json-ref-readers@1.2.2': + dependencies: + node-fetch: 2.7.0 + tslib: 1.14.1 + transitivePeerDependencies: + - encoding + + '@stoplight/json-ref-resolver@3.1.6': + dependencies: + '@stoplight/json': 3.21.7 + '@stoplight/path': 1.3.2 + '@stoplight/types': 13.6.0 + '@types/urijs': 1.19.25 + dependency-graph: 0.11.0 + fast-memoize: 2.5.2 + immer: 9.0.21 + lodash: 4.17.21 + tslib: 2.7.0 + urijs: 1.19.11 + + '@stoplight/json@3.21.7': + dependencies: + '@stoplight/ordered-object-literal': 1.0.5 + '@stoplight/path': 1.3.2 + '@stoplight/types': 13.20.0 + jsonc-parser: 2.2.1 + lodash: 4.17.21 + safe-stable-stringify: 1.1.1 + + '@stoplight/ordered-object-literal@1.0.5': {} + + '@stoplight/path@1.3.2': {} + + '@stoplight/spectral-core@1.18.3': + dependencies: + '@stoplight/better-ajv-errors': 1.0.3(ajv@8.17.1) + '@stoplight/json': 3.21.7 + '@stoplight/path': 1.3.2 + '@stoplight/spectral-parsers': 1.0.4 + '@stoplight/spectral-ref-resolver': 1.0.4 + '@stoplight/spectral-runtime': 1.1.2 + '@stoplight/types': 13.6.0 + '@types/es-aggregate-error': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-errors: 3.0.0(ajv@8.17.1) + ajv-formats: 2.1.1(ajv@8.17.1) + es-aggregate-error: 1.0.13 + jsonpath-plus: 7.1.0 + lodash: 4.17.21 + lodash.topath: 4.5.2 + minimatch: 3.1.2 + nimma: 0.2.2 + pony-cause: 1.1.1 + simple-eval: 1.0.0 + tslib: 2.7.0 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-formats@1.6.0': + dependencies: + '@stoplight/json': 3.21.7 + '@stoplight/spectral-core': 1.18.3 + '@types/json-schema': 7.0.15 + tslib: 2.7.0 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-functions@1.8.0': + dependencies: + '@stoplight/better-ajv-errors': 1.0.3(ajv@8.17.1) + '@stoplight/json': 3.21.7 + '@stoplight/spectral-core': 1.18.3 + '@stoplight/spectral-formats': 1.6.0 + '@stoplight/spectral-runtime': 1.1.2 + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) + ajv-errors: 3.0.0(ajv@8.17.1) + ajv-formats: 2.1.1(ajv@8.17.1) + lodash: 4.17.21 + tslib: 2.7.0 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-parsers@1.0.4': + dependencies: + '@stoplight/json': 3.21.7 + '@stoplight/types': 14.1.1 + '@stoplight/yaml': 4.3.0 + tslib: 2.7.0 + + '@stoplight/spectral-ref-resolver@1.0.4': + dependencies: + '@stoplight/json-ref-readers': 1.2.2 + '@stoplight/json-ref-resolver': 3.1.6 + '@stoplight/spectral-runtime': 1.1.2 + dependency-graph: 0.11.0 + tslib: 2.7.0 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-rulesets@1.19.1': + dependencies: + '@asyncapi/specs': 4.3.1 + '@stoplight/better-ajv-errors': 1.0.3(ajv@8.17.1) + '@stoplight/json': 3.21.7 + '@stoplight/spectral-core': 1.18.3 + '@stoplight/spectral-formats': 1.6.0 + '@stoplight/spectral-functions': 1.8.0 + '@stoplight/spectral-runtime': 1.1.2 + '@stoplight/types': 13.20.0 + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + json-schema-traverse: 1.0.0 + leven: 3.1.0 + lodash: 4.17.21 + tslib: 2.7.0 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-runtime@1.1.2': + dependencies: + '@stoplight/json': 3.21.7 + '@stoplight/path': 1.3.2 + '@stoplight/types': 12.5.0 + abort-controller: 3.0.0 + lodash: 4.17.21 + node-fetch: 2.7.0 + tslib: 2.7.0 + transitivePeerDependencies: + - encoding + + '@stoplight/types@12.5.0': + dependencies: + '@types/json-schema': 7.0.15 + utility-types: 3.11.0 + + '@stoplight/types@13.20.0': + dependencies: + '@types/json-schema': 7.0.15 + utility-types: 3.11.0 + + '@stoplight/types@13.6.0': + dependencies: + '@types/json-schema': 7.0.15 + utility-types: 3.11.0 + + '@stoplight/types@14.1.1': + dependencies: + '@types/json-schema': 7.0.15 + utility-types: 3.11.0 + + '@stoplight/yaml-ast-parser@0.0.50': {} + + '@stoplight/yaml@4.3.0': + dependencies: + '@stoplight/ordered-object-literal': 1.0.5 + '@stoplight/types': 14.1.1 + '@stoplight/yaml-ast-parser': 0.0.50 + tslib: 2.7.0 + + '@sxzz/popperjs-es@2.11.7': {} + + '@types/crypto-js@4.2.2': {} + + '@types/es-aggregate-error@1.0.6': + dependencies: + '@types/node': 22.5.4 + + '@types/estree@1.0.5': {} + + '@types/json-schema@7.0.15': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.7 + + '@types/lodash@4.17.7': {} + + '@types/marked@4.3.2': {} + + '@types/node@22.5.4': + dependencies: + undici-types: 6.19.8 + + '@types/nprogress@0.2.3': {} + + '@types/sortablejs@1.15.8': {} + + '@types/urijs@1.19.25': {} + + '@types/utf8@3.0.3': {} + + '@types/web-bluetooth@0.0.16': {} + + '@types/web-bluetooth@0.0.20': {} + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.7 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.7 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.7 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-vue-jsx@4.0.1(vite@5.4.4(@types/node@22.5.4)(sass@1.84.0))(vue@3.5.4(typescript@5.5.4))': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.25.2) + vite: 5.4.4(@types/node@22.5.4)(sass@1.84.0) + vue: 3.5.4(typescript@5.5.4) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@5.1.3(vite@5.4.4(@types/node@22.5.4)(sass@1.84.0))(vue@3.5.4(typescript@5.5.4))': + dependencies: + vite: 5.4.4(@types/node@22.5.4)(sass@1.84.0) + vue: 3.5.4(typescript@5.5.4) + + '@volar/language-core@2.4.11': + dependencies: + '@volar/source-map': 2.4.11 + + '@volar/source-map@2.4.11': {} + + '@volar/typescript@2.4.11': + dependencies: + '@volar/language-core': 2.4.11 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue-flow/core@1.41.1(vue@3.5.4(typescript@5.5.4))': + dependencies: + '@vueuse/core': 10.11.1(vue@3.5.4(typescript@5.5.4)) + d3-drag: 3.0.0 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + vue: 3.5.4(typescript@5.5.4) + transitivePeerDependencies: + - '@vue/composition-api' + + '@vue/babel-helper-vue-transform-on@1.2.5': {} + + '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.25.2)': + dependencies: + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + '@vue/babel-helper-vue-transform-on': 1.2.5 + '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.25.2) + html-tags: 3.3.1 + svg-tags: 1.0.0 + optionalDependencies: + '@babel/core': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.25.2)': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/parser': 7.25.6 + '@vue/compiler-sfc': 3.5.4 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.4': + dependencies: + '@babel/parser': 7.25.6 + '@vue/shared': 3.5.4 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.4': + dependencies: + '@vue/compiler-core': 3.5.4 + '@vue/shared': 3.5.4 + + '@vue/compiler-sfc@3.5.4': + dependencies: + '@babel/parser': 7.25.6 + '@vue/compiler-core': 3.5.4 + '@vue/compiler-dom': 3.5.4 + '@vue/compiler-ssr': 3.5.4 + '@vue/shared': 3.5.4 + estree-walker: 2.0.2 + magic-string: 0.30.11 + postcss: 8.4.45 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.4': + dependencies: + '@vue/compiler-dom': 3.5.4 + '@vue/shared': 3.5.4 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/devtools-api@6.6.4': {} + + '@vue/eslint-config-prettier@9.0.0(eslint@8.57.0)(prettier@3.3.3)': + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3) + prettier: 3.3.3 + transitivePeerDependencies: + - '@types/eslint' + + '@vue/eslint-config-typescript@13.0.0(eslint-plugin-vue@9.28.0(eslint@8.57.0))(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 + eslint-plugin-vue: 9.28.0(eslint@8.57.0) + vue-eslint-parser: 9.4.3(eslint@8.57.0) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@vue/language-core@2.2.4(typescript@5.5.4)': + dependencies: + '@volar/language-core': 2.4.11 + '@vue/compiler-dom': 3.5.4 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.4 + alien-signals: 1.0.4 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.5.4 + + '@vue/reactivity@3.5.4': + dependencies: + '@vue/shared': 3.5.4 + + '@vue/runtime-core@3.5.4': + dependencies: + '@vue/reactivity': 3.5.4 + '@vue/shared': 3.5.4 + + '@vue/runtime-dom@3.5.4': + dependencies: + '@vue/reactivity': 3.5.4 + '@vue/runtime-core': 3.5.4 + '@vue/shared': 3.5.4 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.4(vue@3.5.4(typescript@5.5.4))': + dependencies: + '@vue/compiler-ssr': 3.5.4 + '@vue/shared': 3.5.4 + vue: 3.5.4(typescript@5.5.4) + + '@vue/shared@3.5.4': {} + + '@vue/test-utils@2.4.6': + dependencies: + js-beautify: 1.15.1 + vue-component-type-helpers: 2.1.6 + + '@vueuse/core@10.11.1(vue@3.5.4(typescript@5.5.4))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.4(typescript@5.5.4)) + vue-demi: 0.14.10(vue@3.5.4(typescript@5.5.4)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@9.13.0(vue@3.5.4(typescript@5.5.4))': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.5.4(typescript@5.5.4)) + vue-demi: 0.14.10(vue@3.5.4(typescript@5.5.4)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@10.11.1': {} + + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@10.11.1(vue@3.5.4(typescript@5.5.4))': + dependencies: + vue-demi: 0.14.10(vue@3.5.4(typescript@5.5.4)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/shared@9.13.0(vue@3.5.4(typescript@5.5.4))': + dependencies: + vue-demi: 0.14.10(vue@3.5.4(typescript@5.5.4)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + abbrev@2.0.0: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + acorn@8.14.0: {} + + ajv-draft-04@1.0.0(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-errors@3.0.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + alien-signals@1.0.4: {} + + ansi-colors@4.1.3: {} + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-union@2.1.0: {} + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + assert@2.1.0: + dependencies: + call-bind: 1.0.7 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.5 + util: 0.12.5 + + astring@1.9.0: {} + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + avsc@5.7.7: {} + + axios@1.7.7: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bignumber.js@9.1.2: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bn.js@4.12.0: {} + + bn.js@5.2.1: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browser-resolve@2.0.0: + dependencies: + resolve: 1.22.8 + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-rsa@4.1.0: + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + + browserify-sign@4.2.3: + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.7 + hash-base: 3.0.4 + inherits: 2.0.4 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + browserify-zlib@0.2.0: + dependencies: + pako: 1.0.11 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001660 + electron-to-chromium: 1.5.20 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-status-codes@3.0.0: {} + + cac@6.7.14: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + call-me-maybe@1.0.2: {} + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001660: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.1 + + cipher-base@1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@12.1.0: {} + + commander@2.20.3: {} + + commist@1.1.0: + dependencies: + leven: 2.1.0 + minimist: 1.2.8 + + compare-versions@6.1.1: {} + + concat-map@0.0.1: {} + + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + confbox@0.1.8: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + console-browserify@1.2.0: {} + + constants-browserify@1.0.0: {} + + convert-source-map@2.0.0: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + + core-util-is@1.0.3: {} + + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.7 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + create-require@1.1.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-browserify@3.12.0: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.3 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + + crypto-js@4.2.0: {} + + cssesc@3.0.0: {} + + cssfilter@0.0.10: {} + + csstype@3.1.3: {} + + d3-color@3.1.0: {} + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-ease@3.0.1: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-selection@3.0.0: {} + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + dayjs@1.11.13: {} + + de-indent@1.0.2: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + dependency-graph@0.11.0: {} + + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + detect-libc@1.0.3: + optional: true + + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + domain-browser@4.23.0: {} + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + eastasianwidth@0.2.0: {} + + echarts@5.5.1: + dependencies: + tslib: 2.3.0 + zrender: 5.6.0 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.3 + + electron-to-chromium@1.5.20: {} + + element-plus@2.9.4(vue@3.5.4(typescript@5.5.4)): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.1(vue@3.5.4(typescript@5.5.4)) + '@floating-ui/dom': 1.6.10 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.7 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.5.4(typescript@5.5.4)) + async-validator: 4.2.5 + dayjs: 1.11.13 + escape-html: 1.0.3 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.4(typescript@5.5.4) + transitivePeerDependencies: + - '@vue/composition-api' + + elliptic@6.5.7: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@4.5.0: {} + + environment@1.1.0: {} + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-aggregate-error@1.0.13: + dependencies: + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + function-bind: 1.1.2 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + set-function-name: 2.0.2 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + es6-promise@3.3.1: {} + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@9.1.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3): + dependencies: + eslint: 8.57.0 + prettier: 3.3.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.1 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) + + eslint-plugin-vue@9.28.0(eslint@8.57.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + eslint: 8.57.0 + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.6.3 + vue-eslint-parser: 9.4.3(eslint@8.57.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.7 + 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.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + 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.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + esm@3.2.25: {} + + espree@9.6.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + esutils@2.0.3: {} + + event-target-shim@5.0.1: {} + + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-memoize@2.5.2: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@3.0.1: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + follow-redirects@1.15.9: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + github-markdown-css@5.7.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hash-base@3.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + hash-base@3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + help-me@3.0.0: + dependencies: + glob: 7.2.3 + readable-stream: 3.6.2 + + highlight.js@10.7.3: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + hocon-parser@1.0.1: {} + + html-tags@3.3.1: {} + + http2-client@1.3.5: {} + + https-browserify@1.0.0: {} + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + husky@9.1.6: {} + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + immer@9.0.21: {} + + immutable@5.0.3: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isomorphic-timers-promises@1.0.1: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-base64@3.7.7: {} + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + js-sdsl@4.3.0: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsep@1.3.9: {} + + jsesc@2.5.2: {} + + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.1.2 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-to-avro@1.1.1: + dependencies: + avsc: 5.7.7 + debug: 4.3.7 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + + json5@2.2.3: {} + + jsonc-parser@2.2.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonpath-plus@6.0.1: + optional: true + + jsonpath-plus@7.1.0: {} + + jsonpointer@5.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + leven@2.1.0: {} + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.2: {} + + lint-staged@15.2.10: + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.7 + execa: 8.0.1 + lilconfig: 3.1.2 + listr2: 8.2.4 + micromatch: 4.0.8 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.5.1 + transitivePeerDependencies: + - supports-color + + listr2@8.2.4: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + local-pkg@1.0.0: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.21 + lodash-es: 4.17.21 + + lodash.get@4.4.2: {} + + lodash.isempty@4.4.0: {} + + lodash.merge@4.6.2: {} + + lodash.omit@4.5.0: {} + + lodash.omitby@4.6.0: {} + + lodash.topath@4.5.2: {} + + lodash.uniq@4.5.0: {} + + lodash.uniqby@4.7.0: {} + + lodash.uniqwith@4.5.0: {} + + lodash@4.17.21: {} + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + loglevel-plugin-prefix@0.8.4: {} + + loglevel@1.9.2: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + marked@4.3.0: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + memoize-one@6.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@6.2.0: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 + + monaco-editor@0.30.1: {} + + mqtt-packet@6.10.0: + dependencies: + bl: 4.1.0 + debug: 4.3.7 + process-nextick-args: 2.0.1 + transitivePeerDependencies: + - supports-color + + mqtt@4.3.8: + dependencies: + commist: 1.1.0 + concat-stream: 2.0.0 + debug: 4.3.7 + duplexify: 4.1.3 + help-me: 3.0.0 + inherits: 2.0.4 + lru-cache: 6.0.0 + minimist: 1.2.8 + mqtt-packet: 6.10.0 + number-allocator: 1.0.14 + pump: 3.0.2 + readable-stream: 3.6.2 + reinterval: 1.1.0 + rfdc: 1.4.1 + split2: 3.2.2 + ws: 7.5.10 + xtend: 4.0.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + nimma@0.2.2: + dependencies: + '@jsep-plugin/regex': 1.0.3(jsep@1.3.9) + '@jsep-plugin/ternary': 1.1.3(jsep@1.3.9) + astring: 1.9.0 + jsep: 1.3.9 + optionalDependencies: + jsonpath-plus: 6.0.1 + lodash.topath: 4.5.2 + + node-addon-api@7.1.1: + optional: true + + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + + node-releases@2.0.18: {} + + node-stdlib-browser@1.2.0: + dependencies: + assert: 2.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.0 + domain-browser: 4.23.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.4 + util: 0.12.5 + vm-browserify: 1.1.2 + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-path@3.0.0: {} + + normalize-wheel-es@1.2.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + number-allocator@1.0.14: + dependencies: + debug: 4.3.7 + js-sdsl: 4.3.0 + transitivePeerDependencies: + - supports-color + + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.2 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.7.2 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.2 + + object-inspect@1.13.2: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + openapi-types@12.1.3: {} + + openapi3-ts@4.2.2: + dependencies: + yaml: 2.5.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + orval@6.31.0(openapi-types@12.1.3)(typescript@5.5.4): + dependencies: + '@apidevtools/swagger-parser': 10.1.0(openapi-types@12.1.3) + '@orval/angular': 6.31.0(openapi-types@12.1.3) + '@orval/axios': 6.31.0(openapi-types@12.1.3) + '@orval/core': 6.31.0(openapi-types@12.1.3) + '@orval/fetch': 6.31.0(openapi-types@12.1.3) + '@orval/hono': 6.31.0(openapi-types@12.1.3) + '@orval/mock': 6.31.0(openapi-types@12.1.3) + '@orval/query': 6.31.0(openapi-types@12.1.3) + '@orval/swr': 6.31.0(openapi-types@12.1.3) + '@orval/zod': 6.31.0(openapi-types@12.1.3) + ajv: 8.17.1 + cac: 6.7.14 + chalk: 4.1.2 + chokidar: 3.6.0 + enquirer: 2.4.1 + execa: 5.1.1 + find-up: 5.0.0 + fs-extra: 11.2.0 + lodash.uniq: 4.5.0 + openapi3-ts: 4.2.2 + string-argv: 0.3.2 + tsconfck: 2.1.2(typescript@5.5.4) + transitivePeerDependencies: + - encoding + - openapi-types + - supports-color + - typescript + + os-browserify@0.3.0: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.0: {} + + pako@1.0.11: {} + + papaparse@5.4.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-asn1@5.1.7: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + hash-base: 3.0.4 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + picocolors@1.1.0: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pidtree@0.6.0: {} + + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pony-cause@1.1.1: {} + + possible-typed-array-names@1.0.0: {} + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.4.45: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.3.3: {} + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + proto-list@1.2.4: {} + + proxy-from-env@1.1.0: {} + + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.7 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@1.4.1: {} + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + + querystring-es3@0.2.1: {} + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.1: {} + + reftools@1.1.9: {} + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + reinterval@1.1.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + ripemd160@2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + + rollup@4.21.3: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.3 + '@rollup/rollup-android-arm64': 4.21.3 + '@rollup/rollup-darwin-arm64': 4.21.3 + '@rollup/rollup-darwin-x64': 4.21.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 + '@rollup/rollup-linux-arm-musleabihf': 4.21.3 + '@rollup/rollup-linux-arm64-gnu': 4.21.3 + '@rollup/rollup-linux-arm64-musl': 4.21.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 + '@rollup/rollup-linux-riscv64-gnu': 4.21.3 + '@rollup/rollup-linux-s390x-gnu': 4.21.3 + '@rollup/rollup-linux-x64-gnu': 4.21.3 + '@rollup/rollup-linux-x64-musl': 4.21.3 + '@rollup/rollup-win32-arm64-msvc': 4.21.3 + '@rollup/rollup-win32-ia32-msvc': 4.21.3 + '@rollup/rollup-win32-x64-msvc': 4.21.3 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safe-stable-stringify@1.1.1: {} + + sass@1.84.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.0.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + scule@1.3.0: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + setimmediate@1.0.5: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-eval@1.0.0: + dependencies: + jsep: 1.3.9 + + slash@3.0.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + sortablejs@1.15.3: {} + + source-map-js@1.2.1: {} + + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + + sprintf-js@1.0.3: {} + + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + stream-http@3.2.0: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + + stream-shift@1.0.3: {} + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-tags@1.0.0: {} + + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + + synckit@0.9.1: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.7.0 + + text-table@0.2.0: {} + + timers-browserify@2.0.12: + dependencies: + setimmediate: 1.0.5 + + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toggle-selection@1.0.6: {} + + tr46@0.0.3: {} + + ts-api-utils@1.3.0(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + tsconfck@2.1.2(typescript@5.5.4): + optionalDependencies: + typescript: 5.5.4 + + tslib@1.14.1: {} + + tslib@2.3.0: {} + + tslib@2.7.0: {} + + tty-browserify@0.0.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typedarray@0.0.6: {} + + typescript@5.5.4: {} + + ufo@1.5.4: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + undici-types@6.19.8: {} + + unimport@4.1.2: + dependencies: + acorn: 8.14.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.0.0 + magic-string: 0.30.17 + mlly: 1.7.4 + pathe: 2.0.3 + picomatch: 4.0.2 + pkg-types: 1.3.1 + scule: 1.3.0 + strip-literal: 3.0.0 + tinyglobby: 0.2.12 + unplugin: 2.2.0 + unplugin-utils: 0.2.4 + + universalify@2.0.1: {} + + unplugin-auto-import@19.1.0(@vueuse/core@10.11.1(vue@3.5.4(typescript@5.5.4))): + dependencies: + local-pkg: 1.0.0 + magic-string: 0.30.17 + picomatch: 4.0.2 + unimport: 4.1.2 + unplugin: 2.2.0 + unplugin-utils: 0.2.4 + optionalDependencies: + '@vueuse/core': 10.11.1(vue@3.5.4(typescript@5.5.4)) + + unplugin-utils@0.2.4: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.2 + + unplugin-vue-components@28.4.0(@babel/parser@7.25.6)(vue@3.5.4(typescript@5.5.4)): + dependencies: + chokidar: 3.6.0 + debug: 4.4.0 + local-pkg: 1.0.0 + magic-string: 0.30.17 + mlly: 1.7.4 + tinyglobby: 0.2.12 + unplugin: 2.2.0 + unplugin-utils: 0.2.4 + vue: 3.5.4(typescript@5.5.4) + optionalDependencies: + '@babel/parser': 7.25.6 + transitivePeerDependencies: + - supports-color + + unplugin@2.2.0: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.2.0 + picocolors: 1.1.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urijs@1.19.11: {} + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.13.0 + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + + utility-types@3.11.0: {} + + validator@13.12.0: {} + + vite-plugin-node-polyfills@0.22.0(rollup@4.21.3)(vite@5.4.4(@types/node@22.5.4)(sass@1.84.0)): + dependencies: + '@rollup/plugin-inject': 5.0.5(rollup@4.21.3) + node-stdlib-browser: 1.2.0 + vite: 5.4.4(@types/node@22.5.4)(sass@1.84.0) + transitivePeerDependencies: + - rollup + + vite@5.4.4(@types/node@22.5.4)(sass@1.84.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.45 + rollup: 4.21.3 + optionalDependencies: + '@types/node': 22.5.4 + fsevents: 2.3.3 + sass: 1.84.0 + + vm-browserify@1.1.2: {} + + vscode-uri@3.1.0: {} + + vue-component-type-helpers@2.1.6: {} + + vue-demi@0.14.10(vue@3.5.4(typescript@5.5.4)): + dependencies: + vue: 3.5.4(typescript@5.5.4) + + vue-eslint-parser@9.4.3(eslint@8.57.0): + dependencies: + debug: 4.3.7 + eslint: 8.57.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + vue-i18n@9.14.0(vue@3.5.4(typescript@5.5.4)): + dependencies: + '@intlify/core-base': 9.14.0 + '@intlify/shared': 9.14.0 + '@vue/devtools-api': 6.6.4 + vue: 3.5.4(typescript@5.5.4) + + vue-router@4.4.4(vue@3.5.4(typescript@5.5.4)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.4(typescript@5.5.4) + + vue-tsc@2.2.4(typescript@5.5.4): + dependencies: + '@volar/typescript': 2.4.11 + '@vue/language-core': 2.2.4(typescript@5.5.4) + typescript: 5.5.4 + + vue@3.5.4(typescript@5.5.4): + dependencies: + '@vue/compiler-dom': 3.5.4 + '@vue/compiler-sfc': 3.5.4 + '@vue/runtime-dom': 3.5.4 + '@vue/server-renderer': 3.5.4(vue@3.5.4(typescript@5.5.4)) + '@vue/shared': 3.5.4 + optionalDependencies: + typescript: 5.5.4 + + vuex@4.1.0(vue@3.5.4(typescript@5.5.4)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.4(typescript@5.5.4) + + webidl-conversions@3.0.1: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@7.5.10: {} + + xml-name-validator@4.0.0: {} + + xss@1.0.15: + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@1.10.2: {} + + yaml@2.5.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + zrender@5.6.0: + dependencies: + tslib: 2.3.0 diff --git a/public/static/favicon.ico b/public/favicon.ico similarity index 100% rename from public/static/favicon.ico rename to public/favicon.ico diff --git a/public/index.html b/public/index.html deleted file mode 100644 index 01924e894..000000000 --- a/public/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - EMQX Dashboard - - - -
- - - diff --git a/scripts/checkPackageVersion.js b/scripts/checkPackageVersion.cjs similarity index 86% rename from scripts/checkPackageVersion.js rename to scripts/checkPackageVersion.cjs index 62a67efe2..76f579f69 100644 --- a/scripts/checkPackageVersion.js +++ b/scripts/checkPackageVersion.cjs @@ -1,7 +1,11 @@ /* eslint-disable @typescript-eslint/no-var-requires */ const packageJSON = require('../package.json') const axios = require('axios') -const baseURL = process.env.HOST_URL || 'http://localhost:18083' +const { loadEnv } = require('vite') + +const envVariables = loadEnv('development', process.cwd(), '') +const baseURL = envVariables.HOST_URL || 'http://localhost:18083' + const rawPackageVersion = packageJSON.version const packageVersionRegex = /^(\d+\.\d+)/ diff --git a/scripts/checkUselessI18n.js b/scripts/checkUselessI18n.js index 3c08ccfa5..eae512bab 100644 --- a/scripts/checkUselessI18n.js +++ b/scripts/checkUselessI18n.js @@ -1,15 +1,23 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const fs = require('fs') -const { execSync } = require('child_process') -const path = require('path') +import fs from 'fs/promises' +import { execSync } from 'child_process' +import path from 'path' +import { fileURLToPath } from 'url' +import { dirname } from 'path' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename) const useLessKey = {} -const scanFile = (filePath) => { +const scanFile = async (filePath) => { console.log(`Checking ${filePath}`) - const { default: json_data } = require('esm')(module)(`../${filePath}`) + const fullPath = path.resolve(__dirname, '..', filePath) + + // Dynamically import the module + const module = await import(fullPath) + const json_data = module.default || module - Object.keys(json_data).forEach((key) => { + for (const key of Object.keys(json_data)) { try { execSync(`grep -r --exclude-dir=i18n -E '${key}[^\\w]' ./src`, { encoding: 'utf-8', @@ -20,22 +28,20 @@ const scanFile = (filePath) => { } useLessKey[filePath].push(key) } - }) + } } -function traverseDir(dirPath) { - fs.readdir(dirPath, (err, files) => { - if (err) { - console.error(`Failed to read directory ${dirPath}: ${err}`) - return - } - - files.forEach((file) => { +async function traverseDir(dirPath) { + try { + const files = await fs.readdir(dirPath) + for (const file of files) { const filePath = path.join(dirPath, file) - scanFile(filePath) - }) + await scanFile(filePath) + } console.log(useLessKey) - }) + } catch (err) { + console.error(`Failed to read directory ${dirPath}: ${err}`) + } } -traverseDir('./src/i18n') +traverseDir('./src/i18n').catch(console.error) diff --git a/scripts/escapeI18N.js b/scripts/escapeI18N.js index db2c75f75..e67c8e347 100644 --- a/scripts/escapeI18N.js +++ b/scripts/escapeI18N.js @@ -1,6 +1,5 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const fs = require('fs') -const path = require('path') +import fs from 'fs' +import path from 'path' const dirPath = 'src/schemaText' diff --git a/scripts/removeOrvalClient.js b/scripts/removeOrvalClient.js index 84a89d1d3..f03ea71bf 100644 --- a/scripts/removeOrvalClient.js +++ b/scripts/removeOrvalClient.js @@ -1,5 +1,4 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const fs = require('fs') +import fs from 'fs' const args = process.argv.slice(2) const filePath = args[0] diff --git a/scripts/transformer/filterTagsSchema.js b/scripts/transformer/filterTagsSchema.js index eebdfbdb1..c7d186e0c 100644 --- a/scripts/transformer/filterTagsSchema.js +++ b/scripts/transformer/filterTagsSchema.js @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ const { isObject, get, set } = require('lodash') const paramRefReg = /^#\/components\/parameters\// @@ -190,11 +189,88 @@ const handleSourceJSON = (swaggerJSON) => { return swaggerJSON } +const sortMetricsKey = (metrics) => { + const sortedMetrics = Object.keys(metrics).sort((a, b) => a.localeCompare(b)) + const sortedMetricsObj = sortedMetrics.reduce((obj, key) => { + obj[key] = metrics[key] + return obj + }, {}) + return sortedMetricsObj +} +const handleMetricsJSON = (swaggerJSON) => { + const handleTarget = (key) => { + const targetObj = swaggerJSON.components.schemas[key].properties + swaggerJSON.components.schemas[key].properties = sortMetricsKey(targetObj) + } + handleTarget('emqx_dashboard_monitor_api.sampler_current') + handleTarget('emqx_dashboard_monitor_api.sampler_current_node') + return swaggerJSON +} + const specialHandlers = new Map([ ['Actions', handleActionJSON], ['Sources', handleSourceJSON], + ['Metrics', handleMetricsJSON], ]) +const sortObj = (rawObj) => { + const sortedKeys = Object.keys(rawObj).sort((a, b) => a.localeCompare(b)) + const sortedObj = sortedKeys.reduce((obj, key) => { + obj[key] = rawObj[key] + return obj + }, {}) + return sortedObj +} + +const sortOneofRefs = (oneofRefs) => { + const sortedRefs = oneofRefs.sort((a, b) => { + if (a.$ref && b.$ref) { + return a.$ref.localeCompare(b.$ref) + } + return 0 + }) + return sortedRefs +} + +const sortDataContent = (data) => { + if (data.content) { + Object.values(data.content).forEach((content) => { + if (content.schema && content.schema.oneOf) { + content.schema.oneOf = sortOneofRefs(content.schema.oneOf) + } + }) + } +} + +const sortResult = (swaggerObj) => { + const { paths, components } = swaggerObj + swaggerObj.paths = sortObj(paths) + Object.values(paths).forEach((path) => { + Object.values(path).forEach((method) => { + if (method.responses) { + Object.values(method.responses).forEach((response) => { + sortDataContent(response) + }) + } + if (method.requestBody) { + sortDataContent(method.requestBody) + } + }) + }) + + const { parameters, schemas } = components + components.parameters = sortObj(parameters) + + components.schemas = sortObj(schemas) + Object.values(components.schemas).forEach((schema) => { + if (schema.properties) { + schema.properties = sortObj(schema.properties) + } + }) + + return swaggerObj +} + const filterTargetSchema = (swaggerJSON, tag) => { const filteredUselessPathsJSON = filterUselessRequest(swaggerJSON, tag) const targetRequestArr = getTargetRequestArr(filteredUselessPathsJSON, tag) @@ -208,7 +284,7 @@ const filterTargetSchema = (swaggerJSON, tag) => { if (specialHandler) { ret = specialHandler(ret) } - return removeAllDesc(ret) + return sortResult(removeAllDesc(ret)) } -module.exports = filterTargetSchema +export default filterTargetSchema diff --git a/src/App.vue b/src/App.vue index 7f2b7299e..e4b9da97e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,10 +3,6 @@ - + + diff --git a/src/components/ArrayEditorInput.vue b/src/components/ArrayEditorInput.vue index c4e19ca8c..4a11c75e0 100644 --- a/src/components/ArrayEditorInput.vue +++ b/src/components/ArrayEditorInput.vue @@ -3,8 +3,6 @@ - - - diff --git a/src/components/Buttons/CreateButton.vue b/src/components/Buttons/CreateButton.vue new file mode 100644 index 000000000..4231e6583 --- /dev/null +++ b/src/components/Buttons/CreateButton.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components/Buttons/LinkButton.vue b/src/components/Buttons/LinkButton.vue new file mode 100644 index 000000000..cdf7a8d87 --- /dev/null +++ b/src/components/Buttons/LinkButton.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/Buttons/RefreshButton.vue b/src/components/Buttons/RefreshButton.vue new file mode 100644 index 000000000..1b246aaf0 --- /dev/null +++ b/src/components/Buttons/RefreshButton.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/src/components/Buttons/ResetButton.vue b/src/components/Buttons/ResetButton.vue new file mode 100644 index 000000000..203aad44d --- /dev/null +++ b/src/components/Buttons/ResetButton.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/components/Buttons/SearchButton.vue b/src/components/Buttons/SearchButton.vue new file mode 100644 index 000000000..5e1c20716 --- /dev/null +++ b/src/components/Buttons/SearchButton.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/Buttons/ShowMoreButton.vue b/src/components/Buttons/ShowMoreButton.vue new file mode 100644 index 000000000..8860ffddb --- /dev/null +++ b/src/components/Buttons/ShowMoreButton.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components/Buttons/TableButton.vue b/src/components/Buttons/TableButton.vue new file mode 100644 index 000000000..e5ece9ed3 --- /dev/null +++ b/src/components/Buttons/TableButton.vue @@ -0,0 +1,3 @@ + diff --git a/src/components/Buttons/index.ts b/src/components/Buttons/index.ts new file mode 100644 index 000000000..4e476b32a --- /dev/null +++ b/src/components/Buttons/index.ts @@ -0,0 +1,7 @@ +export { default as CreateButton } from './CreateButton.vue' +export { default as SearchButton } from './SearchButton.vue' +export { default as TableButton } from './TableButton.vue' +export { default as RefreshButton } from './RefreshButton.vue' +export { default as ResetButton } from './ResetButton.vue' +export { default as ShowMoreButton } from './ShowMoreButton.vue' +export { default as LinkButton } from './LinkButton.vue' diff --git a/src/components/CheckIcon.vue b/src/components/CheckIcon.vue index 8299f70b9..dc8e185b6 100644 --- a/src/components/CheckIcon.vue +++ b/src/components/CheckIcon.vue @@ -7,7 +7,6 @@ diff --git a/src/components/SchemaForm.tsx b/src/components/SchemaForm.tsx index 647d2b779..bda78a0f5 100644 --- a/src/components/SchemaForm.tsx +++ b/src/components/SchemaForm.tsx @@ -9,16 +9,10 @@ import Monaco from '@/components/Monaco.vue' import CommonTLSConfig from '@/components/TLSConfig/CommonTLSConfig.vue' import TLSEnableConfig from '@/components/TLSConfig/TLSEnableConfig.vue' import TextareaWithUploader from '@/components/TextareaWithUploader.vue' -import useItemLabelAndDesc from '@/hooks/Schema/useItemLabelAndDesc' -import useSchemaForm from '@/hooks/Schema/useSchemaForm' -import useSchemaRecord from '@/hooks/Schema/useSchemaRecord' -import useConfFooterStyle from '@/hooks/useConfFooterStyle' -import useI18nTl from '@/hooks/useI18nTl' import { Properties, Property } from '@/types/schemaForm' import ConnectorSelect from '@/views/RuleEngine/Bridge/Components/ConnectorSelect.vue' import { Setting } from '@element-plus/icons-vue' -import _ from 'lodash' -import { PropType, computed, defineComponent, ref, watch, watchEffect } from 'vue' +import { JSX } from 'vue/jsx-runtime' import AdvancedSettingContainer from './AdvancedSettingContainer.vue' import ArrayEditor from './ArrayEditor.vue' import ArrayEditorInput from './ArrayEditorInput.vue' @@ -29,9 +23,9 @@ import ObjectArrayEditor from './ObjectArrayEditor.vue' import Oneof from './Oneof.vue' import OneofRefs from './OneofRefs.vue' import OneofRefsSelect from './OneofRefsSelect.vue' -import SelectAllowInput from './SelectAllowInput.vue' import TimeInputWithUnitSelect from './TimeInputWithUnitSelect.vue' import CertFileInput from './TLSConfig/CertFileInput.vue' +import CustomInputPassword from './CustomInputPassword.vue' interface FormItemMeta { levelName?: string @@ -65,7 +59,6 @@ const SchemaForm = defineComponent({ AdvancedSettingContainer, CertFileInput, InputWithPlaceholderSelect, - SelectAllowInput, }, props: { accordingTo: { @@ -225,6 +218,13 @@ const SchemaForm = defineComponent({ const clearValidate = () => formCom.value?.clearValidate?.() + const validateField = (propArr: Array) => { + if (formCom.value?.validateField) { + return formCom.value.validateField(propArr) + } + return Promise.resolve() + } + const replaceVarPath = (path: string) => { let _path = path if (/\$\w+/g.test(_path)) { @@ -255,6 +255,10 @@ const SchemaForm = defineComponent({ return TLSEnableConfig } + const handleObjectArrayEditorOperation = (property: Property) => { + formCom?.value?.validateField?.(property.path) + } + const isComplexOneof = (prop: Property) => prop.type === 'oneof' && prop.oneOf?.length && prop.oneOf?.some(({ $ref }) => $ref) @@ -320,8 +324,6 @@ const SchemaForm = defineComponent({ const modelValue = _.get(configForm.value, path) const handleUpdateModelValue: any = { 'onUpdate:modelValue': handleModelValueUpdate(path) } const inputType = format === 'password' ? 'password' : 'text' - const autocomplete = inputType === 'password' ? 'one-time-code' : '' - const showPassword = inputType === 'password' const clearableValue = typeof clearable === 'boolean' ? clearable : true const customProps = property.componentProps || {} const isTemplate = !!property.is_template @@ -332,8 +334,6 @@ const SchemaForm = defineComponent({ placeholder={property.default?.toString()} modelValue={modelValue} type={inputType} - autocomplete={autocomplete} - showPassword={showPassword} {...handleUpdateModelValue} clearable {...customProps} @@ -358,6 +358,18 @@ const SchemaForm = defineComponent({ placeholder={property.default?.toString()} modelValue={modelValue} type={inputType} + oneOf={property.oneOf} + {...handleUpdateModelValue} + clearable + {...customProps} + /> + ) + } else if (format === 'password') { + return ( + handleObjectArrayEditorOperation(property)} + onDeleteItem={() => handleObjectArrayEditorOperation(property)} /> ) } @@ -671,7 +686,7 @@ const SchemaForm = defineComponent({ /> ) } - return + return } return

{modelValue}

} @@ -1101,6 +1116,9 @@ const SchemaForm = defineComponent({ (isSchemaLoading.value || props.recordLoading) && typesDoNotShowSkeleton.includes(props.type), ) + const schemaFormClass = computed( + () => `schema-form ${showSkeleton.value || showLoading.value ? 'is-loading' : ''}`, + ) ;(() => { if (props.form && _.isObject(props.form) && !isEmptyObj(props.form)) { configForm.value = _.cloneDeep(props.form) @@ -1108,14 +1126,11 @@ const SchemaForm = defineComponent({ init() })() - ctx.expose({ configForm, validate, clearValidate, getInitRecord }) + ctx.expose({ configForm, validate, clearValidate, validateField, getInitRecord }) return () => { return ( -
+
{showSkeleton.value ? : null} {renderSchemaForm(components.value)}
diff --git a/src/components/SchemaFormItem.tsx b/src/components/SchemaFormItem.tsx index 751327a57..1e244e257 100644 --- a/src/components/SchemaFormItem.tsx +++ b/src/components/SchemaFormItem.tsx @@ -2,7 +2,6 @@ import { createRandomString } from '@/common/tools' import Monaco from '@/components/Monaco.vue' import CommonTLSConfig from '@/components/TLSConfig/CommonTLSConfig.vue' import { Properties } from '@/types/schemaForm' -import { PropType, SetupContext, computed, defineComponent } from 'vue' import ArrayEditor from './ArrayEditor.vue' import CustomInputNumber from './CustomInputNumber.vue' import InputWithPlaceholderSelect from './InputWithPlaceholderSelect.vue' @@ -10,6 +9,8 @@ import InputWithUnit from './InputWithUnit.vue' import KeyAndValueEditor from './KeyAndValueEditor.vue' import OneOf from './Oneof.vue' import TimeInputWithUnitSelect from './TimeInputWithUnitSelect.vue' +import CustomInputPassword from './CustomInputPassword.vue' +import { SetupContext } from 'vue' type FormItemType = | 'string' @@ -153,6 +154,17 @@ export default defineComponent({ disabled={isDisabled} type={inputType} clearable + oneOf={props.property?.oneOf} + {...customProps} + /> + ) + } else if (props.format === 'password') { + return ( + ) @@ -170,6 +182,19 @@ export default defineComponent({ /> ) case 'enum': + if (isTemplate) { + return ( + + ) + } return ( - - - diff --git a/src/components/StatusDetailsOfEachNode.vue b/src/components/StatusDetailsOfEachNode.vue index 3475532bb..7c99c9ab6 100644 --- a/src/components/StatusDetailsOfEachNode.vue +++ b/src/components/StatusDetailsOfEachNode.vue @@ -34,18 +34,14 @@ - - diff --git a/src/components/commonPagination.vue b/src/components/commonPagination.vue index b156bd576..78b7512ae 100644 --- a/src/components/commonPagination.vue +++ b/src/components/commonPagination.vue @@ -17,7 +17,7 @@ import { DEFAULT_PAGE_SIZE_OPT as defaultPageSizeOpt } from '@/common/constants' -import { computed, watch, PropType, defineProps, defineEmits } from 'vue' import MiniPagination from './MiniPagination.vue' import { PageData } from '@/types/common' diff --git a/src/components/global-components.ts b/src/components/global-components.ts new file mode 100644 index 000000000..9f11e94ac --- /dev/null +++ b/src/components/global-components.ts @@ -0,0 +1,35 @@ +import CustomInputPassword from './CustomInputPassword.vue' +import { + CreateButton, + TableButton, + RefreshButton, + SearchButton, + ResetButton, + ShowMoreButton, + LinkButton, +} from './Buttons' +import { App } from 'vue' + +export default { + install(app: App): void { + app.component('CustomInputPassword', CustomInputPassword) + app.component('CreateButton', CreateButton) + app.component('TableButton', TableButton) + app.component('RefreshButton', RefreshButton) + app.component('SearchButton', SearchButton) + app.component('ResetButton', ResetButton) + app.component('ShowMoreButton', ShowMoreButton) + app.component('LinkButton', LinkButton) + }, +} + +export { + CustomInputPassword, + CreateButton, + TableButton, + RefreshButton, + SearchButton, + ResetButton, + ShowMoreButton, + LinkButton, +} diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 000000000..ed6932663 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,11 @@ +/// + +declare const __EMQX_VERSION__: string + +interface ImportMetaEnv { + readonly VITE_APP_VERSION: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/src/global-components.d.ts b/src/global-components.d.ts new file mode 100644 index 000000000..a52a2fc18 --- /dev/null +++ b/src/global-components.d.ts @@ -0,0 +1,23 @@ +import { + CustomInputPassword, + CreateButton, + TableButton, + RefreshButton, + SearchButton, + ResetButton, + ShowMoreButton, + LinkButton, +} from '@/components/global-components' + +declare module 'vue' { + export interface GlobalComponents { + CustomInputPassword: typeof CustomInputPassword + CreateButton: typeof CreateButton + TableButton: typeof TableButton + RefreshButton: typeof RefreshButton + SearchButton: typeof SearchButton + ResetButton: typeof ResetButton + ShowMoreButton: typeof ShowMoreButton + LinkButton: typeof LinkButton + } +} diff --git a/src/hooks/Auth/useAuth.ts b/src/hooks/Auth/useAuth.ts index 4963c9e8a..46ee16b33 100644 --- a/src/hooks/Auth/useAuth.ts +++ b/src/hooks/Auth/useAuth.ts @@ -1,5 +1,3 @@ -import { useI18n } from 'vue-i18n' - export default function useAuth(): { titleMap: { [key: string]: string diff --git a/src/hooks/Auth/useAuthHelp.ts b/src/hooks/Auth/useAuthHelp.ts index 04ea21406..f7ce2f78d 100644 --- a/src/hooks/Auth/useAuthHelp.ts +++ b/src/hooks/Auth/useAuthHelp.ts @@ -1,4 +1,3 @@ -import useI18nTl from '../useI18nTl' import { AUTHZ_COMMON_PLACEHOLDERS, AUTHZ_HTTP_PLACEHOLDERS, @@ -7,14 +6,12 @@ import { AUTH_PLACEHOLDER_CLIENT_ATTRS, } from '@/common/constants' import codeMapInHelpOfAuth from '@/common/codeMapInHelpOfAuth' -import type { ComputedRef } from 'vue' -import { computed, inject } from 'vue' export default (context: { authType: 'authn' | 'authz' databaseType: 'mysql' | 'postgresql' | 'mongodb' | 'redis' | 'http' | undefined }): { - helpText: ComputedRef + helpText: ComputedRef<(string | { type: string; content: string })[]> helpCode: ComputedRef } => { const { t, tl } = useI18nTl('AuthDoc') @@ -60,6 +57,14 @@ export default (context: { mongodb: [ tl('authzMongoDBParagraph1'), `${t('AuthDoc.authzSupportedPlaceholders', [tl('selector')])}${AUTHZ_MONGODB_PLACEHOLDERS}`, + tl('authzMongoDBOrderTip'), + { + type: 'code', + content: `{ + "username": "\${username}", + "$orderby": {"info.order": 1} +}`, + }, tl('dataStructureExample'), ], postgresql: [ @@ -81,9 +86,11 @@ export default (context: { if (!databaseType) { return [] } - let ret = helpTextMap[authType][databaseType] + let ret = helpTextMap[authType][databaseType] as (string | { type: string; content: string })[] if (gateway) { - ret = ret.map((item) => item.replace(AUTH_PLACEHOLDER_CLIENT_ATTRS, '')) + ret = ret.map((item) => + typeof item === 'string' ? item.replace(AUTH_PLACEHOLDER_CLIENT_ATTRS, '') : item, + ) } return ret }) diff --git a/src/hooks/Auth/useAuthn.ts b/src/hooks/Auth/useAuthn.ts index 5ab38a74d..2b1200bcc 100644 --- a/src/hooks/Auth/useAuthn.ts +++ b/src/hooks/Auth/useAuthn.ts @@ -1,12 +1,7 @@ -import type { Ref, Component } from 'vue' -import { ref, nextTick } from 'vue' import { listAuthn, queryAuthnItemMetrics } from '@/api/auth' import { AuthnItem, Metrics } from '@/types/auth' -import useSortableTable from '@/hooks/useSortableTable' import { SortableEvent } from 'sortablejs' -import useHandleAuthnItem from '@/hooks/Auth/useHandleAuthnItem' -import useMove from '@/hooks/useMove' -import useAuth from '@/hooks/Auth/useAuth' +import jwtIcon from '@/assets/img/jwt.png' export type AuthnItemInTable = AuthnItem & { metrics?: Metrics @@ -51,13 +46,9 @@ export default (): { authnList.value = res.map((item) => { const ret: AuthnItemInTable = item if (ret.mechanism !== 'jwt') { - try { - ret.img = require(`@/assets/img/${ret.backend}.png`) - } catch { - ret.img = '' - } + ret.img = getImg(`img/${ret.backend}.png`) } else { - ret.img = require(`@/assets/img/jwt.png`) + ret.img = jwtIcon } ret.metrics = metricsMap.value[ret.id] return item diff --git a/src/hooks/Auth/useAuthnCreate.ts b/src/hooks/Auth/useAuthnCreate.ts index 19529643c..907946fd0 100644 --- a/src/hooks/Auth/useAuthnCreate.ts +++ b/src/hooks/Auth/useAuthnCreate.ts @@ -1,7 +1,3 @@ -import useSSL from '@/hooks/useSSL' -import _ from 'lodash' -import { getPasswordHashAlgorithmObj } from './usePasswordHashAlgorithmData' -import useProcessAuthData from './useProcessAuthData' import { LDAPAuthMethod } from '@/types/enum' // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types @@ -47,6 +43,7 @@ export default function useAuthnCreate() { pool_size: 8, connect_timeout: '15s', request_timeout: '5s', + max_inactive: '10s', enable_pipelining: 100, ssl: createSSLForm(), } @@ -169,7 +166,7 @@ export default function useAuthnCreate() { return getJwtConfig() } } - const create = (config: any, backend: string, mechanism: string) => { + const create = (config: any, backend: string | undefined, mechanism: string) => { let data: any = {} if (mechanism === 'jwt') { data = processJwtConfig(config) @@ -188,7 +185,7 @@ export default function useAuthnCreate() { data = processLDAPConfig(config) break default: - data = _.cloneDeep(config) + data = cloneDeep(config) break } data.backend = backend diff --git a/src/hooks/Auth/useAuthnType.ts b/src/hooks/Auth/useAuthnType.ts index 3a263f89f..352fb0872 100644 --- a/src/hooks/Auth/useAuthnType.ts +++ b/src/hooks/Auth/useAuthnType.ts @@ -1,4 +1,3 @@ -import { getLabelFromValueInOptionList } from '@/common/tools' import { AuthnMechanismType } from '@/types/enum' export const useAuthnMechanismType = (): { diff --git a/src/hooks/Auth/useAuthz.ts b/src/hooks/Auth/useAuthz.ts index 61809a991..a2114b4dc 100644 --- a/src/hooks/Auth/useAuthz.ts +++ b/src/hooks/Auth/useAuthz.ts @@ -1,10 +1,5 @@ -import type { Component, Ref } from 'vue' -import { nextTick, ref } from 'vue' import { listAuthz, queryAuthzItemMetrics } from '@/api/auth' import { AuthzSourceItem, Metrics } from '@/types/auth' -import useHandleAuthzItem from '@/hooks/Auth/useHandleAuthzItem' -import useMove from '@/hooks/useMove' -import useSortableTable from '@/hooks/useSortableTable' import { SortableEvent } from 'sortablejs' export type AuthzItemInTable = AuthzSourceItem & { @@ -43,7 +38,7 @@ export default (): { authzList.value = res.sources.map((item) => { let img = '' try { - img = require(`@/assets/img/${item.type}.png`) + img = getImg(`img/${item.type}.png`) } catch (error) { console.error(error) } diff --git a/src/hooks/Auth/useAuthzCreate.ts b/src/hooks/Auth/useAuthzCreate.ts index 639521b46..fddbe87a9 100644 --- a/src/hooks/Auth/useAuthzCreate.ts +++ b/src/hooks/Auth/useAuthzCreate.ts @@ -1,7 +1,3 @@ -import _ from 'lodash' -import useProcessAuthData from './useProcessAuthData' -import useSSL from '@/hooks/useSSL' - // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types export default function useAuthzCreate() { const { createSSLForm, handleSSLDataBeforeSubmit } = useSSL() @@ -75,6 +71,7 @@ export default function useAuthzCreate() { pool_size: 8, connect_timeout: '15s', request_timeout: '30s', + max_inactive: '10s', enable_pipelining: 100, ssl: createSSLForm(), } @@ -161,7 +158,7 @@ export default function useAuthzCreate() { data = processRedisConfig(config) break default: - data = _.cloneDeep(config) + data = cloneDeep(config) break } data.type = type diff --git a/src/hooks/Auth/useAuthzManager.ts b/src/hooks/Auth/useAuthzManager.ts new file mode 100644 index 000000000..f84651515 --- /dev/null +++ b/src/hooks/Auth/useAuthzManager.ts @@ -0,0 +1,20 @@ +import { AuthzRuleAction, AuthzRulePermission } from '@/types/typeAlias' + +export default () => { + const { t, tl } = useI18nTl('Auth') + const actionOpts = [ + { value: AuthzRuleAction.publish, label: tl('publish') }, + { value: AuthzRuleAction.subscribe, label: tl('subscribe') }, + { value: AuthzRuleAction.all, label: tl('all') }, + ] + + const permissionOpts = [ + { value: AuthzRulePermission.allow, label: t('Base.allow') }, + { value: AuthzRulePermission.deny, label: t('Base.deny') }, + ] + + return { + actionOpts, + permissionOpts, + } +} diff --git a/src/hooks/Auth/useBannedType.ts b/src/hooks/Auth/useBannedType.ts index 94689dc59..39dfe1176 100644 --- a/src/hooks/Auth/useBannedType.ts +++ b/src/hooks/Auth/useBannedType.ts @@ -1,6 +1,4 @@ import { BannedType } from '@/types/enum' -import useI18nTl from '../useI18nTl' -import { getLabelFromValueInOptionList } from '@/common/tools' export default (): { typeList: { diff --git a/src/hooks/Auth/useBuiltInDataUpdateTip.ts b/src/hooks/Auth/useBuiltInDataUpdateTip.ts index 57a584865..99fb8fb72 100644 --- a/src/hooks/Auth/useBuiltInDataUpdateTip.ts +++ b/src/hooks/Auth/useBuiltInDataUpdateTip.ts @@ -1,7 +1,5 @@ import { AuthnItem } from '@/types/auth' -import { ElMessageBox, MessageBoxData } from 'element-plus' -import { cloneDeep } from 'lodash' -import useI18nTl from '../useI18nTl' +import { MessageBoxData } from 'element-plus' export default (): { setRawSetting: (data: AuthnItem) => void diff --git a/src/hooks/Auth/useDatabaseConfig.ts b/src/hooks/Auth/useDatabaseConfig.ts index 119f4c7fb..0bc37faf9 100644 --- a/src/hooks/Auth/useDatabaseConfig.ts +++ b/src/hooks/Auth/useDatabaseConfig.ts @@ -1,9 +1,7 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { DEFAULT_SALT_POSITION } from '@/common/constants' import { SaltPosition } from '@/types/enum' -import { watch, ref, computed, SetupContext } from 'vue' -import { useRoute } from 'vue-router' -import { isEqual } from 'lodash' +import { SetupContext } from 'vue' export default function useDatabaseConfig( props: { diff --git a/src/hooks/Auth/useDatabaseConfigForm.ts b/src/hooks/Auth/useDatabaseConfigForm.ts index 88080ab4d..3154cd456 100644 --- a/src/hooks/Auth/useDatabaseConfigForm.ts +++ b/src/hooks/Auth/useDatabaseConfigForm.ts @@ -1,9 +1,5 @@ -import type { ComputedRef, Ref } from 'vue' -import { computed, ref } from 'vue' -import useFormRules from '@/hooks/useFormRules' +import { isJSONString } from '@emqx/shared-ui-utils' import { FormRules } from 'element-plus' -import useI18nTl from '../useI18nTl' -import { usePasswordHashRules } from './usePasswordHashAlgorithmData' type PropsParams = { database: string @@ -67,6 +63,16 @@ export default (props: PropsParams, databaseConfig: any): ReturnData => { ...createMongoCommonFormRules(), /* For mongo type 'rs' */ replica_set_name: createRequiredRule(tl('replicaSetName')), + filter: [ + { + validator(rules, value, callback) { + if (!value || isJSONString(value)) { + return callback() + } + callback(new Error(tl('jsonFormatError'))) + }, + }, + ], } } else if (isMySQL.value || isPgSQL.value) { ret = { ...ret, ...createMySQLFormRules() } diff --git a/src/hooks/Auth/useHTTPConfigForm.ts b/src/hooks/Auth/useHTTPConfigForm.ts index eafeb546f..4f56b0d96 100644 --- a/src/hooks/Auth/useHTTPConfigForm.ts +++ b/src/hooks/Auth/useHTTPConfigForm.ts @@ -1,8 +1,4 @@ -import type { ComputedRef, Ref } from 'vue' -import { computed, ref } from 'vue' -import useFormRules from '@/hooks/useFormRules' import { FormRules } from '@/types/common' -import useI18nTl from '../useI18nTl' import { isJSONString } from '@emqx/shared-ui-utils' export default (): { diff --git a/src/hooks/Auth/useJWTConfigForm.ts b/src/hooks/Auth/useJWTConfigForm.ts index fe632727b..50f5e1071 100644 --- a/src/hooks/Auth/useJWTConfigForm.ts +++ b/src/hooks/Auth/useJWTConfigForm.ts @@ -1,8 +1,4 @@ import { FormRules } from '@/types/common' -import type { ComputedRef, Ref } from 'vue' -import { computed, ref } from 'vue' -import useFormRules from '../useFormRules' -import useI18nTl from '../useI18nTl' export default (): { formCom: Ref diff --git a/src/hooks/Auth/useLdapConfigForm.ts b/src/hooks/Auth/useLdapConfigForm.ts index a1b075572..fc32fe21f 100644 --- a/src/hooks/Auth/useLdapConfigForm.ts +++ b/src/hooks/Auth/useLdapConfigForm.ts @@ -1,8 +1,4 @@ -import type { ComputedRef, Ref } from 'vue' -import { computed, ref } from 'vue' -import useFormRules from '@/hooks/useFormRules' import { FormRules } from '@/types/common' -import useI18nTl from '../useI18nTl' export default (): { formCom: Ref diff --git a/src/hooks/Auth/usePasswordHashAlgorithmData.ts b/src/hooks/Auth/usePasswordHashAlgorithmData.ts index 899b8643c..294c59456 100644 --- a/src/hooks/Auth/usePasswordHashAlgorithmData.ts +++ b/src/hooks/Auth/usePasswordHashAlgorithmData.ts @@ -1,7 +1,4 @@ -import { DEFAULT_SALT_POSITION } from '@/common/constants' import { HashType } from '@/types/enum' -import useFormRules from '../useFormRules' -import useI18nTl from '../useI18nTl' import { FormRules } from '@/types/common' interface PasswordHashAlgorithm { diff --git a/src/hooks/Auth/useProcessAuthData.ts b/src/hooks/Auth/useProcessAuthData.ts index 64f093cb3..89c852cdd 100644 --- a/src/hooks/Auth/useProcessAuthData.ts +++ b/src/hooks/Auth/useProcessAuthData.ts @@ -1,9 +1,7 @@ import { ElMessage as M } from 'element-plus' -import _ from 'lodash' -import { getUsefulPasswordHashAlgorithmData } from './usePasswordHashAlgorithmData' import { parseJSONSafely } from '@emqx/shared-ui-utils' import { LDAPAuthMethod } from '@/types/enum' -// import { AUTO_RESTART_INTERVAL_DEFAULT } from '@/common/constants' +// // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types export default function useProcessAuthData() { @@ -18,7 +16,7 @@ export default function useProcessAuthData() { const processHttpConfig = (data: any) => { try { - const tempData = _.cloneDeep(data) + const tempData = cloneDeep(data) const { body } = data if (body !== '' && body !== undefined) { tempData.body = parseJSONSelectively(body) @@ -31,7 +29,7 @@ export default function useProcessAuthData() { } } const processRedisConfig = (data: any) => { - const tempData = _.cloneDeep(data) + const tempData = cloneDeep(data) const { redis_type } = data if (redis_type !== 'sentinel') { delete tempData.sentinel @@ -48,7 +46,7 @@ export default function useProcessAuthData() { } const processMongoDBConfig = (data: any) => { try { - let tempData = _.cloneDeep(data) + let tempData = cloneDeep(data) const { mongo_type, filter } = data const needDeleteFields = [] if (mongo_type !== 'single') { @@ -59,7 +57,7 @@ export default function useProcessAuthData() { if (mongo_type !== 'rs') { needDeleteFields.push('w_mode', 'r_mode', 'replica_set_name') } - tempData = _.omit(tempData, needDeleteFields) + tempData = omit(tempData, needDeleteFields) if (filter !== '' && filter !== undefined) { tempData.filter = parseJSONSelectively(filter) } else { @@ -73,9 +71,9 @@ export default function useProcessAuthData() { const processLDAPConfig = (data: any) => { const { method } = data if (method.type === LDAPAuthMethod.Hash) { - data.method = _.omit(method, 'bind_password') + data.method = omit(method, 'bind_password') } else if (method.type === LDAPAuthMethod.Bind) { - data.method = _.omit(method, ['password_attribute', 'is_superuser_attribute']) + data.method = omit(method, ['password_attribute', 'is_superuser_attribute']) } return data } @@ -121,7 +119,7 @@ export default function useProcessAuthData() { return tempData } const processPasswordHashAlgorithmData = (data: any) => { - const ret = _.cloneDeep(data) + const ret = cloneDeep(data) const isBuiltInDatabase = data.backend === 'built_in_database' if ('password_hash_algorithm' in ret) { ret.password_hash_algorithm = getUsefulPasswordHashAlgorithmData( diff --git a/src/hooks/Auth/useToggleAuthStatus.ts b/src/hooks/Auth/useToggleAuthStatus.ts index 290e6ce15..2c5c26cd7 100644 --- a/src/hooks/Auth/useToggleAuthStatus.ts +++ b/src/hooks/Auth/useToggleAuthStatus.ts @@ -1,9 +1,4 @@ import { updateAuthn, updateAuthz } from '@/api/auth' -import { ElMessageBox, ElMessage } from 'element-plus' -import useI18nTl from '../useI18nTl' -import { AuthnItemInTable } from './useAuthn' -import { AuthzItemInTable } from './useAuthz' -import { omit } from 'lodash' export default (): { toggleAuthStatus: ( diff --git a/src/hooks/Clients/useClientDetail.ts b/src/hooks/Clients/useClientDetail.ts index 77a74d986..6ed257717 100644 --- a/src/hooks/Clients/useClientDetail.ts +++ b/src/hooks/Clients/useClientDetail.ts @@ -1,9 +1,5 @@ import { Client } from '@/types/client' -import moment from 'moment' -import type { ComputedRef, Ref } from 'vue' -import useDurationStr from '@/hooks/useDurationStr' -import useI18nTl from '../useI18nTl' -import { SESSION_NEVER_EXPIRE_TIME } from '@/common/constants' +import dayjs from 'dayjs' type GetSessionInfoItem = (msg: string) => string | number | boolean @@ -31,7 +27,7 @@ export default ( case 'awaiting_rel': return msg.awaiting_rel_cnt + '/' + msg.awaiting_rel_max case 'created_at': - return moment(msg[key]).format('YYYY-MM-DD HH:mm:ss') + return dayjs(msg[key]).format('YYYY-MM-DD HH:mm:ss') case 'heap_size': return `${msg.heap_size} bytes` case 'expiry_interval': diff --git a/src/hooks/Clients/useClientFields.ts b/src/hooks/Clients/useClientFields.ts index cb4be6aaf..9daa5b761 100644 --- a/src/hooks/Clients/useClientFields.ts +++ b/src/hooks/Clients/useClientFields.ts @@ -1,5 +1,3 @@ -import useI18nTl from '../useI18nTl' - export default (): { clientFields: { [key: string]: Array } snake2pascal: (s: string) => string diff --git a/src/hooks/Config/useLimiter.ts b/src/hooks/Config/useLimiter.ts index 7a46e145b..7c78fde2e 100644 --- a/src/hooks/Config/useLimiter.ts +++ b/src/hooks/Config/useLimiter.ts @@ -1,5 +1,4 @@ import { FormRules } from '@/types/common' -import useI18nTl from '../useI18nTl' export default (): { limiterRules: FormRules diff --git a/src/hooks/Config/useListenerDrawer.ts b/src/hooks/Config/useListenerDrawer.ts index 974b037c3..0a9941285 100644 --- a/src/hooks/Config/useListenerDrawer.ts +++ b/src/hooks/Config/useListenerDrawer.ts @@ -1,16 +1,8 @@ import { addGatewayListener, updateGatewayListener } from '@/api/gateway' import { addListener, queryListenerDetail, updateListener } from '@/api/listener' -import { GATEWAY_DISABLED_LISTENER_TYPE_MAP, unexposedConfigs } from '@/common/constants' -import { checkNOmitFromObj, emptyObject, jumpToErrorFormItem } from '@/common/tools' import { FormRules } from '@/types/common' import { GatewayName, ListenerType, ListenerTypeForGateway } from '@/types/enum' import { Listener } from '@/types/listener' -import { ElMessage, ElMessageBox } from 'element-plus' -import { assign, cloneDeep, merge, omit } from 'lodash' -import type { ComputedRef, Ref, WritableComputedRef } from 'vue' -import { computed, nextTick, ref, watch } from 'vue' -import useI18nTl from '../useI18nTl' -import useListenerUtils from './useListenerUtils' import { isEmptyObj, unflattenObject } from '@emqx/shared-ui-utils' type Props = Readonly< @@ -52,6 +44,7 @@ interface useListenerDrawerReturns { showWSConfig: ComputedRef listenerFormRules: ComputedRef submit: () => Promise + confirmClose: () => Promise onDelete: () => void transPort: (port: string) => string handleTLSVerifyChange: (val: string | number | boolean) => void @@ -148,6 +141,34 @@ export default (props: Props, emit: Emit): useListenerDrawerReturns => { const isLoading = ref(false) + let rawListenerRecord = {} + let rawListenerCustomConfigs = {} + const isRecordChanged = () => + !isEqual(rawListenerRecord, listenerRecord.value) || + !isEqual(rawListenerCustomConfigs, listenerCustomConfigs.value) + const confirmClose = async () => { + try { + const isChanged = isRecordChanged() + if (isChanged) { + await ElMessageBox({ + type: 'info', + title: t('APIKey.close'), + message: t('Base.unloadTip'), + showCancelButton: true, + confirmButtonText: t('Base.confirm'), + showClose: false, + closeOnClickModal: false, + closeOnPressEscape: false, + closeOnHashChange: false, + }) + return Promise.resolve() + } + return Promise.resolve() + } catch (error) { + return Promise.reject() + } + } + const loadListenerData = async () => { if (!props.listener) { return @@ -166,6 +187,8 @@ export default (props: Props, emit: Emit): useListenerDrawerReturns => { if (!isEmptyObj(differences)) { listenerCustomConfigs.value = unflattenObject(differences) } + rawListenerRecord = cloneDeep(listenerRecord.value) + rawListenerCustomConfigs = cloneDeep(listenerCustomConfigs.value) } catch (error) { // } finally { @@ -358,6 +381,7 @@ export default (props: Props, emit: Emit): useListenerDrawerReturns => { isCoAP, SSLConfigKey, listenerFormRules, + confirmClose, submit, onDelete, transPort, diff --git a/src/hooks/Config/useListenerUtils.ts b/src/hooks/Config/useListenerUtils.ts index f5a659b1b..d07822ce3 100644 --- a/src/hooks/Config/useListenerUtils.ts +++ b/src/hooks/Config/useListenerUtils.ts @@ -1,11 +1,6 @@ -import { SSL_VERIFY_VALUE_MAP, unexposedConfigs } from '@/common/constants' -import useLimiter from '@/hooks/Config/useLimiter' import { FormRules } from '@/types/common' import { ListenerType, ListenerTypeForGateway } from '@/types/enum' import { Listener } from '@/types/listener' -import { cloneDeep } from 'lodash' -import useFormRules from '../useFormRules' -import useI18nTl from '../useI18nTl' import parseHoconToObject from 'hocon-parser' import { isEmptyObj } from '@emqx/shared-ui-utils' diff --git a/src/hooks/Exhook/useExhookItemStatus.ts b/src/hooks/Exhook/useExhookItemStatus.ts index a1a656cb1..8e8706b87 100644 --- a/src/hooks/Exhook/useExhookItemStatus.ts +++ b/src/hooks/Exhook/useExhookItemStatus.ts @@ -1,6 +1,5 @@ import { ExhookStatus, NodeStatusClass } from '@/types/enum' import { Exhook } from '@/types/systemModule' -import useI18nTl from '../useI18nTl' export default (): { getTheWorstStatus: (exhook: Exhook) => ExhookStatus @@ -40,7 +39,7 @@ export default (): { [ExhookStatus.Disconnected]: t('RuleEngine.disconnected'), [ExhookStatus.Disabled]: tl('disabled'), [ExhookStatus.Error]: tl('error'), - }[status] || 'unknown') + })[status] || 'unknown' const statusTextClass = (status: ExhookStatus): NodeStatusClass => ({ @@ -49,7 +48,7 @@ export default (): { [ExhookStatus.Disconnected]: NodeStatusClass.Danger, [ExhookStatus.Disabled]: NodeStatusClass.Danger, [ExhookStatus.Error]: NodeStatusClass.Danger, - }[status] || NodeStatusClass.Danger) + })[status] || NodeStatusClass.Danger return { getTheWorstStatus, diff --git a/src/hooks/Exhook/useHandleExhookItem.ts b/src/hooks/Exhook/useHandleExhookItem.ts index 52877ba7a..e8ffdf47b 100644 --- a/src/hooks/Exhook/useHandleExhookItem.ts +++ b/src/hooks/Exhook/useHandleExhookItem.ts @@ -1,10 +1,6 @@ import { moveExhook, deleteExhook as requestDeleteExhook, updateExhook } from '@/api/exhook' import { TargetPosition } from '@/types/enum' import { Exhook, ExhookFormForCreate } from '@/types/systemModule' -import { ElMessage, ElMessageBox } from 'element-plus' -import { cloneDeep } from 'lodash' -import { useI18n } from 'vue-i18n' -import useSSL from '../useSSL' export default (): { deleteExhook: (name: string) => Promise diff --git a/src/hooks/Gateway/useHandleExprotoData.ts b/src/hooks/Gateway/useHandleExprotoData.ts index 35bf72c34..9fe3ec932 100644 --- a/src/hooks/Gateway/useHandleExprotoData.ts +++ b/src/hooks/Gateway/useHandleExprotoData.ts @@ -1,6 +1,3 @@ -import { checkNOmitFromObj } from '@/common/tools' -import { cloneDeep, omit } from 'lodash' - export default (): { handleExprotoData: (gatewayData: Record) => Record } => { diff --git a/src/hooks/Overview/useNodesGraph.ts b/src/hooks/Overview/useNodesGraph.ts index a72b903bd..71098166b 100644 --- a/src/hooks/Overview/useNodesGraph.ts +++ b/src/hooks/Overview/useNodesGraph.ts @@ -1,9 +1,5 @@ -import { numToFixed, waitAMoment } from '@/common/tools' import { NodeInfo } from '@/types/dashboard' import { NodeStatus } from '@/types/enum' -import type { ComputedRef, Ref } from 'vue' -import { computed, onMounted, onUnmounted, ref, watch } from 'vue' -import { useStore } from 'vuex' export interface FlowNodeData { type: 'core' | 'replicant' | 'background' diff --git a/src/hooks/Plugins/avroUtils.ts b/src/hooks/Plugins/avroUtils.ts index d6beacf14..1890faa7d 100644 --- a/src/hooks/Plugins/avroUtils.ts +++ b/src/hooks/Plugins/avroUtils.ts @@ -2,7 +2,6 @@ // @ts-ignore import { jsonToAvro, avroToJson } from 'json-to-avro' import avro from 'avsc' -import { ElMessage } from 'element-plus' /** * Converts an object to Avro JSON format. diff --git a/src/hooks/Plugins/useGenPluginFormRules.ts b/src/hooks/Plugins/useGenPluginFormRules.ts index 817d4c1e2..d45a9c9ed 100644 --- a/src/hooks/Plugins/useGenPluginFormRules.ts +++ b/src/hooks/Plugins/useGenPluginFormRules.ts @@ -1,6 +1,5 @@ import { PluginUIConfigForm, Rule } from '@/types/plugin' import { isEmptyObj } from '@emqx/shared-ui-utils' -import { computed } from 'vue' /** * Checks if a given value is within the specified range. diff --git a/src/hooks/Plugins/usePluginItem.ts b/src/hooks/Plugins/usePluginItem.ts index 64e8940a6..d6670609e 100644 --- a/src/hooks/Plugins/usePluginItem.ts +++ b/src/hooks/Plugins/usePluginItem.ts @@ -1,11 +1,8 @@ import { uninstallPlugin } from '@/api/plugins' -import { useI18n } from 'vue-i18n' -import { ElMessageBox, ElMessage } from 'element-plus' import { PluginItem } from '@/types/plugin' import { PluginStatus, StatusCommandSendToPlugin, TargetPosition } from '@/types/enum' import { updatePluginStatus } from '@/api/plugins' import { movePluginPosition } from '@/api/plugins' -import { tryToCompleteURL } from '@/common/tools' interface FuncRet { NAME_VERSION_JOINER: string diff --git a/src/hooks/Plugins/useRenderPluginForm.ts b/src/hooks/Plugins/useRenderPluginForm.ts index 1f1b9eb3e..14c6da19c 100644 --- a/src/hooks/Plugins/useRenderPluginForm.ts +++ b/src/hooks/Plugins/useRenderPluginForm.ts @@ -1,5 +1,3 @@ -import { computed, ref, Ref } from 'vue' -import { useStore } from 'vuex' import { isEmptyObj } from '@emqx/shared-ui-utils' import { AvroEnum, AvroSchema, PluginUIConfigForm, PluginUIConfigs } from '@/types/plugin' import { getPluginConfigs, getPluginSchema, updatePluginConfigs } from '@/api/plugins' diff --git a/src/hooks/Rule/KeysInRule.ts b/src/hooks/Rule/KeysInRule.ts index 2e096318a..3b9078b7e 100644 --- a/src/hooks/Rule/KeysInRule.ts +++ b/src/hooks/Rule/KeysInRule.ts @@ -2,7 +2,7 @@ import RuleFunc from './RuleFunc.json' import RuleField from './RuleField.json' const funcList = RuleFunc.reduce((arr: Array, { list }): Array => { - list.forEach(({ name }: { name: string }) => arr.push(name)) + list?.forEach(({ name }: { name: string }) => arr.push(name)) return arr }, []) diff --git a/src/hooks/Rule/RuleFunc.json b/src/hooks/Rule/RuleFunc.json index 5986e916b..5fde129ed 100644 --- a/src/hooks/Rule/RuleFunc.json +++ b/src/hooks/Rule/RuleFunc.json @@ -336,6 +336,16 @@ "required": true } ] + }, + { + "name": "is_empty", + "args": [ + { + "name": "Value", + "type": "any", + "required": true + } + ] } ] }, @@ -756,6 +766,16 @@ "required": true } ] + }, + { + "name": "map_size", + "args": [ + { + "name": "Map", + "type": "object", + "required": true + } + ] } ] }, @@ -1067,6 +1087,26 @@ "required": true } ] + }, + { + "name": "str_utf16_le", + "args": [ + { + "name": "Data", + "type": "string", + "required": true + } + ] + }, + { + "name": "sqlserver_bin2hexstr", + "args": [ + { + "name": "Data", + "type": "string", + "required": true + } + ] } ] }, diff --git a/src/hooks/Rule/action/useActionList.ts b/src/hooks/Rule/action/useActionList.ts index 80b340a83..bd95f729a 100644 --- a/src/hooks/Rule/action/useActionList.ts +++ b/src/hooks/Rule/action/useActionList.ts @@ -1,4 +1,4 @@ -import { getActions } from '@/api/action' +import { getSimplifiedActions } from '@/api/action' import { BridgeItem } from '@/types/rule' export default (): { @@ -6,7 +6,7 @@ export default (): { } => { const getActionList = async (): Promise> => { try { - const data = await getActions() + const data = await getSimplifiedActions() return Promise.resolve(data) } catch (error) { return Promise.reject(error) diff --git a/src/hooks/Rule/action/useHandleActionItem.ts b/src/hooks/Rule/action/useHandleActionItem.ts index 61c0d946f..df74c7cbd 100644 --- a/src/hooks/Rule/action/useHandleActionItem.ts +++ b/src/hooks/Rule/action/useHandleActionItem.ts @@ -12,10 +12,6 @@ import { } from '@/api/action' import { BridgeType } from '@/types/enum' import { Action } from '@/types/rule' -import type { Ref } from 'vue' -import { ref } from 'vue' -import { useRoute } from 'vue-router' -import { useActionDataHandler } from '../useDataHandler' type HandleDirectionCallback = ( direction?: number, diff --git a/src/hooks/Rule/action/useHandleSourceItem.ts b/src/hooks/Rule/action/useHandleSourceItem.ts index 32d886320..73a09c7b3 100644 --- a/src/hooks/Rule/action/useHandleSourceItem.ts +++ b/src/hooks/Rule/action/useHandleSourceItem.ts @@ -10,13 +10,7 @@ import { getSourceMetrics as requestSourceMetrics, testSourceConnectivity, } from '@/api/sources' -import useI18nTl from '@/hooks/useI18nTl' import { Source } from '@/types/rule' -import { ElMessage, ElMessageBox } from 'element-plus' -import { isFunction } from 'lodash' -import type { Ref } from 'vue' -import { ref } from 'vue' -import { useActionDataHandler } from '../useDataHandler' const useHandleSourceItem = (): { getSourceDetail: (id: string) => Promise diff --git a/src/hooks/Rule/action/useSourceList.ts b/src/hooks/Rule/action/useSourceList.ts index eb2e0cf84..b88e4879b 100644 --- a/src/hooks/Rule/action/useSourceList.ts +++ b/src/hooks/Rule/action/useSourceList.ts @@ -1,4 +1,4 @@ -import { getSources } from '@/api/sources' +import { getSimplifiedSources } from '@/api/sources' import { BridgeItem } from '@/types/rule' export default (): { @@ -6,7 +6,7 @@ export default (): { } => { const getSourceList = async () => { try { - const sourceList: Array = await getSources() + const sourceList = await getSimplifiedSources() return Promise.resolve(sourceList) } catch (error) { return Promise.reject(error) diff --git a/src/hooks/Rule/bridge/useComponentsHandlers.ts b/src/hooks/Rule/bridge/useActionComponentsHandlers.ts similarity index 85% rename from src/hooks/Rule/bridge/useComponentsHandlers.ts rename to src/hooks/Rule/bridge/useActionComponentsHandlers.ts index a807da51b..90fe62fad 100644 --- a/src/hooks/Rule/bridge/useComponentsHandlers.ts +++ b/src/hooks/Rule/bridge/useActionComponentsHandlers.ts @@ -1,11 +1,5 @@ -import useSpecialRuleForPassword from '@/hooks/Rule/bridge/useSpecialRuleForPassword' -import { SchemaRules } from '@/hooks/Schema/useSchemaFormRules' -import useFormRules from '@/hooks/useFormRules' import { BridgeType } from '@/types/enum' import { Properties, Property } from '@/types/schemaForm' -import { pick } from 'lodash' -import { useAvailableProviders } from '../useProvidersForMonaco' -import useSQLAvailablePlaceholder from '../useSQLAvailablePlaceholder' type Handler = ({ components, rules }: { components: Properties; rules: SchemaRules }) => { components: Properties @@ -62,13 +56,14 @@ export default ( prop.componentProps = Object.assign(prop.componentProps || {}, componentProps) } - const { availablePlaceholders } = useSQLAvailablePlaceholder() const { completionProvider } = useAvailableProviders() const handleProp = (parm: Property) => { const walk = (prop: Property) => { if (prop.properties) { Object.values(prop.properties).forEach((item) => walk(item)) + } else if (prop.type === 'array' && prop.items?.properties) { + Object.values(prop.items.properties).forEach((item) => walk(item)) } else if (prop.type === 'oneof') { prop.oneOf?.forEach((item) => walk(item)) } else if ( @@ -114,17 +109,11 @@ export default ( const { qos, retain, payload, topic } = components?.parameters?.properties || {} if (qos?.type === 'oneof') { qos.type = 'enum' - qos.symbols = [ - ...(getSymbolsFromOneOfArr(qos.oneOf) || []), - '${qos}', - ...availablePlaceholders.value, - ] - setComponentProps(qos, { filterable: true, allowCreate: true }) + qos.symbols = [...(getSymbolsFromOneOfArr(qos.oneOf) || []), '${qos}'] } if (retain?.type === 'oneof') { retain.type = 'enum' - retain.symbols = [true, false, '${flags.retain}', ...availablePlaceholders.value] - setComponentProps(retain, { filterable: true, allowCreate: true }) + retain.symbols = [true, false, '${flags.retain}'] } // for detect whether it is source or action if (topic && !payload) { diff --git a/src/hooks/Rule/bridge/useBridgeTypeValue.ts b/src/hooks/Rule/bridge/useBridgeTypeValue.ts index 49b4d1008..e652c1961 100644 --- a/src/hooks/Rule/bridge/useBridgeTypeValue.ts +++ b/src/hooks/Rule/bridge/useBridgeTypeValue.ts @@ -1,6 +1,3 @@ -import { CONNECTOR_TYPES_WITH_TWO_DIRECTIONS, INGRESS_BRIDGE_TYPES } from '@/common/constants' -import { getLabelFromValueInOptionList } from '@/common/tools' -import useI18nTl from '@/hooks/useI18nTl' import { BridgeDirection, BridgeType } from '@/types/enum' import { BridgeItem } from '@/types/rule' @@ -142,7 +139,7 @@ export const useBridgeTypeIcon = (): { return '' } try { - return require(`@/assets/img/${getBridgeIconKey(type)}.png`) + return getImg(`img/${getBridgeIconKey(type)}.png`) } catch (error) { console.error(error) return '' diff --git a/src/hooks/Rule/bridge/useCheckBeforeSaveAsCopy.ts b/src/hooks/Rule/bridge/useCheckBeforeSaveAsCopy.ts index 196c3821f..df9b3deca 100644 --- a/src/hooks/Rule/bridge/useCheckBeforeSaveAsCopy.ts +++ b/src/hooks/Rule/bridge/useCheckBeforeSaveAsCopy.ts @@ -1,10 +1,3 @@ -import { ENCRYPTED_PWD_REG } from '@/common/constants' -import { jumpToErrorFormItem } from '@/common/tools' -import useI18nTl from '@/hooks/useI18nTl' -import { get } from 'lodash' -import { ref, Ref } from 'vue' -import { useBridgeDataHandler } from '../useDataHandler' - export default (): { pwdErrorWhenCoping: Ref checkLikePwdField: (bridge: any, errorMsg?: string) => Promise diff --git a/src/hooks/Rule/bridge/useDeleteBridge.ts b/src/hooks/Rule/bridge/useDeleteBridge.ts index 2dae03063..2700e3538 100644 --- a/src/hooks/Rule/bridge/useDeleteBridge.ts +++ b/src/hooks/Rule/bridge/useDeleteBridge.ts @@ -1,18 +1,9 @@ -import useWebhookUtils from '@/hooks/Webhook/useWebhookUtils' -import useI18nTl from '@/hooks/useI18nTl' import { BridgeItem } from '@/types/rule' -import { ElMessage, ElMessageBox } from 'element-plus' -import { isFunction } from 'lodash' -import type { Ref } from 'vue' -import { ref } from 'vue' -import useHandleActionItem from '../action/useHandleActionItem' interface DeleteBridgeResult { showSecondConfirm: Ref usingBridgeRules: Ref currentDeleteBridgeId: Ref - currentDelName: Ref - showDeleteWebhookAssociatedTip: Ref handleDeleteSuc: () => void handleDeleteBridge: (data: BridgeItem) => Promise } @@ -24,8 +15,6 @@ export default (deletedCallBack: () => void): DeleteBridgeResult => { const usingBridgeRules: Ref> = ref([]) const currentDeleteBridgeId = ref('') - const currentDelName = ref('') - const showDeleteWebhookAssociatedTip = ref(false) const { judgeIsWebhookAction } = useWebhookUtils() const handleDeleteSuc = () => { @@ -43,8 +32,6 @@ export default (deletedCallBack: () => void): DeleteBridgeResult => { const { deleteAction } = useHandleActionItem() const handleDeleteBridge = async (item: BridgeItem) => { if (judgeIsWebhookAction(item)) { - currentDelName.value = item.name - showDeleteWebhookAssociatedTip.value = true return } if (item.rules?.length) { @@ -71,8 +58,6 @@ export default (deletedCallBack: () => void): DeleteBridgeResult => { showSecondConfirm, usingBridgeRules, currentDeleteBridgeId, - currentDelName, - showDeleteWebhookAssociatedTip, handleDeleteSuc, handleDeleteBridge, } diff --git a/src/hooks/Rule/bridge/useResourceOpt.ts b/src/hooks/Rule/bridge/useResourceOpt.ts index 969388905..897d717e0 100644 --- a/src/hooks/Rule/bridge/useResourceOpt.ts +++ b/src/hooks/Rule/bridge/useResourceOpt.ts @@ -1,5 +1,4 @@ import { ResourceOpt } from '@/types/rule' -import { omit } from 'lodash' export default (): { createDefaultResourceOptsForm: (config?: { diff --git a/src/hooks/Rule/bridge/useSchemaBridgePropsLayout.ts b/src/hooks/Rule/bridge/useSchemaBridgePropsLayout.ts index ed255b23e..bc9fdfcb1 100644 --- a/src/hooks/Rule/bridge/useSchemaBridgePropsLayout.ts +++ b/src/hooks/Rule/bridge/useSchemaBridgePropsLayout.ts @@ -1,9 +1,6 @@ import { BridgeType } from '@/types/enum' -import type { ComputedRef, WritableComputedRef } from 'vue' -import { computed } from 'vue' -import useSyncConfiguration from './useSyncConfiguration' -export const resourceOptFields = [ +export const actionResourceOptFields = [ 'start_timeout', 'worker_pool_size', 'request_ttl', @@ -53,7 +50,7 @@ export default ( 'pool_size', 'connect_timeout', 'max_retries', - ...resourceOptFields, + ...actionResourceOptFields, ] const basicInfoFields = ['name', 'connector', 'description'] diff --git a/src/hooks/Rule/bridge/useSpecialRuleForPassword.ts b/src/hooks/Rule/bridge/useSpecialRuleForPassword.ts index 4636976a5..80378f464 100644 --- a/src/hooks/Rule/bridge/useSpecialRuleForPassword.ts +++ b/src/hooks/Rule/bridge/useSpecialRuleForPassword.ts @@ -1,5 +1,3 @@ -import { ENCRYPTED_PWD_REG } from '@/common/constants' -import useI18nTl from '@/hooks/useI18nTl' import { FormItemRule } from '@/types/common' export default ( diff --git a/src/hooks/Rule/bridge/useSyncConfiguration.ts b/src/hooks/Rule/bridge/useSyncConfiguration.ts index 24b6877d8..43eadf947 100644 --- a/src/hooks/Rule/bridge/useSyncConfiguration.ts +++ b/src/hooks/Rule/bridge/useSyncConfiguration.ts @@ -1,7 +1,4 @@ import { OtherBridge } from '@/types/rule' -import type { ComputedRef, WritableComputedRef } from 'vue' -import { computed } from 'vue' -import { isString, omit } from 'lodash' /** * some utils about sync, batch and msg queue configuration diff --git a/src/hooks/Rule/connector/useComponentsHandlers.ts b/src/hooks/Rule/connector/useConnectorComponentsHandlers.ts similarity index 86% rename from src/hooks/Rule/connector/useComponentsHandlers.ts rename to src/hooks/Rule/connector/useConnectorComponentsHandlers.ts index c4f5644eb..467570126 100644 --- a/src/hooks/Rule/connector/useComponentsHandlers.ts +++ b/src/hooks/Rule/connector/useConnectorComponentsHandlers.ts @@ -1,11 +1,5 @@ -import { DEFAULT_SSL_VERIFY_VALUE, SSL_VERIFY_VALUE_MAP } from '@/common/constants' -import useSpecialRuleForPassword from '@/hooks/Rule/bridge/useSpecialRuleForPassword' -import { SchemaRules } from '@/hooks/Schema/useSchemaFormRules' -import useFormRules from '@/hooks/useFormRules' -import useSSL from '@/hooks/useSSL' import { BridgeType } from '@/types/enum' import { Properties, Property } from '@/types/schemaForm' -import { pick } from 'lodash' type Handler = ({ components, rules }: { components: Properties; rules: SchemaRules }) => { components: Properties @@ -35,6 +29,7 @@ export default ( ): { getComponentsHandler: () => Handler } => { + const { t } = useI18n() const { ruleWhenEditing } = useSpecialRuleForPassword(props) const { createCommonIdRule } = useFormRules() const addRuleForPassword = (rules: any) => { @@ -125,6 +120,24 @@ export default ( comRet.keepalive.type = 'duration' } + // Add labels and descriptions for ids and node + const getI18nPrefix = (type: string) => `BridgeSchema.${type}.` + const setLabelAndDesc = (prop: Property, path: string) => { + if (prop) { + prop.label = t(`${path}.label`) + prop.description = t(`${path}.desc`) + } + } + const i18nPrefix = getI18nPrefix(BridgeType.MQTT) + if (comRet?.static_clientids?.items?.properties) { + const props = comRet.static_clientids.items.properties + if (props.ids) { + setLabelAndDesc(props.ids, `${i18nPrefix}ids`) + } + if (props.node) { + setLabelAndDesc(props.node, `${i18nPrefix}node`) + } + } return { components: comRet, rules } } diff --git a/src/hooks/Rule/connector/useHandleConnectorItem.ts b/src/hooks/Rule/connector/useHandleConnectorItem.ts index 06a8b49ce..094ca634f 100644 --- a/src/hooks/Rule/connector/useHandleConnectorItem.ts +++ b/src/hooks/Rule/connector/useHandleConnectorItem.ts @@ -6,16 +6,7 @@ import { deleteConnector as requestDelConnector, reconnectConnector as requestReconnectConnector, } from '@/api/connector' -import useTestConnector from '@/hooks/Rule/connector/useTestConnector' -import useWebhookUtils from '@/hooks/Webhook/useWebhookUtils' -import useI18nTl from '@/hooks/useI18nTl' -import useOperationConfirm from '@/hooks/useOperationConfirm' import { BridgeItem, Connector } from '@/types/rule' -import { ElMessage } from 'element-plus' -import { isFunction } from 'lodash' -import type { Ref } from 'vue' -import { ref } from 'vue' -import { useConnectorDataHandler } from '../useDataHandler' type NowConnector = Connector | BridgeItem @@ -34,8 +25,6 @@ interface ConnectorHandlerResult { isTesting: Ref testConnectivity: (data: NowConnector) => Promise showDelTip: Ref - currentDelName: Ref - showDeleteWebhookAssociatedTip: Ref handleDeleteConnector: (data: Connector, callback: () => void | Promise) => Promise } @@ -138,18 +127,14 @@ export default (): ConnectorHandlerResult => { return confirmDel(() => deleteConnector(id)) } - const currentDelName = ref('') - const showDeleteWebhookAssociatedTip = ref(false) const { judgeIsWebhookConnector } = useWebhookUtils() const handleDeleteConnector = async ( connector: Connector, callback: () => void | Promise, ) => { - const { id, actions, sources, name } = connector + const { id, actions, sources } = connector if (judgeIsWebhookConnector(connector)) { - currentDelName.value = name - showDeleteWebhookAssociatedTip.value = true return } if ((actions && actions.length) || (sources && sources.length)) { @@ -180,8 +165,6 @@ export default (): ConnectorHandlerResult => { isTesting, testConnectivity, showDelTip, - currentDelName, - showDeleteWebhookAssociatedTip, handleDeleteConnector, } } diff --git a/src/hooks/Rule/connector/useSchemaConnectorPropsLayout.ts b/src/hooks/Rule/connector/useSchemaConnectorPropsLayout.ts index 99858113f..4dc22ff94 100644 --- a/src/hooks/Rule/connector/useSchemaConnectorPropsLayout.ts +++ b/src/hooks/Rule/connector/useSchemaConnectorPropsLayout.ts @@ -1,9 +1,6 @@ import { BridgeType } from '@/types/enum' -import type { ComputedRef, WritableComputedRef } from 'vue' -import { computed } from 'vue' -import useSyncConfiguration from '../bridge/useSyncConfiguration' -export const resourceOptFields = [ +export const connectorResourceOptFields = [ 'start_timeout', 'worker_pool_size', 'request_ttl', @@ -46,8 +43,9 @@ export default ( 'pool_type', 'pool_size', 'connect_timeout', + 'max_inactive', 'max_retries', - ...resourceOptFields, + ...connectorResourceOptFields, ] const baseFields = ['name', 'description'] diff --git a/src/hooks/Rule/connector/useTestConnector.ts b/src/hooks/Rule/connector/useTestConnector.ts index c1b3460ef..9bc0a2df9 100644 --- a/src/hooks/Rule/connector/useTestConnector.ts +++ b/src/hooks/Rule/connector/useTestConnector.ts @@ -1,8 +1,5 @@ import { testConnectorConnectivity } from '@/api/connector' import { Connector } from '@/types/rule' -import type { Ref } from 'vue' -import { ref } from 'vue' -import { useConnectorDataHandler } from '../useDataHandler' export default (): { isTesting: Ref diff --git a/src/hooks/Rule/rule/useDebugRule.ts b/src/hooks/Rule/rule/useDebugRule.ts index 4c022413f..ffa0b08f1 100644 --- a/src/hooks/Rule/rule/useDebugRule.ts +++ b/src/hooks/Rule/rule/useDebugRule.ts @@ -1,8 +1,5 @@ import { addTrace, deleteTrace, getTraceLog, getTraceNodesMsg } from '@/api/diagnose' import { applyRuleTest } from '@/api/ruleengine' -import { getKeywordsFromSQL } from '@/common/tools' -import useI18nTl from '@/hooks/useI18nTl' -import useSyncPolling from '@/hooks/useSyncPolling' import { TraceRecord } from '@/types/diagnose' import { EventForRule, @@ -12,16 +9,7 @@ import { TraceEncodeType, } from '@/types/enum' import { BasicRule, BridgeItem, RuleEvent, RuleItem } from '@/types/rule' -import { ElMessageBox } from 'element-plus' -import { cloneDeep, debounce, isArray, isEqual, mergeWith, startCase } from 'lodash' -import moment from 'moment' -import type { ComputedRef, Ref, WritableComputedRef } from 'vue' -import { computed, onUnmounted, ref, watch } from 'vue' -import { useStore } from 'vuex' -import type { FormattedLog, LogItem } from './useFormatDebugLog' -import useFormatDebugLog from './useFormatDebugLog' -import { useRuleUtils } from './useRule' -import useRuleEvents from './useRuleEvents' +import dayjs from 'dayjs' const BYTE_PER_PAGE = Math.pow(2, 30) @@ -62,7 +50,7 @@ export default (): { const nowTimestamp = new Date().getTime() const oneDayLaterTimestamp = nowTimestamp + 24 * 60 * 60 * 1000 const traceData: TraceRecord = { - name: `DEBUG_RULE_${ruleId}_${moment().format('YYYYMMDD_HHmmssSSS')}`, + name: `DEBUG_RULE_${ruleId}_${dayjs().format('YYYYMMDD_HHmmssSSS')}`, type: 'ruleid', ruleid: ruleId, payload_encode: TraceEncodeType.Text, @@ -382,7 +370,7 @@ export const useMockData = ( const getEventTypeInContext = () => { const { type, target } = findSourceTypeAndTarget(dataType.value) if (type === RuleInputType.Event) { - return dataType.value.match(/(\$events\/)([\w]+)/)?.[2] + return dataType.value.match(/\w+$/)?.[0] } if (type === RuleInputType.Bridge) { return `$bridges/${(target as BridgeItem).type}:*` diff --git a/src/hooks/Rule/rule/useFormatDebugLog.ts b/src/hooks/Rule/rule/useFormatDebugLog.ts index fd059ae0d..1697434f4 100644 --- a/src/hooks/Rule/rule/useFormatDebugLog.ts +++ b/src/hooks/Rule/rule/useFormatDebugLog.ts @@ -1,8 +1,5 @@ -import { getBridgeKey } from '@/common/tools' -import useI18nTl from '@/hooks/useI18nTl' import { BridgeType, LogResult, RuleOutput } from '@/types/enum' import { stringifyObjSafely } from '@emqx/shared-ui-utils' -import { groupBy, get, omit, startCase } from 'lodash' /** * Some Special Log Msg @@ -68,7 +65,7 @@ export const LogTargetType = { Republish: RuleOutput.Republish, Action: RuleOutput.DataBridge, } -export type LogTargetTypeValue = typeof LogTargetType[keyof typeof LogTargetType] +export type LogTargetTypeValue = (typeof LogTargetType)[keyof typeof LogTargetType] export interface TargetLogInfo { [key: string]: { diff --git a/src/hooks/Rule/rule/useRule.ts b/src/hooks/Rule/rule/useRule.ts index 5021ffad5..317e30ec6 100644 --- a/src/hooks/Rule/rule/useRule.ts +++ b/src/hooks/Rule/rule/useRule.ts @@ -5,18 +5,12 @@ import { RULE_INPUT_EVENT_PREFIX, TOPIC_EVENT, } from '@/common/constants' -import { addNewlineAfterComma, getTypeAndNameFromKey, splitOnComma } from '@/common/tools' import useBridgeTypeValue, { typesWithProducerAndConsumer, useBridgeTypeIcon, } from '@/hooks/Rule/bridge/useBridgeTypeValue' import { BridgeType, EventForRule, RuleInputType, RuleOutput, RuleSQLKeyword } from '@/types/enum' import { BridgeItem, OutputItem, RuleEvent, TestColumnItem } from '@/types/rule' -import type { ComputedRef } from 'vue' -import { computed, ref } from 'vue' -import useRuleEvents from './useRuleEvents' -import { escapeRegExp } from 'lodash' -import useI18nTl from '@/hooks/useI18nTl' export const useRuleUtils = (): { TOPIC_EVENT: string @@ -232,18 +226,24 @@ export const useRuleUtils = (): { } } +export const SourceServerType = { + MQTTBroker: BridgeType.MQTT, +} + /** * Unlike RuleInputType, the action here is specific to what type of action it is. */ export const RuleSourceType = { Message: 'message', Event: 'event', - MQTTBroker: BridgeType.MQTT, + ...SourceServerType, } export const useRuleInputs = (): { getBridgeIdFromInput: (input: string) => string detectInputType: (from: string) => string + isBridgeType: (type: string) => boolean isNotBridgeSourceTypes: Array + sourceServerOptList: Array<{ value: string; label: string }> sourceOptList: Array<{ value: string; label: string }> getRuleSourceIcon: (type: string) => string } => { @@ -260,7 +260,7 @@ export const useRuleInputs = (): { const typeLabelMap = { [RuleSourceType.Message]: tl('messages'), [RuleSourceType.Event]: tl('event'), - [RuleSourceType.MQTTBroker]: tl('mqttBroker'), + [RuleSourceType.MQTT]: tl('mqttBroker'), } const { getBridgeLabelByTypeValue } = useBridgeTypeValue() const getTypeLabel = (specificType: string): string => { @@ -271,6 +271,11 @@ export const useRuleInputs = (): { return ret || specificType } + const sourceServerOptList = Object.entries(SourceServerType).map(([, value]) => ({ + value, + label: getTypeLabel(value), + })) + const sourceOptList = Object.entries(RuleSourceType).map(([, value]) => ({ value, label: getTypeLabel(value), @@ -318,12 +323,12 @@ export const useRuleInputs = (): { const adjustedType = adjustTypeForSpecialCases(type) if (isTypeUsingNewIcon(adjustedType)) { - return require(`@/assets/flowIcon/${adjustedType}.png`) + return getImg(`flowIcon/${adjustedType}.png`) } if (isBridgeType(type)) { return getBridgeIcon(type) } - return require(`@/assets/img/${adjustedType}.png`) + return getImg(`img/${adjustedType}.png`) } catch (error) { return '' } @@ -332,7 +337,9 @@ export const useRuleInputs = (): { return { getBridgeIdFromInput, detectInputType, + isBridgeType, isNotBridgeSourceTypes, + sourceServerOptList, sourceOptList, getRuleSourceIcon, } diff --git a/src/hooks/Rule/rule/useRuleEvents.ts b/src/hooks/Rule/rule/useRuleEvents.ts index 4a82c729a..dba08a149 100644 --- a/src/hooks/Rule/rule/useRuleEvents.ts +++ b/src/hooks/Rule/rule/useRuleEvents.ts @@ -1,8 +1,5 @@ import { getRuleEvents as queryRuleEvents } from '@/api/ruleengine' import { RuleEvent } from '@/types/rule' -import { camelCase } from 'lodash' -import { useI18n } from 'vue-i18n' -import { useStore } from 'vuex' const EVENT_SORT: Array = [ '$events/client_check_authn_complete', diff --git a/src/hooks/Rule/rule/useRuleForm.ts b/src/hooks/Rule/rule/useRuleForm.ts index da481eddc..6d5b43cda 100644 --- a/src/hooks/Rule/rule/useRuleForm.ts +++ b/src/hooks/Rule/rule/useRuleForm.ts @@ -1,6 +1,3 @@ -import { DEFAULT_FROM, DEFAULT_SELECT } from '@/common/constants' -import { createRandomString } from '@/common/tools' -import { useRuleUtils } from '@/hooks/Rule/rule/useRule' import { BasicRule, RuleItem } from '@/types/rule' export default (): { @@ -16,7 +13,7 @@ export default (): { sql: transSQLFormDataToSQL(DEFAULT_SELECT, [from]), actions: [], description: '', - enable: true + enable: true, }) const getRuleDataForUpdate = ({ diff --git a/src/hooks/Rule/rule/useRuleSourceEvents.ts b/src/hooks/Rule/rule/useRuleSourceEvents.ts index 2309220b3..fc9e268c9 100644 --- a/src/hooks/Rule/rule/useRuleSourceEvents.ts +++ b/src/hooks/Rule/rule/useRuleSourceEvents.ts @@ -1,9 +1,3 @@ -import useI18nTl from '@/hooks/useI18nTl' -import { camelCase } from 'lodash' -import { computed } from 'vue' -import { useStore } from 'vuex' -import { useRuleUtils } from './useRule' - export default (): { eventDoNotNeedShow: string[] isMsgPubEvent: (event: string) => boolean diff --git a/src/hooks/Rule/rule/useRuleStatus.ts b/src/hooks/Rule/rule/useRuleStatus.ts index dddc9433a..dced7544c 100644 --- a/src/hooks/Rule/rule/useRuleStatus.ts +++ b/src/hooks/Rule/rule/useRuleStatus.ts @@ -1,5 +1,4 @@ import { NodeStatusClass } from '@/types/enum' -import { useI18n } from 'vue-i18n' export default (): { getStatusLabel: (enable: boolean | undefined) => string diff --git a/src/hooks/Rule/useActionAndSourceStatus.ts b/src/hooks/Rule/useActionAndSourceStatus.ts new file mode 100644 index 000000000..092cc6fc4 --- /dev/null +++ b/src/hooks/Rule/useActionAndSourceStatus.ts @@ -0,0 +1,26 @@ +import { ConnectionStatus } from '@/types/enum' + +const useActionAndSourceStatus = (): { + statusOptList: Array<{ value: ConnectionStatus; label: string }> + statusLabelMap: Partial> +} => { + const { t, tl } = useI18nTl('RuleEngine') + const statusLabelMap = { + [ConnectionStatus.Connected]: tl('actionAvailable'), + [ConnectionStatus.Disconnected]: tl('actionUnavailable'), + [ConnectionStatus.Connecting]: t('Base.connecting'), + [ConnectionStatus.Inconsistent]: t('Base.inconsistent'), + } + const statusOptList = (Object.entries(statusLabelMap) as [ConnectionStatus, string][]).map( + ([key, value]) => ({ + value: key, + label: value, + }), + ) + return { + statusLabelMap, + statusOptList, + } +} + +export default useActionAndSourceStatus diff --git a/src/hooks/Rule/useDataHandler.ts b/src/hooks/Rule/useDataHandler.ts index 40f950486..a9215430f 100644 --- a/src/hooks/Rule/useDataHandler.ts +++ b/src/hooks/Rule/useDataHandler.ts @@ -1,19 +1,16 @@ -import { checkNOmitFromObj } from '@/common/tools' -import useSSL from '@/hooks/useSSL' import { BridgeType } from '@/types/enum' import { Action, Connector } from '@/types/rule' -import { cloneDeep, get, omit, set } from 'lodash' const keysDoNotNeedForAPI = [ 'node_status', 'status', 'status_reason', 'error', - 'role', 'idForRuleFrom', 'actions', 'id', 'rules', + 'last_modified_at', ] const keysNeedDel = { diff --git a/src/hooks/Rule/useProvidersForMonaco.ts b/src/hooks/Rule/useProvidersForMonaco.ts index 0ccf169bf..6e8ddf2ae 100644 --- a/src/hooks/Rule/useProvidersForMonaco.ts +++ b/src/hooks/Rule/useProvidersForMonaco.ts @@ -1,14 +1,6 @@ -import { RULE_INPUT_BRIDGE_TYPE_PREFIX, RULE_INPUT_EVENT_PREFIX } from '@/common/constants' -import { waitAMoment } from '@/common/tools' import { BridgeItem, RuleEvent } from '@/types/rule' -import { camelCase } from 'lodash' import * as monaco from 'monaco-editor' -import type { ComputedRef, Ref } from 'vue' -import { computed, ref } from 'vue' -import useI18nTl from '../useI18nTl' import keysInRule from './KeysInRule' -import useRuleSourceEvents from './rule/useRuleSourceEvents' -import useSQLAvailablePlaceholder from './useSQLAvailablePlaceholder' const { syntaxKeys, fieldsCanUse, builtInSQLFuncs, jqFunc } = keysInRule diff --git a/src/hooks/Rule/useSQLAvailablePlaceholder.ts b/src/hooks/Rule/useSQLAvailablePlaceholder.ts index b4362b50d..025432f62 100644 --- a/src/hooks/Rule/useSQLAvailablePlaceholder.ts +++ b/src/hooks/Rule/useSQLAvailablePlaceholder.ts @@ -1,4 +1,3 @@ -import { RULE_INPUT_BRIDGE_TYPE_PREFIX, RULE_INPUT_EVENT_PREFIX } from '@/common/constants' import { getKeyPartsFromSQL, getRuleSelectionAlias, @@ -6,12 +5,8 @@ import { splitOnComma, trimSpacesAndLFs, } from '@/common/tools' -import { useRuleUtils } from '@/hooks/Rule/rule/useRule' import { RuleInputType } from '@/types/enum' import { RuleEvent } from '@/types/rule' -import { escapeRegExp, isUndefined } from 'lodash' -import type { ComputedRef, Ref } from 'vue' -import { computed, inject, ref } from 'vue' // store kafka, rabbit columns...can not get from api like mqtt const _events: Array = [] as Array @@ -86,8 +81,8 @@ export default (): { const itemType = checkIsBridge(item) ? RuleInputType.Bridge : checkIsTopic(item) - ? RuleInputType.Topic - : RuleInputType.Event + ? RuleInputType.Topic + : RuleInputType.Event const value = itemType === RuleInputType.Bridge ? item.replace(ruleInputBridgeReg, '') : item const targetEvent = getTestTargetEvent(itemType, value, totalEventList.value) diff --git a/src/hooks/Schema/useItemLabelAndDesc.ts b/src/hooks/Schema/useItemLabelAndDesc.ts index 302340464..aedc77787 100644 --- a/src/hooks/Schema/useItemLabelAndDesc.ts +++ b/src/hooks/Schema/useItemLabelAndDesc.ts @@ -1,4 +1,3 @@ -import { INTEGRATION_SCHEMA_TYPES } from '@/common/constants' import { useActionSchema, useConnectorSchema, @@ -6,8 +5,6 @@ import { } from '@/hooks/Rule/bridge/useBridgeTypeValue' import actionText from '@/schemaText/actionText/index' import { Property } from '@/types/schemaForm' -import { isFunction, snakeCase } from 'lodash' -import { useI18n } from 'vue-i18n' type GetTextKey = (prop: Property) => string @@ -15,26 +12,6 @@ const numReg = /_\d/g const customSnakeCase = (str: string) => snakeCase(str).replace(numReg, (match) => match.replace('_', '')) -const DEFAULT_ZONE = 'emqx_schema' -const TYPE_ZONE_MAP: Record> = { - emqx_schema: ['mqtt', 'session', 'sysmon'], - emqx_conf_schema: ['log'], - emqx_limiter_schema: ['limiter'], -} - -/** - * For Log Configuration - */ -const LOG_DEFAULT_PREFIX = 'common_handler_' -const LOG_SPECIAL_KEY_PREFIX_MAP = { - log_overload_kill_: ['mem_size', 'qlen', 'restart_after'], - log_burst_limit_: ['max_count', 'window_time'], - log_file_handler_: ['max_size', 'path', 'rotation_size'], - log_rotation_: ['count'], -} - -const SYS_MON_PREFIX = 'sysmon_' - // Bridge const COMMON_ZONE = 'common' const COMMON_FIELD_KEYS = Object.keys(actionText.en.common) @@ -61,47 +38,20 @@ export default ( } getOptLabel: (key: string) => string } => { + const CONFIG_TEXT_BASE = 'ConfigSchema.' const { t, te } = useI18n() + const testConfigTextKey = (key: string) => te(`${CONFIG_TEXT_BASE}${key}.label`) const typesUseBridgeText = INTEGRATION_SCHEMA_TYPES - /** - * zone is first level - */ - const getConfigurationTextZone = () => - Object.keys(TYPE_ZONE_MAP).find((key) => TYPE_ZONE_MAP[key].includes(props.type)) || - DEFAULT_ZONE - - const getMQTTAndSessionItemTextKey = ({ path }: Property) => - `${getConfigurationTextZone()}.${customSnakeCase(path as string)}` - - const getLogItemTextKey = ({ key, path }: Property) => { - const prefix = - Object.entries(LOG_SPECIAL_KEY_PREFIX_MAP).find( - ([, value]) => value.includes(path as string) || value.includes(key as string), - )?.[0] || LOG_DEFAULT_PREFIX - return `${getConfigurationTextZone()}.${prefix}${key}` - } - - const getSysMonTextKey = ({ path }: Property) => - `${getConfigurationTextZone()}.${SYS_MON_PREFIX}${customSnakeCase(path as string)}` - - const getLimiterTextKey = ({ key }: Property) => `${getConfigurationTextZone()}.${key}` - - const funcMap: Record = { - mqtt: getMQTTAndSessionItemTextKey, - session: getMQTTAndSessionItemTextKey, - log: getLogItemTextKey, - sysmon: getSysMonTextKey, - limiter: getLimiterTextKey, + const commonGetConfigItemKey = ({ key, path }: Property) => { + const exactKey = `${props.type}_${customSnakeCase(path as string)}` + const fullKey = testConfigTextKey(`${exactKey}`) ? `${exactKey}` : (key as string) + return fullKey } const getConfigurationItemTextKey = (prop: Property) => { - const func = funcMap[props.type] - if (func && isFunction(func)) { - return func(prop) - } - return prop.path + return commonGetConfigItemKey(prop) } const { getTypeByConnectorSchemaRef } = useConnectorSchema() @@ -119,7 +69,7 @@ export default ( } const getHotConfText = (prop: Property) => { - const textKey = 'ConfigSchema.' + getConfigurationItemTextKey(prop) + const textKey = CONFIG_TEXT_BASE + getConfigurationItemTextKey(prop) const descKey = `${textKey}.desc` if (textKey) { return { diff --git a/src/hooks/Schema/useSchemaForm.ts b/src/hooks/Schema/useSchemaForm.ts index b02384f5d..313351836 100644 --- a/src/hooks/Schema/useSchemaForm.ts +++ b/src/hooks/Schema/useSchemaForm.ts @@ -1,12 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ +import { PropType } from '@/types/enum' import { Component, Properties, Property, Schema } from '@/types/schemaForm' import axios from 'axios' -import { cloneDeep, get } from 'lodash' -import type { Ref } from 'vue' -import { ref } from 'vue' -import { useStore } from 'vuex' -import useSchemaFormRules, { SchemaRules } from './useSchemaFormRules' -import useSchemaRecord from './useSchemaRecord' const CONNECTOR_CONF_KEYS = 'connector' @@ -89,6 +84,13 @@ export default function useSchemaForm( const getComponentByRef = (data: Schema, ref: string | Array): Component => get(data, filter(ref), {}) + const getIsTemplateFromOneOfArr = (oneof: Property['oneOf']): boolean => { + if (!oneof) { + return false + } + return oneof.some((item) => item.is_template) + } + /** * Calling it before components are assigned as much as possible will reduce the number of re-renders, * but because sometimes data such as `format` may be custom modified by the parent component @@ -110,6 +112,7 @@ export default function useSchemaForm( } return property } + const simpleTypes = ['string', 'number', 'boolean', 'integer'] const getComponents = (objForGetComponent: { path?: string; ref?: string | Array }) => { let lastLabel = '' /** @@ -202,6 +205,18 @@ export default function useSchemaForm( } return item }) as Property[] + property.is_template = property.is_template ?? getIsTemplateFromOneOfArr(property.oneOf) + const isSimpleOneof = oneOf.every(({ type }) => simpleTypes.includes(type)) + if (isSimpleOneof && property.is_template) { + const justWithBoolean = + oneOf.length === 2 && + oneOf.every(({ type }) => + [PropType.Boolean, PropType.String].includes(type as PropType), + ) + property.type = justWithBoolean ? 'enum' : 'string' + property.symbols = justWithBoolean ? [true, false] : undefined + property.default = property.default ?? (justWithBoolean ? '' : undefined) + } } if (!label) { property.label = lastLabel diff --git a/src/hooks/Schema/useSchemaFormRules.ts b/src/hooks/Schema/useSchemaFormRules.ts index 4ec75ce96..5b236e520 100644 --- a/src/hooks/Schema/useSchemaFormRules.ts +++ b/src/hooks/Schema/useSchemaFormRules.ts @@ -1,12 +1,6 @@ -import { transTimeStrToMS } from '@/common/tools' import { FormRules } from '@/types/common' import { PropType } from '@/types/enum' import { Component } from '@/types/schemaForm' -import { isNumber, isString, isUndefined } from 'lodash' -import type { Ref } from 'vue' -import { ref } from 'vue' -import useFormRules from '../useFormRules' -import useI18nTl from '../useI18nTl' export type SchemaRules = FormRules diff --git a/src/hooks/Schema/useSchemaRecord.ts b/src/hooks/Schema/useSchemaRecord.ts index f9b0b5607..23d45ee5b 100644 --- a/src/hooks/Schema/useSchemaRecord.ts +++ b/src/hooks/Schema/useSchemaRecord.ts @@ -1,6 +1,5 @@ import { PropType } from '@/types/enum' import { Properties, Property } from '@/types/schemaForm' -import { set } from 'lodash' export default (): { createInitValueByType: (prop: Property) => any diff --git a/src/hooks/Webhook/useWebhookForm.ts b/src/hooks/Webhook/useWebhookForm.ts index 53cca761d..b94c99fe5 100644 --- a/src/hooks/Webhook/useWebhookForm.ts +++ b/src/hooks/Webhook/useWebhookForm.ts @@ -1,13 +1,6 @@ -import { WEBHOOK_SUFFIX } from '@/common/constants' -import { getAPIPath } from '@/common/tools' -import useRuleForm from '@/hooks/Rule/rule/useRuleForm' import { BridgeType } from '@/types/enum' import { ConnectorForm, HTTPBridge } from '@/types/rule' import { WebhookForm } from '@/types/webhook' -import { pick } from 'lodash' -import { useActionSchema } from '../Rule/bridge/useBridgeTypeValue' -import useSchemaForm from '../Schema/useSchemaForm' -import useSchemaRecord from '../Schema/useSchemaRecord' export default (): { createRawWebhookForm: () => Promise diff --git a/src/hooks/Webhook/useWebhookItem.ts b/src/hooks/Webhook/useWebhookItem.ts index 5ff083760..a7b4c0c78 100644 --- a/src/hooks/Webhook/useWebhookItem.ts +++ b/src/hooks/Webhook/useWebhookItem.ts @@ -1,14 +1,11 @@ import { deleteAction, putActionEnable } from '@/api/action' -import { deleteConnector } from '@/api/connector' +import { deleteConnector, putConnectorEnable } from '@/api/connector' import { deleteRules, updateRules } from '@/api/ruleengine' import { WebhookItem } from '@/types/webhook' import { ElMessage as M, ElMessageBox as MB } from 'element-plus' -import type { Ref } from 'vue' -import { ref } from 'vue' -import { useI18n } from 'vue-i18n' export default (): { - toggleWebhookEnableStatus: (webhook: WebhookItem) => Promise<[any, any]> + toggleWebhookEnableStatus: (webhook: WebhookItem) => Promise<[any, any, any]> deleteLoading: Ref deleteWebhook: (webhook: WebhookItem) => Promise } => { @@ -23,6 +20,7 @@ export default (): { return await Promise.all([ toggleBridgeEnableStatus(webhook.action.id, enable), toggleRuleEnableStatus(webhook.rule.id, enable), + putConnectorEnable(webhook.connector.id, enable), ]) } diff --git a/src/hooks/Webhook/useWebhookList.ts b/src/hooks/Webhook/useWebhookList.ts index 57f7c2252..b07c9e46c 100644 --- a/src/hooks/Webhook/useWebhookList.ts +++ b/src/hooks/Webhook/useWebhookList.ts @@ -1,12 +1,8 @@ import { getActions as queryActions } from '@/api/action' import { getConnectors as queryConnectors } from '@/api/connector' import { getRules as queryRules } from '@/api/ruleengine' -import { getAllListData } from '@/common/tools' import { BridgeItem, Connector, HTTPBridge, RuleItem } from '@/types/rule' import { WebhookItem } from '@/types/webhook' -import type { Ref } from 'vue' -import { ref } from 'vue' -import useWebhookUtils from './useWebhookUtils' export default (): { webhookList: Ref diff --git a/src/hooks/Webhook/useWebhookUtils.ts b/src/hooks/Webhook/useWebhookUtils.ts index df243aef4..72ef4b9f0 100644 --- a/src/hooks/Webhook/useWebhookUtils.ts +++ b/src/hooks/Webhook/useWebhookUtils.ts @@ -1,5 +1,3 @@ -import { WEBHOOK_SUFFIX } from '@/common/constants' -import { useBridgeTypeValue } from '@/hooks/Rule/bridge/useBridgeTypeValue' import { BridgeType, RuleOutput } from '@/types/enum' import { BridgeItem, Connector, HTTPBridge, OutputItem, RuleItem } from '@/types/rule' import { WebhookItem } from '@/types/webhook' @@ -48,11 +46,11 @@ export default (): { } const judgeIsWebhookAction = (action: BridgeItem) => { - const { type, name, connector } = action - if (!(type === BridgeType.Webhook && webhookTargetReg.test(name))) { + const { type, name, rules } = action + if (!(type === BridgeType.Webhook && webhookTargetReg.test(name) && rules?.length > 0)) { return false } - return name === connector + return rules.some((ruleName: string) => ruleName === name) } const judgeOutputsContainWebhook = (rule: RuleItem) => { diff --git a/src/hooks/useAdaptiveEditor.ts b/src/hooks/useAdaptiveEditor.ts index 6ffef80a6..f36538e74 100644 --- a/src/hooks/useAdaptiveEditor.ts +++ b/src/hooks/useAdaptiveEditor.ts @@ -1,6 +1,3 @@ -import type { Ref } from 'vue' -import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue' - interface UseAdaptiveEditorOptions { initialContent: Ref maxHeightRatio?: number @@ -15,7 +12,7 @@ interface UseAdaptiveEditorReturn { updateEditorHeight: () => void } -export function useAdaptiveEditor({ +export default function useAdaptiveEditor({ initialContent, maxHeightRatio = 0.9, minHeight = 100, @@ -59,5 +56,3 @@ export function useAdaptiveEditor({ updateEditorHeight, } } - -export default {} diff --git a/src/hooks/useClusterNodes.ts b/src/hooks/useClusterNodes.ts index 017c90899..e22983df1 100644 --- a/src/hooks/useClusterNodes.ts +++ b/src/hooks/useClusterNodes.ts @@ -1,6 +1,3 @@ -import type { Ref } from 'vue' -import { ref, reactive } from 'vue' -import _ from 'lodash' import { compareVersions } from 'compare-versions' import { loadNodes } from '@/api/common' import { NodeInfo } from '@/types/dashboard' @@ -37,7 +34,7 @@ export default function useClusterNodes( const handleVersions = (nodes: NodeInfo[]) => { const versionList = nodes.map((node) => node.version.split('-')[0]) - const uniqueVersions = _.uniq(versionList) + const uniqueVersions = uniq(versionList) versionInfo.isMutiVersion = uniqueVersions.length > 1 if (versionInfo.isMutiVersion) { versionInfo.latestVersion = uniqueVersions.reduce((latest, version) => { diff --git a/src/hooks/useCommonConnectionStatus.ts b/src/hooks/useCommonConnectionStatus.ts index f965a7eb3..b13e7a9ec 100644 --- a/src/hooks/useCommonConnectionStatus.ts +++ b/src/hooks/useCommonConnectionStatus.ts @@ -1,4 +1,3 @@ -import useI18nTl from '@/hooks/useI18nTl' import { ConnectionStatus, NodeStatusClass } from '@/types/enum' export default (): { diff --git a/src/hooks/useCopy.ts b/src/hooks/useCopy.ts index b7f3c481d..c065367f0 100644 --- a/src/hooks/useCopy.ts +++ b/src/hooks/useCopy.ts @@ -1,7 +1,4 @@ import copy from 'copy-to-clipboard' -import { ElMessage } from 'element-plus' -import { onBeforeUnmount } from 'vue' -import { useI18n } from 'vue-i18n' export default function useCopy(callback?: () => void): { copyText: (text: string) => Promise diff --git a/src/hooks/useDataNotSaveConfirm.ts b/src/hooks/useDataNotSaveConfirm.ts index c332760ca..8964a7304 100644 --- a/src/hooks/useDataNotSaveConfirm.ts +++ b/src/hooks/useDataNotSaveConfirm.ts @@ -1,11 +1,3 @@ -import useI18nTl from '@/hooks/useI18nTl' -import { ElMessageBox } from 'element-plus' -import { isFunction } from 'lodash' -import { onMounted, onUnmounted, Ref } from 'vue' -import { onBeforeRouteLeave } from 'vue-router' -import { useStore } from 'vuex' -import { isEqual, cloneDeep } from 'lodash' - export const useCheckDataChanged = ( nowData: Ref, ): { diff --git a/src/hooks/useDatePickerShortcuts.ts b/src/hooks/useDatePickerShortcuts.ts index 82215f64d..ecb6e8523 100644 --- a/src/hooks/useDatePickerShortcuts.ts +++ b/src/hooks/useDatePickerShortcuts.ts @@ -1,5 +1,3 @@ -import useI18nTl from './useI18nTl' - export default (): { datePickerShortcuts: { text: string diff --git a/src/hooks/useDocLink.ts b/src/hooks/useDocLink.ts index f70a3a3a5..c04ad5e22 100644 --- a/src/hooks/useDocLink.ts +++ b/src/hooks/useDocLink.ts @@ -1,4 +1,3 @@ -import { useI18n } from 'vue-i18n' import getDocLinks, { DocMap } from '@/common/docLinks' export default (): { docMap: DocMap } => { diff --git a/src/hooks/useDurationStr.ts b/src/hooks/useDurationStr.ts index 79bce1cdb..bb06ebc96 100644 --- a/src/hooks/useDurationStr.ts +++ b/src/hooks/useDurationStr.ts @@ -1,5 +1,4 @@ import { TimeUnit } from '@/types/enum' -import useI18nTl from './useI18nTl' const timeUnitArr: Array = [ TimeUnit.Millisecond, diff --git a/src/hooks/useEchartResize.ts b/src/hooks/useEchartResize.ts index fb709e326..76f01bb9a 100644 --- a/src/hooks/useEchartResize.ts +++ b/src/hooks/useEchartResize.ts @@ -1,7 +1,4 @@ -import { waitAMoment } from '@/common/tools' import { ECharts } from 'echarts' -import { nextTick, onUnmounted, watch } from 'vue' -import { useStore } from 'vuex' export default (): { addListener: (chart: ECharts) => void diff --git a/src/hooks/useEditionConfigs.ts b/src/hooks/useEditionConfigs.ts index 315062757..5bf081361 100644 --- a/src/hooks/useEditionConfigs.ts +++ b/src/hooks/useEditionConfigs.ts @@ -1,18 +1,19 @@ -import { IS_ENTERPRISE } from '@/common/constants' -import { computed, ComputedRef } from 'vue' -import { useI18n } from 'vue-i18n' +import enterpriseLogo from '@/assets/img/emqx-logo-enterprise.svg' +import openSourceLogo from '@/assets/img/emqx-logo-open-source.png' +import enterpriseBanner from '@/assets/img/login-banner-enterprise.png' +import openSourceBanner from '@/assets/img/login-banner-open-source.png' // Configs for different editions const editionConfigs = { enterprise: { title: 'Base.enterpriseEdition', - banner: require('@/assets/img/login-banner-enterprise.png'), - logo: require('@/assets/img/emqx-logo-enterprise.svg'), + banner: enterpriseBanner, + logo: enterpriseLogo, }, openSource: { title: 'Base.openSourceEdition', - banner: require('@/assets/img/login-banner-open-source.png'), - logo: require('@/assets/img/emqx-logo-open-source.png'), + banner: openSourceBanner, + logo: openSourceLogo, }, } diff --git a/src/hooks/useFillNewRecord.ts b/src/hooks/useFillNewRecord.ts index dc4fc2b46..e59214d34 100644 --- a/src/hooks/useFillNewRecord.ts +++ b/src/hooks/useFillNewRecord.ts @@ -2,7 +2,6 @@ * fill new record by old record, old component and new component */ import { Properties } from '@/types/schemaForm' -import { cloneDeep, get, omit, set } from 'lodash' interface Val { components: Properties diff --git a/src/hooks/useFormRules.ts b/src/hooks/useFormRules.ts index 2ff16d338..c80a0f1ad 100644 --- a/src/hooks/useFormRules.ts +++ b/src/hooks/useFormRules.ts @@ -1,9 +1,5 @@ -import { COMMON_ID_REG } from '@/common/constants' -import { checkInRange, checkStringWithUnit } from '@/common/tools' import { InternalRuleItem } from 'async-validator' import { FormItemRule } from 'element-plus' -import { isUndefined } from 'lodash' -import { useI18n } from 'vue-i18n' export const NO_CHINESE_REG = /^[^\u4e00-\u9fa5]+$/ @@ -61,8 +57,8 @@ export default (): { min !== undefined && max !== undefined ? t('Rule.errorRange', { min, max }) : min !== undefined - ? t('Rule.minimumError', { min }) - : t('Rule.maximumError', { max }) + ? t('Rule.minimumError', { min }) + : t('Rule.maximumError', { max }) return [{ type: 'number', min, max, message: errorMsg, trigger: 'change' }] } diff --git a/src/hooks/useGuide.ts b/src/hooks/useGuide.ts index 20137d601..4732232af 100644 --- a/src/hooks/useGuide.ts +++ b/src/hooks/useGuide.ts @@ -1,6 +1,3 @@ -import { ref } from 'vue' -import { isFunction } from 'lodash' - // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types export default function useGuide(before?: () => void) { const activeGuidesIndex = ref([0]) diff --git a/src/hooks/useI18nTl.ts b/src/hooks/useI18nTl.ts index 237835a28..6b29207a0 100644 --- a/src/hooks/useI18nTl.ts +++ b/src/hooks/useI18nTl.ts @@ -1,5 +1,3 @@ -import { useI18n, ComposerTranslation } from 'vue-i18n' - export default function useI18nTl(collection: string): { t: ComposerTranslation tl: ( diff --git a/src/hooks/useMetrics.ts b/src/hooks/useMetrics.ts index 37d6d643f..7f6ac73d3 100644 --- a/src/hooks/useMetrics.ts +++ b/src/hooks/useMetrics.ts @@ -1,5 +1,3 @@ -import { accAdd, transMemorySizeNumToStr } from '@/common/tools' -import useEchartResize from '@/hooks/useEchartResize' import { Metrics } from '@/types/common' import { BarSeriesOption, ECharts, EChartsOption, PieSeriesOption } from 'echarts' import 'echarts/lib/chart/bar' @@ -9,10 +7,7 @@ import 'echarts/lib/component/grid' import 'echarts/lib/component/title' import 'echarts/lib/component/tooltip' import * as echarts from 'echarts/lib/echarts' -import { get, isUndefined } from 'lodash' -import moment from 'moment' -import useI18nTl from './useI18nTl' -import { ref } from 'vue' +import dayjs from 'dayjs' export const enum MetricType { Green, @@ -254,17 +249,20 @@ export const useChartDataUtils = (): { } const { title, contains: values } = value let typeCount = 0 - const typeList = values.reduce((ret, key) => { - const value = get(metrics, key) - const item = { - value, - label: getMetricItemLabel(key, textMap), - desc: getMetricItemDesc(key, textMap), - } - typeCount = accAdd(typeCount, value) - ret.push(item) - return ret - }, [] as Array<{ value: number; label: string; desc?: string }>) + const typeList = values.reduce( + (ret, key) => { + const value = get(metrics, key) + const item = { + value, + label: getMetricItemLabel(key, textMap), + desc: getMetricItemDesc(key, textMap), + } + typeCount = accAdd(typeCount, value) + ret.push(item) + return ret + }, + [] as Array<{ value: number; label: string; desc?: string }>, + ) arr.push({ title, count: typeCount, detail: typeList, type: Number(key) as MetricType }) return arr }, [] as Array) @@ -302,7 +300,7 @@ export const useChartDataUtils = (): { x: createEmptyArray(length), y: createEmptyArray(length), }) - const getNow = () => moment().format('HH:mm:ss') + const getNow = () => dayjs().format('HH:mm:ss') const addRateDataItem = (rate: number, rateData: RateData, dataLen: number) => { rateData.x.push(getNow()) rateData.y.push(rate) @@ -321,6 +319,38 @@ export const useChartDataUtils = (): { } } +export const useSizeMetric = () => { + const getSizeStr = (bytes: number) => transMemorySizeNumToStr(bytes, 2) + const numPartReg = /^-?\d+(\.\d+)?/ + const getSizeNumPart = (size: string) => numPartReg.exec(size)?.[0] || '0' + const getSizeUnitPart = (size: string) => size.replace(numPartReg, '') || 'Bytes' + + const getSizeNum = (size: number) => formatNumber(getSizeNumPart(getSizeStr(size))) + const getSizeUnit = (size: number) => getSizeUnitPart(getSizeStr(size)) + + return { + getSizeStr, + getSizeNumPart, + getSizeUnitPart, + getSizeNum, + getSizeUnit, + } +} + +export const useNodeOpts = () => { + const { tl } = useI18nTl('BasicConfig') + const CLUSTER = 'cluster' + const clusterOpt = { label: tl('cluster'), value: CLUSTER } + const getNodeOpts = (nodes: Array) => [ + clusterOpt, + ...nodes.map((node) => ({ value: node, label: node })), + ] + return { + CLUSTER, + getNodeOpts, + } +} + interface Rate { unitKey: string current: string @@ -394,10 +424,7 @@ export const useBridgeMetrics = (): { } export const useActionQueueMetrics = () => { - const getSizeStr = (bytes: number) => transMemorySizeNumToStr(bytes, 2) - const numPartReg = /^-?\d+(\.\d+)?/ - const getSizeNumPart = (size: string) => numPartReg.exec(size)?.[0] || '0' - const getSizeUnitPart = (size: string) => size.replace(numPartReg, '') || 'Bytes' + const { getSizeStr, getSizeNumPart, getSizeUnitPart } = useSizeMetric() const queueBytesDataLength = 20 const completeQueueBytesDataData = ( @@ -453,7 +480,7 @@ export const useActionQueueMetrics = () => { if (isUndefined(value)) { return tl('noData') } - return `${moment(Number(axisValue)).format('HH:mm:ss')}
${getSizeStr(value)}` + return `${dayjs(Number(axisValue)).format('HH:mm:ss')}
${getSizeStr(value)}` }, }, color: [TYPE_COLOR_MAP[MetricType.Blue]], diff --git a/src/hooks/useOperationConfirm.ts b/src/hooks/useOperationConfirm.ts index 509b2caf2..0c985f43a 100644 --- a/src/hooks/useOperationConfirm.ts +++ b/src/hooks/useOperationConfirm.ts @@ -1,7 +1,4 @@ import type { MessageBoxData } from 'element-plus' -import { ElMessage, ElMessageBox } from 'element-plus' -import { isFunction } from 'lodash' -import useI18nTl from './useI18nTl' export default (): { operationWarning: (confirmText: string, opts?: Record) => Promise @@ -33,7 +30,7 @@ export default (): { if (callback && isFunction(callback)) { await callback() } - sucText ?? ElMessage.success(sucText) + sucText && ElMessage.success(sucText) return Promise.resolve() } catch (error) { return Promise.reject(error) diff --git a/src/hooks/usePagination.ts b/src/hooks/usePagination.ts index 6ac7ad873..2a2fced0d 100644 --- a/src/hooks/usePagination.ts +++ b/src/hooks/usePagination.ts @@ -1,6 +1,4 @@ import { PageData } from '@/types/common' -import type { ComputedRef, Ref, WritableComputedRef } from 'vue' -import { computed, ref } from 'vue' export default (): { page: Ref diff --git a/src/hooks/usePaginationRemember.ts b/src/hooks/usePaginationRemember.ts index 1ec5ed20d..0edb34f88 100644 --- a/src/hooks/usePaginationRemember.ts +++ b/src/hooks/usePaginationRemember.ts @@ -1,8 +1,5 @@ import { parseJSONSafely } from '@emqx/shared-ui-utils' import { PageData } from '@/types/common' -import { omit } from 'lodash' -import { Ref } from 'vue' -import { RouteLocationRaw, onBeforeRouteLeave, useRoute, useRouter } from 'vue-router' const STORE_KEY = 'list_page_params' diff --git a/src/hooks/usePaginationWithHasNext.ts b/src/hooks/usePaginationWithHasNext.ts index ef9890dbd..f396f32e9 100644 --- a/src/hooks/usePaginationWithHasNext.ts +++ b/src/hooks/usePaginationWithHasNext.ts @@ -1,6 +1,4 @@ import { PageData } from '@/types/common' -import type { ComputedRef, Ref } from 'vue' -import { computed, ref } from 'vue' const generateDefaultPageMeta = (): PageData => ({ limit: 20, diff --git a/src/hooks/usePaging.ts b/src/hooks/usePaging.ts index 87320b40e..9a6953ae4 100644 --- a/src/hooks/usePaging.ts +++ b/src/hooks/usePaging.ts @@ -1,6 +1,4 @@ import { ListDataWithPagination } from '@/types/common' -import _ from 'lodash' -import { ref, Ref } from 'vue' type ListData = Array @@ -9,9 +7,9 @@ interface PageMeta { limit: number } -export interface FilterItem { +export interface DataFilterItem { key: string - value: string + value: string | boolean | RegExp } interface SortFrom { @@ -26,13 +24,13 @@ export default (): { setTotalData: (data: ListData) => void getAPageData: ( pageMeta: PageMeta, - filters?: Array, + filters?: Array, sortFrom?: SortFrom, ) => ListDataWithPagination } => { const totalData: Ref = ref([]) // Use the following six variables to do a cache-like operation to reduce computational overhead - let latestFiltersString = '' + let latestFilters: Array = [] const listAfterFilter: Ref = ref([]) let latestSortFromString: string | undefined = undefined const listAfterFilterNSort: Ref = ref([]) @@ -46,14 +44,27 @@ export default (): { chunkList() } - const filterList = (filters: Array = []) => { - latestFiltersString = JSON.stringify(filters) + const checkValue = (filterValue: string | boolean | RegExp, value: any) => { + if (typeof filterValue === 'string') { + const reg = new RegExp(filterValue, 'i') + if (Array.isArray(value)) { + return value.some((item) => reg.test(item)) + } + return reg.test(value) + } else if (isRegExp(filterValue)) { + return filterValue.test(value) + } + return filterValue === value + } + + const filterList = (filters: Array = []) => { + latestFilters = cloneDeep(filters) if (filters.length === 0) { listAfterFilter.value = totalData.value } else { - listAfterFilter.value = totalData.value.filter((item) => - filters.every(({ key, value }) => item[key]?.indexOf && item[key].indexOf(value) > -1), - ) + listAfterFilter.value = totalData.value.filter((item) => { + return filters.every(({ key, value: filterValue }) => checkValue(filterValue, item[key])) + }) } } @@ -63,21 +74,21 @@ export default (): { listAfterFilterNSort.value = listAfterFilter.value } else { latestSortFromString = JSON.stringify(sortFrom) - listAfterFilterNSort.value = _.orderBy(listAfterFilter.value, [sortFrom.key], [sortFrom.type]) + listAfterFilterNSort.value = orderBy(listAfterFilter.value, [sortFrom.key], [sortFrom.type]) } } const chunkList = (pageSize = DEFAULT_PAGE_SIZE) => { currentPageSize = pageSize - currentChunks.value = _.chunk(listAfterFilterNSort.value, currentPageSize) + currentChunks.value = chunk(listAfterFilterNSort.value, currentPageSize) } const getAPageData = ( pageMeta: PageMeta, - filters: Array = [], + filters: Array = [], sortFrom?: SortFrom, ) => { - if (latestFiltersString !== JSON.stringify(filters)) { + if (!isEqual(latestFilters, filters)) { filterList(filters) sortList(sortFrom) chunkList(pageMeta.limit) diff --git a/src/hooks/usePassword.ts b/src/hooks/usePassword.ts index e6040c6c1..eda665313 100644 --- a/src/hooks/usePassword.ts +++ b/src/hooks/usePassword.ts @@ -1,6 +1,3 @@ -import type { Ref } from 'vue' -import { ref } from 'vue' - export default function usePassword(): { HashOptions: Ref } { diff --git a/src/hooks/useRuleFunc.ts b/src/hooks/useRuleFunc.ts deleted file mode 100644 index afd72248f..000000000 --- a/src/hooks/useRuleFunc.ts +++ /dev/null @@ -1,108 +0,0 @@ -import RuleFunc from '@/hooks/Rule/RuleFunc.json' -import useI18nTl from './useI18nTl' - -export const enum ArgumentType { - Number = 'number', - Any = 'any', - Float = 'float', - Integer = 'integer', - String = 'string', - Enum = 'enum', - Object = 'object', - Array = 'array', - Binary = 'binary', -} - -export interface ArgItem { - name: string - type: ArgumentType - required: boolean - optionalValues?: Array - /** - * for type number - */ - range?: [null | number, null | number] - default?: string | number -} - -export interface FuncItem { - name: string - args: Array -} - -interface GroupFuncData { - groupLabel: string - name: string - value: string - list: Array -} - -type FuncData = Array - -export default (): { - funcOptList: FuncData - getFuncItemByName: (name: string) => FuncItem | null - getFuncGroupByName: (name: string) => string | null - getArgIndex: (func: FuncItem, groupLabel: string) => number -} => { - const { tl } = useI18nTl('Function') - - const funcOptList: FuncData = (RuleFunc as FuncData).map(({ groupLabel, list }) => ({ - groupLabel, - name: tl(groupLabel), - value: groupLabel, - list: list.filter((item) => item.args.length) as Array, - })) - - const getFuncItemByName = (name: string): FuncItem | null => { - for (const { list } of funcOptList) { - for (const item of list) { - if (item.name === name) { - return item - } - } - } - return null - } - - const getFuncGroupByName = (name: string): string | null => { - for (const { groupLabel, list } of funcOptList) { - for (const item of list) { - if (item.name === name) { - return groupLabel - } - } - } - return null - } - - const funcGroupMainArgTypeMap: Record = { - stringFunc: ArgumentType.String, - mapFunc: ArgumentType.Object, - arrFunc: ArgumentType.Array, - } - /** - * Get the index of the most important parameter in a function - */ - const getArgIndex = (func: FuncItem, groupLabel: string) => { - const targetArgType = funcGroupMainArgTypeMap[groupLabel] - let targetIndex = -1 - - // Find the first parameter of the current group operation type, - // if not found, it will be placed first by default - if (targetArgType) { - targetIndex = func.args.findIndex((item) => item.type === targetArgType) - } else if (/time/i.test(groupLabel)) { - targetIndex = func.args.findIndex((item) => /timestamp/i.test(item.name)) - } - targetIndex = targetIndex > -1 ? targetIndex : 0 - return targetIndex - } - - return { - funcOptList, - getFuncItemByName, - getFuncGroupByName, - getArgIndex, - } -} diff --git a/src/hooks/useSSL.ts b/src/hooks/useSSL.ts index 0198b9def..6ee6a1762 100644 --- a/src/hooks/useSSL.ts +++ b/src/hooks/useSSL.ts @@ -1,6 +1,4 @@ -import { DEFAULT_SSL_VERIFY_VALUE } from '@/common/constants' import { SSL } from '@/types/common' -import { cloneDeep, omit } from 'lodash' type CreateSSLForm = () => SSL type HandleSSLDataBeforeSubmit = (data: SSL) => SSL diff --git a/src/hooks/useShowTextByDifferent.ts b/src/hooks/useShowTextByDifferent.ts index f4146a4cc..921a53ee3 100644 --- a/src/hooks/useShowTextByDifferent.ts +++ b/src/hooks/useShowTextByDifferent.ts @@ -1,9 +1,5 @@ -import type { Ref } from 'vue' -import { ref, watch } from 'vue' -import { SHOW_PAYLOAD_BY_WHICH_OPTION_LIST } from '@/common/constants' import { encode, decode } from 'js-base64' import { PayloadShowByType } from '@/types/enum' -import { ElMessage } from 'element-plus' /** * format obj str diff --git a/src/hooks/useSortableTable.ts b/src/hooks/useSortableTable.ts index 94f3e4bf1..d7869c106 100644 --- a/src/hooks/useSortableTable.ts +++ b/src/hooks/useSortableTable.ts @@ -1,6 +1,4 @@ import Sortable, { SortableEvent } from 'sortablejs' -import type { Ref } from 'vue' -import { Component, ref } from 'vue' export default ( onUpdate: (evt: SortableEvent) => void, diff --git a/src/hooks/useSyncPolling.ts b/src/hooks/useSyncPolling.ts index 159878d92..640272dcc 100644 --- a/src/hooks/useSyncPolling.ts +++ b/src/hooks/useSyncPolling.ts @@ -1,5 +1,3 @@ -import { onUnmounted, ref, Ref } from 'vue' - export default (): { needPolling: Ref syncPolling: (queryData: () => Promise, interval: number) => Promise diff --git a/src/hooks/useTwoWayBindingManually.ts b/src/hooks/useTwoWayBindingManually.ts index 84fbba8a9..3e8cecd40 100644 --- a/src/hooks/useTwoWayBindingManually.ts +++ b/src/hooks/useTwoWayBindingManually.ts @@ -1,5 +1,3 @@ -import { get, set } from 'lodash' - type Get = typeof get type Set = typeof set diff --git a/src/i18n.ts b/src/i18n.ts index 7ad76b3f5..04c53c9d0 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -5,8 +5,8 @@ import { createI18n } from 'vue-i18n' import zhLocale from 'element-plus/es/locale/lang/zh-cn' import enLocale from 'element-plus/es/locale/lang/en' -import schemaTextZh from '@/schemaText/schema-text-zh.json' -import schemaTextEn from '@/schemaText/schema-text-en.json' +import schemaTextZh from '@/schemaText/schema-text-zh' +import schemaTextEn from '@/schemaText/schema-text-en' import { enSymbolLabel as symbolLabelEn, @@ -25,17 +25,25 @@ const lang: { [key: string]: any } = { ...zhLocale, }, } -const translations = require.context('./i18n', false, /\.js$/) -Array.prototype.forEach.call(translations.keys(), (path) => { - const tran = translations(path).default - const partKey = path.match(/\w+/)[0] //retrieve the filename as partial keys - lang.en[partKey] = lang.en[partKey] || {} - lang.zh[partKey] = lang.zh[partKey] || {} - Object.keys(tran).forEach((k) => { - const { en, zh } = tran[k] - lang.en[partKey][k] = en - lang.zh[partKey][k] = zh - }) + +// Dynamically import all translation files +const modules = import.meta.glob('./i18n/*.ts') + +// Process each module +Object.keys(modules).forEach((path) => { + const partKey = path.match(/\/(\w+)\.ts$/)?.[1] // retrieve the filename as partial keys + if (partKey) { + modules[path]().then((mod) => { + const tran = mod.default + lang.en[partKey] = lang.en[partKey] || {} + lang.zh[partKey] = lang.zh[partKey] || {} + Object.keys(tran).forEach((k) => { + const { en, zh } = tran[k] + lang.en[partKey][k] = en + lang.zh[partKey][k] = zh + }) + }) + } }) lang.en.ConfigSchema = schemaTextEn @@ -48,9 +56,10 @@ lang.en.SchemaSymbolLabel = symbolLabelEn lang.zh.SchemaSymbolLabel = symbolLabelZh const i18nInstance = createI18n({ + legacy: false, messages: lang, locale: store.state.lang, - warnHtmlInMessage: 'off', + warnHtmlMessage: false, }) export const getLocalMessage = (path: string): string => { diff --git a/src/i18n/APIKey.js b/src/i18n/APIKey.ts similarity index 100% rename from src/i18n/APIKey.js rename to src/i18n/APIKey.ts diff --git a/src/i18n/Auth.js b/src/i18n/Auth.ts similarity index 86% rename from src/i18n/Auth.js rename to src/i18n/Auth.ts index 8bc5ad1d0..47c8e9462 100644 --- a/src/i18n/Auth.js +++ b/src/i18n/Auth.ts @@ -99,21 +99,57 @@ export default { zh: '下移', en: 'Move down', }, + nodeCacheSettings: { + zh: '外部资源缓存设置', + en: 'External Resource Cache Settings', + }, + enableNodeCache: { + zh: '启用外部资源缓存', + en: 'Enable External Resource Cache', + }, + enableNodeCacheDesc: { + zh: '启用外部资源缓存后,EMQX 将缓存外部资源(如 MySQL、MongoDB 等)的查询结果,以提高效率;对于本地数据源,如内置数据库或文件等不进行缓存。', + en: 'After enabling external resource cache, EMQX will cache the query results of external resources (such as MySQL, MongoDB, etc.), to improve efficiency; for local data sources, such as built-in databases or file, are not cached.', + }, + nodeCacheMaxCount: { + zh: '缓存最大数量', + en: 'Maximum Number of Cached Items', + }, + cleanupInterval: { + zh: '清理间隔', + en: 'Cleanup Interval', + }, + maxMemory: { + zh: '最大内存', + en: 'Maximum Memory', + }, + statUpdateInterval: { + zh: '统计更新间隔', + en: 'Statistics Update Interval', + }, + cacheTTL: { + zh: '缓存过期时间', + en: 'Cache TTL', + }, + nodeCacheStatus: { + zh: '外部资源缓存状态', + en: 'External Resource Cache Status', + }, authzSetting: { zh: '授权设置', en: 'Authorization Settings', }, enableCache: { - zh: '启用缓存', - en: 'Enable Cache', + zh: '启用客户端缓存', + en: 'Enable Client Cache', }, clearCache: { - zh: '清除缓存', - en: 'Clear cache', + zh: '清除客户端缓存', + en: 'Clear Client Cache', }, clearCacheDesc: { - zh: '清除当前所有授权结果缓存。', - en: 'Clears all current authorization result caches.', + zh: '清除当前所有客户端缓存。', + en: 'Clears all current client caches.', }, clearCacheConfirm: { zh: '是否确认清除缓存', @@ -175,10 +211,6 @@ export default { zh: '启用 TLS', en: 'Enable TLS', }, - tlsVerify: { - zh: '验证服务器证书', - en: 'TLS Verify', - }, mongoType: { zh: '部署模式', en: 'MongoDB Mode', @@ -187,6 +219,14 @@ export default { zh: '认证源', en: 'Auth Source', }, + authzMongoLimit: { + zh: '记录条数限制', + en: 'Record Limit', + }, + authzMongoSkip: { + zh: '跳过记录数', + en: 'Skip', + }, srvRecord: { zh: 'SRV 记录', en: 'SRV Record', @@ -504,8 +544,8 @@ export default { en: 'Number of times client authorization data is not found. If the authorizer execution fails, the count will also increase', }, rateUnit: { - zh: '次/秒 | 次/秒', - en: 'time/sec | times/sec', + zh: '次/秒', + en: 'times/sec | time/sec | times/sec', }, authnRateBarDesc: { zh: '近一分钟内认证次数趋势', @@ -525,7 +565,7 @@ export default { }, importUsers: { zh: '导入用户', - en: 'Import users', + en: 'Import Users', }, selectImportMethod: { zh: '选择导入方式', @@ -603,4 +643,54 @@ export default { zh: '成功导入 {total} 条数据', en: 'Successfully imported {total} records', }, + + // Node Cache Metrics + cacheCount: { + zh: '缓存条目数', + en: 'Cache Entries', + }, + cacheMemory: { + zh: '内存占用', + en: 'Memory Usage', + }, + cacheHits: { + zh: '缓存命中', + en: 'Cache Hits', + }, + cacheInserts: { + zh: '缓存插入', + en: 'Cache Inserts', + }, + cacheMisses: { + zh: '缓存未命中', + en: 'Cache Misses', + }, + currentRate: { + zh: '当前', + en: 'current', + }, + last5mRate: { + zh: '5 分钟', + en: '5 mins', + }, + insertUnit: { + zh: '条/秒', + en: 'entries/sec | entry/sec | entries/sec', + }, + bytes: { + zh: '字节', + en: 'bytes', + }, + refresh: { + zh: '刷新', + en: 'Refresh', + }, + resetNodeCacheStatus: { + zh: '重置节点缓存状态', + en: 'Reset Node Cache Status', + }, + resetNodeCacheStatusConfirm: { + zh: '确定要重置节点缓存状态吗?', + en: 'Are you sure you want to reset the node cache status?', + }, } diff --git a/src/i18n/AuthDoc.js b/src/i18n/AuthDoc.ts similarity index 90% rename from src/i18n/AuthDoc.js rename to src/i18n/AuthDoc.ts index 4ca80f37c..a25d8a789 100644 --- a/src/i18n/AuthDoc.js +++ b/src/i18n/AuthDoc.ts @@ -62,6 +62,10 @@ export default { zh: '{0} 语句支持的占位符有:', en: 'The {0} supports the following placeholders: ', }, + authzMongoDBOrderTip: { + zh: '查询器语句支持在第一层级中使用 $orderby 指定排序字段和排序顺序,对查询结果进行排序,排序字段支持嵌套', + en: 'The selector statement supports using the $orderby operator in the first level to specify sorting fields and order, sorting the query results. Nested fields are supported in sorting.', + }, /* MySQL, PgSQL */ authzSQLParagraph1: { zh: 'SQL 语句需要从 {0} 中查询出包含 action permission topic 字段的数据列表', diff --git a/src/i18n/Base.js b/src/i18n/Base.ts similarity index 92% rename from src/i18n/Base.js rename to src/i18n/Base.ts index 45d9baadd..76bdba9cc 100644 --- a/src/i18n/Base.js +++ b/src/i18n/Base.ts @@ -24,8 +24,8 @@ export default { en: 'Skip', }, skipTip: { - zh: '下次登录时将再次提示您修改默认密码,您也可以稍后在系统 > 用户菜单中进行修改。', - en: 'You will be prompted to change the default password again when you log in next time, and you can also change it later in the System > User.', + zh: '下次登录时将再次提示您修改密码,您也可以稍后在系统 > 用户菜单中进行修改。', + en: 'You will be prompted to change the password again when you log in next time, and you can also change it later in the System > User.', }, copied: { zh: '复制成功!', @@ -443,6 +443,10 @@ export default { zh: '为保护账户安全,请修改默认密码:', en: 'To ensure your account security, we kindly request you to change your default password:', }, + expiredPwdTip: { + zh: '密码已长时间未修改,为保护账户安全,请定期修改密码:', + en: 'Your password has not been modified for a long time. To ensure your account security, please change your password regularly:', + }, note: { zh: '备注', en: 'Note', @@ -604,8 +608,8 @@ export default { en: 'Maximum Rate', }, enterToCreate: { - zh: '输入后创建新的自定义条目', - en: 'Enter to create a new custom item', + zh: '输入后创建新的条目', + en: 'Enter to create a new item', }, node: { zh: '节点', @@ -643,4 +647,24 @@ export default { zh: ',', en: ', ', }, + wordBdy: { + zh: '', + en: ' ', + }, + lastModified: { + zh: '更新时间', + en: 'Last Modified', + }, + createdAt: { + zh: '创建时间', + en: 'Created At', + }, + duplicatedInput: { + zh: '重复的输入', + en: 'Duplicated Input', + }, + tableNo: { + zh: '序号', + en: 'No.', + }, } diff --git a/src/i18n/BasicConfig.js b/src/i18n/BasicConfig.ts similarity index 86% rename from src/i18n/BasicConfig.js rename to src/i18n/BasicConfig.ts index 8727c4775..0cf5b3137 100644 --- a/src/i18n/BasicConfig.js +++ b/src/i18n/BasicConfig.ts @@ -23,10 +23,6 @@ export default { zh: '默认', en: 'Default', }, - listenerZoneDesc: { - zh: '监听器所属的配置组,一个 Zone 定义了一组配置项 (比如最大连接数等),Listener 可以通过该配置项指定使用某个 Zone,以使用该 Zone 下的所有配置。多个 Listener 可以共享同一个 Zone', - en: 'The configuration group to which the listener belongs. A Zone defines a set of configuration items (such as the maximum number of connections), and a Listener can specify a Zone to use all the configurations in the Zone. Multiple Listeners can share the same Zone.', - }, mqttPath: { zh: "WebSocket 连接 URL 中的路径,应以 `/` 开头,并支持子路径。默认情况下,WebSocket 客户端连接的完整 URL 为 `ws://{'{'}ip{'}'}:{'{'}port{'}'}/mqtt`。
支持在路径末尾添加 `/[...]` 表示任意子路径。例如,当设置为 `/mqtt/[...]` 时,可以接受 `/mqtt/org1`、`/mqtt/org1/app1` 等连接。
注意,如果客户端连接的路径与配置不匹配,则连接将在 HTTP 层被拒绝。", en: "The path in the WebSocket connection URL, which should start with `/` and supports subpaths. By default, the full URL of a WebSocket client connection is `ws://{'{'}ip{'}'}:{'{'}port{'}'}/mqtt`.
It is supported to add `/[...] ` at the end of the path to make EMOX accept any subpath. For example, specifying `/mqtt/[...]` would allow clients to connect at paths like `mqtt/org1` or `mqtt/org1/app1`, etc.

NOTE: An unmatched path will cause the client to be rejected immediately at the HTTP laver.", @@ -75,10 +71,6 @@ export default { zh: '邀请成功', en: 'Invite Successfully', }, - clusterType: { - zh: '集群方式', - en: 'Cluster Type', - }, currentNode: { zh: '当前节点', en: 'Current Node', @@ -118,11 +110,11 @@ export default { }, console: { zh: '控制台日志', - en: 'Console Log', + en: 'Console Logs', }, file: { zh: '文件日志', - en: 'File Log', + en: 'File Logs', }, throttling: { zh: '日志限流', diff --git a/src/i18n/Clients.js b/src/i18n/Clients.ts similarity index 97% rename from src/i18n/Clients.js rename to src/i18n/Clients.ts index b2a1206c1..be668abd6 100644 --- a/src/i18n/Clients.js +++ b/src/i18n/Clients.ts @@ -415,6 +415,26 @@ export default { zh: '来自于用户名', en: 'From Username', }, + name: { + zh: '警报名称', + en: 'Alarm Name', + }, + details: { + zh: '告警消息', + en: 'Alarm Message', + }, + message: { + zh: '警报信息', + en: 'Alarm Message', + }, + activated_at: { + zh: '开始时间', + en: 'Activated At', + }, + deactivated_at: { + zh: '解除时间', + en: 'Deactivated At', + }, reason: { zh: '原因', en: 'Reason', diff --git a/src/i18n/Dashboard.js b/src/i18n/Dashboard.ts similarity index 98% rename from src/i18n/Dashboard.js rename to src/i18n/Dashboard.ts index 41db31ec1..b96fe31ef 100644 --- a/src/i18n/Dashboard.js +++ b/src/i18n/Dashboard.ts @@ -283,14 +283,6 @@ export default { zh: '数据指标集成', en: 'Metrics Integration', }, - integrationDesc: { - zh: '集成指标数据外部的监控与告警管理', - en: 'Integrated monitoring and alerting toolkit', - }, - promDesc: { - zh: '使用 Prometheus 采集指标数据', - en: 'Integrated with Prometheus', - }, role: { zh: '角色', en: 'Role', @@ -331,6 +323,14 @@ export default { zh: '过去 7 天', en: 'Last 7 days', }, + resetMonitorData: { + zh: '重置监控数据', + en: 'Reset monitor data', + }, + confirmResetMonitorData: { + zh: '确定重置监控数据?', + en: 'Confirm to reset monitor data?', + }, /* client */ client_connect: { zh: 'client.connect 钩子触发次数', diff --git a/src/i18n/Exhook.js b/src/i18n/Exhook.ts similarity index 97% rename from src/i18n/Exhook.js rename to src/i18n/Exhook.ts index c3f4a1873..317316553 100644 --- a/src/i18n/Exhook.js +++ b/src/i18n/Exhook.ts @@ -95,10 +95,6 @@ export default { zh: '次/秒', en: 'time/sec', }, - nodeMetricsData: { - zh: '节点指标', - en: 'Node Metrics', - }, nodeStatusDesc: { zh: '每个节点上钩子执行指标数据', en: 'Hook execution metrics data on each node', diff --git a/src/i18n/Extension.js b/src/i18n/Extension.ts similarity index 87% rename from src/i18n/Extension.js rename to src/i18n/Extension.ts index 0774ca83e..35fb8e135 100644 --- a/src/i18n/Extension.js +++ b/src/i18n/Extension.ts @@ -11,10 +11,6 @@ export default { zh: '自动订阅', en: 'Auto Subscribe', }, - postpone: { - zh: '延迟发布', - en: 'Delayed Publish', - }, message: { zh: '事件消息', en: 'Event Message', @@ -23,10 +19,6 @@ export default { zh: '消息存储', en: 'Storage', }, - flowControl: { - en: 'Flow Control', - zh: '流控', - }, msgExpiryInterval: { en: 'Message Expiry Interval', zh: '消息过期间隔', @@ -51,6 +43,14 @@ export default { zh: '派发保留消息的最大速率', en: 'The maximum rate of delivering retained messages', }, + maxPublishRate: { + zh: '最大发布速率', + en: 'Max Publish Rate', + }, + maxPublishRateDesc: { + zh: '发布保留消息的最大速率。超过限制发布的消息会被投递,但不会存储为保留消息。', + en: 'The maximum rate of publishing retained messages. Messages that are published over the limit are delivered but not stored as retained.', + }, storageMethod: { zh: '存储方式', en: 'Storage Method', @@ -71,14 +71,6 @@ export default { zh: '启用', en: 'Enable', }, - enableRetained: { - zh: '启用保留消息', - en: 'Enable Retained Messages', - }, - enableDesc: { - zh: '打开或关闭保留消息功能,停用后不会清除已保留消息', - en: 'Enable retainer feature, disabling will not clear the saved retained messages', - }, createDate: { zh: '发布时间', en: 'Created At', @@ -103,14 +95,6 @@ export default { zh: '发布时间', en: 'Publish Time', }, - eventTitleDesc: { - zh: '将设备生命周期事件通过事件主题以 MQTT 消息的形式发布', - en: 'Publish client life cycle events through events topic', - }, - configMsg: { - zh: '配置需要启用的事件消息', - en: 'Configure event messages that need to be enabled', - }, client_connected: { en: 'Clients have already connected', zh: '客户端连接完成', @@ -151,14 +135,6 @@ export default { zh: '正则表达式', en: 'Regex', }, - dataManage: { - zh: '数据管理', - en: 'Manage Data', - }, - builtInDatabase: { - zh: '内置数据库', - en: 'Built-in Database', - }, noExp: { en: 'Never Expire', zh: '永不过期', @@ -227,10 +203,6 @@ export default { zh: '已保留消息', en: 'Retained Messages', }, - retainerDisabled: { - zh: '保留消息功能已禁用,点击跳转到设置页面中开启。', - en: 'Retained message is disabled, click to enable on settings page.', - }, msgExpiryIntervalDesc: { en: 'Message retention time. 0 means message will never be expired', zh: '消息保留时间。0 代表永久保留', diff --git a/src/i18n/Function.js b/src/i18n/Function.ts similarity index 100% rename from src/i18n/Function.js rename to src/i18n/Function.ts diff --git a/src/i18n/Gateway.js b/src/i18n/Gateway.ts similarity index 77% rename from src/i18n/Gateway.js rename to src/i18n/Gateway.ts index 133faf92a..6bbca5b2a 100644 --- a/src/i18n/Gateway.js +++ b/src/i18n/Gateway.ts @@ -11,6 +11,10 @@ export default { zh: '连接', en: 'Connections', }, + currentConnection: { + zh: '连接数', + en: 'Current Connections', + }, listeners: { zh: '监听器', en: 'Listeners', @@ -111,6 +115,48 @@ export default { zh: '挂载点', en: 'MountPoint', }, + mountPointDesc: { + zh: `为客户端在 \`SUBSCRIBE\` 和 \`UNSUBSCRIBE\` 请求、\`PUBLISH\` 消息以及 Will Message(如果在 \`CONNECT\` 数据包中提供)中使用的主题添加静态或模板前缀(例如 \`n1/\` 或 \`{'$'}{'{'}username{'}'}/\`)。
+从发布到相应订阅的消息的主题中将移除此前缀。 + +支持的占位符包括: +- \`{'$'}{'{'}username{'}'}\` +- \`{'$'}{'{'}clientid{'}'}\` +- \`{'$'}{'{'}zone{'}'}\` +- \`{'$'}{'{'}client_attrs.NAME{'}'}\` + +例如,使用 \`mountpoint="{'$'}{'{'}username{'}'}/"\` 时,用户名 \`u1\` 的客户端将出现以下情况: +- 客户端 SUBSCRIBE \`sensors/#\` -> 在代理中内部转换为 \`u1/sensors/#\`。 +- 代理 PUBLISH \`u1/sensors/data\` -> 发送给客户端时变为 \`sensors/data\`。 + +前缀的挂载/卸载应用于: +- \`CONNECT\` 中的 Will +- \`PUBLISH\` +- \`SUBSCRIBE\` +- \`UNSUBSCRIBE\` + +注意:挂载发生在**授权/ACL检查之后**。`, + en: `Adds a static or templated prefix (e.g., \`n1/\` or \`{'$'}{'{'}username{'}'}/\`) to topics used by clients in \`SUBSCRIBE\` and \`UNSUBSCRIBE\` requests, \`PUBLISH\` messages, and Will Message (if supplied in the \`CONNECT\` packet).
+Removes this prefix from topics of messages published to the respective subscriptions. + +The supported placeholders are: +- \`{'$'}{'{'}username{'}'}\` +- \`{'$'}{'{'}clientid{'}'}\` +- \`{'$'}{'{'}zone{'}'}\` +- \`{'$'}{'{'}client_attrs.NAME{'}'}\` + +For example, with \`mountpoint="{'$'}{'{'}username{'}'}/"\`, a client using \`u1\` as username will have: +- Client SUBSCRIBE \`sensors/#\` -> \`u1/sensors/#\` internally in the broker. +- Broker PUBLISH \`u1/sensors/data\` -> \`sensors/data\` sent to the client. + +The prefix mount/unmount is applied to: +- Will in \`CONNECT\` +- \`PUBLISH\` +- \`SUBSCRIBE\` +- \`UNSUBSCRIBE\` + +Note: mounting occurs **after authorization/ACL checks**.`, + }, lType: { zh: '类型', en: 'Type', @@ -148,8 +194,8 @@ export default { en: 'Connection Required', }, connectionRequireDesc: { - zh: '连接模式是非标准协议的特性。启用连接模式时,需要管理连接资源的创建、认证和保活。选择为 false 则进入无连接模式,在此模式下,添加的认证器不会生效。', - en: `Connection mode is a feature of non-standard protocols. When connection mode is enabled, it's essential to manage the creation, authentication, and aliveness of connection resources. When set to false, it enters connectionless mode, and the added authenticator won't take effect.`, + zh: '连接模式是非标准的特性。启用连接模式时,客户端**必须**管理连接资源的创建、认证和保活。选择为 false 则表示客户端对管理连接资源是可选的,支持不创建连接资源,直接进行消息发布和订阅。', + en: `Connection Required is a non-standard feature. When Connection Required is enabled, the client **must** manage the creation, authentication, and keep-alive of connection resources. Selecting false means that the client is optional for managing connection resources and supports not creating connection resources directly for message publishing and subscription.`, }, heartbeat: { zh: '心跳间隔', @@ -215,14 +261,30 @@ export default { zh: '最大连接速率(监听器)', en: 'Max Connection Rate (Listener)', }, + maxConnBurst: { + zh: '最大连接突发速率(监听器)', + en: 'Max Connection Burst (Listener)', + }, + maxConnBurstDesc: { + zh: '在突发情况下当前监听器可以接受的最大连接数量;为空时表示不限制。\n\n例如:`10000/60m` 表示在 60 分钟内,允许接受最多 10000 个连接。', + en: 'The maximum number of connections that can be accepted in a burst by the current listener; empty means no limit.\n\nFor example: `10000/60m` means allowing up to 10000 connections in 60 minutes.', + }, maxMsgPubRate: { zh: '最大消息发布速率(单客户端)', en: 'Max Message Publishing Rate (Per Client)', }, + maxMsgPubBurst: { + zh: '最大消息发布突发速率(单客户端)', + en: 'Max Message Publishing Burst (Per Client)', + }, maxMsgPubTraffic: { zh: '最大消息发布流量(单客户端)', en: 'Max Message Publishing Traffic (Per Client)', }, + maxMsgPubTrafficBurst: { + zh: '最大消息发布流量突发速率(单客户端)', + en: 'Max Message Publishing Traffic Burst (Per Client)', + }, maxConn: { zh: '最大连接数', en: 'Max Connections', diff --git a/src/i18n/General.js b/src/i18n/General.ts similarity index 68% rename from src/i18n/General.js rename to src/i18n/General.ts index fad7f1912..7f2e16c0f 100644 --- a/src/i18n/General.js +++ b/src/i18n/General.ts @@ -131,10 +131,6 @@ export default { zh: '确认重置?', en: 'Confirm to reset', }, - 'banned-clients': { - zh: '黑名单', - en: 'Banned Clients', - }, determineToDeleteTheBannedClient: { zh: '确认解除该黑名单?', en: 'Confirm to unban this banned client?', @@ -259,4 +255,28 @@ export default { zh: '持久会话中消息保留时长,超期的消息不会发送到订阅者。', en: 'The duration of message retention in a persistent session, messages that expire are not delivered to subscribers.', }, + enableForceShutdown: { + zh: '启用强制关闭', + en: 'Enable Force Shutdown', + }, + enableForceShutdownDesc: { + zh: '启用 force_shutdown(强制关闭)功能,当进程堆内存或邮箱大小超过设定值时强制关闭进程', + en: 'Enable force_shutdown feature. Process will be forcibly shutdown when heap memory or mailbox size exceeds the set value', + }, + maxHeapSize: { + zh: '最大堆内存', + en: 'Max Heap Size', + }, + maxHeapSizeDesc: { + zh: '进程的最大堆内存大小。如果启用了强制关闭功能,超过此限制的进程将自动退出或被强制终止。进程消息队列(邮箱)中的消息也是堆的一部分。进程关闭可分为以下两种情况:\n- 进程在运行时主动检查当前堆大小,发现超出限制后主动退出\n- 底层调度系统在为进程执行垃圾回收后检查当前堆大小,发现超出限制后强制终止进程\n\n注意:上述两种情况产生的错误日志会有所不同。前者生成的日志类似于 ...errorContext: connection_shutdown, reason: #{max => 2097152, reason => proc_heap_too_large, value => 2787348}..,后者生成的日志类似于 ...Context: maximum heap size reached...。', + en: 'The maximum heap size of the process. If the force_shutdown is enabled, processes that exceed this limit will automatically exit or be forcibly killed. Messages in the process message queue (mailbox) are also part of the heap. The shutdown of a process can be divided into the following two situations:\n- The process actively checks the current heap size during its own operation, and actively exits after finding that it exceeds the limit.\n- The underlying scheduling system checks the current heap size after performing garbage collection for the process, and forcibly kills the process after finding that it exceeds the limit.\n\nNote: The Error logs generated by the above two will be different. The log generated by the former is similar to ...errorContext: connection_shutdown, reason: #{max => 2097152, reason => proc_heap_too_large, value => 2787348}.., and the log generated by the latter is similar to ...Context: maximum heap size reached....', + }, + maxMailboxSize: { + zh: '最大邮箱大小', + en: 'Max Mailbox Size', + }, + maxMailboxSizeDesc: { + zh: 'EMQX 为每个客户端连接创建至少一个轻量级进程。每个进程都有自己的消息队列(邮箱)来保存来自其他进程(如 MQTT 消息)的消息,以便进程可以随时从消息队列(邮箱)中读取消息。如果系统繁忙或进程因繁忙的套接字而挂起,消息队列可能会积累大量消息。为避免过度使用内存,当进程的消息队列长度超过此值时,EMQX 将强制关闭该进程。', + en: 'EMQX creates at least one lightweight process for each client connection. Each process has its own message queue (aka mailbox) to hold messages from other processes (e.g. MQTT messages) so that the process can read messages from the message queue (mailbox) at any time. If the system is busy or the process hangs due to a busy socket (see high_watermark), the message queue can accumulate many messages. To avoid excessive memory usage, EMQX will force a process to shut down when the length of its message queue exceeds max_mailbox_size.', + }, } diff --git a/src/i18n/LogTrace.js b/src/i18n/LogTrace.ts similarity index 100% rename from src/i18n/LogTrace.js rename to src/i18n/LogTrace.ts diff --git a/src/i18n/MQTTRes.js b/src/i18n/MQTTRes.ts similarity index 100% rename from src/i18n/MQTTRes.js rename to src/i18n/MQTTRes.ts diff --git a/src/i18n/MonitoringIntegration.js b/src/i18n/MonitoringIntegration.js deleted file mode 100644 index 4f07e355a..000000000 --- a/src/i18n/MonitoringIntegration.js +++ /dev/null @@ -1,189 +0,0 @@ -export default { - monitoringPlatform: { - zh: '监控平台', - en: 'Monitoring platform', - }, - monitoringPlatformFormItemLabel: { - en: `Select a monitoring platform, for Prometheus, click the "Help button" after configuration to see how to configure the monitoring platform.`, - zh: '选择一个监控平台,对于 Prometheus,配置后点击 "帮助按钮" 查看如何配置监控平台。', - }, - enablePushgateway: { - zh: '启用 Pushgateway', - en: 'Enable Pushgateway', - }, - enablePushgatewayDesc: { - zh: '启用后,EMQX 将会将监控数据推送到 Pushgateway,然后由 Prometheus 从 Pushgateway 中拉取数据。', - en: 'After enabling, EMQX will push the monitoring metrics data to the Pushgateway, and then Prometheus will pull the data from the Pushgateway.', - }, - interval: { - zh: '采集间隔', - en: 'Interval', - }, - jobName: { - zh: 'Job 名称', - en: 'Job Name', - }, - jobNameDesc: { - zh: `推送到 Pushgateway 的 Job 名称。可用变量为:
-- \${'{'}name{'}'}: EMQX 节点的名称。
-- \${'{'}host{'}'}: EMQX 节点主机名。
-例如,当 EMQX 节点名为 emqx{'@'}127.0.0.1 则 name 变量的值为 emqx,host 变量的值为 127.0.0.1
-默认值为: \${'{'}name{'}'}/instance/\${'{'}name{'}'}~\${'{'}host{'}'}`, - en: `Job Name that is pushed to the Pushgateway. Available variables:
-- \${'{'}name{'}'}: Name of EMQX node.
-- \${'{'}host{'}'}: Host name of EMQX node.
-For example, when the EMQX node name is emqx{'@'}127.0.0.1 then the name variable takes value emqx and the host variable takes value 127.0.0.1.
-Default value is: \${'{'}name{'}'}/instance/\${'{'}name{'}'}~\${'{'}host{'}'}`, - }, - headersDesc: { - zh: `推送到 Pushgateway 的 HTTP Headers 列表。
-例如, {'{'} Authorization = "some-authz-tokens"{'}'}`, - en: `A list of HTTP Headers when pushing to Pushgateway.
-For example, {'{'} Authorization = "some-authz-tokens"{'}'}`, - }, - dataReportingInterval: { - zh: '监控数据指标上报到监控服务的时间间隔。', - en: 'The time interval at which monitoring data metrics are reported to the monitoring service.', - }, - pushgatewayServer: { - zh: 'Pushgateway 服务', - en: 'Pushgateway Server', - }, - pushgatewayDesc: { - zh: '通常情况下不需要使用。启用后,将会在每个节点上启动 Pushgateway,用于收集 Prometheus Push 模式的监控数据。', - en: 'Usually not needed. When enabled, Pushgateway will be started on each node to collect Prometheus Push mode monitoring data.', - }, - learn: { - zh: '了解', - en: 'Learn ', - }, - usePushgateway: { - zh: '使用 Pushgateway', - en: 'Use Pushgateway', - }, - whenToUsePushgateway: { - zh: '何时使用 Pushgateway', - en: 'When to use Pushgateway', - }, - promSetupHelp: { - zh: 'Prometheus 与 Grafana 配置帮助', - en: 'Prometheus and Grafana setup help', - }, - promSetupHelpDesc: { - zh: 'EMQX 支持将数据集成到 Prometheus 服务中来监控数据,可以使用 Grafana 来可视化监控数据。通常使用默认方法即可完成配置,也可选择使用 Pushgateway。', - en: 'EMQX supports integrating data into the Prometheus service to monitor data, and you can use Grafana to visualize monitoring data. Usually the default method can be used to complete the configuration, or you can choose to use Pushgateway.', - }, - pushgatewayInstall: { - zh: '安装 Pushgateway 或 Node Exporter 服务', - en: 'Install the Pushgateway or Node Exporter service', - }, - promStepOne: { - zh: '可以使用 Docker 来安装和启动 Pushgateway 服务,例如使用以下命令:', - en: 'You can use Docker to install and start the Pushgateway service, for example, use the following command:', - }, - nodeExporterDesc: { - zh: '对于监控物理机或虚拟机的系统信息可使用 Node Exporter, 点击查看 ', - en: 'For monitoring system information of physical machines or VM, you can use Node Exporter, click to view ', - }, - installNodeExporter: { - zh: '安装和运行 Node Exporter。', - en: 'Installing and running the Node Exporter.', - }, - promConfig: { - zh: '配置 Prometheus', - en: 'Configure Prometheus', - }, - promConfigDesc: { - zh: '生成 Prometheus 配置文件,包括 EMQX 服务地址,以及 EMQX 提供监控数据 API 的 Path。', - en: 'Generate a Prometheus configuration file, including the EMQX service address, and the Path of the EMQX monitoring metrics data API.', - }, - promStepTwo: { - zh: '在 Prometheus 的配置文件中添加 Pushgateway 服务的地址,Node Exporter 和 Prometheus 的地址在有需要的情况下再添加。', - en: 'Add the address of the Pushgateway service to the Prometheus configuration file, and add the address of Node Exporter and Prometheus if necessary.', - }, - promRun: { - zh: '再使用生成的配置文件来启动 Prometheus,例如使用以下命令:', - en: 'Then use the generated configuration file to start Prometheus, for example, use the following command:', - }, - grafConfig: { - zh: '配置 Grafana', - en: 'Configure Grafana', - }, - promStepThree: { - zh: '在 Grafana 中添加 Prometheus 作为数据源,然后添加配置或导入一个 Dashboard 来可视化监控数据,例如可使用以下启动命令:', - en: 'Add Prometheus as a data source in Grafana, then add a configuration or import a Dashboard to visualize the monitoring data, for example, you can use the following startup command:', - }, - clickDownloadTemplateDesc: { - zh: '点击下方按钮下载默认的 Grafana Dashboard 模版。', - en: 'Click the button below to download the default Grafana Dashboard template.', - }, - clickDonwnloadTemplate: { - zh: '下载 Grafana 模版', - en: 'Download Grafana Template', - }, - genPromConfig: { - zh: '生成配置文件', - en: 'Generate Configuration File', - }, - pushgatewayRequired: { - zh: '请配置 Pushgateway 地址', - en: 'Please configure the Pushgateway address', - }, - emqxRequired: { - zh: '请配置 EMQX 地址', - en: 'Please configure the EMQX address', - }, - metricsPathRequired: { - zh: '请配置 metrics API path', - en: 'Please configure the metrics API path', - }, - endpoint: { - zh: '服务地址', - en: 'Endpoint', - }, - exportInterval: { - zh: '导出间隔', - // Must have a space at the beginning - en: ' Export Interval', - }, - enableBasicAuth: { - zh: '启用基本认证', - en: 'Enable Basic Auth', - }, - enableBasicAuthDesc: { - zh: '启用或禁用 Prometheus 抓取 API 的基本认证,不适用于 Pushgateway', - en: 'Enable or disable basic authentication for Prometheus scrape API, not for Pushgateway', - }, - featureSelection: { - zh: '功能选择', - en: 'Feature Selection', - }, - metricsEnable: { - zh: '指标', - en: 'Metrics', - }, - tracesEnable: { - zh: '追踪', - en: 'Traces', - }, - tracesFilterTracesAll: { - zh: '追踪全部消息', - en: 'Traces All Messages', - }, - tracesFilterTracesAllDesc: { - zh: '当启用时,EMQX 将追踪所有发布的消息,如果无法从消息中提取追踪ID,则会生成一个新的追踪ID。当禁用时,只有在发布时带有追踪上下文(Trace context)的消息才会被追踪。', - en: 'When enabled, the EMQX will trace all published messages. If a trace ID cannot be extracted from the message, a new trace ID will be generated. When disabled, only messages with trace context at the time of publishing will be traced.', - }, - logsEnable: { - zh: '日志', - en: 'Logs', - }, - logsLevel: { - zh: '日志级别', - en: 'Logs Level', - }, - thisDoc: { - zh: '此文档', - en: 'this doc', - }, -} diff --git a/src/i18n/Plugins.js b/src/i18n/Plugins.ts similarity index 76% rename from src/i18n/Plugins.js rename to src/i18n/Plugins.ts index 5595d41cd..561387604 100644 --- a/src/i18n/Plugins.js +++ b/src/i18n/Plugins.ts @@ -59,10 +59,6 @@ export default { zh: '插件描述', en: 'Description', }, - uploadPlugin: { - zh: '上传插件', - en: 'Upload plugin', - }, dragFilePlaceholder: { zh: '选择或拖拽文件到此处', en: 'Select or drag files here', @@ -91,10 +87,6 @@ export default { zh: '请先上传文件', en: 'Please upload the file first', }, - installNow: { - zh: '立即安装', - en: 'Install now', - }, moveToTop: { zh: '移到顶部', en: 'Move to top', @@ -127,4 +119,28 @@ export default { zh: '此插件不支持在 Dashboard 中进行配置。', en: 'This plugin does not support configuration via the Dashboard.', }, + inConsistent: { + zh: '集群中各节点版本不一致', + en: 'Inconsistent for nodes in the cluster', + }, + syncToNodes: { + zh: '同步至各节点', + en: 'Sync to Nodes', + }, + confirmSyncPluginVersion: { + zh: '是否确认将版本 {currentVersion} 的插件 {name} 同步至以下节点', + en: 'Are you sure to sync version {currentVersion} of the plugin {name} to the following nodes?', + }, + currentVersion: { + zh: '当前版本', + en: 'Current Version', + }, + syncSuccess: { + zh: '同步成功', + en: 'Synchronized Successfully', + }, + restartPluginTip: { + zh: '为保证同步后插件正常运行,请在同步后重新启动插件', + en: 'To ensure the plugin runs normally after synchronization, please restart the plugin after synchronization.', + }, } diff --git a/src/i18n/Rule.js b/src/i18n/Rule.ts similarity index 100% rename from src/i18n/Rule.js rename to src/i18n/Rule.ts diff --git a/src/i18n/RuleEngine.js b/src/i18n/RuleEngine.ts similarity index 98% rename from src/i18n/RuleEngine.js rename to src/i18n/RuleEngine.ts index 1449c34aa..6f0a0aed4 100644 --- a/src/i18n/RuleEngine.js +++ b/src/i18n/RuleEngine.ts @@ -75,14 +75,6 @@ export default { zh: 'HTTP 服务', en: 'HTTP Server', }, - bridgeDescHTTP: { - zh: '发送数据到 HTTP 服务', - en: 'Send data to HTTP Server', - }, - bridgeDescMQTT: { - zh: '使用 MQTT 桥接数据', - en: 'Using MQTT to bridge data', - }, trigger: { zh: '触发器', en: 'Trigger', @@ -693,6 +685,14 @@ export default { zh: '当取消终端订阅成功时触发规则', en: `Triggered when the terminal subscription is cancelled successfully`, }, + sysAlarmActivatedDesc: { + zh: '当系统告警激活时触发规则', + en: `Trigger the rule when the system alarm is activated`, + }, + sysAlarmDeactivatedDesc: { + zh: '当系统告警解除时触发规则', + en: `Trigger the rule when the system alarm is deactivated`, + }, useAction: { zh: '使用动作', en: 'Use action', @@ -1089,6 +1089,10 @@ export default { zh: '关联规则', en: 'Associated Rules', }, + viewRules: { + zh: '查看规则', + en: 'View Rules', + }, directDispatch: { zh: '直接派发', en: 'Direct Dispatch', diff --git a/src/i18n/RuleEvent.js b/src/i18n/RuleEvent.ts similarity index 87% rename from src/i18n/RuleEvent.js rename to src/i18n/RuleEvent.ts index 04289353c..59a576f27 100644 --- a/src/i18n/RuleEvent.js +++ b/src/i18n/RuleEvent.ts @@ -55,6 +55,14 @@ export default { en: 'Message Transformation Failed', zh: '消息转换失败', }, + eventsSysAlarmDeactivated: { + en: 'System Alarm Deactivated', + zh: '系统告警解除', + }, + eventsSysAlarmActivated: { + en: 'System Alarm Activated', + zh: '系统告警激活', + }, bridgesMqtt: { en: 'Mqtt Bridge Message', zh: 'MQTT 桥接消息', diff --git a/src/i18n/RuleSyntax.js b/src/i18n/RuleSyntax.ts similarity index 96% rename from src/i18n/RuleSyntax.js rename to src/i18n/RuleSyntax.ts index 7d368adab..cf61156bc 100644 --- a/src/i18n/RuleSyntax.js +++ b/src/i18n/RuleSyntax.ts @@ -1064,7 +1064,7 @@ export default { }, hexstr2BinDesc: { zh: 'Hex 字符串转为二进制数据', - en: 'Binary to Hex String', + en: 'Hex String to Hex String', }, hexstr2BinParams: { zh: 'Hex 字符串', @@ -1164,4 +1164,52 @@ Typical JQ programs describe simple transformations or filters for JSON data, bu zh: '返回值为执行生成生成的 JSON 对象列表。如果执行超时或者 JQ 程序抛出异常,该函数将抛出异常。', en: 'list of objects corresponding to the JSON objects generated by the given JQ program (parameter 1) when given the input provided by parameter 2. The function throws an exception if the execution did not finish before the timeout or if the jq program throws an exception.', }, + isEmptyDesc: { + zh: '判断 Map 或数组是否为空', + en: 'Return true if the map or array is empty', + }, + isEmptyParams: { + zh: '要检查的值', + en: 'Value to check', + }, + isEmptyReturns: { + zh: '布尔值,为空时返回 true', + en: 'Boolean value, true if empty', + }, + mapSizeDesc: { + zh: '获取 Map 的大小', + en: 'Return the size of a map', + }, + mapSizeParams: { + zh: 'Map 对象', + en: 'Map object', + }, + mapSizeReturns: { + zh: 'Map 的大小', + en: 'The size of the map', + }, + strUtf16LeDesc: { + zh: '将 UTF-8 字符串转换为 UTF-16 小端序编码', + en: 'Convert a UTF-8 string to UTF-16 little-endian' + }, + strUtf16LeParams: { + zh: '要转换的字符串', + en: 'String to convert' + }, + strUtf16LeReturns: { + zh: 'UTF-16 小端序编码的字符串', + en: 'UTF-16 little-endian encoded string' + }, + sqlserverBin2HexstrDesc: { + zh: '将字符串或二进制转换为 SQL Server 十六进制格式(带 0x 前缀)', + en: 'Convert string or binary to SQL Server hex format with 0x prefix' + }, + sqlserverBin2HexstrParams: { + zh: '要转换的数据', + en: 'Data to convert' + }, + sqlserverBin2HexstrReturns: { + zh: 'SQL Server 格式的十六进制字符串', + en: 'Hex string in SQL Server format' + } } diff --git a/src/i18n/Settings.js b/src/i18n/Settings.ts similarity index 100% rename from src/i18n/Settings.js rename to src/i18n/Settings.ts diff --git a/src/i18n/Subs.js b/src/i18n/Subs.ts similarity index 100% rename from src/i18n/Subs.js rename to src/i18n/Subs.ts diff --git a/src/i18n/Tools.js b/src/i18n/Tools.ts similarity index 92% rename from src/i18n/Tools.js rename to src/i18n/Tools.ts index 328c24fdd..56cf59fdc 100644 --- a/src/i18n/Tools.js +++ b/src/i18n/Tools.ts @@ -79,6 +79,14 @@ export default { zh: '订阅', en: 'Subscribe', }, + invalidPubTopic: { + zh: '请输入有效的主题', + en: 'Please enter a valid topic', + }, + invalidSubTopic: { + zh: '发布主题不能包含通配符', + en: 'Publish topic cannot contain wildcards', + }, time: { zh: '时间', en: 'Time', diff --git a/src/i18n/Topics.js b/src/i18n/Topics.ts similarity index 100% rename from src/i18n/Topics.js rename to src/i18n/Topics.ts diff --git a/src/i18n/components.js b/src/i18n/components.ts similarity index 93% rename from src/i18n/components.js rename to src/i18n/components.ts index 4e1974c5c..7f793eadf 100644 --- a/src/i18n/components.js +++ b/src/i18n/components.ts @@ -24,8 +24,8 @@ export default { en: 'Management', }, diagnose: { - zh: '问题分析', - en: 'Diagnose', + zh: '诊断工具', + en: 'Diagnostics Tools', }, acl: { zh: 'ACL', @@ -89,7 +89,7 @@ export default { }, rule: { zh: '规则', - en: 'Rule', + en: 'Rules', }, rules: { zh: '规则', @@ -108,8 +108,8 @@ export default { en: 'Create Flow', }, webhook: { - zh: 'Webhook', - en: 'Webhook', + zh: 'Webhooks', + en: 'Webhooks', }, 'webhook-create': { zh: '创建 Webhook', @@ -157,7 +157,7 @@ export default { }, extension: { zh: '扩展', - en: 'Extension', + en: 'Extensions', }, 'mqtt-system-topic': { zh: '系统主题', @@ -172,12 +172,12 @@ export default { en: 'Gateways', }, exhook: { - zh: 'ExHook', - en: 'ExHook', + zh: 'ExHooks', + en: 'ExHooks', }, 'api-key': { zh: 'API 密钥', - en: 'API Key', + en: 'API Keys', }, 'banned-clients': { zh: '黑名单', @@ -257,11 +257,11 @@ export default { }, 'log-trace': { zh: '日志追踪', - en: 'Log Trace', + en: 'Log Traces', }, connector: { zh: '连接器', - en: 'Connector', + en: 'Connectors', }, extensions: { zh: '插件扩展', @@ -269,7 +269,7 @@ export default { }, 'mqtt-session': { zh: '会话', - en: 'Session', + en: 'Sessions', }, 'mqtt-retainer': { zh: '保留消息', @@ -287,6 +287,10 @@ export default { zh: '会话持久化', en: 'Durable Sessions', }, + 'mqtt-force-shutdown': { + zh: '强制关闭', + en: 'Force Shutdown', + }, /* For Quick Panel Start */ 'rule-create': { zh: '创建规则', diff --git a/src/main.ts b/src/main.ts index 23bad0fed..9746e6999 100644 --- a/src/main.ts +++ b/src/main.ts @@ -11,8 +11,8 @@ import ElementPlus from 'element-plus' import elementI18nZhCn from 'element-plus/es/locale/lang/zh-cn' import elementI18nEn from 'element-plus/es/locale/lang/en' import safeHTML from '@/common/safeHTML' - import i18n from './i18n' +import globalComponents from './components/global-components' function bindDirective(app: Application) { app.directive('safe-html', safeHTML) @@ -27,6 +27,7 @@ const app = createApp(App) }) .use(i18n) .use(bindDirective) + .use(globalComponents) .mount('#app') export default app diff --git a/src/router/index.ts b/src/router/index.ts index 3c4656b73..5e6b775ba 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,6 +1,4 @@ import store from '@/store' -import { Component } from 'vue' -import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router' const Layout = (): Promise => import('@/views/Base/Layout.vue') // const Cluster =()=> import('@/views/Config/BasicConfig/Cluster.vue') @@ -504,6 +502,11 @@ export const routes: Array = [ name: 'mqtt-system-topic', component: () => import('@/views/Config/BasicConfig/SystemTopics.vue'), }, + { + path: 'force-shutdown', + name: 'mqtt-force-shutdown', + component: () => import('@/views/Config/BasicConfig/ForceShutdown.vue'), + }, ], }, // log config @@ -617,7 +620,7 @@ export function toLogin(path?: string): void { currentPath !== '/login' && router.push({ path: '/login', - query: { to: path ? path : currentPath ?? undefined }, + query: { to: path ? path : (currentPath ?? undefined) }, }) } diff --git a/src/schemaText/actionText/action-label-en.json b/src/schemaText/actionText/action-label-en.json index d48de06dd..4e75b94a9 100644 --- a/src/schemaText/actionText/action-label-en.json +++ b/src/schemaText/actionText/action-label-en.json @@ -4,6 +4,7 @@ "ssl": "Enable SSL" }, "mqtt": { - "source_topic": "Topic" + "source_topic": "Topic", + "no_local": "No Local" } } \ No newline at end of file diff --git a/src/schemaText/actionText/action-label-zh.json b/src/schemaText/actionText/action-label-zh.json index dcf9507f0..dd3e28727 100644 --- a/src/schemaText/actionText/action-label-zh.json +++ b/src/schemaText/actionText/action-label-zh.json @@ -4,6 +4,7 @@ "ssl": "启用SSL" }, "mqtt": { - "source_topic": "主题" + "source_topic": "主题", + "no_local": "禁止本地转发" } } \ No newline at end of file diff --git a/src/schemaText/actionText/index.ts b/src/schemaText/actionText/index.ts index 1b87b892a..feaaf36d8 100644 --- a/src/schemaText/actionText/index.ts +++ b/src/schemaText/actionText/index.ts @@ -6,7 +6,6 @@ import { zhIntegrationDesc, enIntegrationDesc, } from '@emqx/shared-ui-i18n' -import { merge } from 'lodash' import customActionDescEn from './action-desc-en.json' import customActionDescZh from './action-desc-zh.json' import customActionLabelEn from './action-label-en.json' diff --git a/src/schemaText/schema-text-en.json b/src/schemaText/schema-text-en.json deleted file mode 100644 index 08eec88cd..000000000 --- a/src/schemaText/schema-text-en.json +++ /dev/null @@ -1,1378 +0,0 @@ -{ - "emqx_conf_schema": { - "common_handler_drop_mode_qlen": { - "desc": "When the number of buffered log events is larger than this value, the new log events are dropped.\nWhen drop mode is activated or deactivated, a message is printed in the logs.", - "label": "Queue Length before Entering Drop Mode" - }, - "cluster_mcast_addr": { - "desc": "Multicast IPv4 address.", - "label": "Cluster Multicast Address" - }, - "desc_cluster_dns": { - "desc": "Service discovery via DNS SRV records.", - "label": "Cluster DNS" - }, - "cluster_dns_name": { - "desc": "The domain name from which to discover peer EMQX nodes' IP addresses.\nApplicable when cluster.discovery_strategy = dns", - "label": "Cluster Dns Name" - }, - "rpc_keyfile": { - "desc": "Path to the private key file for the rpc.certfile.
\nNote: contents of this file are secret, so it's necessary to set permissions to 600.", - "label": "RPC Keyfile" - }, - "cluster_mcast_recbuf": { - "desc": "Size of the kernel-level buffer for incoming datagrams.", - "label": "Cluster Muticast Sendbuf" - }, - "cluster_autoheal": { - "desc": "If true, the node will try to heal network partitions automatically.", - "label": "Cluster Auto Heal" - }, - "log_overload_kill_enable": { - "desc": "Enable log handler overload kill feature.", - "label": "Log Handler Overload Kill" - }, - "node_etc_dir": { - "desc": "etc dir for the node", - "label": "Etc Dir" - }, - "cluster_proto_dist": { - "desc": "The Erlang distribution protocol for the cluster.
\n- inet_tcp: IPv4 TCP
\n- inet_tls: IPv4 TLS, works together with etc/ssl_dist.conf", - "label": "Cluster Protocol Distribution" - }, - "log_burst_limit_enable": { - "desc": "Enable log burst control feature.", - "label": "Enable Burst" - }, - "dist_buffer_size": { - "desc": "Erlang's distribution buffer busy limit in kilobytes.", - "label": "Erlang's dist buffer size(KB)" - }, - "common_handler_max_depth": { - "desc": "Maximum depth for Erlang term log formatting and Erlang process message queue inspection.", - "label": "Max Depth" - }, - "desc_log": { - "desc": "EMQX logging supports multiple sinks for the log events.\nEach sink is represented by a _log handler_, which can be configured independently.", - "label": "Log" - }, - "common_handler_flush_qlen": { - "desc": "If the number of buffered log events grows larger than this threshold, a flush (delete) operation takes place.\nTo flush events, the handler discards the buffered log messages without logging.", - "label": "Flush Threshold" - }, - "common_handler_chars_limit": { - "desc": "Set the maximum length of a single log message. If this length is exceeded, the log message will be truncated.\nNOTE: Restrict char limiter if formatter is JSON , it will get a truncated incomplete JSON data, which is not recommended.", - "label": "Single Log Max Length" - }, - "cluster_k8s_namespace": { - "desc": "Kubernetes namespace.", - "label": "K8s Namespace" - }, - "node_name": { - "desc": "Unique name of the EMQX node. It must follow %name%{'@'}FQDN or\n%name%{'@'}IPv4 format.", - "label": "Node Name" - }, - "rpc_port_discovery": { - "desc": "manual: discover ports by tcp_server_port.
\nstateless: discover ports in a stateless manner, using the following algorithm.\nIf node name is emqxN{'@'}127.0.0.1, where the N is an integer,\nthen the listening port will be 5370 + N.", - "label": "RRC Port Discovery" - }, - "log_overload_kill_restart_after": { - "desc": "The handler restarts automatically after a delay in the event of termination, unless the value `infinity` is set, which blocks any subsequent restarts.", - "label": "Handler Restart Timer" - }, - "log_file_handler_rotation_size": { - "desc": "This parameter controls log file rotation. The value `infinity` means the log file will grow indefinitely, otherwise the log file will be rotated once it reaches `max_size` in bytes.", - "label": "Rotation Size" - }, - "desc_log_file_handler": { - "desc": "Log handler that prints log events to files.", - "label": "Files Log Handler" - }, - "rpc_socket_keepalive_count": { - "desc": "How many times the keepalive probe message can fail to receive a reply\nuntil the RPC connection is considered lost.", - "label": "RPC Socket Keepalive Count" - }, - "cluster_etcd_server": { - "desc": "List of endpoint URLs of the etcd cluster", - "label": "Cluster Etcd Server" - }, - "db_backend": { - "desc": "Select the backend for the embedded database.
\nrlog is the default backend,\nthat is suitable for very large clusters.
\nmnesia is a backend that offers decent performance in small clusters.", - "label": "DB Backend" - }, - "desc_authorization": { - "desc": "Settings that control client authorization.", - "label": "Authorization" - }, - "cluster_etcd_ssl": { - "desc": "Options for the TLS connection to the etcd cluster.", - "label": "Cluster Etcd SSL Option" - }, - "rpc_insecure_fallback": { - "desc": "Enable compatibility with old RPC authentication.", - "label": "RPC insecure fallback" - }, - "cluster_mcast_buffer": { - "desc": "Size of the user-level buffer.", - "label": "Cluster Muticast Buffer" - }, - "rpc_authentication_timeout": { - "desc": "Timeout for the remote node authentication.", - "label": "RPC Authentication Timeout" - }, - "cluster_call_retry_interval": { - "desc": "Time interval to retry after a failed call.", - "label": "Cluster Call Retry Interval" - }, - "cluster_mcast_sndbuf": { - "desc": "Size of the kernel-level buffer for outgoing datagrams.", - "label": "Cluster Muticast Sendbuf" - }, - "rpc_driver": { - "desc": "Transport protocol used for inter-broker communication", - "label": "RPC dirver" - }, - "max_ets_tables": { - "desc": "Max number of ETS tables", - "label": "Max number of ETS tables" - }, - "desc_db": { - "desc": "Settings for the embedded database.", - "label": "Database" - }, - "desc_cluster_etcd": { - "desc": "Service discovery using 'etcd' service.", - "label": "Cluster Etcd" - }, - "cluster_name": { - "desc": "Human-friendly name of the EMQX cluster.", - "label": "Cluster Name" - }, - "log_rotation_enable": { - "desc": "Enable log rotation feature.", - "label": "Rotation Enable" - }, - "cluster_call_cleanup_interval": { - "desc": "Time interval to clear completed but stale transactions.\nEnsure that the number of completed transactions is less than the max_history.", - "label": "Clean Up Interval" - }, - "desc_cluster_static": { - "desc": "Service discovery via static nodes.\nThe new node joins the cluster by connecting to one of the bootstrap nodes.", - "label": "Cluster Static" - }, - "db_default_shard_transport": { - "desc": "Defines the default transport for pushing transaction logs.
\nThis may be overridden on a per-shard basis in db.shard_transports.\ngen_rpc uses the gen_rpc library,\ndistr uses the Erlang distribution.", - "label": "Default Shard Transport" - }, - "cluster_static_seeds": { - "desc": "List EMQX node names in the static cluster. See node.name.", - "label": "Cluster Static Seeds" - }, - "log_overload_kill_qlen": { - "desc": "Maximum allowed queue length.", - "label": "Max Queue Length" - }, - "node_backtrace_depth": { - "desc": "Maximum depth of the call stack printed in error messages and\nprocess_info.", - "label": "BackTrace Depth" - }, - "desc_log_burst_limit": { - "desc": "Large bursts of log events produced in a short time can potentially cause problems, such as:\n - Log files grow very large\n - Log files are rotated too quickly, and useful information gets overwritten\n - Overall performance impact on the system\n\nLog burst limit feature can temporarily disable logging to avoid these issues.", - "label": "Log Burst Limit" - }, - "common_handler_enable": { - "desc": "Enable this log handler.", - "label": "Enable Log Handler" - }, - "common_handler_timestamp_format": { - "desc": "Pick a timestamp format:
- auto: automatically choose the best format based on log formatter. epoch for JSON and rfc3339 for text.
- epoch: Unix epoch time in microseconds.
- rfc3339: RFC3339 format.", - "label": "Timestamp Format" - }, - "cluster_k8s_service_name": { - "desc": "EMQX broker service name.", - "label": "K8s Service Name" - }, - "common_handler_rotation_count": { - "desc": "Maximum number of log files.", - "label": "Max Log Files Number" - }, - "node_cookie": { - "desc": "Secret cookie is a random string that should be the same on all nodes in\nthe given EMQX cluster, but unique per EMQX cluster. It is used to prevent EMQX nodes that\nbelong to different clusters from accidentally connecting to each other.", - "label": "Node Cookie" - }, - "db_role": { - "desc": "Select a node role.
\ncore nodes provide durability of the data, and take care of writes.\nIt is recommended to place core nodes in different racks or different availability zones.
\nreplicant nodes are ephemeral worker nodes. Removing them from the cluster\ndoesn't affect database redundancy
\nIt is recommended to have more replicant nodes than core nodes.
\nNote: this parameter only takes effect when the backend is set\nto rlog.", - "label": "DB Role" - }, - "rpc_tcp_server_port": { - "desc": "Listening port used by RPC local service.
\nNote that this config only takes effect when rpc.port_discovery is set to manual.", - "label": "RPC TCP Server Port" - }, - "desc_console_handler": { - "desc": "Log handler that prints log events to the EMQX console.", - "label": "Console Handler" - }, - "node_applications": { - "desc": "List of Erlang applications that shall be rebooted when the EMQX broker joins the cluster.", - "label": "Application" - }, - "log_burst_limit_max_count": { - "desc": "Maximum number of log events to handle within a `window_time` interval. After the limit is reached, successive events are dropped until the end of the `window_time`.", - "label": "Events Number" - }, - "rpc_tcp_client_num": { - "desc": "Set the maximum number of RPC communication channels initiated by this node to each remote node.", - "label": "RPC TCP Client Num" - }, - "cluster_k8s_address_type": { - "desc": "Address type used for connecting to the discovered nodes.\nSetting cluster.k8s.address_type to ip will\nmake EMQX to discover IP addresses of peer nodes from Kubernetes API.", - "label": "K8s Address Type" - }, - "rpc_socket_sndbuf": { - "desc": "TCP tuning parameters. TCP sending buffer size.", - "label": "RPC Socket Sndbuf" - }, - "cluster_mcast_ttl": { - "desc": "Time-to-live (TTL) for the outgoing UDP datagrams.", - "label": "Cluster Multicast TTL" - }, - "db_core_nodes": { - "desc": "List of core nodes that the replicant will connect to.
\nNote: this parameter only takes effect when the backend is set\nto rlog and the role is set to replicant.
\nThis value needs to be defined for manual or static cluster discovery mechanisms.
\nIf an automatic cluster discovery mechanism is being used (such as etcd),\nthere is no need to set this value.", - "label": "Db Core Node" - }, - "log_file_handler_path": { - "desc": "The path and name of the log file.", - "label": "Log File Name" - }, - "log_file_handler_to": { - "desc": "Name the log file.", - "label": "Log File Name" - }, - "node_dist_net_ticktime": { - "desc": "This is the approximate time an EMQX node may be unresponsive until it is considered down and thereby disconnected.", - "label": "Dist Net TickTime" - }, - "desc_cluster_k8s": { - "desc": "Service discovery via Kubernetes API server.", - "label": "Cluster Kubernetes" - }, - "desc_cluster_mcast": { - "desc": "Service discovery via UDP multicast.", - "label": "Cluster Multicast" - }, - "rpc_cacertfile": { - "desc": "Path to certification authority TLS certificate file used to validate rpc.certfile.
\nNote: certificates of all nodes in the cluster must be signed by the same CA.", - "label": "RPC Cacertfile" - }, - "desc_node": { - "desc": "Node name, cookie, config & data directories and the Erlang virtual machine (BEAM) boot parameters.", - "label": "Node" - }, - "cluster_k8s_apiserver": { - "desc": "Kubernetes API endpoint URL.", - "label": "Cluster k8s ApiServer" - }, - "common_handler_supervisor_reports": { - "desc": "Type of supervisor reports that are logged. Defaults to error
\n - error: only log errors in the Erlang processes
.\n - progress: log process startup.", - "label": "Report Type" - }, - "node_data_dir": { - "desc": "Path to the persistent data directory.
\nPossible auto-created subdirectories are:
\n- `mnesia/`: EMQX's built-in database directory.
\nFor example, `mnesia/emqx{'@'}127.0.0.1`.
\nThere should be only one such subdirectory.
\nMeaning, in case the node is to be renamed (to e.g. `emqx{'@'}10.0.1.1`),
\nthe old dir should be deleted first.
\n- `configs`: Generated configs at boot time, and cluster/local override configs.
\n- `patches`: Hot-patch beam files are to be placed here.
\n- `trace`: Trace log files.
\n\n**NOTE**: One data dir cannot be shared by two or more EMQX nodes.", - "label": "Node Data Dir" - }, - "cluster_k8s_suffix": { - "desc": "Node name suffix.
\nNote: this parameter is only relevant when address_type is dns\nor hostname.", - "label": "K8s Suffix" - }, - "db_rpc_module": { - "desc": "Protocol used for pushing transaction logs to the replicant nodes.", - "label": "RPC Module" - }, - "cluster_etcd_prefix": { - "desc": "Key prefix used for EMQX service discovery.", - "label": "Cluster Etcd Prefix" - }, - "cluster_mcast_iface": { - "desc": "Local IP address the node discovery service needs to bind to.", - "label": "Cluster Multicast Interface" - }, - "log_burst_limit_window_time": { - "desc": "See max_count.", - "label": "Window Time" - }, - "cluster_dns_record_type": { - "desc": "DNS record type.", - "label": "DNS Record Type" - }, - "cluster_autoclean": { - "desc": "Remove disconnected nodes from the cluster after this interval.", - "label": "Cluster Auto Clean" - }, - "process_limit": { - "desc": "Maximum number of simultaneously existing processes for this Erlang system.\nThe actual maximum chosen may be much larger than the Number passed.\nFor more information, see: https://www.erlang.org/doc/man/erl.html", - "label": "Erlang Process Limit" - }, - "max_ports": { - "desc": "Maximum number of simultaneously existing ports for this Erlang system.\nThe actual maximum chosen may be much larger than the Number passed.\nFor more information, see: https://www.erlang.org/doc/man/erl.html", - "label": "Erlang Port Limit" - }, - "desc_log_rotation": { - "desc": "By default, the logs are stored in `./log` directory (for installation from zip file) or in `/var/log/emqx` (for binary installation).
\nThis section of the configuration controls the number of files kept for each log handler.", - "label": "Log Rotation" - }, - "desc_log_overload_kill": { - "desc": "Log overload kill features an overload protection that activates when the log handlers use too much memory or have too many buffered log messages.
\nWhen the overload is detected, the log handler is terminated and restarted after a cooldown period.", - "label": "Log Overload Kill" - }, - "authorization": { - "desc": "Authorization a.k.a. ACL.
\nIn EMQX, MQTT client access control is extremely flexible.
\nAn out-of-the-box set of authorization data sources are supported.\nFor example,
\n'file' source is to support concise and yet generic ACL rules in a file;
\n'built_in_database' source can be used to store per-client customizable rule sets,\nnatively in the EMQX node;
\n'http' source to make EMQX call an external HTTP API to make the decision;
\n'PostgreSQL' etc. to look up clients or rules from external databases", - "label": "Authorization" - }, - "rpc_socket_keepalive_idle": { - "desc": "How long the connections between the brokers should remain open after the last message is sent.", - "label": "RPC Socket Keepalive Idle" - }, - "desc_cluster_call": { - "desc": "Options for the 'cluster call' feature that allows to execute a callback on all nodes in the cluster.", - "label": "Cluster Call" - }, - "cluster_mcast_ports": { - "desc": "List of UDP ports used for service discovery.
\nNote: probe messages are broadcast to all the specified ports.", - "label": "Cluster Multicast Ports" - }, - "log_overload_kill_mem_size": { - "desc": "Maximum memory size that the log handler process is allowed to use.", - "label": "Log Handler Max Memory Size" - }, - "rpc_connect_timeout": { - "desc": "Timeout for establishing an RPC connection.", - "label": "RPC Connect Timeout" - }, - "cluster_etcd_node_ttl": { - "desc": "Expiration time of the etcd key associated with the node.\nIt is refreshed automatically, as long as the node is alive.", - "label": "Cluster Etcd Node TTL" - }, - "rpc_call_receive_timeout": { - "desc": "Timeout for the reply to a synchronous RPC.", - "label": "RPC Call Receive Timeout" - }, - "rpc_socket_recbuf": { - "desc": "TCP tuning parameters. TCP receiving buffer size.", - "label": "RPC Socket Recbuf" - }, - "db_tlog_push_mode": { - "desc": "In sync mode the core node waits for an ack from the replicant nodes before sending the next\ntransaction log entry.", - "label": "Tlog Push Mode" - }, - "node_crash_dump_bytes": { - "desc": "This variable sets the maximum size of a crash dump file in bytes.\nThe crash dump will be truncated if this limit is exceeded.\nIf setting it to 0, the runtime system does not even attempt to write a crash dump file.", - "label": "Crash Dump Bytes" - }, - "rpc_certfile": { - "desc": "Path to TLS certificate file used to validate identity of the cluster nodes.\nNote that this config only takes effect when rpc.driver is set to ssl.", - "label": "RPC Certfile" - }, - "node_crash_dump_seconds": { - "desc": "This variable gives the number of seconds that the emulator is allowed to spend writing a crash dump. When the given number of seconds have elapsed, the emulator is terminated.
\n- If setting to 0 seconds, the runtime system does not even attempt to write the crash dump file. It only terminates.
\n- If setting to a positive value S, wait for S seconds to complete the crash dump file and then terminates the runtime system with a SIGALRM signal.
\n- A negative value causes the termination of the runtime system to wait indefinitely until the crash dump file has been completely written.", - "label": "Crash Dump Seconds" - }, - "log_file_handlers": { - "desc": "File-based log handlers.", - "label": "File Handler" - }, - "node_global_gc_interval": { - "desc": "Periodic garbage collection interval. Set to disabled to have it disabled.", - "label": "Global GC Interval" - }, - "common_handler_time_offset": { - "desc": "The time offset to be used when formatting the timestamp.\nCan be one of:\n - system: the time offset used by the local system\n - utc: the UTC time offset\n - +-[hh]:[mm]: user specified time offset, such as \"-02:00\" or \"+00:00\"\nDefaults to: system.", - "label": "Time Offset" - }, - "rpc_mode": { - "desc": "In sync mode the sending side waits for the ack from the receiving side.", - "label": "RPC Mode" - }, - "node_crash_dump_file": { - "desc": "Location of the crash dump file.", - "label": "Crash Dump File" - }, - "cluster_mcast_loop": { - "desc": "If true, loop UDP datagrams back to the local socket.", - "label": "Cluster Multicast Loop" - }, - "rpc_socket_keepalive_interval": { - "desc": "The interval between keepalive messages.", - "label": "RPC Socket Keepalive Interval" - }, - "common_handler_level": { - "desc": "The log level for the current log handler.\nDefaults to warning.", - "label": "Log Level" - }, - "desc_rpc": { - "desc": "EMQX uses a library called gen_rpc for inter-broker communication.
\nMost of the time the default config should work,\nbut in case you need to do performance fine-tuning or experiment a bit,\nthis is where to look.", - "label": "RPC" - }, - "rpc_ssl_server_port": { - "desc": "Listening port used by RPC local service.
\nNote that this config only takes effect when rpc.port_discovery is set to manual\nand driver is set to ssl.", - "label": "RPC SSL Server Port" - }, - "desc_cluster": { - "desc": "EMQX nodes can form a cluster to scale up the total capacity.
\n Here holds the configs to instruct how individual nodes can discover each other.", - "label": "Cluster" - }, - "common_handler_sync_mode_qlen": { - "desc": "As long as the number of buffered log events is lower than this value,\nall log events are handled asynchronously. This means that the client process sending the log event,\nby calling a log function in the Logger API, does not wait for a response from the handler\nbut continues executing immediately after the event is sent.\nIt is not affected by the time it takes the handler to print the event to the log device.\nIf the message queue grows larger than this value,\nthe handler starts handling log events synchronously instead,\nmeaning that the client process sending the event must wait for a response.\nWhen the handler reduces the message queue to a level below the sync_mode_qlen threshold,\nasynchronous operation is resumed.", - "label": "Queue Length before Entering Sync Mode" - }, - "common_handler_formatter": { - "desc": "Choose log formatter. text for free text, and json for structured logging.", - "label": "Log Formatter" - }, - "rpc_async_batch_size": { - "desc": "The maximum number of batch messages sent in asynchronous mode.\n Note that this configuration does not work in synchronous mode.", - "label": "Async Batch Size" - }, - "cluster_call_max_history": { - "desc": "Retain the maximum number of completed transactions (for queries).", - "label": "Cluster Call Max History" - }, - "cluster_discovery_strategy": { - "desc": "Service discovery method for the cluster nodes. Possible values are:\n- manual: Use emqx ctl cluster command to manage cluster.
\n- static: Configure static nodes list by setting seeds in config file.
\n- dns: Use DNS A record to discover peer nodes.
\n- etcd: Use etcd to discover peer nodes.
\n- k8s: Use Kubernetes API to discover peer pods.", - "label": "Cluster Discovery Strategy" - }, - "rpc_send_timeout": { - "desc": "Timeout for sending the RPC request.", - "label": "RPC Send Timeout" - }, - "common_handler_single_line": { - "desc": "Print logs in a single line if set to true. Otherwise, log messages may span multiple lines.", - "label": "Single Line Mode" - }, - "rpc_socket_buffer": { - "desc": "TCP tuning parameters. Socket buffer size in user mode.", - "label": "RPC Socket Buffer" - }, - "db_shard_transports": { - "desc": "Allows to tune the transport method used for transaction log replication, on a per-shard basis.
\ngen_rpc uses the gen_rpc library,\ndistr uses the Erlang distribution.
If not specified,\nthe default is to use the value set in db.default_shard_transport.", - "label": "Shard Transports" - }, - "common_handler_time_window": { - "desc": "The time window for log throttling ensures that the same type of event is only logged once within the designated time frame to prevent log overflow. A detailed log encapsulating the activities within that period is generated at the end of the time window. The minimum configurable value for this window is one second.
The following events are throttled:
- authorization_permission_denied
- cannot_publish_to_topic_due_to_not_authorized
- cannot_publish_to_topic_due_to_quota_exceeded
- connection_rejected_due_to_license_limit_reached
- dropped_msg_due_to_mqueue_is_full", - "label": "Time Window" - }, - "common_handler_payload_encode": { - "desc": "The encoding method of payload in logs", - "label": "Payload Encode" - } - }, - "emqx_limiter_schema": { - "max_conn_rate": { - "desc": "Maximum connection rate.
\nThis is used to limit the connection rate for this node,\nonce the limit is reached, new connections will be deferred or refused.", - "label": "Maximum Connection Rate" - }, - "messages_rate": { - "desc": "Messages publish rate.
\nThis is used to limit the inbound message numbers for this node,\nonce the limit is reached, the restricted client will slow down and even be hung for a while.", - "label": "Messages Publish Rate" - }, - "bytes_rate": { - "desc": "Data publish rate.
\nThis is used to limit the inbound bytes rate for this node,\nonce the limit is reached, the restricted client will slow down and even be hung for a while.", - "label": "Data Publish Rate" - } - }, - "emqx_schema": { - "fields_mqtt_quic_listener_peer_unidi_stream_count": { - "desc": "Number of unidirectional streams to allow the peer to open.", - "label": "Peer unidi stream count" - }, - "fields_authorization_no_match": { - "desc": "Default access control action if the user or client matches no ACL rules,\nor if no such user or client is found by the configurable authorization\nsources such as built_in_database, an HTTP API, or a query against PostgreSQL.\nFind more details in 'authorization.sources' config.", - "label": "Authorization no match" - }, - "sysmon_top_db_hostname": { - "desc": "Hostname of the PostgreSQL database that collects the data points", - "label": "DB Hostname" - }, - "zones": { - "desc": "A zone is a set of configs grouped by the zone name.\nFor flexible configuration mapping, the name can be set to a listener's zone config.\nNOTE: A built-in zone named default is auto created and can not be deleted." - }, - "fields_mqtt_quic_listener_certfile": { - "desc": "Path to the certificate file. Will be deprecated in 5.1, use .ssl_options.certfile instead.", - "label": "Certificate file" - }, - "fields_rate_limit_conn_bytes_in": { - "desc": "Limit the rate of receiving packets for a MQTT connection.\nThe rate is counted by bytes of packets per second.", - "label": "Connection bytes in" - }, - "crl_cache_capacity": { - "desc": "The maximum number of CRL URLs that can be held in cache. If the cache is at full capacity and a new URL must be fetched, then it'll evict the oldest inserted URL in the cache.", - "label": "CRL Cache Capacity" - }, - "alarm_actions": { - "desc": "The actions triggered when the alarm is activated.
Currently, the following actions are supported: log and publish.\nlog is to write the alarm to log (console or file).\npublish is to publish the alarm as an MQTT message to the system topics:\n$SYS/brokers/emqx{'@'}xx.xx.xx.x/alarms/activate and\n$SYS/brokers/emqx{'@'}xx.xx.xx.x/alarms/deactivate", - "label": "Alarm Actions" - }, - "base_listener_max_connections": { - "desc": "The maximum number of concurrent connections allowed by the listener.", - "label": "Max connections" - }, - "mqtt_peer_cert_as_username": { - "desc": "Use the CN, DN field in the peer certificate or the entire certificate content as Username. Only works for the TLS connection.\nSupported configurations are the following:\n- cn: CN field of the certificate\n- dn: DN field of the certificate\n- crt: Content of the DER or PEM certificate\n- pem: Convert DER certificate content to PEM format and use as Username\n- md5: MD5 value of the DER or PEM certificate", - "label": "Use Peer Certificate as Username" - }, - "fields_cache_enable": { - "desc": "Enable or disable the authorization cache.", - "label": "Enable or disable the authorization cache" - }, - "fields_mqtt_quic_listener_disconnect_timeout_ms": { - "desc": "How long to wait for an ACK before declaring a path dead and disconnecting. Default: 16000", - "label": "Disconnect timeout ms" - }, - "mqtt_max_topic_alias": { - "label": "Max Topic Alias" - }, - "common_ssl_opts_schema_user_lookup_fun": { - "desc": "EMQX-internal callback that is used to lookup pre-shared key (PSK) identity.", - "label": "SSL PSK user lookup fun" - }, - "fields_listeners_wss": { - "desc": "HTTPS websocket listeners.", - "label": "HTTPS websocket listeners" - }, - "sysmon_top_max_procs": { - "desc": "Stop collecting data when the number of processes\nin the VM exceeds this value", - "label": "Max procs" - }, - "mqtt_use_username_as_clientid": { - "desc": "Whether to use Username as Client ID.\nThis setting takes effect later than Use Peer Certificate as Username and Use Peer Certificate as Client ID.", - "label": "Use Username as Client ID" - }, - "mqtt_max_qos_allowed": { - "label": "Max QoS Allowed" - }, - "fields_mqtt_quic_listener_max_binding_stateless_operations": { - "desc": "The maximum number of stateless operations that may be queued on a binding at any one time. Default: 100", - "label": "Max binding stateless operations" - }, - "fields_mqtt_quic_listener_stream_recv_buffer_default": { - "desc": "Stream initial buffer size. Default: 4096", - "label": "Stream recv buffer default" - }, - "fields_mqtt_quic_listener_pacing_enabled": { - "desc": "Pace sending to avoid overfilling buffers on the path. Default: 1 (Enabled)", - "label": "Pacing enabled" - }, - "mqtt_max_subscriptions": { - "desc": "Maximum number of subscriptions allowed per client.", - "label": "Max Subscriptions" - }, - "persistent_session_builtin_messages_table": { - "desc": "Performance tuning options for built-in messages table.", - "label": "Persistent messages" - }, - "sysmon_os_cpu_low_watermark": { - "desc": "The threshold, as percentage of system CPU load,\n for how much system cpu can be used before the corresponding alarm is cleared.", - "label": "CPU low watermark" - }, - "fields_mqtt_quic_listener_tls_server_max_send_buffer": { - "desc": "How much Server TLS data to buffer. Default: 8192", - "label": "TLS server max send buffer" - }, - "base_listener_bind": { - "desc": "IP address and port for the listening socket.", - "label": "IP address and port" - }, - "server_ssl_opts_schema_handshake_timeout": { - "desc": "Maximum time duration allowed for the handshake to complete", - "label": "Handshake timeout" - }, - "fields_deflate_opts_server_context_takeover": { - "desc": "Takeover means the compression state is retained between server messages.", - "label": "Server context takeover" - }, - "mqtt_session_expiry_interval": { - "desc": "Specifies how long the session will expire after the connection is disconnected, only for non-MQTT 5.0 connections.", - "label": "Session Expiry Interval" - }, - "mqtt_message_expiry_interval": { - "desc": "The MQTT message expiry interval. For MQTT v5.0 clients, it is only effective if the Message-Expiry-Interval property is not specified for the message; for MQTT v3.1 and v3.1.1, it always applies. Note that it is not helpful to set this value to a greater value than the MQTT Session Expiry Interval, because once the session expires, all related messages are purged.", - "label": "Message Expiry Interval" - }, - "fields_listener_enabled": { - "desc": "Enable listener.", - "label": "Enable listener" - }, - "mqtt": { - "desc": "Global MQTT configuration.\nThe configs here work as default values which can be overridden in zone configs" - }, - "crl_cache_refresh_http_timeout": { - "desc": "The timeout for the HTTP request when fetching CRLs. This is a global setting for all listeners.", - "label": "CRL Cache Refresh HTTP Timeout" - }, - "fields_tcp_opts_backlog": { - "desc": "TCP backlog defines the maximum length that the queue of\npending connections can grow to.", - "label": "TCP backlog length" - }, - "broker_route_batch_clean": { - "desc": "Enable batch clean for deleted routes." - }, - "fields_mqtt_quic_listener_initial_window_packets": { - "desc": "The size (in packets) of the initial congestion window for a connection. Default: 10", - "label": "Initial window packets" - }, - "flapping_detect_enable": { - "desc": "Enable flapping connection detection feature.", - "label": "Enable flapping detection" - }, - "sysmon_top_db_password": { - "desc": "EMQX user password in the PostgreSQL database", - "label": "DB Password" - }, - "fields_ws_opts_check_origins": { - "desc": "List of allowed origins.
See check_origin_enable.", - "label": "Allowed origins" - }, - "fields_deflate_opts_client_context_takeover": { - "desc": "Takeover means the compression state is retained between client messages.", - "label": "Client context takeover" - }, - "base_listener_acceptors": { - "desc": "The size of the listener's receiving pool.", - "label": "Acceptors Num" - }, - "common_ssl_opts_schema_cacertfile": { - "desc": "Trusted PEM format CA certificates bundle file.
\nThe certificates in this file are used to verify the TLS peer's certificates.\nAppend new certificates to the file if new CAs are to be trusted.\nThere is no need to restart EMQX to have the updated file loaded, because\nthe system regularly checks if file has been updated (and reload).
\nNOTE: invalidating (deleting) a certificate from the file will not affect\nalready established connections.", - "label": "CACertfile" - }, - "fields_ws_opts_mqtt_path": { - "desc": "WebSocket's MQTT protocol path. So the address of EMQX Broker's WebSocket is:\nws://{'{'}ip{'}'}:{'{'}port{'}'}/mqtt", - "label": "WS MQTT Path" - }, - "sysmon_os_procmem_high_watermark": { - "desc": "The threshold, as percentage of system memory,\n for how much system memory can be allocated by one Erlang process before\n the corresponding alarm is raised.", - "label": "ProcMem high wartermark" - }, - "fields_listeners_quic": { - "desc": "QUIC listeners.", - "label": "QUIC listeners" - }, - "fields_listeners_ws": { - "desc": "HTTP websocket listeners.", - "label": "HTTP websocket listeners" - }, - "mqtt_retry_interval": { - "desc": "Retry interval for QoS 1/2 message delivering.", - "label": "Message Retry Interval" - }, - "stats_enable": { - "desc": "Enable/disable statistic data collection.", - "label": "Enable/disable statistic data collection" - }, - "fields_authorization_deny_action": { - "desc": "The action when the authorization check rejects an operation.", - "label": "Authorization deny action" - }, - "fields_deflate_opts_server_max_window_bits": { - "desc": "Specifies the size of the compression context for the server.", - "label": "Server compression max window size" - }, - "client_ssl_opts_schema_server_name_indication": { - "desc": "Specify the host name to be used in TLS Server Name Indication extension.
\nFor instance, when connecting to \"server.example.net\", the genuine server\nwhich accepts the connection and performs TLS handshake may differ from the\nhost the TLS client initially connects to, e.g. when connecting to an IP address\nor when the host has multiple resolvable DNS records
\nIf not specified, it will default to the host name string which is used\nto establish the connection, unless it is IP addressed used.
\nThe host name is then also used in the host name verification of the peer\ncertificate.
The special value 'disable' prevents the Server Name\nIndication extension from being sent and disables the hostname\nverification check.", - "label": "Server Name Indication" - }, - "fields_mqtt_quic_listener_retry_memory_limit": { - "desc": "The percentage of available memory usable for handshake connections before stateless retry is used. Calculated as `N/65535`. Default: 65", - "label": "Retry memory limit" - }, - "force_shutdown_max_message_queue_len": { - "desc": "Maximum message queue length.", - "label": "Maximum mailbox queue length of process" - }, - "sys_heartbeat_interval": { - "desc": "Time interval for publishing following heartbeat messages:\n - `$SYS/brokers//uptime`\n - `$SYS/brokers//datetime`" - }, - "flapping_detect_ban_time": { - "desc": "How long the flapping clientid will be banned.", - "label": "Ban Duration" - }, - "sysmon_top_num_items": { - "desc": "The number of top processes per monitoring group", - "label": "Top num items" - }, - "persistent_session_builtin_session_table": { - "desc": "Performance tuning options for built-in session table.", - "label": "Persistent session" - }, - "mqtt_upgrade_qos": { - "desc": "Force upgrade of QoS level according to subscription.", - "label": "Upgrade QoS" - }, - "mqtt_shared_subscription": { - "label": "Allowed Shared Subscription" - }, - "fields_tcp_opts_sndbuf": { - "desc": "The TCP send buffer (OS kernel) for the connections.", - "label": "TCP send buffer" - }, - "sysmon_os_mem_check_interval": { - "desc": "The time interval for the periodic memory check.", - "label": "Mem check interval" - }, - "server_ssl_opts_schema_gc_after_handshake": { - "desc": "Memory usage tuning. If enabled, will immediately perform a garbage collection after the TLS/SSL handshake.", - "label": "Perform GC after handshake" - }, - "fields_mqtt_quic_listener_ssl_options": { - "desc": "TLS options for QUIC transport", - "label": "TLS Options" - }, - "fields_ws_opts_mqtt_piggyback": { - "desc": "Whether a WebSocket message is allowed to contain multiple MQTT packets.", - "label": "MQTT Piggyback" - }, - "base_listener_mountpoint": { - "desc": "When publishing or subscribing, prefix all topics with a mountpoint string.\nThe prefixed string will be removed from the topic name when the message\nis delivered to the subscriber. The mountpoint is a way that users can use\nto implement isolation of message routing between different listeners.\nFor example if a client A subscribes to `t` with `listeners.tcp.\\.mountpoint`\nset to `some_tenant`, then the client actually subscribes to the topic\n`some_tenant/t`. Similarly, if another client B (connected to the same listener\nas the client A) sends a message to topic `t`, the message is routed\nto all the clients subscribed `some_tenant/t`, so client A will receive the\nmessage, with topic name `t`.
\nSet to `\"\"` to disable the feature.
\n\nVariables in mountpoint string:\n - ${'{'}clientid{'}'}: clientid\n - ${'{'}username{'}'}: username", - "label": "mountpoint" - }, - "mqtt_max_awaiting_rel": { - "desc": "Specifies the maximum number of pending QoS 2 messages in each session until either PUBREL is received or timed out. When this limit is reached, new QoS 2 PUBLISH requests will be rejected with error code 147(0x93).", - "label": "Max Awaiting PUBREL" - }, - "ciphers_schema_quic": { - "desc": "This config holds TLS cipher suite names separated by comma,\nor as an array of strings. e.g.\n\"TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256\" or\n[\"TLS_AES_256_GCM_SHA384\",\"TLS_AES_128_GCM_SHA256\"].\n
\nCiphers (and their ordering) define the way in which the\nclient and server encrypts information over the network connection.\nSelecting a good cipher suite is critical for the\napplication's data security, confidentiality and performance.\n\nThe names should be in OpenSSL string format (not RFC format).\nAll default values and examples provided by EMQX config\ndocumentation are all in OpenSSL format.
\n\nNOTE: Certain cipher suites are only compatible with\nspecific TLS versions ('tlsv1.1', 'tlsv1.2' or 'tlsv1.3')\nincompatible cipher suites will be silently dropped.\nFor instance, if only 'tlsv1.3' is given in the versions,\nconfiguring cipher suites for other versions will have no effect.\n
\n\nNOTE: PSK ciphers are suppressed by 'tlsv1.3' version config
\nIf PSK cipher suites are intended, 'tlsv1.3' should be disabled from versions.
\nPSK cipher suites: \"RSA-PSK-AES256-GCM-SHA384,RSA-PSK-AES256-CBC-SHA384,\nRSA-PSK-AES128-GCM-SHA256,RSA-PSK-AES128-CBC-SHA256,\nRSA-PSK-AES256-CBC-SHA,RSA-PSK-AES128-CBC-SHA,\nRSA-PSK-DES-CBC3-SHA,RSA-PSK-RC4-SHA\"
\n\nNOTE: QUIC listener supports only 'tlsv1.3' ciphers", - "label": "" - }, - "fields_mqtt_quic_listener_max_bytes_per_key": { - "desc": "Maximum number of bytes to encrypt with a single 1-RTT encryption key before initiating key update. Default: 274877906944", - "label": "Max bytes per key" - }, - "fields_mqtt_quic_listener_mtu_discovery_search_complete_timeout_us": { - "desc": "The time in microseconds to wait before reattempting MTU probing if max was not reached. Default: 600000000", - "label": "MTU discovery search complete timeout us" - }, - "fields_ws_opts_check_origin_enable": { - "desc": "If true, origin HTTP header will be\n validated against the list of allowed origins configured in check_origins\n parameter.", - "label": "Check origin" - }, - "sysmon_vm_busy_dist_port": { - "desc": "When the RPC connection used to communicate with other nodes in the cluster is overloaded,\nthere will be a busy_dist_port warning log,\nand an MQTT message is published to system topic $SYS/sysmon/busy_dist_port.", - "label": "Enable Busy Distribution Port monitoring" - }, - "mqtt_max_mqueue_len": { - "desc": "Maximum allowed queue length when persistent client are disconnected or inflight window is full.", - "label": "Max Message Queue Length" - }, - "mqtt_max_inflight": { - "desc": "Maximum number of QoS 1 and QoS 2 messages that are allowed to be delivered simultaneously before completing the acknowledgment.", - "label": "Max Inflight" - }, - "persistent_session_store_enabled": { - "desc": "Use the database to store information about persistent sessions.\nThis makes it possible to migrate a client connection to another\ncluster node if a node is stopped.", - "label": "Enable persistent session store" - }, - "fields_deflate_opts_level": { - "desc": "Compression level.", - "label": "Compression level" - }, - "mqtt_server_keepalive": { - "label": "Server Keep Alive" - }, - "global_authentication": { - "desc": "Default authentication configs for all MQTT listeners.\n\nFor per-listener overrides see authentication in listener configs\n\nThis option can be configured with:\n
    \n
  • []: The default value, it allows *ALL* logins
  • \n
  • one: For example {'{'}enable:true,backend:\"built_in_database\",mechanism=\"password_based\"{'}'}
  • \n
  • chain: An array of structs.
  • \n
\n\nWhen a chain is configured, the login credentials are checked against the backends per the configured order, until an 'allow' or 'deny' decision can be made.\n\nIf there is no decision after a full chain exhaustion, the login is rejected." - }, - "fields_mqtt_quic_listener_load_balancing_mode": { - "desc": "0: Disabled, 1: SERVER_ID_IP, 2: SERVER_ID_FIXED. default: 0", - "label": "Load balancing mode" - }, - "persistent_session_store_session_message_gc_interval": { - "desc": "The starting interval for garbage collection of transient data for\npersistent session messages. This does not affect the lifetime length\nof persistent session messages.", - "label": "Session message GC interval" - }, - "server_ssl_opts_schema_ocsp_refresh_http_timeout": { - "desc": "The timeout for the HTTP request when checking OCSP responses.", - "label": "OCSP Refresh HTTP Timeout" - }, - "fields_tcp_opts_send_timeout": { - "desc": "The TCP send timeout for the connections.", - "label": "TCP send timeout" - }, - "sysmon_vm_process_high_watermark": { - "desc": "The threshold, as percentage of processes, for how many\n processes can simultaneously exist at the local node before the corresponding\n alarm is raised.", - "label": "Process high watermark" - }, - "fields_tcp_opts_buffer": { - "desc": "The size of the user-space buffer used by the driver.", - "label": "TCP user-space buffer" - }, - "server_ssl_opts_schema_honor_cipher_order": { - "desc": "An important security setting, it forces the cipher to be set based\n on the server-specified order instead of the client-specified order,\n hence enforcing the (usually more properly configured) security\n ordering of the server administrator.", - "label": "SSL honor cipher order" - }, - "conn_congestion_min_alarm_sustain_duration": { - "desc": "Minimal time before clearing the alarm.
The alarm is cleared only when there's no pending data in
the queue, and at least min_alarm_sustain_durationmilliseconds passed since the last time we considered the connection 'congested'.
This is to avoid clearing and raising the alarm again too often.", - "label": "Sustain duration" - }, - "fields_mqtt_quic_listener_keep_alive_interval_ms": { - "desc": "How often to send PING frames to keep a connection alive.", - "label": "Keep alive interval ms" - }, - "fields_mqtt_quic_listener_handshake_idle_timeout_ms": { - "desc": "How long a handshake can idle before it is discarded", - "label": "Handshake idle timeout ms" - }, - "broker_session_locking_strategy": { - "desc": "Session locking strategy in a cluster.\n - `local`: only lock the session on the current node\n - `one`: select only one remote node to lock the session\n - `quorum`: select some nodes to lock the session\n - `all`: lock the session on all the nodes in the cluster" - }, - "persistent_store_ram_cache": { - "desc": "Maintain a copy of the data in RAM for faster access.", - "label": "RAM cache" - }, - "fields_mqtt_quic_listener_stream_recv_window_default": { - "desc": "Initial stream receive window size. Default: 32678", - "label": "Stream recv window default" - }, - "mqtt_mqueue_priorities": { - "desc": "Topic priorities. Priority number [1-255]. There's no priority table by default, hence all messages are treated equal.
NOTE: Comma and equal signs are not allowed for priority topic names.
NOTE: Messages for topics not in the priority table are treated as either highest or lowest priority depending on the configured value for mqtt.mqueue_default_priority.
Examples:
To configure \"topic/1\" > \"topic/2\":
mqueue_priorities: {'{'}\"topic/1\": 10, \"topic/2\": 8{'}'}", - "label": "Topic Priorities" - }, - "fields_rate_limit_conn_messages_in": { - "desc": "Message limit for the external MQTT connections.", - "label": "connecting messages in" - }, - "fields_rate_limit_max_conn_rate": { - "desc": "Maximum connections per second.", - "label": "Max connection rate" - }, - "alarm_size_limit": { - "desc": "The maximum total number of deactivated alarms to keep as history.
When this limit is exceeded, the oldest deactivated alarms are deleted to cap the total number.", - "label": "Alarm size limit" - }, - "fields_cache_max_size": { - "desc": "Maximum number of cached items.", - "label": "Maximum number of cached items" - }, - "fields_listeners_tcp": { - "desc": "TCP listeners.", - "label": "TCP listeners" - }, - "conn_congestion_enable_alarm": { - "desc": "Enable or disable connection congestion alarm.", - "label": "Enable/disable congestion alarm" - }, - "fields_ws_opts_proxy_port_header": { - "desc": "HTTP header used to pass information about the client port. Relevant when the EMQX cluster is deployed behind a load-balancer.", - "label": "Proxy port header" - }, - "overload_protection_enable": { - "desc": "React on system overload or not.", - "label": "React on system overload or not" - }, - "fields_mqtt_quic_listener_minimum_mtu": { - "desc": "The minimum MTU supported by a connection. This will be used as the starting MTU. Default: 1248", - "label": "Minimum MTU" - }, - "sys_msg_interval": { - "desc": "Time interval of publishing `$SYS` messages." - }, - "mqtt_await_rel_timeout": { - "desc": "Specifies the amount of time to wait for a publish of a QoS 2 message with no PUBREL received. When this limit is reached, EMQX will release the packet ID and also output a warning level log. \nNote: EMQX’s forwarding of the received QoS 2 message is independent from the receiving of PUBREL", - "label": "Max Awaiting PUBREL Timeout" - }, - "common_ssl_opts_schema_verify": { - "desc": "Enable or disable peer verification.", - "label": "Verify peer" - }, - "fields_listeners_ssl": { - "desc": "SSL listeners.", - "label": "SSL listeners" - }, - "fields_deflate_opts_client_max_window_bits": { - "desc": "Specifies the size of the compression context for the client.", - "label": "Client compression max window size" - }, - "common_ssl_opts_schema_keyfile": { - "desc": "PEM format private key file.", - "label": "Keyfile" - }, - "sysmon_os_cpu_high_watermark": { - "desc": "The threshold, as percentage of system CPU load,\n for how much system cpu can be used before the corresponding alarm is raised.", - "label": "CPU high watermark" - }, - "flapping_detect_window_time": { - "desc": "The time window for flapping detection.", - "label": "Window time" - }, - "mqtt_mqueue_default_priority": { - "desc": "Default topic priority, which will be used by topics not in Topic Priorities (mqueue_priorities).", - "label": "Default Topic Priorities" - }, - "client_ssl_opts_schema_enable": { - "desc": "Enable TLS.", - "label": "Enable TLS" - }, - "fields_mqtt_quic_listener_mtu_discovery_missing_probe_count": { - "desc": "The maximum number of stateless operations that may be queued on a binding at any one time. Default: 3", - "label": "MTU discovery missing probe count" - }, - "fields_tcp_opts_recbuf": { - "desc": "The TCP receive buffer (OS kernel) for the connections.", - "label": "TCP receive buffer" - }, - "sysmon_vm_process_check_interval": { - "desc": "The time interval for the periodic process limit check.", - "label": "Process limit check interval" - }, - "fields_mqtt_quic_listener_server_resumption_level": { - "desc": "Controls resumption tickets and/or 0-RTT server support. Default: 0 (No resumption)", - "label": "Server resumption level" - }, - "fields_ws_opts_proxy_address_header": { - "desc": "HTTP header used to pass information about the client IP address.\nRelevant when the EMQX cluster is deployed behind a load-balancer.", - "label": "Proxy address header" - }, - "sysmon_os_sysmem_high_watermark": { - "desc": "The threshold, as percentage of system memory,\n for how much system memory can be allocated before the corresponding alarm is raised.", - "label": "SysMem high wartermark" - }, - "fields_tcp_opts_high_watermark": { - "desc": "The socket is set to a busy state when the amount of data queued internally\nby the VM socket implementation reaches this limit.", - "label": "TCP 高水位线" - }, - "fields_mqtt_quic_listener_stateless_operation_expiration_ms": { - "desc": "The time limit between operations for the same endpoint, in milliseconds. Default: 100", - "label": "Stateless operation expiration ms" - }, - "server_ssl_opts_schema_dhfile": { - "desc": "Path to a file containing PEM-encoded Diffie-Hellman parameters\nto be used by the server if a cipher suite using Diffie-Hellman\nkey exchange is negotiated. If not specified, default parameters\nare used.
\nNOTE: The dhfile option is not supported by TLS 1.3.", - "label": "SSL dhfile" - }, - "flapping_detect_max_count": { - "desc": "The maximum number of disconnects allowed for a MQTT Client in `window_time`", - "label": "Max count" - }, - "mqtt_max_topic_levels": { - "label": "Max Topic Levels" - }, - "force_shutdown_max_heap_size": { - "desc": "Total heap size", - "label": "Total heap size" - }, - "persistent_store_on_disc": { - "desc": "Save information about the persistent sessions on disc.\nIf this option is enabled, persistent sessions will survive full restart of the cluster.\nOtherwise, all the data will be stored in RAM, and it will be lost when all the nodes in the cluster are stopped.", - "label": "Persist on disc" - }, - "mqtt_ignore_loop_deliver": { - "desc": "Whether the messages sent by the MQTT v3.1.1/v3.1.0 client will be forwarded to the client itself, similar to `No Local` in MQTT 5.0.", - "label": "Ignore Loop Deliver" - }, - "common_ssl_opts_schema_certfile": { - "desc": "PEM format certificates chain file.
\nThe certificates in this file should be in reversed order of the certificate\nissue chain. That is, the host's certificate should be placed in the beginning\nof the file, followed by the immediate issuer certificate and so on.\nAlthough the root CA certificate is optional, it should be placed at the end of\nthe file if it is to be added.", - "label": "Certfile" - }, - "mqtt_exclusive_subscription": { - "label": "Allowed Exclusive Subscription" - }, - "mqtt_retain_available": { - "desc": "Whether to enable support for MQTT retained message. When this option is disabled, clients will not be able to publish retained messages.", - "label": "Allowed Retain" - }, - "fields_tcp_opts_reuseaddr": { - "desc": "The SO_REUSEADDR flag for the connections.", - "label": "SO_REUSEADDR" - }, - "sysmon_vm_long_schedule": { - "desc": "When the Erlang VM detect a task scheduled for too long, a warning level 'long_schedule' log is emitted,\nand an MQTT message is published to the system topic $SYS/sysmon/long_schedule.", - "label": "Enable Long Schedule monitoring" - }, - "mqtt_keepalive_multiplier": { - "desc": "`Keep-Alive Timeout = Keep-Alive Interval × Keep-Alive Multiplier`. Default value is 1.5 as per MQTT 5.0.\n\nFor example, a Keep-Alive interval of 10 seconds yields a timeout of 15 seconds with a multiplier of 1.5. Increasing the multiplier value to 2 extends the timeout to 20 seconds.", - "label": "Keep Alive Multiplier" - }, - "force_gc_bytes": { - "desc": "GC the process after specified number of bytes have passed through.", - "label": "Process GC bytes" - }, - "server_ssl_opts_schema_fail_if_no_peer_cert": { - "desc": "Used together with {'{'}verify, verify_peer{'}'} by an TLS/DTLS server.\nIf set to true, the server fails if the client does not have a\ncertificate to send, that is, sends an empty certificate.\nIf set to false, it fails only if the client sends an invalid\ncertificate (an empty certificate is considered valid).", - "label": "Force Verify Peer Certificate" - }, - "fields_ws_opts_compress": { - "desc": "If true, compress WebSocket messages using zlib.
\nThe configuration items under deflate_opts belong to the compression-related parameter configuration.", - "label": "Ws compress" - }, - "fields_mqtt_quic_listener_keep_alive_interval": { - "desc": "How often to send PING frames to keep a connection alive. 0 means disabled.", - "label": "Keep Alive Interval" - }, - "fields_cache_ttl": { - "desc": "Time to live for the cached data.", - "label": "Time to live for the cached data" - }, - "sys_topics": { - "desc": "System topics configuration." - }, - "sys_event_client_subscribed": { - "desc": "Enable to publish event message that client subscribed a topic successfully." - }, - "sysmon_top_db_port": { - "desc": "Port of the PostgreSQL database that collects the data points.", - "label": "DB Port" - }, - "fields_mqtt_quic_listener_max_operations_per_drain": { - "desc": "The maximum number of operations to drain per connection quantum. Default: 16", - "label": "Max operations per drain" - }, - "fields_mqtt_quic_listener_datagram_receive_enabled": { - "desc": "Advertise support for QUIC datagram extension. Reserve for the future. Default 0 (FALSE)", - "label": "Datagram receive enabled" - }, - "fields_mqtt_quic_listener_initial_rtt_ms": { - "desc": "Initial RTT estimate.", - "label": "Initial RTT ms" - }, - "overload_protection_backoff_gc": { - "desc": "When at high load, skip forceful GC.", - "label": "Skip GC" - }, - "broker_perf_route_lock_type": { - "desc": "Performance tuning for subscribing/unsubscribing a wildcard topic.\nChange this parameter only when there are many wildcard topics.\n\nNOTE: when changing from/to `global` lock, it requires all nodes in the cluster to be stopped before the change.\n - `key`: mnesia transactional updates with per-key locks. Recommended for a single-node setup.\n - `tab`: mnesia transactional updates with table lock. Recommended for a cluster setup.\n - `global`: updates are protected with a global lock. Recommended for large clusters." - }, - "fields_tcp_opts_nodelay": { - "desc": "The TCP_NODELAY flag for the connections.", - "label": "TCP_NODELAY" - }, - "sysmon_top_db_username": { - "desc": "Username of the PostgreSQL database", - "label": "DB Username" - }, - "broker": { - "desc": "Message broker options." - }, - "force_gc_count": { - "desc": "GC the process after this many received messages.", - "label": "Process GC messages num" - }, - "mqtt_max_clientid_len": { - "label": "Max Client ID Length" - }, - "fields_ws_opts_supported_subprotocols": { - "desc": "Comma-separated list of supported subprotocols.", - "label": "Supported subprotocols" - }, - "broker_shared_subscription_strategy": { - "desc": "Dispatch strategy for shared subscription.\n - `random`: dispatch the message to a random selected subscriber\n - `round_robin`: select the subscribers in a round-robin manner\n - `round_robin_per_group`: select the subscribers in round-robin fashion within each shared subscriber group\n - `local`: select random local subscriber otherwise select random cluster-wide\n - `sticky`: always use the last selected subscriber to dispatch, until the subscriber disconnects.\n - `hash_clientid`: select the subscribers by hashing the `clientIds` of senders.\n - `hash_topic`: select the subscribers by hashing the source topic" - }, - "fields_deflate_opts_mem_level": { - "desc": "Specifies the size of the compression state.
\nLower values decrease memory usage per connection.", - "label": "Size of the compression state" - }, - "fields_mqtt_quic_listener_send_idle_timeout_ms": { - "desc": "Reset congestion control after being idle for amount of time. Default: 1000", - "label": "Send idle timeout ms" - }, - "base_listener_limiter": { - "desc": "Type of the rate limit.", - "label": "Type of the rate limit" - }, - "persistent_session_store_backend": { - "desc": "Database management system used to store information about persistent sessions and messages.\n- `builtin`: Use the embedded database (mria)", - "label": "Backend" - }, - "alarm_validity_period": { - "desc": "Retention time of deactivated alarms. Alarms are not deleted immediately\nwhen deactivated, but after the retention time.", - "label": "Alarm validity period" - }, - "server_ssl_opts_schema_ocsp_issuer_pem": { - "desc": "PEM-encoded certificate of the OCSP issuer for the server certificate.", - "label": "OCSP Issuer Certificate" - }, - "fields_tcp_opts_active_n": { - "desc": "Specify the {'{'}active, N{'}'} option for this Socket.
\nSee: https://erlang.org/doc/man/inet.html#setopts-2", - "label": "active_n" - }, - "listener_authentication": { - "desc": "Per-listener authentication override.\nAuthentication can be one single authenticator instance or a chain of authenticators as an array.\nWhen authenticating a login (username, client ID, etc.) the authenticators are checked in the configured order.", - "label": "Per-listener authentication override" - }, - "fields_trace_payload_encode": { - "desc": "Determine the format of the payload format in the trace log file.
\n`text`: Text-based protocol or plain text protocol.\n It is recommended when payload is JSON encoded.
\n`hex`: Binary hexadecimal encode. It is recommended when payload is a custom binary protocol.
\n`hidden`: payload is obfuscated as `******`", - "label": "Payload encode" - }, - "mqtt_response_information": { - "desc": "Response Information
UTF-8 string, for creating the response topic, for example, if set to `reqrsp/`, the publisher/subscriber will communite under the topic `reqrsp/`.To disable this feature, input `\"\"` in the text box below.", - "label": "Response Information" - }, - "persistent_session_store_max_retain_undelivered": { - "desc": "The time messages that was not delivered to a persistent session\nis stored before being garbage collected if the node the previous\nsession was handled on restarts of is stopped.", - "label": "Max retain undelivered" - }, - "fields_mqtt_quic_listener_migration_enabled": { - "desc": "Enable clients to migrate IP addresses and tuples. Requires a cooperative load-balancer, or no load-balancer. Default: 1 (Enabled)", - "label": "Migration enabled" - }, - "common_ssl_opts_schema_password": { - "desc": "String containing the user's password. Only used if the private key file is password-protected.", - "label": "Keyfile passphrase" - }, - "common_ssl_opts_schema_hibernate_after": { - "desc": "Hibernate the SSL process after idling for amount of time reducing its memory footprint.", - "label": "hibernate after" - }, - "fields_mqtt_quic_listener_send_buffering_enabled": { - "desc": "Buffer send data instead of holding application buffers until sent data is acknowledged. Default: 1 (Enabled)", - "label": "Send buffering enabled" - }, - "sys_event_client_unsubscribed": { - "desc": "Enable to publish event message that client unsubscribed a topic successfully." - }, - "overload_protection_backoff_new_conn": { - "desc": "When at high load, close new incoming connections.", - "label": "Close new connections" - }, - "server_ssl_opts_schema_ocsp_responder_url": { - "desc": "URL for the OCSP responder to check the server certificate against.", - "label": "OCSP Responder URL" - }, - "mqtt_idle_timeout": { - "desc": "Configure the duration of time that a connection can remain idle (i.e., without any data transfer) before being: \n\n- Automatically disconnected if no CONNECT package is received from the client yet. \n- Put into hibernation mode to save resources if some CONNECT packages are already received.\n\nNote: Please set the parameter with caution as long idle time will lead to resource waste.", - "label": "Idle Timeout" - }, - "fields_mqtt_quic_listener_conn_flow_control_window": { - "desc": "Connection-wide flow control window. Default: 16777216", - "label": "Conn flow control window" - }, - "fields_mqtt_quic_listener_maximum_mtu": { - "desc": "The maximum MTU supported by a connection. This will be the maximum probed value. Default: 1500", - "label": "Maximum MTU" - }, - "sysmon_top_db_name": { - "desc": "PostgreSQL database name", - "label": "DB Name" - }, - "mqtt_strict_mode": { - "desc": "Whether to parse MQTT messages in strict mode.\nIn strict mode, invalid utf8 strings in for example client ID, topic name, etc. will cause the client to be disconnected.", - "label": "Strict Mode" - }, - "shared_subscription_group_strategy": { - "desc": "Per group dispatch strategy for shared subscription.\nThis config is a map from shared subscription group name to the strategy\nname. The group name should be of format `[A-Za-z0-9]`. i.e. no\nspecial characters are allowed." - }, - "fields_deflate_opts_strategy": { - "desc": "Specifies the compression strategy.", - "label": "compression strategy" - }, - "shared_subscription_strategy_enum": { - "desc": "Dispatch strategy for shared subscription.\n- `random`: dispatch the message to a random selected subscriber\n- `round_robin`: select the subscribers in a round-robin manner\n- `round_robin_per_group`: select the subscribers in round-robin fashion within each shared subscriber group\n- `sticky`: always use the last selected subscriber to dispatch,\nuntil the subscriber disconnects.\n- `hash`: select the subscribers by the hash of `clientIds`\n- `local`: send to a random local subscriber. If local\nsubscriber was not found, send to a random subscriber cluster-wide" - }, - "persistent_session_builtin_sess_msg_table": { - "desc": "Performance tuning options for built-in session messages table.", - "label": "Persistent session messages" - }, - "mqtt_mqueue_store_qos0": { - "desc": "Specifies whether to store QoS 0 messages in the message queue while the connection is down but the session remains.", - "label": "Store QoS 0 Message" - }, - "server_ssl_opts_schema_client_renegotiation": { - "desc": "In protocols that support client-initiated renegotiation,\nthe cost of resources of such an operation is higher for the server than the client.\nThis can act as a vector for denial of service attacks.\nThe SSL application already takes measures to counter-act such attempts,\nbut client-initiated renegotiation can be strictly disabled by setting this option to false.\nThe default value is true. Note that disabling renegotiation can result in\nlong-lived connections becoming unusable due to limits on\nthe number of messages the underlying cipher suite can encipher.", - "label": "SSL client renegotiation" - }, - "server_ssl_opts_schema_enable_crl_check": { - "desc": "Whether to enable CRL verification for this listener.", - "label": "Enable CRL Check" - }, - "fields_mqtt_quic_listener_peer_bidi_stream_count": { - "desc": "Number of bidirectional streams to allow the peer to open.", - "label": "Peer bidi stream count" - }, - "fields_mqtt_quic_listener_max_stateless_operations": { - "desc": "The maximum number of stateless operations that may be queued on a worker at any one time. Default: 16", - "label": "Max stateless operations" - }, - "fields_ws_opts_idle_timeout": { - "desc": "Close transport-layer connections from the clients that have not sent MQTT CONNECT message within this interval.", - "label": "WS idle timeout" - }, - "fields_mqtt_quic_listener_max_ack_delay_ms": { - "desc": "How long to wait after receiving data before sending an ACK. Default: 25", - "label": "Max ack delay ms" - }, - "base_listener_zone": { - "desc": "The configuration zone to which the listener belongs.", - "label": "Zone" - }, - "fields_mqtt_quic_listener_handshake_idle_timeout": { - "desc": "How long a handshake can idle before it is discarded.", - "label": "Handshake Idle Timeout" - }, - "force_gc_enable": { - "desc": "Enable forced garbage collection.", - "label": "Enable forced garbage collection" - }, - "fields_ws_opts_allow_origin_absence": { - "desc": "If false and check_origin_enable is\n true, the server will reject requests that don't have origin\n HTTP header.", - "label": "Allow origin absence" - }, - "common_ssl_opts_schema_versions": { - "desc": "All TLS/DTLS versions to be supported.
\nNOTE: PSK ciphers are suppressed by 'tlsv1.3' version config.
\nIn case PSK cipher suites are intended, make sure to configure\n['tlsv1.2', 'tlsv1.1'] here.", - "label": "SSL versions" - }, - "mqtt_listener_proxy_protocol_timeout": { - "desc": "Timeout for proxy protocol. EMQX will close the TCP connection if proxy protocol packet is not received within the timeout.", - "label": "Proxy protocol timeout" - }, - "fields_mqtt_quic_listener_idle_timeout": { - "desc": "How long a connection can go idle before it is gracefully shut down. 0 to disable", - "label": "Idle Timeout" - }, - "common_ssl_opts_schema_secure_renegotiate": { - "desc": "SSL parameter renegotiation is a feature that allows a client and a server\nto renegotiate the parameters of the SSL connection on the fly.\nRFC 5746 defines a more secure way of doing this. By enabling secure renegotiation,\nyou drop support for the insecure renegotiation, prone to MitM attacks.", - "label": "SSL renegotiate" - }, - "sysmon_vm_busy_port": { - "desc": "When a port (e.g. TCP socket) is overloaded, there will be a busy_port warning log,\nand an MQTT message is published to the system topic $SYS/sysmon/busy_port.", - "label": "Enable Busy Port monitoring" - }, - "sys_event_client_connected": { - "desc": "Enable to publish client connected event messages" - }, - "sysmon_vm_process_low_watermark": { - "desc": "The threshold, as percentage of processes, for how many\n processes can simultaneously exist at the local node before the corresponding\n alarm is cleared.", - "label": "Process low watermark" - }, - "mqtt_max_packet_size": { - "desc": "If the size is out of the preset value, EMQX will disconnect the current connection", - "label": "Max Packet Size" - }, - "common_ssl_opts_schema_reuse_sessions": { - "desc": "Enable TLS session reuse.", - "label": "TLS session reuse" - }, - "common_ssl_opts_schema_depth": { - "desc": "Maximum number of non-self-issued intermediate certificates that can follow the peer certificate in a valid certification path.\nSo, if depth is 0 the PEER must be signed by the trusted ROOT-CA directly;
\nif 1 the path can be PEER, Intermediate-CA, ROOT-CA;
\nif 2 the path can be PEER, Intermediate-CA1, Intermediate-CA2, ROOT-CA.", - "label": "CACert Depth" - }, - "sysmon_vm_long_gc": { - "desc": "When an Erlang process spends long time to perform garbage collection, a warning level long_gc log is emitted,\nand an MQTT message is published to the system topic $SYS/sysmon/long_gc.", - "label": "Enable Long GC monitoring" - }, - "fields_mqtt_quic_listener_keyfile": { - "desc": "Path to the secret key file. Will be deprecated in 5.1, use .ssl_options.keyfile instead.", - "label": "Key file" - }, - "mqtt_peer_cert_as_clientid": { - "desc": "Use the CN, DN field in the peer certificate or the entire certificate content as Client ID. Only works for the TLS connection.\nSupported configurations are the following:\n- cn: CN field of the certificate\n- dn: DN field of the certificate\n- crt: DER or PEM certificate\n- pem: Convert DER certificate content to PEM format and use as Client ID\n- md5: MD5 value of the DER or PEM certificate", - "label": "Use Peer Certificate as Client ID" - }, - "persistent_session_store_message_gc_interval": { - "desc": "The starting interval for garbage collection of undelivered messages to\na persistent session. This affects how often the \"max_retain_undelivered\"\nis checked for removal.", - "label": "Message GC interval" - }, - "broker_shared_dispatch_ack_enabled": { - "desc": "Deprecated, will be removed in 5.1.\nEnable/disable shared dispatch acknowledgement for QoS 1 and QoS 2 messages.\nThis should allow messages to be dispatched to a different subscriber in the group in case the picked (based on `shared_subscription_strategy`) subscriber is offline." - }, - "base_listener_enable_authn": { - "desc": "Set true (default) to enable client authentication on this listener, the authentication\nprocess goes through the configured authentication chain.\nWhen set to false to allow any clients with or without authentication information such as username or password to log in.\nWhen set to quick_deny_anonymous, it behaves like when set to true, but clients will be\ndenied immediately without going through any authenticators if username is not provided. This is useful to fence off\nanonymous clients early.", - "label": "Enable authentication" - }, - "force_shutdown_enable": { - "desc": "Enable `force_shutdown` feature.", - "label": "Enable `force_shutdown` feature" - }, - "broker_enable_session_registry": { - "desc": "Enable session registry" - }, - "overload_protection_backoff_delay": { - "desc": "The maximum duration of delay for background task execution during high load conditions.", - "label": "Delay Time" - }, - "ciphers_schema_common": { - "desc": "This config holds TLS cipher suite names separated by comma,\nor as an array of strings. e.g.\n\"TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256\" or\n[\"TLS_AES_256_GCM_SHA384\",\"TLS_AES_128_GCM_SHA256\"].\n
\nCiphers (and their ordering) define the way in which the\nclient and server encrypts information over the network connection.\nSelecting a good cipher suite is critical for the\napplication's data security, confidentiality and performance.\n\nThe names should be in OpenSSL string format (not RFC format).\nAll default values and examples provided by EMQX config\ndocumentation are all in OpenSSL format.
\n\nNOTE: Certain cipher suites are only compatible with\nspecific TLS versions ('tlsv1.1', 'tlsv1.2' or 'tlsv1.3')\nincompatible cipher suites will be silently dropped.\nFor instance, if only 'tlsv1.3' is given in the versions,\nconfiguring cipher suites for other versions will have no effect.\n
\n\nNOTE: PSK ciphers are suppressed by 'tlsv1.3' version config
\nIf PSK cipher suites are intended, 'tlsv1.3' should be disabled from versions.
\nPSK cipher suites: \"RSA-PSK-AES256-GCM-SHA384,RSA-PSK-AES256-CBC-SHA384,\nRSA-PSK-AES128-GCM-SHA256,RSA-PSK-AES128-CBC-SHA256,\nRSA-PSK-AES256-CBC-SHA,RSA-PSK-AES128-CBC-SHA,\nRSA-PSK-DES-CBC3-SHA,RSA-PSK-RC4-SHA\"", - "label": "" - }, - "sys_event_client_disconnected": { - "desc": "Enable to publish client disconnected event messages." - }, - "crl_cache_refresh_interval": { - "desc": "The period to refresh the CRLs from the servers. This is a global setting for all URLs and listeners.", - "label": "CRL Cache Refresh Interval" - }, - "mqtt_listener_proxy_protocol": { - "desc": "Enable the Proxy Protocol V1/2 if the EMQX cluster is deployed behind HAProxy or Nginx.
\nSee: https://www.haproxy.com/blog/haproxy/proxy-protocol/", - "label": "Proxy protocol" - }, - "mqtt_listener_access_rules": { - "desc": "The access control rules for this listener.
See: https://github.com/emqtt/esockd#allowdeny", - "label": "Access rules" - }, - "server_ssl_opts_schema_enable_ocsp_stapling": { - "desc": "Whether to enable Online Certificate Status Protocol (OCSP) stapling for the listener. If set to true, requires defining the OCSP responder URL and issuer PEM path.", - "label": "Enable OCSP Stapling" - }, - "fields_tcp_opts_send_timeout_close": { - "desc": "Close the connection if send timeout.", - "label": "TCP send timeout close" - }, - "sysmon_os_cpu_check_interval": { - "desc": "The time interval for the periodic CPU check.", - "label": "The time interval for the periodic CPU check" - }, - "sysmon_top_sample_interval": { - "desc": "Specifies how often process top should be collected", - "label": "Top sample interval" - }, - "fields_mqtt_quic_listener_idle_timeout_ms": { - "desc": "How long a connection can go idle before it is gracefully shut down. 0 to disable timeout", - "label": "Idle timeout ms" - }, - "fields_ws_opts_fail_if_no_subprotocol": { - "desc": "If true, the server will return an error when\n the client does not carry the Sec-WebSocket-Protocol field.\n
Note: WeChat applet needs to disable this verification.", - "label": "Fail if no subprotocol" - }, - "mqtt_wildcard_subscription": { - "label": "Allowed Wildcard Subscription" - }, - "server_ssl_opts_schema_ocsp_refresh_interval": { - "desc": "The period to refresh the OCSP response for the server.", - "label": "OCSP Refresh Interval" - }, - "overload_protection_backoff_hibernation": { - "desc": "When at high load, skip process hibernation.", - "label": "Skip hibernation" - }, - "fields_ws_opts_max_frame_size": { - "desc": "The maximum length of a single MQTT packet.", - "label": "Max frame size" - }, - "sys_event_messages": { - "desc": "Client events messages." - }, - "broker_perf_trie_compaction": { - "desc": "Enable trie path compaction.\nEnabling it significantly improves wildcard topic subscribe rate, if wildcard topics have unique prefixes like: 'sensor/{'{'}{'{'}id{'}'}{'}'}/+/', where ID is unique per subscriber.\nTopic match performance (when publishing) may degrade if messages are mostly published to topics with large number of levels.\n\nNOTE: This is a cluster-wide configuration. It requires all nodes to be stopped before changing it." - }, - "sysmon_vm_large_heap": { - "desc": "When an Erlang process consumed a large amount of memory for its heap space,\nthe system will write a warning level large_heap log, and an MQTT message is published to\nthe system topic $SYS/sysmon/large_heap.", - "label": "Enable Large Heap monitoring" - }, - "mqtt_shared_subscription_strategy": { - "label": "Shared Subscription Strategy", - "desc": "Dispatch strategy for shared subscription.
- `random`: dispatch the message to a random selected subscriber
- `round_robin`: select the subscribers in a round-robin manner
- `round_robin_per_group`: select the subscribers in round-robin fashion within each shared subscriber group
- `sticky`: always use the last selected subscriber to dispatch, until the subscriber disconnects.
- `local`: select random local subscriber otherwise select random cluster-wide
- `hash_topic`: select the subscribers by hashing the source topic
- `hash_clientid`: select the subscribers by hashing the `clientIds` of senders" - }, - "mqtt_client_attrs_init": { - "label": "Client Attributes", - "desc": "Set custom attributes on client connection and use them in authentication, authorization, and other functions." - }, - "client_attrs_init_set_as_attr": { - "label": "Attribute" - }, - "client_attrs_init_expression": { - "label": "Attribute Expression", - "desc": "A single-line expression that dynamically extracts attribute values from existing client information can use the following fields:

- `clientid`: client ID
- `username`: user name
- `cn`: CN field of TLS certificate
- `dn`: DN field of TLS certificate
- `user_property.*`: extracts the property value from the `User-Property` of the MQTT CONNECT packet, e.g. `user_property.foo`

You can use predefined string functions to dynamically process the information. For example, to extract the prefix of a dot-separated client ID: `nth(1, tokens(clientid, '.'))`; to extract a partial username: `substr(username, 0, 5)`. You can read more about variform expressions in EMQX docs.
" - }, - "mqtt_keepalive_check_interval": { - "label": "Keep Alive Check Interval", - "desc": "The frequency of checking for incoming MQTT packets determines how often the server will check for new MQTT packets.
If a certain amount of time passes without any packets being sent from the client, this time will be added up.
Once the accumulated time exceeds `keepalive-interval * keepalive-multiplier`, the connection will be terminated.
The default is set to 30 seconds, with a minimum value of 1 second and a maximum value of `keepalive-interval / 2`.
" - }, - "mqtt_shared_subscription_initial_sticky_pick": { - "label": "Shared Subscription Initial Sticky Pick", - "desc": "The strategy to use for the initial subscriber pick when `Shared Subscription Strategy` is `sticky`.
- `random`: Randomly select the subscriber;
- `local`: Randomly select a subscriber on the current node, if there are no subscribers on the current node, then randomly select within the cluster;
- `hash_clientid`: Hash the publisher's client ID to select a subscriber;
- `hash_topic`: Hash the publishing topic to select a subscriber." - } - } -} \ No newline at end of file diff --git a/src/schemaText/schema-text-en.ts b/src/schemaText/schema-text-en.ts new file mode 100644 index 000000000..6bc440c38 --- /dev/null +++ b/src/schemaText/schema-text-en.ts @@ -0,0 +1,269 @@ +export default { + /* MQTT START */ + exclusive_subscription: { + label: 'Allowed Exclusive Subscription', + }, + max_topic_alias: { + label: 'Max Topic Alias', + }, + use_username_as_clientid: { + desc: 'Whether to use Username as Client ID.\nThis setting takes effect later than Use Peer Certificate as Username and Use Peer Certificate as Client ID.', + label: 'Use Username as Client ID', + }, + idle_timeout: { + desc: 'Configure the duration of time that a connection can remain idle (i.e., without any data transfer) before being: \n\n- Automatically disconnected if no CONNECT package is received from the client yet. \n- Put into hibernation mode to save resources if some CONNECT packages are already received.\n\nNote: Please set the parameter with caution as long idle time will lead to resource waste.', + label: 'Idle Timeout', + }, + strict_mode: { + desc: 'Whether to parse MQTT messages in strict mode.\nIn strict mode, invalid utf8 strings in for example client ID, topic name, etc. will cause the client to be disconnected.', + label: 'Strict Mode', + }, + shared_subscription: { + label: 'Allowed Shared Subscription', + }, + server_keepalive: { + label: 'Server Keep Alive', + }, + wildcard_subscription: { + label: 'Allowed Wildcard Subscription', + }, + max_clientid_len: { + label: 'Max Client ID Length', + }, + response_information: { + desc: 'Response Information
UTF-8 string, for creating the response topic, for example, if set to `reqrsp/`, the publisher/subscriber will communite under the topic `reqrsp/`.To disable this feature, input `""` in the text box below.', + label: 'Response Information', + }, + shared_subscription_initial_sticky_pick: { + label: 'Shared Subscription Initial Sticky Pick', + desc: "The strategy to use for the initial subscriber pick when `Shared Subscription Strategy` is `sticky`.
- `random`: Randomly select the subscriber;
- `local`: Randomly select a subscriber on the current node, if there are no subscribers on the current node, then randomly select within the cluster;
- `hash_clientid`: Hash the publisher's client ID to select a subscriber;
- `hash_topic`: Hash the publishing topic to select a subscriber.", + }, + peer_cert_as_username: { + desc: 'Use the CN, DN field in the peer certificate or the entire certificate content as Username. Only works for the TLS connection.\nSupported configurations are the following:\n- cn: CN field of the certificate\n- dn: DN field of the certificate\n- crt: Content of the DER or PEM certificate\n- pem: Convert DER certificate content to PEM format and use as Username\n- md5: MD5 value of the DER or PEM certificate', + label: 'Use Peer Certificate as Username', + }, + client_attrs_init: { + label: 'Client Attributes', + desc: "Specify how to initialize client attributes.
Each client attribute can be initialized as `client_attrs.{'{'}NAME{'}'}`,
where `{'{'}NAME{'}'}` is the name of the attribute specified in the config field `set_as_attr`.

The initialized client attribute will be stored in the `client_attrs` property with the specified name,
and can be used as a variable to render a template for mountpoint, authentication and authorization requests.

For example, use `${'{'}client_attrs.tns{'}'}` to render an HTTP POST body when `set_as_attr = tns`,
or render listener config `moutpoint = ${'{'}client_attrs.tns{'}'}/` for topic namespacing.", + }, + client_attrs_init_set_as_attr: { + label: 'Attribute', + }, + client_attrs_init_expression: { + label: 'Attribute Expression', + desc: "A one line expression to evaluate a set of predefined string functions (like in the rule engine SQL statements).
The expression can be a function call with nested calls as its arguments, or direct variable reference.
So far, it does not provide user-defined variable binding (like `var a=1`) or user-defined functions.
As an example, to extract the prefix of client ID delimited by a dot: `nth(1, tokens(clientid, '.'))`.

The variables pre-bound variables are:
- `clientid`: MQTT Client ID.
- `username`: MQTT Client's username.
- `user_property.{'{'}NAME{'}'}`: User properties in the CONNECT packet.
For TLS clients, connected directly or via proxy-protocol (v2) enabled load balancer,
some extra variables can be used:
- `cn`: Client's TLS certificate common name.
- `dn`: Client's TLS certificate distinguished name (the subject).
- `peersni`: TLS server name indication sent by the client.

You can read more about variform expressions in EMQX docs.", + }, + clientid_override: { + label: 'Client ID Override Expression', + desc: "A one line expression to evaluate a set of predefined string functions (like in the rule engine SQL statements).
The expression can be a function call with nested calls as its arguments, or direct variable reference.
So far, it does not provide user-defined variable binding (like `var a=1`) or user-defined functions.
As an example, to extract the prefix of client ID delimited by a dot: `nth(1, tokens(username, '.'))`.

The variables pre-bound variables are:
- `clientid`: The original MQTT Client ID.
- `username`: MQTT Client's username.
- `client_attrs.{'{'}NAME{'}'}`: Client attributes initialized by per config `client_attrs_init`.
For TLS clients, connected directly or via proxy-protocol (v2) enabled load balancer,
some extra variables can be used:
- `cn`: Client's TLS certificate common name.
- `dn`: Client's TLS certificate distinguished name (the subject).
- `peersni`: TLS server name indication sent by the client.

You can read more about variform expressions in EMQX docs.", + }, + retain_available: { + desc: 'Whether to enable support for MQTT retained message. When this option is disabled, clients will not be able to publish retained messages.', + label: 'Allowed Retain', + }, + message_expiry_interval: { + desc: 'The MQTT message expiry interval. For MQTT v5.0 clients, it is only effective if the Message-Expiry-Interval property is not specified for the message; for MQTT v3.1 and v3.1.1, it always applies. Note that it is not helpful to set this value to a greater value than the MQTT Session Expiry Interval, because once the session expires, all related messages are purged.', + label: 'Message Expiry Interval', + }, + ignore_loop_deliver: { + desc: 'Whether the messages sent by the MQTT v3.1.1/v3.1.0 client will be forwarded to the client itself, similar to `No Local` in MQTT 5.0.', + label: 'Ignore Loop Deliver', + }, + max_qos_allowed: { + label: 'Max QoS Allowed', + }, + max_topic_levels: { + label: 'Max Topic Levels', + }, + peer_cert_as_clientid: { + desc: 'Use the CN, DN field in the peer certificate or the entire certificate content as Client ID. Only works for the TLS connection.\nSupported configurations are the following:\n- cn: CN field of the certificate\n- dn: DN field of the certificate\n- crt: DER or PEM certificate\n- pem: Convert DER certificate content to PEM format and use as Client ID\n- md5: MD5 value of the DER or PEM certificate', + label: 'Use Peer Certificate as Client ID', + }, + keepalive_multiplier: { + desc: '`Keep-Alive Timeout = Keep-Alive Interval × Keep-Alive Multiplier`. Default value is 1.5 as per MQTT 5.0.\n\nFor example, a Keep-Alive interval of 10 seconds yields a timeout of 15 seconds with a multiplier of 1.5. Increasing the multiplier value to 2 extends the timeout to 20 seconds.', + label: 'Keep Alive Multiplier', + }, + shared_subscription_strategy: { + label: 'Shared Subscription Strategy', + desc: 'Dispatch strategy for shared subscription.
- `random`: dispatch the message to a random selected subscriber
- `round_robin`: select the subscribers in a round-robin manner
- `round_robin_per_group`: select the subscribers in round-robin fashion within each shared subscriber group
- `sticky`: always use the last selected subscriber to dispatch, until the subscriber disconnects.
- `local`: select random local subscriber otherwise select random cluster-wide
- `hash_topic`: select the subscribers by hashing the source topic
- `hash_clientid`: select the subscribers by hashing the `clientIds` of senders', + }, + keepalive_check_interval: { + label: 'Keep Alive Check Interval', + desc: 'The frequency of checking for incoming MQTT packets determines how often the server will check for new MQTT packets.
If a certain amount of time passes without any packets being sent from the client, this time will be added up.
Once the accumulated time exceeds `keepalive-interval * keepalive-multiplier`, the connection will be terminated.
The default is set to 30 seconds, with a minimum value of 1 second and a maximum value of `keepalive-interval / 2`.
', + }, + max_packet_size: { + desc: 'If the size is out of the preset value, EMQX will disconnect the current connection', + label: 'Max Packet Size', + }, + max_conn_rate: { + desc: 'Used to limit the rate at which EMQX accepts connections. Once the limit is reached, EMQX will pause fetching connections from the accept queue, delaying or rejecting new connections. If empty, it means no limit.\n\nFor example:\n\n- `1000/s` means accepting up to 1000 connections per second.\n- `1000/10s` means accepting up to 1000 connections every 10 seconds.', + label: 'Maximum Connection Rate', + }, + max_conn_burst: { + desc: 'The maximum number of connections that can be accepted in a burst. If empty, it means no limit.\n\nFor example: `10000/60m` means allowing up to 10000 connections in 60 minutes.', + label: 'Maximum Connection Burst', + }, + messages_rate: { + desc: 'Used to limit the number of messages a single client can send to EMQX per second, Once the limit is reached, EMQX will pause reading data from the receive-buffer, thus slowing down or even temporarily hanging the sender.\n\nFor example:\n\n- `500/s` means only 500 messages will be received per second, and the remaining messages will be delayed.\n- `500/10s`: Only 500 messages will be received every 10 seconds and the remaining messages will be delayed.', + label: 'Messages Publish Rate', + }, + messages_burst: { + desc: 'Number of messages that can be sent in a burst. If empty, it means no limit.\n\nFor example: `10000/60m` means allowing up to 10000 messages to be sent in 60 minutes.', + label: 'Messages Publish Burst', + }, + bytes_rate: { + desc: 'Used to limit the number of bytes a single client can send to EMQX per second, Once the limit is reached, EMQX will pause reading data from the receive-buffer, thus slowing down or even temporarily hanging the sender.\n\nThe unit of the bytes could be: B, KB, MB, GB.\n\nFor example:\n\n- `500KB/s` means only 500 kilobytes per second will be received, and the remaining bytes will be delayed.\n- `500MB/10s` means only 500 megabytes will be received every 10 seconds, and the remaining bytes will be delayed.', + label: 'Data Publish Rate', + }, + bytes_burst: { + desc: 'Number of bytes that can be sent in a burst. If empty, it means no limit.\n\nFor example: `100MB/60m` means allowing up to 100 megabytes of data to be sent in 60 minutes.', + label: 'Data Publish Burst', + }, + /* MQTT END */ + /* SESSION START */ + max_subscriptions: { + desc: 'Maximum number of subscriptions allowed per client.', + label: 'Max Subscriptions', + }, + upgrade_qos: { + desc: 'Force upgrade of QoS level according to subscription.', + label: 'Upgrade QoS', + }, + max_inflight: { + desc: 'Maximum number of QoS 1 and QoS 2 messages that are allowed to be delivered simultaneously before completing the acknowledgment.', + label: 'Max Inflight', + }, + retry_interval: { + desc: 'Retry interval for QoS 1/2 message delivering.', + label: 'Message Retry Interval', + }, + max_awaiting_rel: { + desc: 'Specifies the maximum number of pending QoS 2 messages in each session until either PUBREL is received or timed out. When this limit is reached, new QoS 2 PUBLISH requests will be rejected with error code 147(0x93).', + label: 'Max Awaiting PUBREL', + }, + await_rel_timeout: { + desc: 'Specifies the amount of time to wait for a publish of a QoS 2 message with no PUBREL received. When this limit is reached, EMQX will release the packet ID and also output a warning level log. \nNote: EMQX’s forwarding of the received QoS 2 message is independent from the receiving of PUBREL', + label: 'Max Awaiting PUBREL Timeout', + }, + session_expiry_interval: { + desc: 'Specifies how long the session will expire after the connection is disconnected, only for non-MQTT 5.0 connections.', + label: 'Session Expiry Interval', + }, + max_mqueue_len: { + desc: 'Maximum allowed queue length when persistent client are disconnected or inflight window is full.', + label: 'Max Message Queue Length', + }, + mqueue_priorities: { + desc: 'Topic priorities. Priority number [1-255]. There\'s no priority table by default, hence all messages are treated equal.
NOTE: Comma and equal signs are not allowed for priority topic names.
NOTE: Messages for topics not in the priority table are treated as either highest or lowest priority depending on the configured value for mqtt.mqueue_default_priority.
Examples:
To configure "topic/1" > "topic/2":
mqueue_priorities: {\'{\'}"topic/1": 10, "topic/2": 8{\'}\'}', + label: 'Topic Priorities', + }, + mqueue_default_priority: { + desc: 'Default topic priority, which will be used by topics not in Topic Priorities (mqueue_priorities).', + label: 'Default Topic Priorities', + }, + mqueue_store_qos0: { + desc: 'Specifies whether to store QoS 0 messages in the message queue while the connection is down but the session remains.', + label: 'Store QoS 0 Message', + }, + /* SESSION END */ + /* LOG START */ + enable: { + desc: 'Enable this log handler.', + label: 'Enable Log Handler', + }, + level: { + desc: 'The log level for the current log handler.\nDefaults to warning.', + label: 'Log Level', + }, + log_file_default_path: { + desc: 'The path and name of the log file.', + label: 'Log File Name', + }, + payload_encode: { + desc: 'The encoding method of payload in logs', + label: 'Payload Encode', + }, + rotation_count: { + desc: 'Maximum number of log files.', + label: 'Max Log Files Number', + }, + rotation_size: { + desc: 'This parameter controls log file rotation. The value `infinity` means the log file will grow indefinitely, otherwise the log file will be rotated once it reaches `max_size` in bytes.', + label: 'Rotation Size', + }, + time_offset: { + desc: 'The time offset to be used when formatting the timestamp.\nCan be one of:\n - system: the time offset used by the local system\n - utc: the UTC time offset\n - +-[hh]:[mm]: user specified time offset, such as "-02:00" or "+00:00"\nDefaults to: system.', + label: 'Time Offset', + }, + timestamp_format: { + desc: 'Pick a timestamp format:
- auto: automatically choose the best format based on log formatter. epoch for JSON and rfc3339 for text.
- epoch: Unix epoch time in microseconds.
- rfc3339: RFC3339 format.', + label: 'Timestamp Format', + }, + formatter: { + desc: 'Choose log formatter. text for free text, and json for structured logging.', + label: 'Log Formatter', + }, + time_window: { + desc: 'The time window for log throttling ensures that the same type of event is only logged once within the designated time frame to prevent log overflow. A detailed log encapsulating the activities within that period is generated at the end of the time window. The minimum configurable value for this window is one second.
The following events are throttled:
- authorization_permission_denied
- cannot_publish_to_topic_due_to_not_authorized
- cannot_publish_to_topic_due_to_quota_exceeded
- connection_rejected_due_to_license_limit_reached
- dropped_msg_due_to_mqueue_is_full', + label: 'Time Window', + }, + /* LOG END */ + /* ALARM START */ + cpu_check_interval: { + desc: 'The time interval for the periodic CPU check.', + label: 'The time interval for the periodic CPU check', + }, + cpu_high_watermark: { + desc: 'The threshold, as percentage of system CPU load,\n for how much system cpu can be used before the corresponding alarm is raised.', + label: 'CPU high watermark', + }, + cpu_low_watermark: { + desc: 'The threshold, as percentage of system CPU load,\n for how much system cpu can be used before the corresponding alarm is cleared.', + label: 'CPU low watermark', + }, + mem_check_interval: { + desc: 'The time interval for the periodic memory check.', + label: 'Mem check interval', + }, + procmem_high_watermark: { + desc: 'The threshold, as percentage of system memory,\n for how much system memory can be allocated by one Erlang process before\n the corresponding alarm is raised.', + label: 'ProcMem high wartermark', + }, + sysmem_high_watermark: { + desc: 'The threshold, as percentage of system memory,\n for how much system memory can be allocated before the corresponding alarm is raised.', + label: 'SysMem high wartermark', + }, + busy_dist_port: { + desc: 'When the RPC connection used to communicate with other nodes in the cluster is overloaded,\nthere will be a busy_dist_port warning log,\nand an MQTT message is published to system topic $SYS/sysmon/busy_dist_port.', + label: 'Enable Busy Distribution Port monitoring', + }, + busy_port: { + desc: 'When a port (e.g. TCP socket) is overloaded, there will be a busy_port warning log,\nand an MQTT message is published to the system topic $SYS/sysmon/busy_port.', + label: 'Enable Busy Port monitoring', + }, + large_heap: { + desc: 'When the heap memory occupied by a process exceeds the size specified by large_heap, the system will write a warning level large_heap log, and an MQTT message is published to\nthe system topic $SYS/sysmon/large_heap.', + label: 'Enable Large Heap monitoring', + }, + long_gc: { + desc: 'When an Erlang process spends long time to perform garbage collection, a warning level long_gc log is emitted,\nand an MQTT message is published to the system topic $SYS/sysmon/long_gc.', + label: 'Enable Long GC monitoring', + }, + long_schedule: { + desc: "When the Erlang VM detect a task scheduled for too long, a warning level 'long_schedule' log is emitted,\nand an MQTT message is published to the system topic $SYS/sysmon/long_schedule.", + label: 'Enable Long Schedule monitoring', + }, + process_check_interval: { + desc: 'The time interval for the periodic process limit check.', + label: 'Process limit check interval', + }, + process_high_watermark: { + desc: 'The threshold, as percentage of processes, for how many\n processes can simultaneously exist at the local node before the corresponding\n alarm is raised.', + label: 'Process high watermark', + }, + process_low_watermark: { + desc: 'The threshold, as percentage of processes, for how many\n processes can simultaneously exist at the local node before the corresponding\n alarm is cleared.', + label: 'Process low watermark', + }, + /* ALARM END */ +} diff --git a/src/schemaText/schema-text-zh.json b/src/schemaText/schema-text-zh.json deleted file mode 100644 index 92d25f96a..000000000 --- a/src/schemaText/schema-text-zh.json +++ /dev/null @@ -1,1374 +0,0 @@ -{ - "emqx_conf_schema": { - "common_handler_drop_mode_qlen": { - "desc": "当缓冲的日志事件数大于此值时,新的日志事件将被丢弃。起到过载保护的功能。\n为了使过载保护算法正常工作必须要: sync_mode_qlen =< drop_mode_qlen =< flush_qlen 且 drop_mode_qlen > 1\n要禁用某些模式,请执行以下操作。\n- 如果sync_mode_qlen被设置为0,所有的日志事件都被同步处理。也就是说,异步日志被禁用。\n- 如果sync_mode_qlen被设置为与drop_mode_qlen相同的值,同步模式被禁用。也就是说,处理程序总是以异步模式运行,除非调用drop或flushing。\n- 如果drop_mode_qlen被设置为与flush_qlen相同的值,则drop模式被禁用,永远不会发生。", - "label": "进入丢弃模式的队列长度" - }, - "cluster_mcast_addr": { - "desc": "指定多播 IPv4 地址。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。", - "label": "多播地址" - }, - "desc_cluster_dns": { - "desc": "DNS SRV 记录服务发现。", - "label": "DNS SRV 记录服务发现" - }, - "cluster_dns_name": { - "desc": "指定 DNS A 记录的名字。emqx 会通过访问这个 DNS A 记录来获取 IP 地址列表。\n当cluster.discovery_strategydns 时有效。", - "label": "DNS名称" - }, - "rpc_keyfile": { - "desc": "rpc.certfile 的私钥文件的路径。
\n注意:此文件内容是私钥,所以需要设置权限为 600。", - "label": "RPC 私钥文件" - }, - "cluster_mcast_recbuf": { - "desc": "接收数据报的内核级缓冲区的大小。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。", - "label": "多播接收数据缓冲区" - }, - "cluster_autoheal": { - "desc": "集群脑裂自动恢复机制开关。", - "label": "节点脑裂自动修复机制" - }, - "log_overload_kill_enable": { - "desc": "日志处理进程过载时为保护自己节点其它的业务能正常,强制杀死日志处理进程。", - "label": "日志处理进程过载保护" - }, - "node_etc_dir": { - "desc": "etc 存放目录", - "label": "Etc 目录" - }, - "cluster_proto_dist": { - "desc": "分布式 Erlang 集群协议类型。可选值为:
\n- inet_tcp: 使用 IPv4
\n- inet_tls: 使用 TLS,需要配合 etc/ssl_dist.conf 一起使用。", - "label": "集群内部通信协议" - }, - "log_burst_limit_enable": { - "desc": "启用日志限流保护机制。", - "label": "日志限流保护" - }, - "dist_buffer_size": { - "desc": "Erlang分布式缓冲区的繁忙阈值,单位是KB。", - "label": "Erlang分布式缓冲区的繁忙阈值(KB)" - }, - "common_handler_max_depth": { - "desc": "Erlang 内部格式日志格式化和 Erlang 进程消息队列检查的最大深度。", - "label": "最大深度" - }, - "desc_log": { - "desc": "EMQX 日志记录支持日志事件的多个接收器。 每个接收器由一个_log handler_表示,可以独立配置。", - "label": "日志" - }, - "common_handler_flush_qlen": { - "desc": "如果缓冲日志事件的数量增长大于此阈值,则会发生冲刷(删除)操作。 日志处理进程会丢弃缓冲的日志消息。\n来缓解自身不会由于内存瀑涨而影响其它业务进程。日志内容会提醒有多少事件被删除。", - "label": "冲刷阈值" - }, - "common_handler_chars_limit": { - "desc": "设置单个日志消息的最大长度。 如果超过此长度,则日志消息将被截断。最小可设置的长度为100。\n注意:如果日志格式为 JSON,限制字符长度可能会导致截断不完整的 JSON 数据。", - "label": "单条日志长度限制" - }, - "cluster_k8s_namespace": { - "desc": "当使用 k8s 方式并且 cluster.k8s.address_type 指定为 dns 类型时,\n可设置 emqx 节点名的命名空间。与 cluster.k8s.suffix 一起使用用以拼接得到节点名列表。", - "label": "K8s 命名空间" - }, - "node_name": { - "desc": "节点名。格式为 \\{'@'}\\。其中 可以是 IP 地址,也可以是 FQDN。\n详见 http://erlang.org/doc/reference_manual/distributed.html。", - "label": "节点名" - }, - "rpc_port_discovery": { - "desc": "manual: 通过 tcp_server_port 来发现端口。\n
stateless: 使用无状态的方式来发现端口,使用如下算法。如果节点名称是 \nemqxN{'@'}127.0.0.1, N 是一个数字,那么监听端口就是 5370 + N。", - "label": "RPC 端口发现策略" - }, - "log_overload_kill_restart_after": { - "desc": "如果处理进程终止,它会在以指定的时间后后自动重新启动。 `infinity` 不自动重启。", - "label": "处理进程重启机制" - }, - "log_file_handler_rotation_size": { - "desc": "此参数控制日志文件轮换。 `infinity` 意味着日志文件将无限增长,否则日志文件将在达到 `max_size`(以字节为单位)时进行轮换。\n与 rotation count配合使用。如果 counter 为 10,则是10个文件轮换。", - "label": "日志文件轮换大小" - }, - "desc_log_file_handler": { - "desc": "日志处理进程将日志事件打印到文件。", - "label": "文件日志处理进程" - }, - "rpc_socket_keepalive_count": { - "desc": "keepalive 探测消息发送失败的次数,直到 RPC 连接被认为已经断开。", - "label": "RPC Socket Keepalive 次数" - }, - "cluster_etcd_server": { - "desc": "指定 etcd 服务的地址。如有多个服务使用逗号 , 分隔。\n当 cluster.discovery_strategy 为 etcd 时,此配置项才有效。", - "label": "Etcd 服务器地址" - }, - "db_backend": { - "desc": "配置后端数据库驱动,默认值为 rlog 它适用于大规模的集群。\nmnesia 是备选数据库,适合中小集群。", - "label": "内置数据库" - }, - "desc_authorization": { - "desc": "授权相关", - "label": "授权" - }, - "cluster_etcd_ssl": { - "desc": "当使用 TLS 连接 etcd 时的配置选项。\n当 cluster.discovery_strategy 为 etcd 时,此配置项才有效。", - "label": "Etcd SSL 选项" - }, - "rpc_insecure_fallback": { - "desc": "兼容旧的无鉴权模式", - "label": "向后兼容旧的无鉴权模式" - }, - "cluster_mcast_buffer": { - "desc": "用户级缓冲区的大小。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。", - "label": "多播用户级缓冲区" - }, - "rpc_authentication_timeout": { - "desc": "远程节点认证的超时时间。", - "label": "RPC 认证超时时间" - }, - "cluster_call_retry_interval": { - "desc": "当集群间调用出错时,多长时间重试一次。", - "label": "重试时间间隔" - }, - "cluster_mcast_sndbuf": { - "desc": "外发数据报的内核级缓冲区的大小。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。", - "label": "多播发送缓存区" - }, - "rpc_driver": { - "desc": "集群间通信使用的传输协议。", - "label": "RPC 驱动" - }, - "max_ets_tables": { - "desc": "Erlang ETS 表的最大数量", - "label": "Erlang 表的最大数量" - }, - "desc_db": { - "desc": "内置数据库的配置。", - "label": "数据库" - }, - "desc_cluster_etcd": { - "desc": "使用 'etcd' 服务的服务发现。", - "label": "'etcd' 服务的服务发现" - }, - "cluster_name": { - "desc": "EMQX集群名称。每个集群都有一个唯一的名称。服务发现时会用于做路径的一部分。", - "label": "集群名称" - }, - "log_rotation_enable": { - "desc": "启用日志轮换功能。启动后生成日志文件后缀会加上对应的索引数字,比如:log/emqx.log.1。\n系统会默认生成*.siz/*.idx用于记录日志位置,请不要手动修改这两个文件。", - "label": "日志轮换" - }, - "cluster_call_cleanup_interval": { - "desc": "清理过期事务的时间间隔", - "label": "清理间隔" - }, - "desc_cluster_static": { - "desc": "静态节点服务发现。新节点通过连接一个节点来加入集群。", - "label": "静态节点服务发现" - }, - "db_default_shard_transport": { - "desc": "定义用于推送事务日志的默认传输。
\n这可以在 db.shard_transports 中基于每个分片被覆盖。\ngen_rpc 使用 gen_rpc 库,\ndistr 使用 Erlang 发行版。", - "label": "事务日志传输默认协议" - }, - "cluster_static_seeds": { - "desc": "集群中的EMQX节点名称列表,\n指定固定的节点列表,多个节点间使用逗号 , 分隔。\n当 cluster.discovery_strategy 为 static 时,此配置项才有效。\n适合于节点数量较少且固定的集群。", - "label": "集群静态节点" - }, - "log_overload_kill_qlen": { - "desc": "允许的最大队列长度。", - "label": "最大队列长度" - }, - "node_backtrace_depth": { - "desc": "错误信息中打印的最大堆栈层数", - "label": "最大堆栈导数" - }, - "desc_log_burst_limit": { - "desc": "短时间内产生的大量日志事件可能会导致问题,例如:\n - 日志文件变得非常大\n - 日志文件轮换过快,有用信息被覆盖\n - 对系统的整体性能影响\n\n日志突发限制功能可以暂时禁用日志记录以避免这些问题。", - "label": "日志突发限制" - }, - "common_handler_enable": { - "desc": "启用此日志处理进程。", - "label": "启用日志处理进程" - }, - "common_handler_timestamp_format": { - "desc": "选择时间戳格式:
- auto:根据日志的格式自动选择最合适的时间戳格式。对于 JSON 使用 epoch,对于文本则使用 rfc3339
- epoch:表示为自 Unix 纪元起的微秒数。
- rfc3339:遵循 RFC3339 标准的时间格式。", - "label": "时间戳格式" - }, - "cluster_k8s_service_name": { - "desc": "指定 Kubernetes 中 EMQX 的服务名。\n当 cluster.discovery_strategy 为 k8s 时,此配置项才有效。", - "label": "K8s 服务别名" - }, - "common_handler_rotation_count": { - "desc": "轮换的最大日志文件数。", - "label": "最大日志文件数" - }, - "node_cookie": { - "desc": "分布式 Erlang 集群使用的 cookie 值。集群间保持一致", - "label": "节点 Cookie" - }, - "db_role": { - "desc": "选择节点的角色。
\ncore 节点提供数据的持久性,并负责写入。建议将核心节点放置在不同的机架或不同的可用区。
\nrepliant 节点是临时工作节点。 从集群中删除它们,不影响数据库冗余
\n建议复制节点多于核心节点。
\n注意:该参数仅在设置backend时生效到 rlog。", - "label": "数据库角色" - }, - "rpc_tcp_server_port": { - "desc": "RPC 本地服务使用的 TCP 端口。
\n只有当 rpc.port_discovery 设置为 manual 时,此配置才会生效。", - "label": "RPC TCP 服务监听端口" - }, - "desc_console_handler": { - "desc": "日志处理进程将日志事件打印到 EMQX 控制台。", - "label": "Console Handler" - }, - "node_applications": { - "desc": "当新EMQX 加入集群时,应重启的Erlang应用程序的列表。", - "label": "应用" - }, - "log_burst_limit_max_count": { - "desc": "在 `window_time` 间隔内处理的最大日志事件数。 达到限制后,将丢弃连续事件,直到 `window_time` 结束。", - "label": "日志事件数" - }, - "rpc_tcp_client_num": { - "desc": "设置本节点与远程节点之间的 RPC 通信通道的最大数量。", - "label": "RPC TCP 客户端数量" - }, - "cluster_k8s_address_type": { - "desc": "当使用 k8s 方式集群时,address_type 用来从 Kubernetes 接口的应答里获取什么形式的 Host 列表。\n指定 cluster.k8s.address_typeip,则将从 Kubernetes 接口中获取集群中其他节点\n的IP地址。", - "label": "K8s 地址类型" - }, - "rpc_socket_sndbuf": { - "desc": "TCP 调节参数。TCP 发送缓冲区大小。", - "label": "RPC 套接字发送缓冲区大小" - }, - "cluster_mcast_ttl": { - "desc": "指定多播的 Time-To-Live 值。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。", - "label": "多播TTL" - }, - "db_core_nodes": { - "desc": "当前节点连接的核心节点列表。
\n注意:该参数仅在设置backend时生效到 rlog\n并且设置rolereplicant时生效。
\n该值需要在手动或静态集群发现机制下设置。
\n如果使用了自动集群发现机制(如etcd),则不需要设置该值。", - "label": "数据库核心节点" - }, - "log_file_handler_path": { - "desc": "日志文件路径及名字。", - "label": "日志文件名字" - }, - "node_dist_net_ticktime": { - "desc": "系统调优参数,此配置将覆盖 vm.args 文件里的 -kernel net_ticktime 参数。当一个节点持续无响应多久之后,认为其已经宕机并断开连接。", - "label": "节点间心跳间隔" - }, - "desc_cluster_k8s": { - "desc": "Kubernetes 服务发现。", - "label": "Kubernetes 服务发现" - }, - "desc_cluster_mcast": { - "desc": "UDP 组播服务发现。", - "label": "UDP 组播服务发现" - }, - "rpc_cacertfile": { - "desc": "验证 rpc.certfile 的 CA 证书文件的路径。
\n注意:集群中所有节点的证书必须使用同一个 CA 签发。", - "label": "RPC CA 证书文件" - }, - "desc_node": { - "desc": "节点名称、Cookie、配置文件、数据目录和 Erlang 虚拟机(BEAM)启动参数。", - "label": "节点" - }, - "cluster_k8s_apiserver": { - "desc": "指定 Kubernetes API Server。如有多个 Server 使用逗号 , 分隔。\n当 cluster.discovery_strategy 为 k8s 时,此配置项才有效。", - "label": "K8s 服务地址" - }, - "common_handler_supervisor_reports": { - "desc": "Supervisor 报告的类型。默认为 error 类型。
\n - error:仅记录 Erlang 进程中的错误。\n - progress:除了 error 信息外,还需要记录进程启动的详细信息。", - "label": "报告类型" - }, - "node_data_dir": { - "desc": "节点数据存放目录,可能会自动创建的子目录如下:
\n- `mnesia/`。EMQX的内置数据库目录。例如,`mnesia/emqx{'@'}127.0.0.1`。
\n如果节点要被重新命名(例如,`emqx{'@'}10.0.1.1`)。旧目录应该首先被删除。
\n- `configs`。在启动时生成的配置,以及集群/本地覆盖的配置。
\n- `patches`: 热补丁文件将被放在这里。
\n- `trace`: 日志跟踪文件。
\n\n**注意**: 一个数据dir不能被两个或更多的EMQX节点同时使用。", - "label": "节点数据目录" - }, - "cluster_k8s_suffix": { - "desc": "当使用 k8s 方式并且 cluster.k8s.address_type 指定为 dns 类型时,可设置 emqx 节点名的后缀。\n与 cluster.k8s.namespace 一起使用用以拼接得到节点名列表。", - "label": "K8s 前缀" - }, - "db_rpc_module": { - "desc": "集群间推送事务日志到复制节点使用的协议。", - "label": "RPC协议" - }, - "cluster_etcd_prefix": { - "desc": "指定 etcd 路径的前缀。每个节点在 etcd 中都会创建一个路径:\nv2/keys///
\n当 cluster.discovery_strategy 为 etcd 时,此配置项才有效。", - "label": "Etcd 路径前缀" - }, - "cluster_mcast_iface": { - "desc": "指定节点发现服务需要绑定到本地 IP 地址。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。", - "label": "多播绑定地址" - }, - "log_burst_limit_window_time": { - "desc": "参考 max_count。", - "label": "Window Time" - }, - "cluster_dns_record_type": { - "desc": "DNS 记录类型。", - "label": "DNS记录类型" - }, - "cluster_autoclean": { - "desc": "指定多久之后从集群中删除离线节点。", - "label": "自动删除离线节点时间" - }, - "process_limit": { - "desc": "Erlang系统同时存在的最大进程数。\n实际选择的最大值可能比设置的数字大得多。\n参考: https://www.erlang.org/doc/man/erl.html", - "label": "Erlang 最大进程数" - }, - "max_ports": { - "desc": "Erlang系统同时存在的最大端口数。\n实际选择的最大值可能比设置的数字大得多。\n参考: https://www.erlang.org/doc/man/erl.html", - "label": "Erlang 最大端口数" - }, - "desc_log_rotation": { - "desc": "默认情况下,日志存储在 `./log` 目录(用于从 zip 文件安装)或 `/var/log/emqx`(用于二进制安装)。
\n这部分配置,控制每个日志处理进程保留的文件数量。", - "label": "日志轮换" - }, - "desc_log_overload_kill": { - "desc": "日志过载终止,具有过载保护功能。当日志处理进程使用过多内存,或者缓存的日志消息过多时该功能被激活。
\n检测到过载时,日志处理进程将终止,并在冷却期后重新启动。", - "label": "日志过载保护" - }, - "authorization": { - "desc": "授权(ACL)。EMQX 支持完整的客户端访问控制(ACL)。", - "label": "授权" - }, - "rpc_socket_keepalive_idle": { - "desc": "broker 之间的连接在最后一条消息发送后保持打开的时间。", - "label": "RPC Socket Keepalive Idle" - }, - "desc_cluster_call": { - "desc": "集群调用功能的选项。", - "label": "集群调用" - }, - "cluster_mcast_ports": { - "desc": "指定多播端口。如有多个端口使用逗号 , 分隔。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。", - "label": "多播端口" - }, - "log_overload_kill_mem_size": { - "desc": "日志处理进程允许使用的最大内存。", - "label": "日志处理进程允许使用的最大内存" - }, - "rpc_connect_timeout": { - "desc": "建立 RPC 连接的超时时间。", - "label": "RPC 连接超时时间" - }, - "cluster_etcd_node_ttl": { - "desc": "指定 etcd 中节点信息的过期时间。\n当 cluster.discovery_strategy 为 etcd 时,此配置项才有效。", - "label": "Etcd 节点过期时间" - }, - "rpc_call_receive_timeout": { - "desc": "同步 RPC 的回复超时时间。", - "label": "RPC 调用接收超时时间" - }, - "rpc_socket_recbuf": { - "desc": "TCP 调节参数。TCP 接收缓冲区大小。", - "label": "RPC 套接字接收缓冲区大小" - }, - "db_tlog_push_mode": { - "desc": "同步模式下,核心节点等待复制节点的确认信息,然后再发送下一条事务日志。", - "label": "Tlog推送模式" - }, - "node_crash_dump_bytes": { - "desc": "限制崩溃文件的大小,当崩溃时节点内存太大,\n如果为了保存现场,需要全部存到崩溃文件中,此处限制最多能保存多大的文件。\n如果超过此限制,崩溃转储将被截断。如果设置为0,系统不会尝试写入崩溃转储文件。", - "label": "崩溃文件最大容量" - }, - "rpc_certfile": { - "desc": "TLS 证书文件的路径,用于验证集群节点的身份。\n只有当 rpc.driver 设置为 ssl 时,此配置才会生效。", - "label": "RPC 证书文件" - }, - "node_crash_dump_seconds": { - "desc": "该配置给出了运行时系统允许花费的写入崩溃转储的秒数。当给定的秒数已经过去,运行时系统将被终止。
\n- 如果设置为0秒,运行时会立即终止,不会尝试写入崩溃转储文件。
\n- 如果设置为一个正数 S,节点会等待 S 秒来完成崩溃转储文件,然后用SIGALRM信号终止运行时系统。
\n- 如果设置为一个负值导致运行时系统的终止等待无限期地直到崩溃转储文件已经完全写入。", - "label": "保存崩溃文件最长时间" - }, - "log_file_handlers": { - "desc": "输出到文件的日志处理进程列表", - "label": "File Handler" - }, - "node_global_gc_interval": { - "desc": "系统调优参数,设置节点运行多久强制进行一次全局垃圾回收。禁用设置为 disabled。", - "label": "全局垃圾回收" - }, - "common_handler_time_offset": { - "desc": "日志中的时间戳使用的时间偏移量。\n可选值为:\n - system: 本地系统使用的时区偏移量\n - utc: 0 时区的偏移量\n - +-[hh]:[mm]: 自定义偏移量,比如 \"-02:00\" 或者 \"+00:00\"\n默认值为本地系统的时区偏移量:system。", - "label": "时间偏移量" - }, - "rpc_mode": { - "desc": "在 sync 模式下,发送端等待接收端的 ack信号。", - "label": "RPC 模式" - }, - "node_crash_dump_file": { - "desc": "设置 Erlang crash_dump 文件的存储路径和文件名。", - "label": "节点崩溃时的Dump文件" - }, - "cluster_mcast_loop": { - "desc": "设置多播的报文是否投递到本地回环地址。\n当 cluster.discovery_strategy 为 mcast 时,此配置项才有效。", - "label": "多播回环开关" - }, - "rpc_socket_keepalive_interval": { - "desc": "keepalive 消息的间隔。", - "label": "RPC Socket Keepalive 间隔" - }, - "common_handler_level": { - "desc": "当前日志处理进程的日志级别。\n默认为 warning 级别。", - "label": "日志级别" - }, - "desc_rpc": { - "desc": "EMQX 使用 gen_rpc 库来实现跨节点通信。
\n大多数情况下,默认的配置应该可以工作,但如果你需要做一些性能优化或者实验,可以尝试调整这些参数。", - "label": "RPC" - }, - "rpc_ssl_server_port": { - "desc": "RPC 本地服务使用的监听SSL端口。
\n只有当 rpc.port_discovery 设置为 manual 且 dirver 设置为 ssl,\n此配置才会生效。", - "label": "RPC SSL 服务监听端口" - }, - "desc_cluster": { - "desc": "EMQX 节点可以组成一个集群,以提高总容量。
这里指定了节点之间如何连接。", - "label": "集群" - }, - "common_handler_sync_mode_qlen": { - "desc": "只要缓冲的日志事件的数量低于这个值,所有的日志事件都会被异步处理。\n这意味着,日志落地速度不会影响正常的业务进程,因为它们不需要等待日志处理进程的响应。\n如果消息队列的增长超过了这个值,处理程序开始同步处理日志事件。也就是说,发送事件的客户进程必须等待响应。\n当处理程序将消息队列减少到低于sync_mode_qlen阈值的水平时,异步操作就会恢复。\n默认为100条信息,当等待的日志事件大于100条时,就开始同步处理日志。", - "label": "进入同步模式的队列长度" - }, - "common_handler_formatter": { - "desc": "选择日志格式类型。 text 用于纯文本,json 用于结构化日志记录。", - "label": "日志格式类型" - }, - "rpc_async_batch_size": { - "desc": "异步模式下,发送的批量消息的最大数量。", - "label": "异步模式下的批量消息数量" - }, - "cluster_call_max_history": { - "desc": "集群间调用最多保留的历史记录数。只用于排错时查看。", - "label": "最大历史记录" - }, - "cluster_discovery_strategy": { - "desc": "集群节点发现方式。可选值为:\n- manual: 使用 emqx ctl cluster 命令管理集群。
\n- static: 配置静态节点。配置几个固定的节点,新节点通过连接固定节点中的某一个来加入集群。
\n- dns: 使用 DNS A 记录的方式发现节点。
\n- etcd: 使用 etcd 发现节点。
\n- k8s: 使用 Kubernetes API 发现节点。", - "label": "集群服务发现策略" - }, - "rpc_send_timeout": { - "desc": "发送 RPC 请求的超时时间。", - "label": "RPC 发送超时时间" - }, - "common_handler_single_line": { - "desc": "如果设置为 true,则单行打印日志。 否则,日志消息可能跨越多行。", - "label": "单行模式" - }, - "rpc_socket_buffer": { - "desc": "TCP 调节参数。用户模式套接字缓冲区大小。", - "label": "RPC 套接字缓冲区大小" - }, - "db_shard_transports": { - "desc": "允许为每个 shard 下的事务日志复制操作的传输方法进行调优。
\ngen_rpc 使用 gen_rpc 库,\ndistr 使用 Erlang 自带的 rpc 库。
如果未指定,\n默认是使用 db.default_shard_transport 中设置的值。", - "label": "事务日志传输协议" - }, - "common_handler_time_window": { - "desc": "日志节流的时间窗口,在设定的时间窗口内同一事件类型的日志只被记录一次以防止日志泛滥。时间窗口结束时将生成反映该时间段内的日志活动的详细日志。该窗口的最小可设置值为1秒。
支持的事件如下:
- authorization_permission_denied
- cannot_publish_to_topic_due_to_not_authorized
- cannot_publish_to_topic_due_to_quota_exceeded
- connection_rejected_due_to_license_limit_reached
- dropped_msg_due_to_mqueue_is_full", - "label": "时间窗口" - }, - "common_handler_payload_encode": { - "desc": "日志中 Payload 的编码方式。", - "label": "Payload 编码" - } - }, - "emqx_limiter_schema": { - "max_conn_rate": { - "desc": "最大连接速率。
\n这用于限制此节点的连接速率,\n一旦达到限制,新连接将被推迟或拒绝。", - "label": "最大连接速率" - }, - "messages_rate": { - "desc": "消息发布速率。
\n这用于限制该节点的入站消息数量,\n一旦达到限制,受限客户端的消息发布将会减慢甚至暂停一段时间。", - "label": "消息发布速率" - }, - "bytes_rate": { - "desc": "数据发布速率。
\n这用于限制该节点的入站字节速率,\n一旦达到限制,受限客户端的数据发布将会减慢甚至暂停一段时间。", - "label": "数据发布速率" - } - }, - "emqx_schema": { - "fields_mqtt_quic_listener_peer_unidi_stream_count": { - "desc": "允许对端打开的单向流的数量", - "label": "对端单向流的数量" - }, - "fields_authorization_no_match": { - "desc": "如果用户或客户端不匹配ACL规则,或者从可配置授权源(比如内置数据库、HTTP API 或 PostgreSQL 等。)内未找\n到此类用户或客户端时,模式的认访问控制操作。\n在“授权”中查找更多详细信息。", - "label": "未匹时的默认授权动作" - }, - "sysmon_top_db_hostname": { - "desc": "收集数据点的 PostgreSQL 数据库的主机名。", - "label": "数据库主机名" - }, - "zones": { - "desc": "zone 是按name 分组的一组配置。\n对于灵活的配置映射,可以将 name 设置为侦听器的 zone 配置。\n注:名为 default 的内置区域是自动创建的,无法删除。" - }, - "fields_mqtt_quic_listener_certfile": { - "desc": "证书文件。在 5.1 中会被废弃,使用 .ssl_options.certfile 代替。", - "label": "证书文件" - }, - "fields_rate_limit_conn_bytes_in": { - "desc": "限制 MQTT 连接接收数据包的速率。 速率以每秒的数据包字节数计算。", - "label": "数据包速率" - }, - "crl_cache_capacity": { - "desc": "缓存中可容纳的 CRL URL 的最大数量。 如果缓存的容量已满,并且必须获取一个新的 URL,那么它将驱逐缓存中插入的最老的 URL。", - "label": "CRL 缓存容量" - }, - "alarm_actions": { - "desc": "警报激活时触发的动作。
目前,支持以下操作:logpublish.\nlog 将告警写入日志 (控制台或者文件).\npublish 将告警作为 MQTT 消息发布到系统主题:\n$SYS/brokers/emqx{'@'}xx.xx.xx.x/alarms/activate and\n$SYS/brokers/emqx{'@'}xx.xx.xx.x/alarms/deactivate", - "label": "告警动作" - }, - "base_listener_max_connections": { - "desc": "监听器允许的最大并发连接数。", - "label": "最大并发连接数" - }, - "mqtt_peer_cert_as_username": { - "desc": "使用对端证书中的 CN、DN 字段或整个证书内容来作为用户名;仅适用于 TLS 连接。\n目前支持:\n- cn: 取证书的 CN 字段\n- dn: 取证书的 DN 字段\n- crt: 取 DERPEM 的证书内容\n- pem: 将 DER 证书转换为 PEM 格式作为用户名\n- md5: 取 DERPEM 证书内容的 MD5 值", - "label": "使用对端证书作为用户名" - }, - "fields_cache_enable": { - "desc": "启用或禁用授权缓存。", - "label": "启用或禁用授权缓存" - }, - "fields_mqtt_quic_listener_disconnect_timeout_ms": { - "desc": "在判定路径无效和断开连接之前,要等待多长时间的ACK。默认:16000", - "label": "断开连接超时 毫秒" - }, - "mqtt_max_topic_alias": { - "label": "最大主题别名数" - }, - "common_ssl_opts_schema_user_lookup_fun": { - "desc": "用于查找预共享密钥(PSK)标识的 EMQX 内部回调。", - "label": "SSL PSK 用户回调" - }, - "fields_listeners_wss": { - "desc": "HTTPS websocket 监听器。", - "label": "HTTPS websocket 监听器" - }, - "sysmon_top_max_procs": { - "desc": "当 VM 中的进程数超过此值时,停止收集数据。", - "label": "最大进程数" - }, - "mqtt_use_username_as_clientid": { - "desc": "是否使用用户名作为客户端 ID。 作用时间晚于 对端证书作为用户名对端证书作为客户端 ID。", - "label": "使用用户名作为客户端 ID" - }, - "mqtt_max_qos_allowed": { - "label": "最大 QoS" - }, - "fields_mqtt_quic_listener_max_binding_stateless_operations": { - "desc": "在任何时候可以在一个绑定上排队的无状态操作的最大数量。默认值:100", - "label": "最大绑定无状态操作" - }, - "fields_mqtt_quic_listener_stream_recv_buffer_default": { - "desc": "流的初始缓冲区大小。默认:4096", - "label": "流媒体接收缓冲区默认值" - }, - "fields_mqtt_quic_listener_pacing_enabled": { - "desc": "有节奏的发送,以避免路径上的缓冲区过度填充。默认值:1(已启用)", - "label": "启用节奏发送" - }, - "mqtt_max_subscriptions": { - "desc": "允许每个客户端建立的最大订阅数量。", - "label": "最大订阅数量" - }, - "persistent_session_builtin_messages_table": { - "desc": "用于内建消息表的性能调优参数。", - "label": "持久化消息" - }, - "sysmon_os_cpu_low_watermark": { - "desc": "在解除相应警报之前可以使用多少系统 CPU 的阈值,以系统CPU负载的百分比表示。", - "label": "CPU 低水位线" - }, - "fields_mqtt_quic_listener_tls_server_max_send_buffer": { - "desc": "缓冲多少TLS数据。 默认值:8192", - "label": "TLS 服务器最大发送缓冲区" - }, - "base_listener_bind": { - "desc": "监听套接字的 IP 地址和端口。", - "label": "IP 地址和端口" - }, - "server_ssl_opts_schema_handshake_timeout": { - "desc": "握手完成所允许的最长时间", - "label": "握手超时时间" - }, - "fields_deflate_opts_server_context_takeover": { - "desc": "接管意味着在服务器消息之间保留压缩状态。", - "label": "服务上下文接管" - }, - "mqtt_session_expiry_interval": { - "desc": "指定会话将在连接断开后多久过期,仅适用于非 MQTT 5.0 的连接。", - "label": "会话过期间隔" - }, - "mqtt_message_expiry_interval": { - "desc": "MQTT 消息的过期时间间隔。对于 MQTT 5.0 版本的客户端,此设置仅在消息未指定 Message-Expiry-Interval 属性时才会生效。对于 MQTT 3.1 和 3.1.1 版本,此设置始终适用。值得注意的是,将此值设定为大于会话过期间隔是无效的,因为一旦会话过期,所有相关消息都将被清除。", - "label": "消息过期间隔" - }, - "fields_listener_enabled": { - "desc": "启停监听器。", - "label": "启停监听器" - }, - "mqtt": { - "desc": "全局的 MQTT 配置项。\nmqtt 下所有的配置作为全局的默认值存在,它可以被 zone 中的配置覆盖。" - }, - "crl_cache_refresh_http_timeout": { - "desc": "获取 CRLs 时 HTTP 请求的超时。 该配置对所有启用 CRL 检查的监听器监听器有效。", - "label": "CRL 缓存刷新 HTTP 超时" - }, - "fields_tcp_opts_backlog": { - "desc": "TCP backlog 定义了挂起连接队列可以增长到的最大长度。", - "label": "TCP 连接队列长度" - }, - "broker_route_batch_clean": { - "desc": "是否开启批量清除路由。" - }, - "fields_mqtt_quic_listener_initial_window_packets": { - "desc": "一个连接的初始拥堵窗口的大小(以包为单位)。默认值:10", - "label": "初始窗口数据包" - }, - "flapping_detect_enable": { - "desc": "启用抖动检测功能。", - "label": "启用抖动检测" - }, - "sysmon_top_db_password": { - "desc": "PostgreSQL 数据库的密码", - "label": "数据库密码" - }, - "fields_ws_opts_check_origins": { - "desc": "允许的 origins 列表", - "label": "允许的 origins" - }, - "fields_deflate_opts_client_context_takeover": { - "desc": "接管意味着在客户端消息之间保留压缩状态。", - "label": "客户端上下文接管" - }, - "base_listener_acceptors": { - "desc": "监听器接收池的大小。", - "label": "接收器数量" - }, - "common_ssl_opts_schema_cacertfile": { - "desc": "受信任的PEM格式 CA 证书捆绑文件
\n此文件中的证书用于验证TLS对等方的证书。\n如果要信任新 CA,请将新证书附加到文件中。\n无需重启EMQX即可加载更新的文件,因为系统会定期检查文件是否已更新(并重新加载)
\n注意:从文件中失效(删除)证书不会影响已建立的连接。", - "label": "CA 证书文件" - }, - "fields_ws_opts_mqtt_path": { - "desc": "WebSocket 的 MQTT 协议路径。因此,EMQX Broker的WebSocket地址为:\nws://{'{'}ip{'}'}:{'{'}port{'}'}/mqtt", - "label": "WS MQTT 路径" - }, - "sysmon_os_procmem_high_watermark": { - "desc": "在发出相应警报之前,一个Erlang进程可以分配多少系统内存的阈值,以系统内存的百分比表示。", - "label": "进程内存高水位线" - }, - "fields_listeners_quic": { - "desc": "QUIC 监听器。", - "label": "QUIC 监听器" - }, - "fields_listeners_ws": { - "desc": "HTTP websocket 监听器。", - "label": "HTTP websocket 监听器" - }, - "mqtt_retry_interval": { - "desc": "QoS 1/2 消息的重新投递间隔。", - "label": "消息重试间隔" - }, - "stats_enable": { - "desc": "启用/禁用统计数据收集功能。", - "label": "启用/禁用统计数据收集功能" - }, - "fields_authorization_deny_action": { - "desc": "授权检查拒绝操作时的操作。", - "label": "授权检查拒绝操作时的操作" - }, - "fields_deflate_opts_server_max_window_bits": { - "desc": "指定服务器压缩上下文的大小。", - "label": "服务器压缩窗口大小" - }, - "client_ssl_opts_schema_server_name_indication": { - "desc": "指定要在 TLS 服务器名称指示扩展中使用的主机名。
\n例如,当连接到 \"server.example.net\" 时,接受连接并执行 TLS 握手的真正服务器可能与 TLS 客户端最初连接到的主机不同,\n例如,当连接到 IP 地址时,或者当主机具有多个可解析的 DNS 记录时
\n如果未指定,它将默认为使用的主机名字符串\n建立连接,除非使用 IP 地址
\n然后,主机名也用于对等机的主机名验证证书
\n特殊值 disable 阻止发送服务器名称指示扩展,并禁用主机名验证检查。", - "label": "服务器名称指示" - }, - "fields_mqtt_quic_listener_retry_memory_limit": { - "desc": "在使用无状态重试之前,可用于握手连接的可用内存的百分比。计算为`N/65535`。默认值:65", - "label": "重试内存限制" - }, - "force_shutdown_max_message_queue_len": { - "desc": "消息队列的最大长度。", - "label": "进程邮箱消息队列的最大长度" - }, - "sys_heartbeat_interval": { - "desc": "发送心跳系统消息的间隔时间,它包括:\n - `$SYS/brokers//uptime`\n - `$SYS/brokers//datetime`" - }, - "flapping_detect_ban_time": { - "desc": "抖动的客户端将会被禁止登录多长时间。", - "label": "禁止登录时长" - }, - "sysmon_top_num_items": { - "desc": "每个监视组的顶级进程数。", - "label": "顶级进程数" - }, - "persistent_session_builtin_session_table": { - "desc": "用于内建会话表的性能调优参数。", - "label": "持久会话" - }, - "mqtt_upgrade_qos": { - "desc": "投递消息时,是否根据订阅主题时的 QoS 等级来强制提升派发消息的 QoS 等级。", - "label": "升级 QoS" - }, - "mqtt_shared_subscription": { - "label": "允许共享订阅" - }, - "fields_tcp_opts_sndbuf": { - "desc": "连接的 TCP 发送缓冲区(OS 内核)。", - "label": "TCP 发送缓冲区" - }, - "sysmon_os_mem_check_interval": { - "desc": "定期内存检查的时间间隔。", - "label": "内存检查间隔" - }, - "server_ssl_opts_schema_gc_after_handshake": { - "desc": "内存使用调优。如果启用,将在TLS/SSL握手完成后立即执行垃圾回收。TLS/SSL握手建立后立即进行GC。", - "label": "握手后执行GC" - }, - "fields_mqtt_quic_listener_ssl_options": { - "desc": "QUIC 传输层的 TLS 选项", - "label": "TLS 选项" - }, - "fields_ws_opts_mqtt_piggyback": { - "desc": "WebSocket消息是否允许包含多个 MQTT 数据包。", - "label": "MQTT Piggyback" - }, - "base_listener_mountpoint": { - "desc": "发布或订阅时,请在所有主题前面加上 mountpoint 字符串。\n\n将消息传递给订阅者时,将从主题名称中删除带前缀的字符串。挂载点是一种用户可以用来实现不同侦听器之间消息路由隔离的方法。\n\n例如,如果客户机 A 使用 listeners.tcp.\\.mountpoint 设置为'some_tenant',那么客户端实际上订阅了主题'some_tenant/t'。
\n类似地,如果另一个客户端B(与客户端A连接到同一个侦听器)向主题 't' 发送消息,该消息将路由到所有订阅了'some_租户/t'的客户端,因此客户端 A 将接收主题名为't'的消息
\n\n设置为\"\" 以禁用该功能
\n\nmountpoint 字符串中的变量:\n- ${'{'}clientid{'}'}: clientid\n- ${'{'}username{'}'}: username", - "label": "mountpoint" - }, - "mqtt_max_awaiting_rel": { - "desc": "为每个会话指定未收到 PUBREL 且未超时的最大 QoS 2 消息数量。超过限制后,新的 QoS 2 消息发布会被拒绝,并返回 147(0x93) 错误。", - "label": "最大待发 PUBREL 数量" - }, - "ciphers_schema_quic": { - "desc": "此配置保存由逗号分隔的 TLS 密码套件名称,或作为字符串数组。例如\n\"TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256\"或\n[\"TLS_AES_256_GCM_SHA384\",\"TLS_AES_128_GCM_SHA256\"]。\n
\n密码(及其顺序)定义了客户端和服务器通过网络连接加密信息的方式。\n选择一个好的密码套件对于应用程序的数据安全性、机密性和性能至关重要。\n\n名称应为 OpenSSL 字符串格式(而不是 RFC 格式)。\nEMQX 配置文档提供的所有默认值和示例都是 OpenSSL 格式
\n注意:某些密码套件仅与特定的 TLS 版本兼容('tlsv1.1'、'tlsv1.2'或'tlsv1.3')。\n不兼容的密码套件将被自动删除。\n\n例如,如果只有 versions 仅配置为 tlsv1.3。为其他版本配置密码套件将无效。\n\n
\n注:PSK 的 Ciphers 不支持 tlsv1.3
\n如果打算使用PSK密码套件,tlsv1.3。应在ssl.versions中禁用。\n\n
\nPSK 密码套件:\n\"RSA-PSK-AES256-GCM-SHA384,RSA-PSK-AES256-CBC-SHA384,\nRSA-PSK-AES128-GCM-SHA256,RSA-PSK-AES128-CBC-SHA256,\nRSA-PSK-AES256-CBC-SHA,RSA-PSK-AES128-CBC-SHA,\nRSA-PSK-DES-CBC3-SHA,RSA-PSK-RC4-SHA\"
\n\n注:QUIC 监听器不支持 tlsv1.3 的 ciphers", - "label": "" - }, - "fields_mqtt_quic_listener_max_bytes_per_key": { - "desc": "在启动密钥更新之前,用单个 1-RTT 加密密钥加密的最大字节数。默认值:274877906944", - "label": "每个密钥的最大字节数" - }, - "fields_mqtt_quic_listener_mtu_discovery_search_complete_timeout_us": { - "desc": "如果没有达到 max ,在重新尝试 MTU 探测之前要等待的时间,单位是微秒。默认值:600000000", - "label": "" - }, - "fields_ws_opts_check_origin_enable": { - "desc": "如果trueoriginHTTP 头将根据check_origins参数中配置的允许来源列表进行验证。", - "label": "检查 origin" - }, - "sysmon_vm_busy_dist_port": { - "desc": "启用后,当用于集群接点之间 RPC 的连接过忙时,会触发一条带有 busy_dist_port 关键字的 warning 级别日志。\n同时还会发布一条主题为 $SYS/sysmon/busy_dist_port 的 MQTT 系统消息。", - "label": "启用分布式端口过忙监控" - }, - "mqtt_max_mqueue_len": { - "desc": "最大消息队列长度。持久客户端断开连接或飞行窗口已满时,允许排队的的最大消息数量。", - "label": "最大消息队列长度" - }, - "mqtt_max_inflight": { - "desc": "完成应答前,最多允许同时投递的 QoS 1 和 QoS 2 消息数量。", - "label": "最大飞行窗口" - }, - "persistent_session_store_enabled": { - "desc": "使用数据库存储有关持久会话的信息。\n这使得在节点停止时,可以将客户端连接迁移到另一个群集节点。", - "label": "启用持久会话保存" - }, - "fields_deflate_opts_level": { - "desc": "压缩级别", - "label": "压缩级别" - }, - "mqtt_server_keepalive": { - "label": "服务端 Keep Alive" - }, - "global_authentication": { - "desc": "全局 MQTT 监听器的默认认证配置。 为每个监听器配置认证参考监听器器配置中的authentication 配置。\n\n该配置可以被配置为:\n
    \n
  • []: 默认值,允许所有的登录请求\n
  • 配置为单认证器,例如 {'{'}enable:true,backend:\"built_in_database\",mechanism=\"password_based\"{'}'}
  • \n
  • 配置为认证器数组
  • \n
\n\n当配置为认证链后,登录凭证会按照配置的顺序进行检查,直到做出allowdeny的结果。\n\n如果在所有的认证器都执行完后,还是没有结果,登录将被拒绝。" - }, - "fields_mqtt_quic_listener_load_balancing_mode": { - "desc": "0: 禁用, 1: SERVER_ID_IP, 2: SERVER_ID_FIXED. 默认: 0", - "label": "负载平衡模式" - }, - "persistent_session_store_session_message_gc_interval": { - "desc": "持久会话消息的临时数据垃圾收集的开始间隔。\n这不会影响持久会话消息的生命周期长度。", - "label": "会话消息清理间隔" - }, - "server_ssl_opts_schema_ocsp_refresh_http_timeout": { - "desc": "检查 OCSP 响应时,HTTP 请求的超时。", - "label": "OCSP 刷新 HTTP 超时" - }, - "fields_tcp_opts_send_timeout": { - "desc": "连接的 TCP 发送超时。", - "label": "TCP 发送超时" - }, - "sysmon_vm_process_high_watermark": { - "desc": "在发出相应警报之前,本地节点上可以同时存在多少进程的阈值(以进程百分比表示)。", - "label": "进程数高水位线" - }, - "fields_tcp_opts_buffer": { - "desc": "驱动程序使用的用户空间缓冲区的大小。", - "label": "TCP 用户态缓冲区" - }, - "server_ssl_opts_schema_honor_cipher_order": { - "desc": "一个重要的安全设置,它强制根据服务器指定的顺序而不是客户机指定的顺序设置密码,从而强制服务器管理员执行(通常配置得更正确)安全顺序。", - "label": "SSL honor cipher order" - }, - "conn_congestion_min_alarm_sustain_duration": { - "desc": "清除警报前的最短时间。
只有当队列中没有挂起的数据,并且连接至少被堵塞了 min_alarm_sustain_duration 毫秒时,
报警才会被清除。这是为了避免太频繁地清除和再次发出警报。", - "label": "告警维持时间" - }, - "fields_mqtt_quic_listener_keep_alive_interval_ms": { - "desc": "多长时间发送一次PING帧以保活连接。", - "label": "保持活着的时间间隔 毫秒" - }, - "fields_mqtt_quic_listener_handshake_idle_timeout_ms": { - "desc": "一个握手在被丢弃之前可以空闲多长时间", - "label": "握手空闲超时 毫秒" - }, - "broker_session_locking_strategy": { - "desc": "Session 在集群中的锁策略。\n - `loca`:仅锁本节点的 Session;\n - `one`:任选一个其它节点加锁;\n - `quorum`:选择集群中半数以上的节点加锁;\n - `all`:选择所有节点加锁。" - }, - "persistent_store_ram_cache": { - "desc": "在内存中保持一份数据的副本,以便更快地访问。", - "label": "内存缓存" - }, - "fields_mqtt_quic_listener_stream_recv_window_default": { - "desc": "初始流接收窗口大小。 默认值:32678", - "label": "流接收窗口默认" - }, - "mqtt_mqueue_priorities": { - "desc": "主题优先级。优先级数字[1-255]。默认情况下没有优先级表,因此所有消息都被平等对待。
注意:优先级主题名称中不允许使用逗号和等号。
注意:不在优先级表中的主题的消息将根据 mqtt.mqueue_default_priority 的配置值被视为最高优先级或最低优先级。
示例:
要配置 'topic/1' > 'topic/2':
mqueue_priorities: {'{'}\"topic/1\": 10, \"topic/2\": 8{'}'}", - "label": "主题优先级" - }, - "fields_rate_limit_conn_messages_in": { - "desc": "外部 MQTT 连接的消息限制。", - "label": "外部 MQTT 连接的消息限制" - }, - "fields_rate_limit_max_conn_rate": { - "desc": "每秒最大连接数。", - "label": "每秒最大连接数" - }, - "alarm_size_limit": { - "desc": "要保留为历史记录的已停用报警的最大总数。当超过此限制时,将删除最旧的停用报警,以限制总数。", - "label": "告警总数限制" - }, - "fields_cache_max_size": { - "desc": "缓存项的最大数量。", - "label": "缓存项的最大数量" - }, - "fields_listeners_tcp": { - "desc": "TCP 监听器。", - "label": "TCP 监听器" - }, - "conn_congestion_enable_alarm": { - "desc": "启用或者禁用连接阻塞告警功能。", - "label": "启用/禁用阻塞告警" - }, - "fields_ws_opts_proxy_port_header": { - "desc": "HTTP 头,用于传递有关客户端端口的信息。当 EMQX 集群部署在负载平衡器后面时,这一点非常重要。", - "label": "客户端端口头" - }, - "overload_protection_enable": { - "desc": "是否对系统过载做出反应。", - "label": "是否对系统过载做出反应" - }, - "fields_mqtt_quic_listener_minimum_mtu": { - "desc": "一个连接所支持的最小MTU。这将被作为起始MTU使用。默认值:1248", - "label": "最小 MTU" - }, - "sys_msg_interval": { - "desc": "发送 `$SYS` 主题的间隔时间。" - }, - "mqtt_await_rel_timeout": { - "desc": "对于未收到 PUBREL 的 QoS 2 消息,将按照指定时间等待重传;超时后 EMQX 将释放 packet ID 并产生一条告警日志。\n注意:EMQX 对消息的转发操作不依赖于 PUBREL收到与否。", - "label": "最大 PUBREL 等待时长" - }, - "common_ssl_opts_schema_verify": { - "desc": "启用或禁用对等验证。", - "label": "对等验证" - }, - "fields_listeners_ssl": { - "desc": "SSL 监听器。", - "label": "SSL 监听器" - }, - "fields_deflate_opts_client_max_window_bits": { - "desc": "指定客户端压缩上下文的大小。", - "label": "压缩窗口大小" - }, - "common_ssl_opts_schema_keyfile": { - "desc": "PEM格式的私钥文件。", - "label": "私钥文件" - }, - "sysmon_os_cpu_high_watermark": { - "desc": "在发出相应警报之前可以使用多少系统 CPU 的阈值,以系统CPU负载的百分比表示。", - "label": "CPU 高水位线" - }, - "flapping_detect_window_time": { - "desc": "抖动检测的时间窗口。", - "label": "时间窗口" - }, - "mqtt_mqueue_default_priority": { - "desc": "默认的主题优先级,不在 主题优先级mqueue_priorities) 中的主题将会使用该优先级。", - "label": "默认主题优先级" - }, - "client_ssl_opts_schema_enable": { - "desc": "启用 TLS。", - "label": "启用 TLS" - }, - "fields_mqtt_quic_listener_mtu_discovery_missing_probe_count": { - "desc": "在任何时候都可以在一个绑定上排队的无状态操作的最大数量。默认值:3", - "label": "MTU发现丢失的探针数量" - }, - "fields_tcp_opts_recbuf": { - "desc": "连接的 TCP 接收缓冲区(OS 内核)。", - "label": "TCP 接收缓冲区" - }, - "sysmon_vm_process_check_interval": { - "desc": "定期进程限制检查的时间间隔。", - "label": "进程限制检查时间" - }, - "fields_mqtt_quic_listener_server_resumption_level": { - "desc": "连接恢复 和/或 0-RTT 服务器支持。默认值:0(无恢复功能)", - "label": "服务端连接恢复支持" - }, - "fields_ws_opts_proxy_address_header": { - "desc": "HTTP 头,用于传递有关客户端 IP 地址的信息。\n当 EMQX 集群部署在负载平衡器后面时,这一点非常重要。", - "label": "客户端地址头" - }, - "sysmon_os_sysmem_high_watermark": { - "desc": "在发出相应报警之前可以分配多少系统内存的阈值,以系统内存的百分比表示。", - "label": "系统内存高水位线" - }, - "fields_tcp_opts_high_watermark": { - "desc": "当 VM 套接字实现内部排队的数据量达到此限制时,套接字将设置为忙碌状态。", - "label": "" - }, - "fields_mqtt_quic_listener_stateless_operation_expiration_ms": { - "desc": "同一个对端的操作之间的时间限制,单位是毫秒。 默认:100", - "label": "无状态操作过期 毫秒" - }, - "server_ssl_opts_schema_dhfile": { - "desc": "如果协商使用Diffie-Hellman密钥交换的密码套件,则服务器将使用包含PEM编码的Diffie-Hellman参数的文件的路径。如果未指定,则使用默认参数。
\n注意:TLS 1.3不支持dhfile选项。", - "label": "SSL dhfile" - }, - "flapping_detect_max_count": { - "desc": "MQTT 客户端在“窗口”时间内允许的最大断开次数。", - "label": "最大断开次数" - }, - "mqtt_max_topic_levels": { - "label": "最大主题层级" - }, - "force_shutdown_max_heap_size": { - "desc": "Heap 的总大小。", - "label": "Heap 的总大小" - }, - "persistent_store_on_disc": { - "desc": "将持久会话数据保存在磁盘上。如果为 false 则存储在内存中。\n如开启, 持久会话数据可在集群重启后恢复。\n如关闭, 数据仅存储在内存中, 则在整个集群停止后丢失。", - "label": "持久化在磁盘上" - }, - "mqtt_ignore_loop_deliver": { - "desc": "设置由 MQTT v3.1.1/v3.1.0 客户端发布的消息是否将转发给其本身;类似 MQTT 5.0 协议中的 `No Local` 选项。", - "label": "忽略循环投递" - }, - "common_ssl_opts_schema_certfile": { - "desc": "PEM格式证书链文件
\n此文件中的证书应与证书颁发链的顺序相反。也就是说,主机的证书应该放在文件的开头,\n然后是直接颁发者 CA 证书,依此类推,一直到根 CA 证书。\n根 CA 证书是可选的,如果想要添加,应加到文件到最末端。", - "label": "证书文件" - }, - "mqtt_exclusive_subscription": { - "label": "允许排它订阅" - }, - "mqtt_retain_available": { - "desc": "是否启用对 MQTT 保留消息的支持。禁用此选项时,客户端将无法发布保留消息。", - "label": "启用保留消息" - }, - "fields_tcp_opts_reuseaddr": { - "desc": "连接的 SO_REUSEADDR 标识。", - "label": "SO_REUSEADDR" - }, - "sysmon_vm_long_schedule": { - "desc": "启用后,如果 Erlang VM 调度器出现某个任务占用时间过长时,会触发一条带有 'long_schedule' 关键字的日志。\n同时还会发布一条主题为 $SYS/sysmon/long_schedule 的 MQTT 系统消息。", - "label": "启用长调度监控" - }, - "mqtt_keepalive_multiplier": { - "desc": "`Keep-Alive Timeout = Keep-Alive Interval × Keep-Alive Multiplier`,根据 MQTT 5.0,默认值为1.5。\n\n例如,如果 Keep-Alive interval 为 10 秒,那么乘以 1.5 的倍数,将产生 15 秒的超时。将倍数值增加到 2,超时将延长到 20 秒。", - "label": "Keep Alive 倍数" - }, - "force_gc_bytes": { - "desc": "在进程处理过多少个字节之后,对此进程执行垃圾回收。", - "label": "垃圾回收字节数" - }, - "server_ssl_opts_schema_fail_if_no_peer_cert": { - "desc": "TLS/DTLS 服务器与 {'{'}verify,verify_peer{'}'} 一起使用。\n如果设置为true,则如果客户端没有要发送的证书,即发送空证书,服务器将失败。\n如果设置为false,则仅当客户端发送无效证书(空证书被视为有效证书)时才会失败。", - "label": "强制验证对端证书" - }, - "fields_ws_opts_compress": { - "desc": "如果 true,则使用zlib 压缩 WebSocket 消息
\ndeflate_opts 下的配置项属于压缩相关参数配置。", - "label": "Ws 压缩" - }, - "fields_mqtt_quic_listener_keep_alive_interval": { - "desc": "发送 PING 帧的频率,以保活连接. 设为 0 表示禁用。", - "label": "PING 保活频率" - }, - "fields_cache_ttl": { - "desc": "缓存数据的生存时间。", - "label": "缓存数据的生存时间" - }, - "sys_topics": { - "desc": "系统主题配置。" - }, - "sys_event_client_subscribed": { - "desc": "是否开启客户端已成功订阅主题事件消息。" - }, - "sysmon_top_db_port": { - "desc": "收集数据点的 PostgreSQL 数据库的端口。", - "label": "数据库端口" - }, - "fields_mqtt_quic_listener_max_operations_per_drain": { - "desc": "每个连接操作的最大耗费操作数。默认:16", - "label": "每次操作最大操作数" - }, - "fields_mqtt_quic_listener_datagram_receive_enabled": { - "desc": "宣传对QUIC Datagram 扩展的支持。为将来保留。默认为0(FALSE)", - "label": "启用 Datagram 接收" - }, - "fields_mqtt_quic_listener_initial_rtt_ms": { - "desc": "初始RTT估计", - "label": "Initial RTT 毫秒" - }, - "overload_protection_backoff_gc": { - "desc": "高负载时,跳过强制 GC。", - "label": "跳过GC" - }, - "broker_perf_route_lock_type": { - "desc": "通配主题订阅/取消订阅性能调优。\n建议仅当通配符主题较多时才更改此参数。\n\n注:当从/更改为 `global` 锁时,它要求集群中的所有节点在更改之前停止。\n - `key`:为 Mnesia 事务涉及到的每个 key 上锁,建议单节点时使用。\n - `tab`:为 Mnesia 事务涉及到的表上锁,建议在集群中使用。\n - `global`:所以更新操作都被全局的锁保护,仅建议在超大规模集群中使用。" - }, - "fields_tcp_opts_nodelay": { - "desc": "连接的 TCP_NODELAY 标识", - "label": "TCP_NODELAY" - }, - "sysmon_top_db_username": { - "desc": "PostgreSQL 数据库的用户名", - "label": "数据库用户名" - }, - "broker": { - "desc": "Broker 相关配置项。" - }, - "force_gc_count": { - "desc": "在进程收到多少消息之后,对此进程执行垃圾回收。", - "label": "垃圾回收消息数" - }, - "mqtt_max_clientid_len": { - "label": "最大客户端 ID 长度" - }, - "fields_ws_opts_supported_subprotocols": { - "desc": "逗号分隔的 subprotocols 支持列表。", - "label": "Subprotocols 支持列表" - }, - "broker_shared_subscription_strategy": { - "desc": "共享订阅消息派发策略。\n - `random`:随机挑选一个共享订阅者派发;\n - `round_robin`:使用 round-robin 策略派发;\n - `round_robin_per_group`:在共享组内循环选择下一个成员;\n - `local`:选择随机的本地成员,否则选择随机的集群范围内成员;\n - `sticky`:总是使用上次选中的订阅者派发,直到它断开连接;\n - `hash_clientid`:通过对发送者的客户端 ID 进行 Hash 处理来选择订阅者;\n - `hash_topic`:通过对源主题进行 Hash 处理来选择订阅者。" - }, - "fields_deflate_opts_mem_level": { - "desc": "指定压缩状态的大小
\n较低的值会减少每个连接的内存使用。", - "label": "压缩状态大小" - }, - "fields_mqtt_quic_listener_send_idle_timeout_ms": { - "desc": "在闲置一定时间后重置拥堵控制。默认值:1000", - "label": "发送空闲超时毫秒" - }, - "base_listener_limiter": { - "desc": "速率限制类型", - "label": "速率限制类型" - }, - "persistent_session_store_backend": { - "desc": "用于存储持久性会话和信息的数据库管理后端\n- `builtin`: 使用内置的数据库(mria)", - "label": "后端类型" - }, - "alarm_validity_period": { - "desc": "停用报警的保留时间。报警在停用时不会立即删除,而是在保留时间之后删除。", - "label": "告警保留时间" - }, - "server_ssl_opts_schema_ocsp_issuer_pem": { - "desc": "服务器证书的 OCSP 签发者的 PEM 编码证书。", - "label": "OCSP 签发者证书" - }, - "fields_tcp_opts_active_n": { - "desc": "为此套接字指定{'{'}active,N{'}'}选项
\nSee: https://erlang.org/doc/man/inet.html#setopts-2", - "label": "active_n" - }, - "listener_authentication": { - "desc": "监听器认证重载。\n认证配置可以是单个认证器实例,也可以是一个认证器数组组成的认证链。\n执行登录验证时(用户名、客户端 ID 等),将按配置的顺序执行。", - "label": "每个监听器的认证覆盖" - }, - "fields_trace_payload_encode": { - "desc": "确定跟踪日志文件中 Payload 格式。
\n`text`:基于文本的协议或纯文本协议。\n建议在 Payload 为 JSON 编码时使用
\n`hex`:二进制十六进制编码。当 Payload 是自定义二进制协议时,建议使用此选项
\n`hidden`:Payload 被模糊化为 `******`", - "label": "Payload 编码" - }, - "mqtt_response_information": { - "desc": "UTF-8 字符串,用于指定返回给客户端的响应主题,如 `reqrsp/`,此时请求和应答客户端都需要使用 `reqrsp/` 前缀的主题来完成通讯。如希望禁用此功能,请在下方的文字框中输入`\"\"`;仅适用于 MQTT 5.0 客户端。", - "label": "响应信息" - }, - "persistent_session_store_max_retain_undelivered": { - "desc": "如果重新启动时处理上一个会话的节点已停止,则未传递到持久会话的消息在垃圾收集之前会被存储。", - "label": "未投递的消息保留条数" - }, - "fields_mqtt_quic_listener_migration_enabled": { - "desc": "开启客户端地址迁移功能。需要一个支持的负载平衡器,或者没有负载平衡器。默认值:1(已启用)", - "label": "启用地址迁移" - }, - "common_ssl_opts_schema_password": { - "desc": "包含用户密码的字符串。仅在私钥文件受密码保护时使用。", - "label": "密钥文件密码" - }, - "common_ssl_opts_schema_hibernate_after": { - "desc": "在闲置一定时间后休眠 SSL 进程,减少其内存占用。", - "label": "闲置多久后休眠" - }, - "fields_mqtt_quic_listener_send_buffering_enabled": { - "desc": "缓冲发送数据,而不是保留应用缓冲区,直到发送数据被确认。默认值:1(启用)", - "label": "启用发送缓冲功能" - }, - "sys_event_client_unsubscribed": { - "desc": "是否开启客户端已成功取消订阅主题事件消息。" - }, - "overload_protection_backoff_new_conn": { - "desc": "高负载时,拒绝新进来的客户端连接。", - "label": "关闭新连接" - }, - "server_ssl_opts_schema_ocsp_responder_url": { - "desc": "用于检查服务器证书的 OCSP Responder 的 URL。", - "label": "OCSP Responder 的 URL" - }, - "mqtt_idle_timeout": { - "desc": "设置连接被断开或进入休眠状态前的等待时间,空闲超时后\n\n- 如暂未收到客户端的 CONNECT 报文,连接将断开;\n- 如已收到客户端的 CONNECT 报文,连接将进入休眠模式以节省系统资源。\n\n注意:请合理设置该参数值,如等待时间设置过长,可能造成系统资源的浪费。", - "label": "空闲超时" - }, - "fields_mqtt_quic_listener_conn_flow_control_window": { - "desc": "连接的流控窗口。默认:16777216", - "label": "流控窗口" - }, - "fields_mqtt_quic_listener_maximum_mtu": { - "desc": "一个连接所支持的最大MTU。这将是最大的探测值。默认值:1500", - "label": "最大 MTU" - }, - "sysmon_top_db_name": { - "desc": "PostgreSQL 数据库的数据库名", - "label": "数据库名" - }, - "mqtt_strict_mode": { - "desc": "是否以严格模式解析 MQTT 消息。严格模式下,如客户端 ID、主题名称等中包含无效 utf8 字符串,连接将被断开。", - "label": "严格模式" - }, - "shared_subscription_group_strategy": { - "desc": "设置共享订阅组为单位的分发策略。该配置是一个从组名到\n策略名的一个map,组名不得包含 `[A-Za-z0-9]` 之外的特殊字符。" - }, - "fields_deflate_opts_strategy": { - "desc": "指定压缩策略。", - "label": "指定压缩策略" - }, - "shared_subscription_strategy_enum": { - "desc": "共享订阅的分发策略名称。\n- `random`:随机选择一个组内成员;\n- `round_robin`:循环选择下一个成员;\n- `round_robin_per_group`:在共享组内循环选择下一个成员;\n- `sticky`:使用上一次选中的成员;\n- `hash`:根据 ClientID 哈希映射到一个成员;\n- `local`:随机分发到节点本地成成员,如果本地成员不存在,则随机分发到任意一个成员。" - }, - "persistent_session_builtin_sess_msg_table": { - "desc": "优化内置的会话消息表的配置。", - "label": "用于内建会话管理表的性能调优参数" - }, - "mqtt_mqueue_store_qos0": { - "desc": "在连接断开但会话保持期间,是否需要在消息队列中存储 QoS 0 消息。", - "label": "存储 QoS 0 消息" - }, - "server_ssl_opts_schema_client_renegotiation": { - "desc": "在支持客户机发起的重新协商的协议中,这种操作的资源成本对于服务器来说高于客户机。\n这可能会成为拒绝服务攻击的载体。\nSSL 应用程序已经采取措施来反击此类尝试,但通过将此选项设置为 false,可以严格禁用客户端发起的重新协商。\n默认值为 true。请注意,由于基础密码套件可以加密的消息数量有限,禁用重新协商可能会导致长期连接变得不可用。", - "label": "SSL 客户端冲协商" - }, - "server_ssl_opts_schema_enable_crl_check": { - "desc": "是否为该监听器启用 CRL 检查。", - "label": "启用 CRL 检查" - }, - "fields_mqtt_quic_listener_peer_bidi_stream_count": { - "desc": "允许对端打开的双向流的数量", - "label": "对端双向流的数量" - }, - "fields_mqtt_quic_listener_max_stateless_operations": { - "desc": "无状态操作的最大数量,在任何时候都可以在一个工作者上排队。默认值:16", - "label": "最大无状态操作数" - }, - "fields_ws_opts_idle_timeout": { - "desc": "关闭在此间隔内未发送 MQTT CONNECT 消息的客户端的传输层连接。", - "label": "WS 空闲时间" - }, - "fields_mqtt_quic_listener_max_ack_delay_ms": { - "desc": "在收到数据后要等待多长时间才能发送一个ACK。默认值:25", - "label": "最大应答延迟 毫秒" - }, - "base_listener_zone": { - "desc": "监听器所属的配置组。", - "label": "配置组" - }, - "fields_mqtt_quic_listener_handshake_idle_timeout": { - "desc": "一个握手在被丢弃之前可以空闲多长时间。", - "label": "握手空闲超时时间" - }, - "force_gc_enable": { - "desc": "启用强制垃圾回收。", - "label": "启用强制垃圾回收" - }, - "fields_ws_opts_allow_origin_absence": { - "desc": "If false and check_origin_enable is true, the server will reject requests that don't have origin HTTP header.", - "label": "允许 origin 缺失" - }, - "common_ssl_opts_schema_versions": { - "desc": "支持所有TLS/DTLS版本
\n注:PSK 的 Ciphers 无法在 tlsv1.3 中使用,如果打算使用 PSK 密码套件,请确保这里配置为 [\"tlsv1.2\",\"tlsv1.1\"]。", - "label": "SSL 版本" - }, - "mqtt_listener_proxy_protocol_timeout": { - "desc": "代理协议超时。如果在超时时间内未收到代理协议数据包,EMQX将关闭TCP连接。", - "label": "Proxy protocol 超时时间" - }, - "fields_mqtt_quic_listener_idle_timeout": { - "desc": "一个连接在被关闭之前可以空闲多长时间。0表示禁用。", - "label": "空闲超时时间" - }, - "common_ssl_opts_schema_secure_renegotiate": { - "desc": "SSL 参数重新协商是一种允许客户端和服务器动态重新协商 SSL 连接参数的功能。\nRFC 5746 定义了一种更安全的方法。通过启用安全的重新协商,您就失去了对不安全的重新协商的支持,从而容易受到 MitM 攻击。", - "label": "SSL 重新协商" - }, - "sysmon_vm_busy_port": { - "desc": "当一个系统接口(例如 TCP socket)过忙,会触发一条带有 busy_port 关键字的 warning 级别的日志。\n同时还会发布一条主题为 $SYS/sysmon/busy_port 的 MQTT 系统消息。", - "label": "启用端口过忙监控" - }, - "sys_event_client_connected": { - "desc": "是否开启客户端已连接事件消息。" - }, - "sysmon_vm_process_low_watermark": { - "desc": "在清除相应警报之前,本地节点上可以同时存在多少进程的阈值(以进程百分比表示)。", - "label": "进程数低水位线" - }, - "mqtt_max_packet_size": { - "desc": "允许的最大 MQTT 报文大小,超出此大小后将断开当前客户端连接。", - "label": "最大报文大小" - }, - "common_ssl_opts_schema_reuse_sessions": { - "desc": "启用 TLS 会话重用。", - "label": "TLS 会话重用" - }, - "common_ssl_opts_schema_depth": { - "desc": "在有效的证书路径中,可以跟随对等证书的非自颁发中间证书的最大数量。\n因此,如果深度为0,则对等方必须由受信任的根 CA 直接签名;
\n如果是1,路径可以是 PEER、中间 CA、ROOT-CA;
\n如果是2,则路径可以是PEER、中间 CA1、中间 CA2、ROOT-CA。", - "label": "CA 证书深度" - }, - "sysmon_vm_long_gc": { - "desc": "当系统检测到某个 Erlang 进程垃圾回收占用过长时间,会触发一条带有 long_gc 关键字的日志。\n同时还会发布一条主题为 $SYS/sysmon/long_gc 的 MQTT 系统消息。", - "label": "启用长垃圾回收监控" - }, - "fields_mqtt_quic_listener_keyfile": { - "desc": "私钥文件。在 5.1 中会被废弃,使用 .ssl_options.keyfile 代替。", - "label": "私钥文件" - }, - "mqtt_peer_cert_as_clientid": { - "desc": "使用对端证书中的 CN、DN 字段或整个证书内容来作为客户端 ID。仅适用于 TLS 连接;\n目前支持:\n- cn: 取证书的 CN 字段\n- dn: 取证书的 DN 字段\n- crt: 取 DERPEM 证书的内容\n- pem: 将 DER 证书内容转换为 PEM 格式作为客户端 ID\n- md5: 取 DERPEM 证书内容的 MD5 值", - "label": "使用对端证书作为客户端 ID" - }, - "persistent_session_store_message_gc_interval": { - "desc": "将未送达的消息垃圾收集到持久会话的开始间隔。\n这会影响检查 \"max_retain_undelivered\"(最大保留未送达)的删除频率。", - "label": "消息清理间隔" - }, - "broker_shared_dispatch_ack_enabled": { - "desc": "该配置项已废弃,会在 5.1 中移除。\n启用/禁用 QoS 1 和 QoS 2 消息的共享派发确认。\n开启后,允许将消息从未及时回复 ACK 的订阅者 (例如,客户端离线) 重新派发给另外一个订阅者。" - }, - "base_listener_enable_authn": { - "desc": "配置 true (默认值)启用客户端进行身份认证,通过检查认配置的认认证器链来决定是否允许接入。\n配置 false 时,将不对客户端做任何认证,任何客户端,不论是不是携带用户名等认证信息,都可以接入。\n配置 quick_deny_anonymous 时,行为跟 true 类似,但是会对匿名\n客户直接拒绝,不做使用任何认证器对客户端进行身份检查。", - "label": "启用身份认证" - }, - "force_shutdown_enable": { - "desc": "启用 `force_shutdown` 功能。", - "label": "启用 `force_shutdown` 功能" - }, - "broker_enable_session_registry": { - "desc": "是否启用 Session Registry" - }, - "overload_protection_backoff_delay": { - "desc": "高负载时,一些不重要的任务可能会延迟执行,在这里设置允许延迟的时间。", - "label": "延迟时间" - }, - "ciphers_schema_common": { - "desc": "此配置保存由逗号分隔的 TLS 密码套件名称,或作为字符串数组。例如\n\"TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256\"或\n[\"TLS_AES_256_GCM_SHA384\",\"TLS_AES_128_GCM_SHA256\"]。\n
\n密码(及其顺序)定义了客户端和服务器通过网络连接加密信息的方式。\n选择一个好的密码套件对于应用程序的数据安全性、机密性和性能至关重要。\n\n名称应为 OpenSSL 字符串格式(而不是 RFC 格式)。\nEMQX 配置文档提供的所有默认值和示例都是 OpenSSL 格式
\n注意:某些密码套件仅与特定的 TLS 版本兼容('tlsv1.1'、'tlsv1.2'或'tlsv1.3')。\n不兼容的密码套件将被自动删除。\n\n例如,如果只有 versions 仅配置为 tlsv1.3。为其他版本配置密码套件将无效。\n\n
\n注:PSK 的 Ciphers 不支持 tlsv1.3
\n如果打算使用PSK密码套件 tlsv1.3。应在ssl.versions中禁用。\n\n
\nPSK 密码套件:\n\"RSA-PSK-AES256-GCM-SHA384,RSA-PSK-AES256-CBC-SHA384,\nRSA-PSK-AES128-GCM-SHA256,RSA-PSK-AES128-CBC-SHA256,\nRSA-PSK-AES256-CBC-SHA,RSA-PSK-AES128-CBC-SHA,\nRSA-PSK-DES-CBC3-SHA,RSA-PSK-RC4-SHA\"", - "label": "" - }, - "sys_event_client_disconnected": { - "desc": "是否开启客户端已断开连接事件消息。" - }, - "crl_cache_refresh_interval": { - "desc": "从服务器刷新CRL的周期。 该配置对所有 URL 和监听器有效。", - "label": "CRL 缓存刷新间隔" - }, - "mqtt_listener_proxy_protocol": { - "desc": "如果EMQX集群部署在 HAProxy 或 Nginx 之后,请启用代理协议 V1/2
\n详情见: https://www.haproxy.com/blog/haproxy/proxy-protocol/", - "label": "Proxy protocol" - }, - "mqtt_listener_access_rules": { - "desc": "此监听器的访问控制规则。", - "label": "访问控制规则" - }, - "server_ssl_opts_schema_enable_ocsp_stapling": { - "desc": "是否为监听器启用 OCSP Stapling 功能。 如果设置为 true,需要定义 OCSP Responder 的 URL 和证书签发者的 PEM 文件路径。", - "label": "启用 OCSP Stapling" - }, - "fields_tcp_opts_send_timeout_close": { - "desc": "如果发送超时,则关闭连接。", - "label": "TCP 发送超时关闭连接" - }, - "sysmon_os_cpu_check_interval": { - "desc": "定期 CPU 检查的时间间隔。", - "label": "定期 CPU 检查的时间间隔" - }, - "sysmon_top_sample_interval": { - "desc": "指定应收集进程顶部的频率。", - "label": "取样时间" - }, - "fields_mqtt_quic_listener_idle_timeout_ms": { - "desc": "一个连接在被优雅地关闭之前可以空闲多长时间。0 表示禁用超时", - "label": "空闲超时 毫秒" - }, - "fields_ws_opts_fail_if_no_subprotocol": { - "desc": "如果true,当客户端未携带Sec WebSocket Protocol字段时,服务器将返回一个错误。\n
注意:微信小程序需要禁用此验证。", - "label": "无 subprotocol 则失败" - }, - "mqtt_wildcard_subscription": { - "label": "允许通配符订阅" - }, - "server_ssl_opts_schema_ocsp_refresh_interval": { - "desc": "为服务器刷新OCSP响应的周期。", - "label": "OCSP 刷新间隔" - }, - "overload_protection_backoff_hibernation": { - "desc": "高负载时,跳过进程休眠。", - "label": "跳过休眠" - }, - "fields_ws_opts_max_frame_size": { - "desc": "单个 MQTT 数据包的最大长度。", - "label": "最大数据包长度" - }, - "sys_event_messages": { - "desc": "客户端事件消息。" - }, - "broker_perf_trie_compaction": { - "desc": "是否开启主题表压缩存储。\n启用它会显着提高通配符主题订阅率,如果通配符主题具有唯一前缀,例如:'sensor/{'{'}{'{'}id{'}'}{'}'}/+/',其中每个订阅者的 ID 是唯一的。\n如果消息主要发布到具有大量级别的主题,则主题匹配性能(发布时)可能会降低。\n\n注意:这是一个集群范围的配置。 它要求在更改之前停止所有节点。" - }, - "sysmon_vm_large_heap": { - "desc": "启用后,当一个 Erlang 进程申请了大量内存,系统会触发一条带有 large_heap 关键字的\nwarning 级别日志。同时还会发布一条主题为 $SYS/sysmon/busy_dist_port 的 MQTT 系统消息。", - "label": "启用大 heap 监控" - }, - "mqtt_shared_subscription_strategy": { - "label": "共享订阅策略", - "desc": "共享订阅的调度策略。
- `random`:将消息分配给随机选择的订阅者。
- `round_robin`:以循环方式选择订阅者。
- `round_robin_per_group`:在每个共享订阅组内以循环方式选择订阅者。
- `sticky`:始终使用最后选择的订阅者进行调度,直到订阅者断开连接。
- `local`:如果本地订阅者不存在,则选择随机本地订阅者,否则选择随机集群广域订阅者。
- `hash_topic`:通过主题源的哈希值选择订阅者。
- `hash_clientid`:通过对发送者的客户端 ID 进行 Hash 处理来选择订阅者。" - }, - "mqtt_client_attrs_init": { - "label": "客户端属性", - "desc": "在客户端连接时设置自定义属性并将其用于认证、授权等功能中。" - }, - "client_attrs_init_set_as_attr": { - "label": "属性" - }, - "client_attrs_init_expression": { - "label": "属性表达式", - "desc": "一个行表达式,用于从客户端现有信息中动态提取属性值,可以使用以下字段:

- `clientid`:客户端 ID
- `username`:用户名
- `cn`:TLS 证书的 CN 字段
- `dn`:TLS 证书的 DN 字段
- `user_property.*`:从 MQTT CONNECT 数据包的 `User-Property` 中提取属性值,例如 `user_property.foo`

支持使用预定义的字符串函数对信息进行动态处理。例如,要提取由点分隔的客户端 ID 的前缀:`nth(1, tokens(clientid, '.'))`;要截取用户名部分信息:`substr(username, 0, 5)`。您可以在 EMQX 文档中了解有关 variform 表达式的更多信息。
" - }, - "mqtt_keepalive_check_interval": { - "label": "保活检查间隔", - "desc": "检查传入 MQTT 数据包的频率决定了服务器检查新 MQTT 数据包的频率。
如果客户端在一定时间内没有发送任何数据包,这段时间将会累积。
一旦累积时间超过 `keepalive-interval * keepalive-multiplier`,连接将会被终止。
默认值设置为 30 秒,最小值为 1 秒,最大值为 `keepalive-interval / 2`。" - }, - "mqtt_shared_subscription_initial_sticky_pick": { - "label": "共享订阅初始 Sticky 选择策略", - "desc": "当`共享订阅策略`设置为 `sticky` 时,用于初始订阅者选择的策略:
- `random`:随机选择订阅者;
- `local`:随机选择当前节点上的订阅者,如果当前节点上没有订阅者,则在集群内随机选择;
- `hash_clientid`:通过对发布者的客户端ID进行哈希来选择订阅者;
- `hash_topic`:通过对发布主题进行哈希来选择订阅者。" - } - } -} \ No newline at end of file diff --git a/src/schemaText/schema-text-zh.ts b/src/schemaText/schema-text-zh.ts new file mode 100644 index 000000000..ad294f39e --- /dev/null +++ b/src/schemaText/schema-text-zh.ts @@ -0,0 +1,268 @@ +export default { + /* MQTT START */ + exclusive_subscription: { + label: '允许排它订阅', + }, + max_topic_alias: { + label: '最大主题别名数', + }, + use_username_as_clientid: { + desc: '是否使用用户名作为客户端 ID。 作用时间晚于 对端证书作为用户名对端证书作为客户端 ID。', + label: '使用用户名作为客户端 ID', + }, + idle_timeout: { + desc: '设置连接被断开或进入休眠状态前的等待时间,空闲超时后\n\n- 如暂未收到客户端的 CONNECT 报文,连接将断开;\n- 如已收到客户端的 CONNECT 报文,连接将进入休眠模式以节省系统资源。\n\n注意:请合理设置该参数值,如等待时间设置过长,可能造成系统资源的浪费。', + label: '空闲超时', + }, + strict_mode: { + desc: '是否以严格模式解析 MQTT 消息。严格模式下,如客户端 ID、主题名称等中包含无效 utf8 字符串,连接将被断开。', + label: '严格模式', + }, + shared_subscription: { + label: '允许共享订阅', + }, + server_keepalive: { + label: '服务端 Keep Alive', + }, + wildcard_subscription: { + label: '允许通配符订阅', + }, + max_clientid_len: { + label: '最大客户端 ID 长度', + }, + response_information: { + desc: 'UTF-8 字符串,用于指定返回给客户端的响应主题,如 `reqrsp/`,此时请求和应答客户端都需要使用 `reqrsp/` 前缀的主题来完成通讯。如希望禁用此功能,请在下方的文字框中输入`""`;仅适用于 MQTT 5.0 客户端。', + label: '响应信息', + }, + shared_subscription_initial_sticky_pick: { + label: '共享订阅初始 Sticky 选择策略', + desc: '当`共享订阅策略`设置为 `sticky` 时,用于初始订阅者选择的策略:
- `random`:随机选择订阅者;
- `local`:随机选择当前节点上的订阅者,如果当前节点上没有订阅者,则在集群内随机选择;
- `hash_clientid`:通过对发布者的客户端ID进行哈希来选择订阅者;
- `hash_topic`:通过对发布主题进行哈希来选择订阅者。', + }, + peer_cert_as_username: { + desc: '使用对端证书中的 CN、DN 字段或整个证书内容来作为用户名;仅适用于 TLS 连接。\n目前支持:\n- cn: 取证书的 CN 字段\n- dn: 取证书的 DN 字段\n- crt: 取 DERPEM 的证书内容\n- pem: 将 DER 证书转换为 PEM 格式作为用户名\n- md5: 取 DERPEM 证书内容的 MD5 值', + label: '使用对端证书作为用户名', + }, + client_attrs_init: { + label: '客户端属性', + desc: "指定如何初始化客户端属性。
每个客户端属性可以初始化为 `client_attrs.{'{'}NAME{'}'}`,
其中 `{'{'}NAME{'}'}` 是配置字段 `set_as_attr` 中指定的属性名称。

初始化的客户端属性将存储在带有指定名称的 `client_attrs` 属性中,
并可用作渲染挂载点、身份验证和授权请求的模板变量。

例如,当 `set_as_attr = tns` 时,使用 `${'{'}client_attrs.tns{'}'}` 渲染 HTTP POST 正文,
或渲染监听器配置 `moutpoint = ${'{'}client_attrs.tns{'}'}/` 用于主题命名空间。", + }, + client_attrs_init_set_as_attr: { + label: '属性', + }, + client_attrs_init_expression: { + label: '属性表达式', + desc: "使用行表达式计算一组预定义的字符串函数(类似于规则引擎 SQL 语句)。
表达式可以是带有嵌套调用参数的函数调用,或直接引用变量。
目前不提供用户自定义变量绑定(如 `var a=1`)或用户自定义函数。
例如,要提取以点分隔的客户端 ID 前缀:`nth(1, tokens(clientid, '.'))`。

预绑定的变量有:
- `clientid`:MQTT 客户端 ID。
- `username`:MQTT 客户端的用户名。
- `user_property.{'{'}NAME{'}'}`:CONNECT 数据包中的用户属性。
对于 TLS 客户端,直接连接或通过支持代理协议(v2)的负载均衡器连接,
可以使用一些额外的变量:
- `cn`:客户端 TLS 证书的通用名称。
- `dn`:客户端 TLS 证书的可分辨名称(主题)。
- `peersni`:客户端发送的 TLS 服务器名称指示。

您可以在 EMQX 文档中阅读更多关于 variform 表达式的信息。", + }, + clientid_override: { + label: '客户端 ID 重写表达式', + desc: "使用行表达式计算一组预定义的字符串函数(类似于规则引擎 SQL 语句)。
表达式可以是带有嵌套调用参数的函数调用,或直接引用变量。
目前不提供用户自定义变量绑定(如 `var a=1`)或用户自定义函数。
例如,要提取以点分隔的客户端 ID 前缀:`nth(1, tokens(username, '.'))`。

预绑定的变量有:
- `clientid`:原始 MQTT 客户端 ID。
- `username`:MQTT 客户端的用户名。
- `client_attrs.{'{'}NAME{'}'}`:通过每个配置的 `client_attrs_init` 初始化的客户端属性。
对于 TLS 客户端,直接连接或通过支持代理协议(v2)的负载均衡器连接,
可以使用一些额外的变量:
- `cn`:客户端 TLS 证书的通用名称。
- `dn`:客户端 TLS 证书的可分辨名称(主题)。
- `peersni`:客户端发送的 TLS 服务器名称指示。

您可以在 EMQX 文档中阅读更多关于 variform 表达式的信息。", + }, + retain_available: { + desc: '是否启用对 MQTT 保留消息的支持。禁用此选项时,客户端将无法发布保留消息。', + label: '启用保留消息', + }, + message_expiry_interval: { + desc: 'MQTT 消息的过期时间间隔。对于 MQTT 5.0 版本的客户端,此设置仅在消息未指定 Message-Expiry-Interval 属性时才会生效。对于 MQTT 3.1 和 3.1.1 版本,此设置始终适用。值得注意的是,将此值设定为大于会话过期间隔是无效的,因为一旦会话过期,所有相关消息都将被清除。', + label: '消息过期间隔', + }, + ignore_loop_deliver: { + desc: '设置由 MQTT v3.1.1/v3.1.0 客户端发布的消息是否将转发给其本身;类似 MQTT 5.0 协议中的 `No Local` 选项。', + label: '忽略循环投递', + }, + max_qos_allowed: { + label: '最大 QoS', + }, + max_topic_levels: { + label: '最大主题层级', + }, + peer_cert_as_clientid: { + desc: '使用对端证书中的 CN、DN 字段或整个证书内容来作为客户端 ID。仅适用于 TLS 连接;\n目前支持:\n- cn: 取证书的 CN 字段\n- dn: 取证书的 DN 字段\n- crt: 取 DERPEM 证书的内容\n- pem: 将 DER 证书内容转换为 PEM 格式作为客户端 ID\n- md5: 取 DERPEM 证书内容的 MD5 值', + label: '使用对端证书作为客户端 ID', + }, + keepalive_multiplier: { + desc: '`Keep-Alive Timeout = Keep-Alive Interval × Keep-Alive Multiplier`,根据 MQTT 5.0,默认值为1.5。\n\n例如,如果 Keep-Alive interval 为 10 秒,那么乘以 1.5 的倍数,将产生 15 秒的超时。将倍数值增加到 2,超时将延长到 20 秒。', + label: 'Keep Alive 倍数', + }, + shared_subscription_strategy: { + label: '共享订阅策略', + desc: '共享订阅的调度策略。
- `random`:将消息分配给随机选择的订阅者。
- `round_robin`:以循环方式选择订阅者。
- `round_robin_per_group`:在每个共享订阅组内以循环方式选择订阅者。
- `sticky`:始终使用最后选择的订阅者进行调度,直到订阅者断开连接。
- `local`:如果本地订阅者不存在,则选择随机本地订阅者,否则选择随机集群广域订阅者。
- `hash_topic`:通过主题源的哈希值选择订阅者。
- `hash_clientid`:通过对发送者的客户端 ID 进行 Hash 处理来选择订阅者。', + }, + keepalive_check_interval: { + label: '保活检查间隔', + desc: '检查传入 MQTT 数据包的频率决定了服务器检查新 MQTT 数据包的频率。
如果客户端在一定时间内没有发送任何数据包,这段时间将会累积。
一旦累积时间超过 `keepalive-interval * keepalive-multiplier`,连接将会被终止。
默认值设置为 30 秒,最小值为 1 秒,最大值为 `keepalive-interval / 2`。', + }, + max_packet_size: { + desc: '允许的最大 MQTT 报文大小,超出此大小后将断开当前客户端连接。', + label: '最大报文大小', + }, + max_conn_rate: { + desc: '用于限制单节点接受连接的速率,达到限制后,EMQX 将暂停从接受队列中获取连接,延迟或拒绝新的连接;为空时表示不限制。\n\n例如:\n\n- `1000/s` 表示每秒最多接受 1000 个连接。\n- `1000/10s` 表示每 10 秒最多接受 1000 个连接。', + label: '最大连接速率', + }, + max_conn_burst: { + desc: '在突发情况下单节点可以接受的最大连接数量;为空时表示不限制。\n\n例如:`10000/60m` 表示在 60 分钟内,允许接受最多 10000 个连接。', + label: '最大连接突发速率', + }, + messages_rate: { + desc: '用于限制单个客户端每秒可以发送给 EMQX 的消息数量,达到限制后,EMQX 将暂停从接收缓冲区读取数据,降低发送者的速度或暂时挂起发送者;为空时表示不限制。\n\n例如:\n\n- `500/s`:每秒最多接收 500 条消息,其余消息将被延迟。\n- `500/10s`:每 10 秒最多接收 500 条消息,其余消息将被延迟。', + label: '消息发布速率', + }, + messages_burst: { + desc: '在突发情况下单个客户端可以发送的最大消息数量;为空时表示不限制。\n\n例如:`10000/60m` 表示在 60 分钟内,允许发送最多 10000 条消息。', + label: '消息发布突发速率', + }, + bytes_rate: { + desc: '用于限制单个客户端每秒可发送给 EMQX 的字节数,达到限制后,EMQX 将暂停从接收缓冲区读取数据,降低发送者的速度或暂时挂起发送者;为空时表示不限制。\n\n字节的单位可以是:B、KB、MB、GB。\n\n例如:\n\n- `500KB/s`:每秒最多接收 500 千字节,其余字节将被延迟。\n- `500MB/10s`:每 10 秒最多接收 500 兆字节,其余字节将被延迟。', + label: '数据发布速率', + }, + bytes_burst: { + desc: '在突发情况下单个客户端允许发送的最大字节数;为空时表示不限制。\n\n例如:`100MB/60m` 表示在 60 分钟内,允许发送最多 100 兆字节的数据。', + label: '数据发布突发速率', + }, + /* MQTT END */ + /* SESSION START */ + max_subscriptions: { + desc: '允许每个客户端建立的最大订阅数量。', + label: '最大订阅数量', + }, + upgrade_qos: { + desc: '投递消息时,是否根据订阅主题时的 QoS 等级来强制提升派发消息的 QoS 等级。', + label: '升级 QoS', + }, + max_inflight: { + desc: '完成应答前,最多允许同时投递的 QoS 1 和 QoS 2 消息数量。', + label: '最大飞行窗口', + }, + retry_interval: { + desc: 'QoS 1/2 消息的重新投递间隔。', + label: '消息重试间隔', + }, + max_awaiting_rel: { + desc: '为每个会话指定未收到 PUBREL 且未超时的最大 QoS 2 消息数量。超过限制后,新的 QoS 2 消息发布会被拒绝,并返回 147(0x93) 错误。', + label: '最大待发 PUBREL 数量', + }, + await_rel_timeout: { + desc: '对于未收到 PUBREL 的 QoS 2 消息,将按照指定时间等待重传;超时后 EMQX 将释放 packet ID 并产生一条告警日志。\n注意:EMQX 对消息的转发操作不依赖于 PUBREL收到与否。', + label: '最大 PUBREL 等待时长', + }, + session_expiry_interval: { + desc: '指定会话将在连接断开后多久过期,仅适用于非 MQTT 5.0 的连接。', + label: '会话过期间隔', + }, + max_mqueue_len: { + desc: '最大消息队列长度。持久客户端断开连接或飞行窗口已满时,允许排队的的最大消息数量。', + label: '最大消息队列长度', + }, + mqueue_priorities: { + desc: "主题优先级。优先级数字[1-255]。默认情况下没有优先级表,因此所有消息都被平等对待。
注意:优先级主题名称中不允许使用逗号和等号。
注意:不在优先级表中的主题的消息将根据 mqtt.mqueue_default_priority 的配置值被视为最高优先级或最低优先级。
示例:
要配置 'topic/1' > 'topic/2':
mqueue_priorities: {'{'}\"topic/1\": 10, \"topic/2\": 8{'}'}", + label: '主题优先级', + }, + mqueue_default_priority: { + desc: '默认的主题优先级,不在 主题优先级mqueue_priorities) 中的主题将会使用该优先级。', + label: '默认主题优先级', + }, + mqueue_store_qos0: { + desc: '在连接断开但会话保持期间,是否需要在消息队列中存储 QoS 0 消息。', + label: '存储 QoS 0 消息', + }, + /* SESSION END */ + /* LOG START */ + enable: { + desc: '启用此日志处理进程。', + label: '启用日志处理进程', + }, + level: { + desc: '当前日志处理进程的日志级别。\n默认为 warning 级别。', + label: '日志级别', + }, + log_file_default_path: { + desc: '日志文件路径及名字。', + label: '日志文件名字', + }, + payload_encode: { + desc: '日志中 Payload 的编码方式。', + label: 'Payload 编码', + }, + rotation_count: { + desc: '轮换的最大日志文件数。', + label: '最大日志文件数', + }, + rotation_size: { + desc: '此参数控制日志文件轮换。 `infinity` 意味着日志文件将无限增长,否则日志文件将在达到 `max_size`(以字节为单位)时进行轮换。\n与 rotation count配合使用。如果 counter 为 10,则是10个文件轮换。', + label: '日志文件轮换大小', + }, + time_offset: { + desc: '日志中的时间戳使用的时间偏移量。\n可选值为:\n - system: 本地系统使用的时区偏移量\n - utc: 0 时区的偏移量\n - +-[hh]:[mm]: 自定义偏移量,比如 "-02:00" 或者 "+00:00"\n默认值为本地系统的时区偏移量:system。', + label: '时间偏移量', + }, + timestamp_format: { + desc: '选择时间戳格式:
- auto:根据日志的格式自动选择最合适的时间戳格式。对于 JSON 使用 epoch,对于文本则使用 rfc3339
- epoch:表示为自 Unix 纪元起的微秒数。
- rfc3339:遵循 RFC3339 标准的时间格式。', + label: '时间戳格式', + }, + formatter: { + desc: '选择日志格式类型。 text 用于纯文本,json 用于结构化日志记录。', + label: '日志格式类型', + }, + time_window: { + desc: '日志节流的时间窗口,在设定的时间窗口内同一事件类型的日志只被记录一次以防止日志泛滥。时间窗口结束时将生成反映该时间段内的日志活动的详细日志。该窗口的最小可设置值为1秒。
支持的事件如下:
- authorization_permission_denied
- cannot_publish_to_topic_due_to_not_authorized
- cannot_publish_to_topic_due_to_quota_exceeded
- connection_rejected_due_to_license_limit_reached
- dropped_msg_due_to_mqueue_is_full', + label: '时间窗口', + }, + /* LOG END */ + /* ALARM START */ + cpu_check_interval: { + desc: '定期 CPU 检查的时间间隔。', + label: '定期 CPU 检查的时间间隔', + }, + cpu_high_watermark: { + desc: '在发出相应警报之前可以使用多少系统 CPU 的阈值,以系统CPU负载的百分比表示。', + label: 'CPU 高水位线', + }, + cpu_low_watermark: { + desc: '在解除相应警报之前可以使用多少系统 CPU 的阈值,以系统CPU负载的百分比表示。', + label: 'CPU 低水位线', + }, + mem_check_interval: { + desc: '定期内存检查的时间间隔。', + label: '内存检查间隔', + }, + procmem_high_watermark: { + desc: '在发出相应警报之前,一个Erlang进程可以分配多少系统内存的阈值,以系统内存的百分比表示。', + label: '进程内存高水位线', + }, + sysmem_high_watermark: { + desc: '在发出相应报警之前可以分配多少系统内存的阈值,以系统内存的百分比表示。', + label: '系统内存高水位线', + }, + busy_dist_port: { + desc: '启用后,当用于集群接点之间 RPC 的连接过忙时,会触发一条带有 busy_dist_port 关键字的 warning 级别日志。\n同时还会发布一条主题为 $SYS/sysmon/busy_dist_port 的 MQTT 系统消息。', + label: '启用分布式端口过忙监控', + }, + busy_port: { + desc: '当一个系统接口(例如 TCP socket)过忙,会触发一条带有 busy_port 关键字的 warning 级别的日志。\n同时还会发布一条主题为 $SYS/sysmon/busy_port 的 MQTT 系统消息。', + label: '启用端口过忙监控', + }, + large_heap: { + desc: '当进程占用的堆内存超过 large_heap 指定的大小时,系统会触发一条带有 large_heap 关键字的 warning 级别日志。同时还会发布一条主题为 $SYS/sysmon/large_heap 的 MQTT 系统消息。', + label: '启用大 heap 监控', + }, + long_gc: { + desc: '当系统检测到某个 Erlang 进程垃圾回收占用过长时间,会触发一条带有 long_gc 关键字的日志。\n同时还会发布一条主题为 $SYS/sysmon/long_gc 的 MQTT 系统消息。', + label: '启用长垃圾回收监控', + }, + long_schedule: { + desc: "启用后,如果 Erlang VM 调度器出现某个任务占用时间过长时,会触发一条带有 'long_schedule' 关键字的日志。\n同时还会发布一条主题为 $SYS/sysmon/long_schedule 的 MQTT 系统消息。", + label: '启用长调度监控', + }, + process_check_interval: { + desc: '定期进程限制检查的时间间隔。', + label: '进程限制检查时间', + }, + process_high_watermark: { + desc: '在发出相应警报之前,本地节点上可以同时存在多少进程的阈值(以进程百分比表示)。', + label: '进程数高水位线', + }, + process_low_watermark: { + desc: '在清除相应警报之前,本地节点上可以同时存在多少进程的阈值(以进程百分比表示)。', + label: '进程数低水位线', + }, +} diff --git a/src/shims-vue.d.ts b/src/shims-vue.d.ts index 4fe5ca9f4..e662f80a6 100644 --- a/src/shims-vue.d.ts +++ b/src/shims-vue.d.ts @@ -8,9 +8,17 @@ declare module '*.vue' { export default component } +declare module 'vuex' { + export * from 'vuex/types/index.d.ts' + export * from 'vuex/types/helpers.d.ts' + export * from 'vuex/types/logger.d.ts' + export * from 'vuex/types/vue.d.ts' +} + declare module '@/common/highlight/sql' +declare module '@/common/highlight/bash' declare module 'js-sql-parser' -declare module 'highlight.js/lib/core' -declare module 'highlight.js/lib/languages/sql' +declare module 'highlight.js/*' +declare module 'monaco-editor/esm/vs/basic-languages/sql/sql' declare module 'hocon-parser' declare module 'github-markdown-css/*.css' diff --git a/src/store/index.ts b/src/store/index.ts index d57c57aca..366c80a56 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,6 +1,4 @@ -import { createStore } from 'vuex' import { getUser, setUser, removeUser } from '@/common/auth' -import { DEFAULT_CLIENT_TABLE_COLUMNS } from '@/common/constants' import { UserInfo } from '@/types/common' import { TestRuleTarget } from '@/types/enum' import { RuleEvent } from '@/types/rule' @@ -176,7 +174,7 @@ export default createStore({ }, isDev() { return false - // return process.env.NODE_ENV === 'development' + // return import.meta.env.DEV }, getSchema(state) { return (key: string) => { diff --git a/src/style/common.scss b/src/style/common.scss index d7f0f5234..0d8484bd5 100644 --- a/src/style/common.scss +++ b/src/style/common.scss @@ -2,7 +2,8 @@ @use './themes/dark.scss'; @use 'normalize.scss'; @use '@/style/schemaForm.scss'; -@use "sass:math"; +@use './variables.scss'; +@use 'sass:math'; @font-face { font-family: 'Roboto'; @@ -41,15 +42,12 @@ src: url(../assets/fonts/Roboto-BlackItalic.ttf) format('truetype'); } -$font: Roboto, -apple-system, BlinkMacSystemFont, PingFang SC, Hiragino Sans GB, Helvetica Neue, - Helvetica, Arial, sans-serif; - body { padding: 0; margin: 0; color: var(--el-text-color-primary); font-size: 14px; - font-family: $font; + font-family: variables.$font; background-color: var(--color-bg); } @@ -69,7 +67,7 @@ a { textarea, code { - font-family: $font; + font-family: variables.$font; } img { @@ -120,6 +118,9 @@ p.description { &.with-padding-top { padding-top: 32px; } + &.with-padding-bottom { + padding-bottom: 32px; + } } .app-wrapper-compact { @@ -173,6 +174,11 @@ p.description { .el-date-editor { width: 100%; } + .col-oper { + display: flex !important; + align-items: center; + justify-content: flex-end; + } } .emq-table-footer { @@ -228,22 +234,22 @@ p.description { } .g-coap::before { - background-image: url('~@/assets/gateway/coap.png'); + background-image: url('@/assets/gateway/coap.png'); } .g-lwm2m::before { - background-image: url('~@/assets/gateway/lwm2m.png'); + background-image: url('@/assets/gateway/lwm2m.png'); } .g-mqttsn::before { - background-image: url('~@/assets/gateway/mqttsn.png'); + background-image: url('@/assets/gateway/mqttsn.png'); } .g-stomp::before { - background-image: url('~@/assets/gateway/stomp.png'); + background-image: url('@/assets/gateway/stomp.png'); } .g-tcp::before { - background-image: url('~@/assets/gateway/tcp.png'); + background-image: url('@/assets/gateway/tcp.png'); } .g-exproto::before { - background-image: url('~@/assets/gateway/exproto.png'); + background-image: url('@/assets/gateway/exproto.png'); } .section-header { @@ -750,10 +756,15 @@ code { padding: 0.25rem 0.5rem; margin: 0; color: var(--color-text-mdcode); - font-size: .85em; + font-size: 0.85em; border-radius: 3px; background-color: var(--color-bg-mdcode); - font-family: Menlo, Monaco, Consolas, Courier New, monospace; + font-family: + Menlo, + Monaco, + Consolas, + Courier New, + monospace; } [data-theme='dark'] { @@ -885,14 +896,26 @@ code { } .vue-flow__handle-left { - left: math.div(-$handle-size, 2) + left: math.div(-$handle-size, 2); } .vue-flow__handle-right { - right: math.div(-$handle-size, 2) + right: math.div(-$handle-size, 2); } .vue-flow__handle { --vf-handle: #babcbe; } } + +label.custom-required::after { + content: '*'; + color: var(--el-color-danger); + margin-left: 4px; +} + +.el-table__cell.overflow-visible { + .cell { + overflow: visible; + } +} diff --git a/src/style/management.scss b/src/style/management.scss index 4cf23ca32..7b5cf76d8 100644 --- a/src/style/management.scss +++ b/src/style/management.scss @@ -5,12 +5,6 @@ .section-header { margin-top: 0; } - - .col-oper { - display: flex !important; - align-items: center; - justify-content: flex-end; - } .show-more { font-size: 18px; cursor: pointer; diff --git a/src/style/normalize.scss b/src/style/normalize.scss index d0a6f0f26..0b346b6d4 100644 --- a/src/style/normalize.scss +++ b/src/style/normalize.scss @@ -1,6 +1,7 @@ -@use "sass:math"; +@use 'sass:math'; +@use 'sass:color'; /* Components Reset Colors */ -@forward "element-plus/theme-chalk/src/common/var.scss" with ( +@forward 'element-plus/theme-chalk/src/common/var.scss' with ( $main: ( 'padding': 0px, ), @@ -42,10 +43,10 @@ ), $drawer: ( 'bg-color': var(--color-bg-content), - ), + ) ); -@use "element-plus/theme-chalk/src/index"; +@use 'element-plus/theme-chalk/src/index'; /* Root Colors */ :root { @@ -56,13 +57,16 @@ --el-text-color-secondary: var(--color-text-secondary); --el-disabled-text-color: var(--color-text-primary); --el-border-color-light: var(--color-border-normal); - --el-color-success: #00B173; - --el-color-danger: #EB4E3D; - --el-color-warning: #F19710; - --el-color-info: #7A7B80; + --el-color-success: #00b173; + --el-color-danger: #eb4e3d; + --el-color-warning: #f19710; + --el-color-info: #7a7b80; --el-box-shadow-light: var(--color-shadow-primary) 0px 4px 12px; --el-border: 1px solid var(--color-border-primary); --el-fill-color-light: var(--color-bg-split); + --el-fill-color-blank: var(--color-bg-content); + --el-border-color: var(--color-border-primary); + --el-menu-hover-bg-color: var(--color-bg-split); } /* Menu */ @@ -89,7 +93,7 @@ border-left: 4px solid transparent; color: #ffffffd9; &:hover { - background-color: #1F303C; + background-color: #1f303c; border-radius: 8px; } } @@ -115,11 +119,11 @@ min-width: initial; &.is-active { color: #fff; - background-color: #1F303C; + background-color: #1f303c; border-radius: 8px; } &:hover { - background-color: #1F303C; + background-color: #1f303c; border-radius: 8px; } } @@ -141,17 +145,19 @@ color: #ffffffd9; &.is-active { color: #fff; - background-color: #1F303C; + background-color: #1f303c; } &:hover { color: #fff; - background-color: #1F303C; + background-color: #1f303c; } } } &.el-menu--horizontal { + height: auto; background-color: transparent; border-bottom: 1px solid var(--color-border-card); + margin-bottom: 32px; & > .el-menu-item { height: 36px; padding: 0px 12px; @@ -161,11 +167,10 @@ color: var(--color-primary); } } - margin-bottom: 32px; } &.el-menu--collapse { - >.el-sub-menu.is-active .el-sub-menu__title { - background-color: #1F303C; + > .el-sub-menu.is-active .el-sub-menu__title { + background-color: #1f303c; color: #fff; } } @@ -177,7 +182,7 @@ &:before, .el-table__inner-wrapper:after, .el-table__inner-wrapper:before { - content: "" !important; + content: '' !important; position: absolute; background-color: transparent; pointer-events: none; @@ -239,7 +244,8 @@ } } .el-table__row:last-child { - th.el-table__cell.is-leaf, td.el-table__cell { + th.el-table__cell.is-leaf, + td.el-table__cell { border-bottom: none; } } @@ -251,6 +257,7 @@ & + .el-dropdown { margin-left: 0; margin-right: 12px; + vertical-align: middle; } } } @@ -301,7 +308,7 @@ color: var(--color-text-primary) !important; } .el-progress-bar__inner { - background: linear-gradient(135deg, #0AD18E 0%, #03A4A5 100%); + background: linear-gradient(135deg, #0ad18e 0%, #03a4a5 100%); } .el-progress-bar { &__outer { @@ -349,7 +356,7 @@ /* Tabs Card */ .el-tabs--card { - &>.el-tabs__header { + & > .el-tabs__header { border-bottom: 1px solid var(--color-border-card); margin-bottom: 0px; .el-tabs__nav { @@ -363,7 +370,10 @@ outline: none; border-left: none; border-top: 2px solid transparent; - transition: border-top 0.3s, color 0.3s, padding 0.3s; + transition: + border-top 0.3s, + color 0.3s, + padding 0.3s; &.is-active, .is-focus { outline: none; @@ -376,33 +386,38 @@ } @mixin border-gradient($from, $to, $weight: 0) { - $mix-main: mix($from, $to); - $mix-sub-from: mix($mix-main, $from); - $mix-sub-to: mix($mix-main, $to); - - box-shadow: 0 1px 0 $weight rgba($mix-sub-to, .25), - 0 -1px 0 $weight rgba($mix-sub-from, .25), - 1px 0 0 $weight rgba($mix-sub-to, .25), - -1px 0 0 $weight rgba($mix-sub-from, .25), - 1px -1px 0 $weight rgba($mix-main, .5), - -1px 1px 0 $weight rgba($mix-main, .5), - 1px 1px 0 $weight rgba($to, .75), - -1px -1px 0 $weight rgba($from, .75); + $mix-main: color.mix($from, $to); + $mix-sub-from: color.mix($mix-main, $from); + $mix-sub-to: color.mix($mix-main, $to); + + box-shadow: + 0 1px 0 $weight rgba($mix-sub-to, 0.25), + 0 -1px 0 $weight rgba($mix-sub-from, 0.25), + 1px 0 0 $weight rgba($mix-sub-to, 0.25), + -1px 0 0 $weight rgba($mix-sub-from, 0.25), + 1px -1px 0 $weight rgba($mix-main, 0.5), + -1px 1px 0 $weight rgba($mix-main, 0.5), + 1px 1px 0 $weight rgba($to, 0.75), + -1px -1px 0 $weight rgba($from, 0.75); } /* Button */ .el-button { &.el-button--primary:not(.is-link) { - background: linear-gradient(135deg, #0AD18E 0%, #03A4A5 100%); + background: linear-gradient(135deg, #0ad18e 0%, #03a4a5 100%); border: none; color: #fff; &.is-plain { background: var(--color-bg-content); color: var(--color-primary); @include border-gradient(#7ad8b3, #6dbebe); + &:not(.el-button--small, .el-button--large) { + // the border is shadow, so we need to set the height to 30px (32 - 2) + height: 30px; + } } &:hover { - background: linear-gradient(135deg, #53DEB0 0%, #4EBFC0 100%); + background: linear-gradient(135deg, #53deb0 0%, #4ebfc0 100%); color: #fff; } &.is-disabled { @@ -410,8 +425,8 @@ &:hover, &:focus, &:active { - background: linear-gradient(135deg, #CDF5E8 0%, #CCEDED 100%); - color: #86DBC1; + background: linear-gradient(135deg, #cdf5e8 0%, #cceded 100%); + color: #86dbc1; } } } @@ -419,7 +434,7 @@ min-height: 22px; padding: 4px 9px; } - &+.el-dropdown { + & + .el-dropdown { margin-left: 10px; } } @@ -438,12 +453,15 @@ .el-button.is-link.is-disabled:active { --el-color-primary-light-5: #86dbc1; } +.el-button:focus-visible { + outline: none; +} /* Dropdown */ .el-dropdown-menu { background: var(--color-bg-content); } -.el-dropdown__popper.el-popper[role=tooltip] { +.el-dropdown__popper.el-popper[role='tooltip'] { background: var(--color-bg-content); } .el-dropdown-menu__item:not(.is-disabled):hover { @@ -490,11 +508,11 @@ } /* Select */ -.el-select__popper.el-popper[role=tooltip] .el-popper__arrow::before { +.el-select__popper.el-popper[role='tooltip'] .el-popper__arrow::before { border: 1px solid var(--color-border-normal); background: var(--color-bg-content); } -.el-select__popper.el-popper[role=tooltip] { +.el-select__popper.el-popper[role='tooltip'] { background: var(--color-bg-content); } .el-select .el-select__tags .el-tag--info { @@ -507,7 +525,7 @@ } .el-input.is-disabled { &.el-input-group--append .el-input-group__append .el-select .el-input .el-input__wrapper, - &.el-input-group--append .el-input-group__append { + &.el-input-group--append .el-input-group__append { box-shadow: 0 0 0 1px var(--el-disabled-border-color) inset; } @@ -525,7 +543,6 @@ } } - /* Date Edtior */ .el-date-editor { --el-date-editor-width: 100%; @@ -541,14 +558,14 @@ } .el-date-table td.in-range .el-date-table-cell:hover, .el-date-table td.in-range .el-date-table-cell { - background-color: var(--color-bg-split); + background-color: var(--color-bg-split); } .el-picker-panel .el-time-panel { background-color: var(--color-bg-content); } -.el-picker-panel *[slot=sidebar], +.el-picker-panel *[slot='sidebar'], .el-picker-panel__sidebar { background-color: var(--color-bg-content); } @@ -572,15 +589,15 @@ .el-step__icon { background-color: var(--color-primary); border: none; - &::before { - position: absolute; - content: ''; - border-radius: 50%; - left: -4px; - width: 32px; - height: 32px; - background-color: #00b17333; - } + &::before { + position: absolute; + content: ''; + border-radius: 50%; + left: -4px; + width: 32px; + height: 32px; + background-color: #00b17333; + } } } } @@ -597,7 +614,9 @@ .el-popper { font-size: 13px; line-height: 1.6; - &:not(.el-select__popper):not(.el-picker__popper):not(.is-wider):not(.el-cascader__dropdown):not(.el-autocomplete__popper) { + &:not(.el-select__popper):not(.el-picker__popper):not(.is-wider):not(.el-cascader__dropdown):not( + .el-autocomplete__popper + ) { max-width: 330px; } &.is-wider { @@ -635,8 +654,8 @@ font-weight: normal; border-radius: 8px; &.el-tag--danger { - background-color: #FCECEC; - border: 1px solid #E44242; + background-color: #fcecec; + border: 1px solid #e44242; } &.el-tag--info { border: 1px solid var(--color-border-primary); @@ -658,6 +677,7 @@ /* Message */ .el-message { + align-items: flex-start; padding: 16px; border-radius: 8px; box-shadow: var(--el-notification-shadow); @@ -671,26 +691,26 @@ word-break: break-all; } .el-message__closeBtn { - transform: none; - top: 16px + math.div(14px * 0.5, 2); + transform: translateY(3px); color: #343741; font-size: 14px; } &--success { - border: 1px solid #00A890; - background-color: #E2FFF5; + border: 1px solid #00a890; + background-color: #e2fff5; } &--error { - border: 1px solid #EB4E3D; - background-color: #FFE9E7; + border: 1px solid #eb4e3d; + background-color: #ffe9e7; } &--warning { - border: 1px solid #F19710; - background-color: #FFF0DA; + border: 1px solid #f19710; + background-color: #fff0da; } - &--message, &--info { - border: 1px solid #469CF7; - background-color: #E6EEFF; + &--message, + &--info { + border: 1px solid #469cf7; + background-color: #e6eeff; } } @@ -711,19 +731,19 @@ /* Card */ .el-card { + border: 1px solid var(--color-border-card); + position: relative; &.is-always-shadow { box-shadow: none; } - border: 1px solid var(--color-border-card); &.allow-overflow { overflow: visible; } - position: relative; &.top-border, &.top-primary { &:before { position: absolute; - content: ""; + content: ''; top: 0px; left: 0px; width: 100%; @@ -753,7 +773,7 @@ } } } -.el-form-item__content>.el-row { +.el-form-item__content > .el-row { width: 100%; } .el-form-item__label { @@ -783,7 +803,6 @@ } } - /* Description */ .el-descriptions { .el-descriptions__title { @@ -833,11 +852,14 @@ } /* Pagination */ -.el-pagination.is-background .btn-prev:disabled, .el-pagination.is-background .btn-next:disabled { - color: #D0D4DC; +.el-pagination.is-background .btn-prev:disabled, +.el-pagination.is-background .btn-next:disabled { + color: #d0d4dc; background-color: var(--color-bg-content); } -.el-pagination.is-background .btn-prev, .el-pagination.is-background .btn-next, .el-pagination.is-background .el-pager li { +.el-pagination.is-background .btn-prev, +.el-pagination.is-background .btn-next, +.el-pagination.is-background .el-pager li { border-radius: 8px; border: 1px solid var(--color-border-primary); background-color: var(--color-bg-content); @@ -901,7 +923,7 @@ } } -/* Skeleton */ +/* Skeleton */ [data-theme='dark'] { .el-skeleton { --el-skeleton-color: #323947; @@ -928,7 +950,6 @@ padding: 16px 24px; margin-right: 0; border-bottom: 1px solid var(--color-border-card); - } .el-dialog__body { diff --git a/src/style/rule.scss b/src/style/rule.scss index b46832a71..a37ff0af8 100644 --- a/src/style/rule.scss +++ b/src/style/rule.scss @@ -40,6 +40,13 @@ .detail-header img { height: 40px; } + .block-title { + max-width: 400px; + overflow: hidden; + text-overflow: ellipsis; + word-wrap: nowrap; + margin: 0; + } .info-tags { .el-tag, .node-status { @@ -192,6 +199,9 @@ } } } + a.io-item { + color: unset; + } .btn-add { margin-top: 24px; :deep(span) { @@ -205,6 +215,7 @@ } .delete-second-confirm { + padding: 0px 16px 4px; .el-dialog__header { display: none; } diff --git a/src/style/themes/dark.scss b/src/style/themes/dark.scss index 4b8fba4ea..8b1cbd910 100644 --- a/src/style/themes/dark.scss +++ b/src/style/themes/dark.scss @@ -1,14 +1,15 @@ [data-theme='dark'] { /* Background */ - --color-bg: #18191D; + --color-bg: #18191d; --color-bg-content: #212429; - --color-bg-split: #272B32; + --color-bg-split: #272b32; --color-bg-main: #17181b; --color-bg-popper: #fff; --color-bg-trans: #212429e6; --color-bg-lighter: #323a48; --color-bg-mdcode: #ffffff14; - --color-bg-table-hd: #353A41; + --color-bg-details: #1b2028ed; + --color-bg-table-hd: #353a41; /* Text */ --color-text-primary: #fff; --color-text-secondary: #d2d3d5; diff --git a/src/style/themes/light.scss b/src/style/themes/light.scss index 12d8bf349..7fb8eec47 100644 --- a/src/style/themes/light.scss +++ b/src/style/themes/light.scss @@ -2,25 +2,26 @@ /* Background */ --color-bg: #071927; --color-bg-content: #fff; - --color-bg-split: #F8FAFE; + --color-bg-split: #f8fafe; --color-bg-main: #f9fafb; --color-bg-popper: #282e38; --color-bg-trans: #ffffffe6; - --color-bg-lighter: #E6EDFB; + --color-bg-lighter: #e6edfb; --color-bg-mdcode: #f4f4f4; - --color-bg-table-hd: #EEF0F5; + --color-bg-details: #ffffffed; + --color-bg-table-hd: #eef0f5; /* Text */ --color-text-primary: #343741; --color-text-secondary: #5a5f6f; - --color-text-placeholder: #BAC1CD; + --color-text-placeholder: #bac1cd; --color-text-popper: #fff; --color-title-primary: #192144; --color-text-footer: #8e8e8e; - --color-text-mdcode: #EB4E3D; + --color-text-mdcode: #eb4e3d; --color-text-progress: #1f3547a8; /* Border */ - --color-border-primary: #D0D4DC; - --color-border-card: #E2E6F0; + --color-border-primary: #d0d4dc; + --color-border-card: #e2e6f0; --color-border-normal: #eeedf6; /* Colors */ --color-primary: #00b173; diff --git a/src/style/variables.scss b/src/style/variables.scss new file mode 100644 index 000000000..271a111cb --- /dev/null +++ b/src/style/variables.scss @@ -0,0 +1,10 @@ +$font: + Roboto, + -apple-system, + BlinkMacSystemFont, + PingFang SC, + Hiragino Sans GB, + Helvetica Neue, + Helvetica, + Arial, + sans-serif; diff --git a/src/types/auth.d.ts b/src/types/auth.d.ts index 94e9a9e71..0de1d7d7d 100644 --- a/src/types/auth.d.ts +++ b/src/types/auth.d.ts @@ -1,5 +1,6 @@ import { MetricsDataWithExtraData } from './common' -import { BannedType, ConnectionStatus } from './enum' +import { BannedType, ConnectionStatus, QoSLevel } from './enum' +import { AuthzRuleAction, AuthzRulePermission } from './typeAlias' export interface AuthzSetting { deny_action: 'ignore' | 'disconnect' @@ -49,9 +50,14 @@ export interface AuthnItem { } export interface BuiltInDBRule { - permission: string - action: string + permission: AuthzRulePermission + action: AuthzRuleAction topic: string + qos?: Array + retain?: boolean | 'all' + clientid_re?: string + username_re?: string + ipaddr?: string } export interface BuiltInDBItem { diff --git a/src/types/config.d.ts b/src/types/config.d.ts index 70f320fbf..b77853ef5 100644 --- a/src/types/config.d.ts +++ b/src/types/config.d.ts @@ -1,4 +1,4 @@ -import { ComponentPublicInstance } from 'vue' +import { EmqxForceShutdown } from './schemas/configs.schemas' export interface SubTabComponent extends ComponentPublicInstance { index: number @@ -80,23 +80,14 @@ export interface ConsoleHandler { enable: boolean level: string time_offset: string - chars_limit: string formatter: string - single_line: boolean - sync_mode_qlen: number - drop_mode_qlen: number - flush_qlen: number overload_kill: OverloadKill burst_limit: BurstLimit - supervisor_reports: string - max_depth: number } export interface OverloadKill { enable: boolean - mem_size: string qlen: number - restart_after: string } export interface BurstLimit { @@ -115,16 +106,9 @@ export interface Name { max_size: string level: string time_offset: string - chars_limit: string formatter: string - single_line: boolean - sync_mode_qlen: number - drop_mode_qlen: number - flush_qlen: number overload_kill: OverloadKill2 burst_limit: BurstLimit2 - supervisor_reports: string - max_depth: number } export interface Rotation { @@ -134,9 +118,7 @@ export interface Rotation { export interface OverloadKill2 { enable: boolean - mem_size: string qlen: number - restart_after: string } export interface BurstLimit2 { @@ -189,7 +171,7 @@ export interface Zone { mqtt: Mqtt stats: Stats flapping_detect: FlappingDetect - force_shutdown: ForceShutdown + force_shutdown: EmqxForceShutdown conn_congestion: ConnCongestion force_gc: ForceGc overload_protection: OverloadProtection @@ -238,12 +220,6 @@ export interface FlappingDetect { ban_time: string } -export interface ForceShutdown { - enable: boolean - max_message_queue_len: number - max_heap_size: string -} - export interface ConnCongestion { enable_alarm: boolean min_alarm_sustain_duration: string diff --git a/src/types/enum.ts b/src/types/enum.ts index cbcef4fe5..477bd4a05 100644 --- a/src/types/enum.ts +++ b/src/types/enum.ts @@ -280,6 +280,7 @@ export enum PropType { Boolean = 'boolean', Duration = 'duration', Number = 'number', + Integer = 'integer', IPPort = 'ip_port', ByteSize = 'byteSize', Object = 'object', diff --git a/src/types/extension.d.ts b/src/types/extension.d.ts index 68ca42661..064bf0af8 100644 --- a/src/types/extension.d.ts +++ b/src/types/extension.d.ts @@ -12,13 +12,13 @@ export interface SysTopics { } export interface Retainer { - enable: boolean max_payload_size: string msg_expiry_interval: string msg_expiry_interval_override: string allow_never_expire: boolean msg_clear_interval: string delivery_rate: string + max_publish_rate: string backend: { type: string storage_type: string diff --git a/src/types/schemas/actions.schemas.ts b/src/types/schemas/actions.schemas.ts index f58a44be3..88b952af7 100644 --- a/src/types/schemas/actions.schemas.ts +++ b/src/types/schemas/actions.schemas.ts @@ -1,5 +1,5 @@ export type PostNodesNodeActionsIdOperation503Code = - typeof PostNodesNodeActionsIdOperation503Code[keyof typeof PostNodesNodeActionsIdOperation503Code] + (typeof PostNodesNodeActionsIdOperation503Code)[keyof typeof PostNodesNodeActionsIdOperation503Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostNodesNodeActionsIdOperation503Code = { @@ -12,7 +12,7 @@ export type PostNodesNodeActionsIdOperation503 = { } export type PostNodesNodeActionsIdOperation501Code = - typeof PostNodesNodeActionsIdOperation501Code[keyof typeof PostNodesNodeActionsIdOperation501Code] + (typeof PostNodesNodeActionsIdOperation501Code)[keyof typeof PostNodesNodeActionsIdOperation501Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostNodesNodeActionsIdOperation501Code = { @@ -25,7 +25,7 @@ export type PostNodesNodeActionsIdOperation501 = { } export type PostNodesNodeActionsIdOperation404Code = - typeof PostNodesNodeActionsIdOperation404Code[keyof typeof PostNodesNodeActionsIdOperation404Code] + (typeof PostNodesNodeActionsIdOperation404Code)[keyof typeof PostNodesNodeActionsIdOperation404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostNodesNodeActionsIdOperation404Code = { @@ -38,7 +38,7 @@ export type PostNodesNodeActionsIdOperation404 = { } export type PostNodesNodeActionsIdOperation400Code = - typeof PostNodesNodeActionsIdOperation400Code[keyof typeof PostNodesNodeActionsIdOperation400Code] + (typeof PostNodesNodeActionsIdOperation400Code)[keyof typeof PostNodesNodeActionsIdOperation400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostNodesNodeActionsIdOperation400Code = { @@ -51,7 +51,7 @@ export type PostNodesNodeActionsIdOperation400 = { } export type GetActionsIdMetrics404Code = - typeof GetActionsIdMetrics404Code[keyof typeof GetActionsIdMetrics404Code] + (typeof GetActionsIdMetrics404Code)[keyof typeof GetActionsIdMetrics404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetActionsIdMetrics404Code = { @@ -69,7 +69,7 @@ export type GetActionsIdMetrics200 = { } export type DeleteActionsId503Code = - typeof DeleteActionsId503Code[keyof typeof DeleteActionsId503Code] + (typeof DeleteActionsId503Code)[keyof typeof DeleteActionsId503Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteActionsId503Code = { @@ -82,7 +82,7 @@ export type DeleteActionsId503 = { } export type DeleteActionsId404Code = - typeof DeleteActionsId404Code[keyof typeof DeleteActionsId404Code] + (typeof DeleteActionsId404Code)[keyof typeof DeleteActionsId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteActionsId404Code = { @@ -95,7 +95,7 @@ export type DeleteActionsId404 = { } export type DeleteActionsId400Code = - typeof DeleteActionsId400Code[keyof typeof DeleteActionsId400Code] + (typeof DeleteActionsId400Code)[keyof typeof DeleteActionsId400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteActionsId400Code = { @@ -112,7 +112,7 @@ export type DeleteActionsIdParams = { also_delete_dep_actions?: boolean } -export type PutActionsId503Code = typeof PutActionsId503Code[keyof typeof PutActionsId503Code] +export type PutActionsId503Code = (typeof PutActionsId503Code)[keyof typeof PutActionsId503Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutActionsId503Code = { @@ -124,7 +124,7 @@ export type PutActionsId503 = { message?: string } -export type PutActionsId404Code = typeof PutActionsId404Code[keyof typeof PutActionsId404Code] +export type PutActionsId404Code = (typeof PutActionsId404Code)[keyof typeof PutActionsId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutActionsId404Code = { @@ -136,7 +136,7 @@ export type PutActionsId404 = { message?: string } -export type PutActionsId400Code = typeof PutActionsId400Code[keyof typeof PutActionsId400Code] +export type PutActionsId400Code = (typeof PutActionsId400Code)[keyof typeof PutActionsId400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutActionsId400Code = { @@ -152,7 +152,7 @@ export type PutActionsId200 = BridgeMqttPublisherGetBridgeV2 | BridgeHttpGetBrid export type PutActionsIdBody = BridgeMqttPublisherPutBridgeV2 | BridgeHttpPutBridgeV2 -export type GetActionsId404Code = typeof GetActionsId404Code[keyof typeof GetActionsId404Code] +export type GetActionsId404Code = (typeof GetActionsId404Code)[keyof typeof GetActionsId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetActionsId404Code = { @@ -166,7 +166,8 @@ export type GetActionsId404 = { export type GetActionsId200 = BridgeMqttPublisherGetBridgeV2 | BridgeHttpGetBridgeV2 -export type GetActionTypes200Item = typeof GetActionTypes200Item[keyof typeof GetActionTypes200Item] +export type GetActionTypes200Item = + (typeof GetActionTypes200Item)[keyof typeof GetActionTypes200Item] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetActionTypes200Item = { @@ -175,7 +176,7 @@ export const GetActionTypes200Item = { } as const export type PostActionsProbe400Code = - typeof PostActionsProbe400Code[keyof typeof PostActionsProbe400Code] + (typeof PostActionsProbe400Code)[keyof typeof PostActionsProbe400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostActionsProbe400Code = { @@ -189,7 +190,7 @@ export type PostActionsProbe400 = { export type PostActionsProbeBody = BridgeMqttPublisherPostBridgeV2 | BridgeHttpPostBridgeV2 -export type PostActions400Code = typeof PostActions400Code[keyof typeof PostActions400Code] +export type PostActions400Code = (typeof PostActions400Code)[keyof typeof PostActions400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostActions400Code = { @@ -208,7 +209,7 @@ export type PostActionsBody = BridgeMqttPublisherPostBridgeV2 | BridgeHttpPostBr export type GetActions200Item = BridgeMqttPublisherGetBridgeV2 | BridgeHttpGetBridgeV2 export type PutActionsIdEnableEnable503Code = - typeof PutActionsIdEnableEnable503Code[keyof typeof PutActionsIdEnableEnable503Code] + (typeof PutActionsIdEnableEnable503Code)[keyof typeof PutActionsIdEnableEnable503Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutActionsIdEnableEnable503Code = { @@ -221,7 +222,7 @@ export type PutActionsIdEnableEnable503 = { } export type PutActionsIdEnableEnable404Code = - typeof PutActionsIdEnableEnable404Code[keyof typeof PutActionsIdEnableEnable404Code] + (typeof PutActionsIdEnableEnable404Code)[keyof typeof PutActionsIdEnableEnable404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutActionsIdEnableEnable404Code = { @@ -234,7 +235,7 @@ export type PutActionsIdEnableEnable404 = { } export type PostActionsIdOperation503Code = - typeof PostActionsIdOperation503Code[keyof typeof PostActionsIdOperation503Code] + (typeof PostActionsIdOperation503Code)[keyof typeof PostActionsIdOperation503Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostActionsIdOperation503Code = { @@ -247,7 +248,7 @@ export type PostActionsIdOperation503 = { } export type PostActionsIdOperation501Code = - typeof PostActionsIdOperation501Code[keyof typeof PostActionsIdOperation501Code] + (typeof PostActionsIdOperation501Code)[keyof typeof PostActionsIdOperation501Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostActionsIdOperation501Code = { @@ -260,7 +261,7 @@ export type PostActionsIdOperation501 = { } export type PostActionsIdOperation404Code = - typeof PostActionsIdOperation404Code[keyof typeof PostActionsIdOperation404Code] + (typeof PostActionsIdOperation404Code)[keyof typeof PostActionsIdOperation404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostActionsIdOperation404Code = { @@ -273,7 +274,7 @@ export type PostActionsIdOperation404 = { } export type PostActionsIdOperation400Code = - typeof PostActionsIdOperation400Code[keyof typeof PostActionsIdOperation400Code] + (typeof PostActionsIdOperation400Code)[keyof typeof PostActionsIdOperation400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostActionsIdOperation400Code = { @@ -286,7 +287,7 @@ export type PostActionsIdOperation400 = { } export type PutActionsIdMetricsReset404Code = - typeof PutActionsIdMetricsReset404Code[keyof typeof PutActionsIdMetricsReset404Code] + (typeof PutActionsIdMetricsReset404Code)[keyof typeof PutActionsIdMetricsReset404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutActionsIdMetricsReset404Code = { @@ -299,7 +300,7 @@ export type PutActionsIdMetricsReset404 = { } export type BridgeNodeStatusStatus = - typeof BridgeNodeStatusStatus[keyof typeof BridgeNodeStatusStatus] + (typeof BridgeNodeStatusStatus)[keyof typeof BridgeNodeStatusStatus] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeNodeStatusStatus = { @@ -338,38 +339,16 @@ export interface BridgeNodeMetrics { metrics?: BridgeMetrics } -export interface BridgeMqttPublisherPutBridgeV2 { - local_topic?: string - parameters: BridgeMqttPublisherActionParameters - enable?: boolean - connector: string - tags?: string[] - description?: string - resource_opts?: BridgeMqttPublisherActionResourceOpts -} - export type BridgeMqttPublisherPostBridgeV2Type = - typeof BridgeMqttPublisherPostBridgeV2Type[keyof typeof BridgeMqttPublisherPostBridgeV2Type] + (typeof BridgeMqttPublisherPostBridgeV2Type)[keyof typeof BridgeMqttPublisherPostBridgeV2Type] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeMqttPublisherPostBridgeV2Type = { mqtt: 'mqtt', } as const -export interface BridgeMqttPublisherPostBridgeV2 { - type: BridgeMqttPublisherPostBridgeV2Type - name: string - local_topic?: string - parameters: BridgeMqttPublisherActionParameters - enable?: boolean - connector: string - tags?: string[] - description?: string - resource_opts?: BridgeMqttPublisherActionResourceOpts -} - export type BridgeMqttPublisherGetBridgeV2Status = - typeof BridgeMqttPublisherGetBridgeV2Status[keyof typeof BridgeMqttPublisherGetBridgeV2Status] + (typeof BridgeMqttPublisherGetBridgeV2Status)[keyof typeof BridgeMqttPublisherGetBridgeV2Status] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeMqttPublisherGetBridgeV2Status = { @@ -380,7 +359,7 @@ export const BridgeMqttPublisherGetBridgeV2Status = { } as const export type BridgeMqttPublisherGetBridgeV2Type = - typeof BridgeMqttPublisherGetBridgeV2Type[keyof typeof BridgeMqttPublisherGetBridgeV2Type] + (typeof BridgeMqttPublisherGetBridgeV2Type)[keyof typeof BridgeMqttPublisherGetBridgeV2Type] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeMqttPublisherGetBridgeV2Type = { @@ -405,7 +384,7 @@ export interface BridgeMqttPublisherGetBridgeV2 { export type BridgeMqttPublisherActionResourceOptsRequestTtl = 'infinity' | string export type BridgeMqttPublisherActionResourceOptsQueryMode = - typeof BridgeMqttPublisherActionResourceOptsQueryMode[keyof typeof BridgeMqttPublisherActionResourceOptsQueryMode] + (typeof BridgeMqttPublisherActionResourceOptsQueryMode)[keyof typeof BridgeMqttPublisherActionResourceOptsQueryMode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeMqttPublisherActionResourceOptsQueryMode = { @@ -433,38 +412,40 @@ export interface BridgeMqttPublisherActionParameters { payload?: string } -export interface BridgeHttpPutBridgeV2 { +export interface BridgeMqttPublisherPutBridgeV2 { + local_topic?: string + parameters: BridgeMqttPublisherActionParameters enable?: boolean connector: string tags?: string[] description?: string - parameters: BridgeHttpParametersOpts - resource_opts?: BridgeHttpActionResourceOpts + resource_opts?: BridgeMqttPublisherActionResourceOpts } -export type BridgeHttpPostBridgeV2Type = - typeof BridgeHttpPostBridgeV2Type[keyof typeof BridgeHttpPostBridgeV2Type] - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const BridgeHttpPostBridgeV2Type = { - http: 'http', -} as const - -export interface BridgeHttpPostBridgeV2 { - type: BridgeHttpPostBridgeV2Type +export interface BridgeMqttPublisherPostBridgeV2 { + type: BridgeMqttPublisherPostBridgeV2Type name: string + local_topic?: string + parameters: BridgeMqttPublisherActionParameters enable?: boolean connector: string tags?: string[] description?: string - parameters: BridgeHttpParametersOpts - resource_opts?: BridgeHttpActionResourceOpts + resource_opts?: BridgeMqttPublisherActionResourceOpts } +export type BridgeHttpPostBridgeV2Type = + (typeof BridgeHttpPostBridgeV2Type)[keyof typeof BridgeHttpPostBridgeV2Type] + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const BridgeHttpPostBridgeV2Type = { + http: 'http', +} as const + export type BridgeHttpParametersOptsHeaders = { [key: string]: any } export type BridgeHttpParametersOptsMethod = - typeof BridgeHttpParametersOptsMethod[keyof typeof BridgeHttpParametersOptsMethod] + (typeof BridgeHttpParametersOptsMethod)[keyof typeof BridgeHttpParametersOptsMethod] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeHttpParametersOptsMethod = { @@ -484,8 +465,28 @@ export interface BridgeHttpParametersOpts { request_timeout?: string } +export interface BridgeHttpPutBridgeV2 { + enable?: boolean + connector: string + tags?: string[] + description?: string + parameters: BridgeHttpParametersOpts + resource_opts?: BridgeHttpActionResourceOpts +} + +export interface BridgeHttpPostBridgeV2 { + type: BridgeHttpPostBridgeV2Type + name: string + enable?: boolean + connector: string + tags?: string[] + description?: string + parameters: BridgeHttpParametersOpts + resource_opts?: BridgeHttpActionResourceOpts +} + export type BridgeHttpGetBridgeV2Type = - typeof BridgeHttpGetBridgeV2Type[keyof typeof BridgeHttpGetBridgeV2Type] + (typeof BridgeHttpGetBridgeV2Type)[keyof typeof BridgeHttpGetBridgeV2Type] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeHttpGetBridgeV2Type = { @@ -493,7 +494,7 @@ export const BridgeHttpGetBridgeV2Type = { } as const export type BridgeHttpGetBridgeV2Status = - typeof BridgeHttpGetBridgeV2Status[keyof typeof BridgeHttpGetBridgeV2Status] + (typeof BridgeHttpGetBridgeV2Status)[keyof typeof BridgeHttpGetBridgeV2Status] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeHttpGetBridgeV2Status = { @@ -520,7 +521,7 @@ export interface BridgeHttpGetBridgeV2 { export type BridgeHttpActionResourceOptsRequestTtl = 'infinity' | string export type BridgeHttpActionResourceOptsQueryMode = - typeof BridgeHttpActionResourceOptsQueryMode[keyof typeof BridgeHttpActionResourceOptsQueryMode] + (typeof BridgeHttpActionResourceOptsQueryMode)[keyof typeof BridgeHttpActionResourceOptsQueryMode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeHttpActionResourceOptsQueryMode = { @@ -536,3 +537,22 @@ export interface BridgeHttpActionResourceOpts { inflight_window?: number max_buffer_bytes?: string } + +export interface ActionsAndSourcesResponseNodeStatus { + node?: string + status?: string + status_reason?: string +} + +export interface ActionsAndSourcesResponseSummary { + enable?: boolean + name?: string + type?: string + description?: string + created_at?: number + last_modified_at?: number + node_status?: ActionsAndSourcesResponseNodeStatus[] + rules?: string[] + status?: string + status_reason?: string +} diff --git a/src/types/schemas/authorization.schemas.ts b/src/types/schemas/authorization.schemas.ts index a54f50d96..83e3dfb0c 100644 --- a/src/types/schemas/authorization.schemas.ts +++ b/src/types/schemas/authorization.schemas.ts @@ -1,5 +1,5 @@ export type PostAuthorizationSourcesBuiltInDatabaseRulesAll400Code = - typeof PostAuthorizationSourcesBuiltInDatabaseRulesAll400Code[keyof typeof PostAuthorizationSourcesBuiltInDatabaseRulesAll400Code] + (typeof PostAuthorizationSourcesBuiltInDatabaseRulesAll400Code)[keyof typeof PostAuthorizationSourcesBuiltInDatabaseRulesAll400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostAuthorizationSourcesBuiltInDatabaseRulesAll400Code = { @@ -12,7 +12,7 @@ export type PostAuthorizationSourcesBuiltInDatabaseRulesAll400 = { } export type PutAuthorizationSettings400Code = - typeof PutAuthorizationSettings400Code[keyof typeof PutAuthorizationSettings400Code] + (typeof PutAuthorizationSettings400Code)[keyof typeof PutAuthorizationSettings400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutAuthorizationSettings400Code = { @@ -25,7 +25,7 @@ export type PutAuthorizationSettings400 = { } export type PutAuthorizationSettings200DenyAction = - typeof PutAuthorizationSettings200DenyAction[keyof typeof PutAuthorizationSettings200DenyAction] + (typeof PutAuthorizationSettings200DenyAction)[keyof typeof PutAuthorizationSettings200DenyAction] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutAuthorizationSettings200DenyAction = { @@ -34,7 +34,7 @@ export const PutAuthorizationSettings200DenyAction = { } as const export type PutAuthorizationSettings200NoMatch = - typeof PutAuthorizationSettings200NoMatch[keyof typeof PutAuthorizationSettings200NoMatch] + (typeof PutAuthorizationSettings200NoMatch)[keyof typeof PutAuthorizationSettings200NoMatch] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutAuthorizationSettings200NoMatch = { @@ -49,7 +49,7 @@ export type PutAuthorizationSettings200 = { } export type PutAuthorizationSettingsBodyDenyAction = - typeof PutAuthorizationSettingsBodyDenyAction[keyof typeof PutAuthorizationSettingsBodyDenyAction] + (typeof PutAuthorizationSettingsBodyDenyAction)[keyof typeof PutAuthorizationSettingsBodyDenyAction] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutAuthorizationSettingsBodyDenyAction = { @@ -58,7 +58,7 @@ export const PutAuthorizationSettingsBodyDenyAction = { } as const export type PutAuthorizationSettingsBodyNoMatch = - typeof PutAuthorizationSettingsBodyNoMatch[keyof typeof PutAuthorizationSettingsBodyNoMatch] + (typeof PutAuthorizationSettingsBodyNoMatch)[keyof typeof PutAuthorizationSettingsBodyNoMatch] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutAuthorizationSettingsBodyNoMatch = { @@ -73,7 +73,7 @@ export type PutAuthorizationSettingsBody = { } export type GetAuthorizationSettings200DenyAction = - typeof GetAuthorizationSettings200DenyAction[keyof typeof GetAuthorizationSettings200DenyAction] + (typeof GetAuthorizationSettings200DenyAction)[keyof typeof GetAuthorizationSettings200DenyAction] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetAuthorizationSettings200DenyAction = { @@ -82,7 +82,7 @@ export const GetAuthorizationSettings200DenyAction = { } as const export type GetAuthorizationSettings200NoMatch = - typeof GetAuthorizationSettings200NoMatch[keyof typeof GetAuthorizationSettings200NoMatch] + (typeof GetAuthorizationSettings200NoMatch)[keyof typeof GetAuthorizationSettings200NoMatch] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetAuthorizationSettings200NoMatch = { @@ -97,7 +97,7 @@ export type GetAuthorizationSettings200 = { } export type DeleteAuthorizationCache400Code = - typeof DeleteAuthorizationCache400Code[keyof typeof DeleteAuthorizationCache400Code] + (typeof DeleteAuthorizationCache400Code)[keyof typeof DeleteAuthorizationCache400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteAuthorizationCache400Code = { @@ -110,7 +110,7 @@ export type DeleteAuthorizationCache400 = { } export type PutAuthorizationSourcesOrder400Code = - typeof PutAuthorizationSourcesOrder400Code[keyof typeof PutAuthorizationSourcesOrder400Code] + (typeof PutAuthorizationSourcesOrder400Code)[keyof typeof PutAuthorizationSourcesOrder400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutAuthorizationSourcesOrder400Code = { @@ -123,7 +123,7 @@ export type PutAuthorizationSourcesOrder400 = { } export type DeleteAuthorizationSourcesType400Code = - typeof DeleteAuthorizationSourcesType400Code[keyof typeof DeleteAuthorizationSourcesType400Code] + (typeof DeleteAuthorizationSourcesType400Code)[keyof typeof DeleteAuthorizationSourcesType400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteAuthorizationSourcesType400Code = { @@ -136,7 +136,7 @@ export type DeleteAuthorizationSourcesType400 = { } export type PutAuthorizationSourcesType400Code = - typeof PutAuthorizationSourcesType400Code[keyof typeof PutAuthorizationSourcesType400Code] + (typeof PutAuthorizationSourcesType400Code)[keyof typeof PutAuthorizationSourcesType400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutAuthorizationSourcesType400Code = { @@ -164,7 +164,7 @@ export type PutAuthorizationSourcesTypeBody = | AuthzApiFile export type GetAuthorizationSourcesType404Code = - typeof GetAuthorizationSourcesType404Code[keyof typeof GetAuthorizationSourcesType404Code] + (typeof GetAuthorizationSourcesType404Code)[keyof typeof GetAuthorizationSourcesType404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetAuthorizationSourcesType404Code = { @@ -192,7 +192,7 @@ export type GetAuthorizationSourcesType200 = | AuthzApiFile export type PostAuthorizationSourcesTypeMove404Code = - typeof PostAuthorizationSourcesTypeMove404Code[keyof typeof PostAuthorizationSourcesTypeMove404Code] + (typeof PostAuthorizationSourcesTypeMove404Code)[keyof typeof PostAuthorizationSourcesTypeMove404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostAuthorizationSourcesTypeMove404Code = { @@ -205,7 +205,7 @@ export type PostAuthorizationSourcesTypeMove404 = { } export type PostAuthorizationSourcesTypeMove400Code = - typeof PostAuthorizationSourcesTypeMove400Code[keyof typeof PostAuthorizationSourcesTypeMove400Code] + (typeof PostAuthorizationSourcesTypeMove400Code)[keyof typeof PostAuthorizationSourcesTypeMove400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostAuthorizationSourcesTypeMove400Code = { @@ -218,7 +218,7 @@ export type PostAuthorizationSourcesTypeMove400 = { } export type DeleteAuthorizationSourcesBuiltInDatabaseRules400Code = - typeof DeleteAuthorizationSourcesBuiltInDatabaseRules400Code[keyof typeof DeleteAuthorizationSourcesBuiltInDatabaseRules400Code] + (typeof DeleteAuthorizationSourcesBuiltInDatabaseRules400Code)[keyof typeof DeleteAuthorizationSourcesBuiltInDatabaseRules400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteAuthorizationSourcesBuiltInDatabaseRules400Code = { @@ -231,7 +231,7 @@ export type DeleteAuthorizationSourcesBuiltInDatabaseRules400 = { } export type DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code = - typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code[keyof typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code] + (typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code)[keyof typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code = { @@ -244,7 +244,7 @@ export type DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404 = { } export type DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code = - typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code[keyof typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code] + (typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code)[keyof typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code = { @@ -257,7 +257,7 @@ export type DeleteAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400 = { } export type PutAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code = - typeof PutAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code[keyof typeof PutAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code] + (typeof PutAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code)[keyof typeof PutAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400Code = { @@ -270,7 +270,7 @@ export type PutAuthorizationSourcesBuiltInDatabaseRulesUsersUsername400 = { } export type GetAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code = - typeof GetAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code[keyof typeof GetAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code] + (typeof GetAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code)[keyof typeof GetAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404Code = { @@ -283,7 +283,7 @@ export type GetAuthorizationSourcesBuiltInDatabaseRulesUsersUsername404 = { } export type PostAuthorizationSources400Code = - typeof PostAuthorizationSources400Code[keyof typeof PostAuthorizationSources400Code] + (typeof PostAuthorizationSources400Code)[keyof typeof PostAuthorizationSources400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostAuthorizationSources400Code = { @@ -311,7 +311,7 @@ export type PostAuthorizationSourcesBody = | AuthzApiFile export type GetAuthorizationSourcesTypeStatus404Code = - typeof GetAuthorizationSourcesTypeStatus404Code[keyof typeof GetAuthorizationSourcesTypeStatus404Code] + (typeof GetAuthorizationSourcesTypeStatus404Code)[keyof typeof GetAuthorizationSourcesTypeStatus404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetAuthorizationSourcesTypeStatus404Code = { @@ -324,7 +324,7 @@ export type GetAuthorizationSourcesTypeStatus404 = { } export type GetAuthorizationSourcesTypeStatus400Code = - typeof GetAuthorizationSourcesTypeStatus400Code[keyof typeof GetAuthorizationSourcesTypeStatus400Code] + (typeof GetAuthorizationSourcesTypeStatus400Code)[keyof typeof GetAuthorizationSourcesTypeStatus400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetAuthorizationSourcesTypeStatus400Code = { @@ -337,7 +337,7 @@ export type GetAuthorizationSourcesTypeStatus400 = { } export type DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code = - typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code[keyof typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code] + (typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code)[keyof typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code = { @@ -350,7 +350,7 @@ export type DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404 = { } export type DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code = - typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code[keyof typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code] + (typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code)[keyof typeof DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code = { @@ -363,7 +363,7 @@ export type DeleteAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400 = { } export type PutAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code = - typeof PutAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code[keyof typeof PutAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code] + (typeof PutAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code)[keyof typeof PutAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400Code = { @@ -376,7 +376,7 @@ export type PutAuthorizationSourcesBuiltInDatabaseRulesClientsClientid400 = { } export type GetAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code = - typeof GetAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code[keyof typeof GetAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code] + (typeof GetAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code)[keyof typeof GetAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404Code = { @@ -389,7 +389,7 @@ export type GetAuthorizationSourcesBuiltInDatabaseRulesClientsClientid404 = { } export type PostAuthorizationSourcesBuiltInDatabaseRulesClients400Code = - typeof PostAuthorizationSourcesBuiltInDatabaseRulesClients400Code[keyof typeof PostAuthorizationSourcesBuiltInDatabaseRulesClients400Code] + (typeof PostAuthorizationSourcesBuiltInDatabaseRulesClients400Code)[keyof typeof PostAuthorizationSourcesBuiltInDatabaseRulesClients400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostAuthorizationSourcesBuiltInDatabaseRulesClients400Code = { @@ -402,7 +402,7 @@ export type PostAuthorizationSourcesBuiltInDatabaseRulesClients400 = { } export type PostAuthorizationSourcesBuiltInDatabaseRulesUsers409Code = - typeof PostAuthorizationSourcesBuiltInDatabaseRulesUsers409Code[keyof typeof PostAuthorizationSourcesBuiltInDatabaseRulesUsers409Code] + (typeof PostAuthorizationSourcesBuiltInDatabaseRulesUsers409Code)[keyof typeof PostAuthorizationSourcesBuiltInDatabaseRulesUsers409Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostAuthorizationSourcesBuiltInDatabaseRulesUsers409Code = { @@ -415,7 +415,7 @@ export type PostAuthorizationSourcesBuiltInDatabaseRulesUsers409 = { } export type PostAuthorizationSourcesBuiltInDatabaseRulesUsers400Code = - typeof PostAuthorizationSourcesBuiltInDatabaseRulesUsers400Code[keyof typeof PostAuthorizationSourcesBuiltInDatabaseRulesUsers400Code] + (typeof PostAuthorizationSourcesBuiltInDatabaseRulesUsers400Code)[keyof typeof PostAuthorizationSourcesBuiltInDatabaseRulesUsers400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostAuthorizationSourcesBuiltInDatabaseRulesUsers400Code = { @@ -465,7 +465,7 @@ export interface MongoTopology { export type LdapSslServerNameIndication = string | 'disable' -export type LdapSslLogLevel = typeof LdapSslLogLevel[keyof typeof LdapSslLogLevel] +export type LdapSslLogLevel = (typeof LdapSslLogLevel)[keyof typeof LdapSslLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const LdapSslLogLevel = { @@ -481,7 +481,7 @@ export const LdapSslLogLevel = { all: 'all', } as const -export type LdapSslVerify = typeof LdapSslVerify[keyof typeof LdapSslVerify] +export type LdapSslVerify = (typeof LdapSslVerify)[keyof typeof LdapSslVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const LdapSslVerify = { @@ -511,7 +511,7 @@ export interface LdapSsl { export type EmqxSslClientOptsServerNameIndication = string | 'disable' export type EmqxSslClientOptsLogLevel = - typeof EmqxSslClientOptsLogLevel[keyof typeof EmqxSslClientOptsLogLevel] + (typeof EmqxSslClientOptsLogLevel)[keyof typeof EmqxSslClientOptsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxSslClientOptsLogLevel = { @@ -528,7 +528,7 @@ export const EmqxSslClientOptsLogLevel = { } as const export type EmqxSslClientOptsVerify = - typeof EmqxSslClientOptsVerify[keyof typeof EmqxSslClientOptsVerify] + (typeof EmqxSslClientOptsVerify)[keyof typeof EmqxSslClientOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxSslClientOptsVerify = { @@ -572,7 +572,7 @@ export interface EmqxAuthzSchemaResourceMetrics { } export type EmqxAuthzSchemaNodeStatusStatus = - typeof EmqxAuthzSchemaNodeStatusStatus[keyof typeof EmqxAuthzSchemaNodeStatusStatus] + (typeof EmqxAuthzSchemaNodeStatusStatus)[keyof typeof EmqxAuthzSchemaNodeStatusStatus] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxAuthzSchemaNodeStatusStatus = { @@ -597,7 +597,7 @@ export interface EmqxAuthzSchemaNodeError { } export type EmqxAuthzSchemaMetricsStatusFieldsStatus = - typeof EmqxAuthzSchemaMetricsStatusFieldsStatus[keyof typeof EmqxAuthzSchemaMetricsStatusFieldsStatus] + (typeof EmqxAuthzSchemaMetricsStatusFieldsStatus)[keyof typeof EmqxAuthzSchemaMetricsStatusFieldsStatus] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxAuthzSchemaMetricsStatusFieldsStatus = { @@ -653,7 +653,7 @@ export interface EmqxAuthzApiSourcesSources { } export type EmqxAuthzApiSourcesRequestSourcesOrderType = - typeof EmqxAuthzApiSourcesRequestSourcesOrderType[keyof typeof EmqxAuthzApiSourcesRequestSourcesOrderType] + (typeof EmqxAuthzApiSourcesRequestSourcesOrderType)[keyof typeof EmqxAuthzApiSourcesRequestSourcesOrderType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxAuthzApiSourcesRequestSourcesOrderType = { @@ -692,7 +692,7 @@ export interface EmqxAuthzApiMnesiaRules { export type EmqxAuthzApiMnesiaRuleItemRetain = boolean | 'all' export type EmqxAuthzApiMnesiaRuleItemAction = - typeof EmqxAuthzApiMnesiaRuleItemAction[keyof typeof EmqxAuthzApiMnesiaRuleItemAction] + (typeof EmqxAuthzApiMnesiaRuleItemAction)[keyof typeof EmqxAuthzApiMnesiaRuleItemAction] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxAuthzApiMnesiaRuleItemAction = { @@ -702,7 +702,7 @@ export const EmqxAuthzApiMnesiaRuleItemAction = { } as const export type EmqxAuthzApiMnesiaRuleItemPermission = - typeof EmqxAuthzApiMnesiaRuleItemPermission[keyof typeof EmqxAuthzApiMnesiaRuleItemPermission] + (typeof EmqxAuthzApiMnesiaRuleItemPermission)[keyof typeof EmqxAuthzApiMnesiaRuleItemPermission] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxAuthzApiMnesiaRuleItemPermission = { @@ -740,14 +740,14 @@ export interface ConnectorHttpRequest { } export type AuthzRedisSingleRedisType = - typeof AuthzRedisSingleRedisType[keyof typeof AuthzRedisSingleRedisType] + (typeof AuthzRedisSingleRedisType)[keyof typeof AuthzRedisSingleRedisType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzRedisSingleRedisType = { single: 'single', } as const -export type AuthzRedisSingleType = typeof AuthzRedisSingleType[keyof typeof AuthzRedisSingleType] +export type AuthzRedisSingleType = (typeof AuthzRedisSingleType)[keyof typeof AuthzRedisSingleType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzRedisSingleType = { @@ -770,7 +770,7 @@ export interface AuthzRedisSingle { } export type AuthzRedisSentinelRedisType = - typeof AuthzRedisSentinelRedisType[keyof typeof AuthzRedisSentinelRedisType] + (typeof AuthzRedisSentinelRedisType)[keyof typeof AuthzRedisSentinelRedisType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzRedisSentinelRedisType = { @@ -778,7 +778,7 @@ export const AuthzRedisSentinelRedisType = { } as const export type AuthzRedisSentinelType = - typeof AuthzRedisSentinelType[keyof typeof AuthzRedisSentinelType] + (typeof AuthzRedisSentinelType)[keyof typeof AuthzRedisSentinelType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzRedisSentinelType = { @@ -802,14 +802,15 @@ export interface AuthzRedisSentinel { } export type AuthzRedisClusterRedisType = - typeof AuthzRedisClusterRedisType[keyof typeof AuthzRedisClusterRedisType] + (typeof AuthzRedisClusterRedisType)[keyof typeof AuthzRedisClusterRedisType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzRedisClusterRedisType = { cluster: 'cluster', } as const -export type AuthzRedisClusterType = typeof AuthzRedisClusterType[keyof typeof AuthzRedisClusterType] +export type AuthzRedisClusterType = + (typeof AuthzRedisClusterType)[keyof typeof AuthzRedisClusterType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzRedisClusterType = { @@ -832,7 +833,7 @@ export interface AuthzRedisCluster { export type AuthzPostgresqlPrepareStatement = { [key: string]: any } -export type AuthzPostgresqlType = typeof AuthzPostgresqlType[keyof typeof AuthzPostgresqlType] +export type AuthzPostgresqlType = (typeof AuthzPostgresqlType)[keyof typeof AuthzPostgresqlType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzPostgresqlType = { @@ -857,7 +858,7 @@ export interface AuthzPostgresql { export type AuthzMysqlPrepareStatement = { [key: string]: any } -export type AuthzMysqlType = typeof AuthzMysqlType[keyof typeof AuthzMysqlType] +export type AuthzMysqlType = (typeof AuthzMysqlType)[keyof typeof AuthzMysqlType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMysqlType = { @@ -880,7 +881,7 @@ export interface AuthzMysql { } export type AuthzMongoSingleUseLegacyProtocol = - typeof AuthzMongoSingleUseLegacyProtocol[keyof typeof AuthzMongoSingleUseLegacyProtocol] + (typeof AuthzMongoSingleUseLegacyProtocol)[keyof typeof AuthzMongoSingleUseLegacyProtocol] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoSingleUseLegacyProtocol = { @@ -889,7 +890,8 @@ export const AuthzMongoSingleUseLegacyProtocol = { false: 'false', } as const -export type AuthzMongoSingleWMode = typeof AuthzMongoSingleWMode[keyof typeof AuthzMongoSingleWMode] +export type AuthzMongoSingleWMode = + (typeof AuthzMongoSingleWMode)[keyof typeof AuthzMongoSingleWMode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoSingleWMode = { @@ -898,7 +900,7 @@ export const AuthzMongoSingleWMode = { } as const export type AuthzMongoSingleMongoType = - typeof AuthzMongoSingleMongoType[keyof typeof AuthzMongoSingleMongoType] + (typeof AuthzMongoSingleMongoType)[keyof typeof AuthzMongoSingleMongoType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoSingleMongoType = { @@ -907,7 +909,7 @@ export const AuthzMongoSingleMongoType = { export type AuthzMongoSingleFilter = { [key: string]: any } -export type AuthzMongoSingleType = typeof AuthzMongoSingleType[keyof typeof AuthzMongoSingleType] +export type AuthzMongoSingleType = (typeof AuthzMongoSingleType)[keyof typeof AuthzMongoSingleType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoSingleType = { @@ -919,6 +921,8 @@ export interface AuthzMongoSingle { enable?: boolean collection: string filter?: AuthzMongoSingleFilter + limit?: number + skip?: number mongo_type: AuthzMongoSingleMongoType server: string w_mode?: AuthzMongoSingleWMode @@ -934,7 +938,7 @@ export interface AuthzMongoSingle { } export type AuthzMongoShardedUseLegacyProtocol = - typeof AuthzMongoShardedUseLegacyProtocol[keyof typeof AuthzMongoShardedUseLegacyProtocol] + (typeof AuthzMongoShardedUseLegacyProtocol)[keyof typeof AuthzMongoShardedUseLegacyProtocol] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoShardedUseLegacyProtocol = { @@ -944,7 +948,7 @@ export const AuthzMongoShardedUseLegacyProtocol = { } as const export type AuthzMongoShardedWMode = - typeof AuthzMongoShardedWMode[keyof typeof AuthzMongoShardedWMode] + (typeof AuthzMongoShardedWMode)[keyof typeof AuthzMongoShardedWMode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoShardedWMode = { @@ -953,7 +957,7 @@ export const AuthzMongoShardedWMode = { } as const export type AuthzMongoShardedMongoType = - typeof AuthzMongoShardedMongoType[keyof typeof AuthzMongoShardedMongoType] + (typeof AuthzMongoShardedMongoType)[keyof typeof AuthzMongoShardedMongoType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoShardedMongoType = { @@ -962,7 +966,8 @@ export const AuthzMongoShardedMongoType = { export type AuthzMongoShardedFilter = { [key: string]: any } -export type AuthzMongoShardedType = typeof AuthzMongoShardedType[keyof typeof AuthzMongoShardedType] +export type AuthzMongoShardedType = + (typeof AuthzMongoShardedType)[keyof typeof AuthzMongoShardedType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoShardedType = { @@ -974,6 +979,8 @@ export interface AuthzMongoSharded { enable?: boolean collection: string filter?: AuthzMongoShardedFilter + limit?: number + skip?: number mongo_type: AuthzMongoShardedMongoType servers: string w_mode?: AuthzMongoShardedWMode @@ -989,7 +996,7 @@ export interface AuthzMongoSharded { } export type AuthzMongoRsUseLegacyProtocol = - typeof AuthzMongoRsUseLegacyProtocol[keyof typeof AuthzMongoRsUseLegacyProtocol] + (typeof AuthzMongoRsUseLegacyProtocol)[keyof typeof AuthzMongoRsUseLegacyProtocol] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoRsUseLegacyProtocol = { @@ -998,7 +1005,7 @@ export const AuthzMongoRsUseLegacyProtocol = { false: 'false', } as const -export type AuthzMongoRsRMode = typeof AuthzMongoRsRMode[keyof typeof AuthzMongoRsRMode] +export type AuthzMongoRsRMode = (typeof AuthzMongoRsRMode)[keyof typeof AuthzMongoRsRMode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoRsRMode = { @@ -1006,7 +1013,7 @@ export const AuthzMongoRsRMode = { slave_ok: 'slave_ok', } as const -export type AuthzMongoRsWMode = typeof AuthzMongoRsWMode[keyof typeof AuthzMongoRsWMode] +export type AuthzMongoRsWMode = (typeof AuthzMongoRsWMode)[keyof typeof AuthzMongoRsWMode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoRsWMode = { @@ -1014,7 +1021,8 @@ export const AuthzMongoRsWMode = { safe: 'safe', } as const -export type AuthzMongoRsMongoType = typeof AuthzMongoRsMongoType[keyof typeof AuthzMongoRsMongoType] +export type AuthzMongoRsMongoType = + (typeof AuthzMongoRsMongoType)[keyof typeof AuthzMongoRsMongoType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoRsMongoType = { @@ -1023,7 +1031,7 @@ export const AuthzMongoRsMongoType = { export type AuthzMongoRsFilter = { [key: string]: any } -export type AuthzMongoRsType = typeof AuthzMongoRsType[keyof typeof AuthzMongoRsType] +export type AuthzMongoRsType = (typeof AuthzMongoRsType)[keyof typeof AuthzMongoRsType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzMongoRsType = { @@ -1035,6 +1043,8 @@ export interface AuthzMongoRs { enable?: boolean collection: string filter?: AuthzMongoRsFilter + limit?: number + skip?: number mongo_type: AuthzMongoRsMongoType servers: string w_mode?: AuthzMongoRsWMode @@ -1051,7 +1061,7 @@ export interface AuthzMongoRs { ssl?: EmqxSslClientOpts } -export type AuthzLdapType = typeof AuthzLdapType[keyof typeof AuthzLdapType] +export type AuthzLdapType = (typeof AuthzLdapType)[keyof typeof AuthzLdapType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzLdapType = { @@ -1077,7 +1087,7 @@ export interface AuthzLdap { export type AuthzHttpPostHeaders = { [key: string]: any } -export type AuthzHttpPostMethod = typeof AuthzHttpPostMethod[keyof typeof AuthzHttpPostMethod] +export type AuthzHttpPostMethod = (typeof AuthzHttpPostMethod)[keyof typeof AuthzHttpPostMethod] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzHttpPostMethod = { @@ -1088,7 +1098,7 @@ export type AuthzHttpPostBody = { $name?: string } -export type AuthzHttpPostType = typeof AuthzHttpPostType[keyof typeof AuthzHttpPostType] +export type AuthzHttpPostType = (typeof AuthzHttpPostType)[keyof typeof AuthzHttpPostType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzHttpPostType = { @@ -1116,7 +1126,7 @@ export interface AuthzHttpPost { export type AuthzHttpGetHeaders = { [key: string]: any } -export type AuthzHttpGetMethod = typeof AuthzHttpGetMethod[keyof typeof AuthzHttpGetMethod] +export type AuthzHttpGetMethod = (typeof AuthzHttpGetMethod)[keyof typeof AuthzHttpGetMethod] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzHttpGetMethod = { @@ -1127,7 +1137,7 @@ export type AuthzHttpGetBody = { $name?: string } -export type AuthzHttpGetType = typeof AuthzHttpGetType[keyof typeof AuthzHttpGetType] +export type AuthzHttpGetType = (typeof AuthzHttpGetType)[keyof typeof AuthzHttpGetType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzHttpGetType = { @@ -1153,7 +1163,7 @@ export interface AuthzHttpGet { headers?: AuthzHttpGetHeaders } -export type AuthzBuiltinDbType = typeof AuthzBuiltinDbType[keyof typeof AuthzBuiltinDbType] +export type AuthzBuiltinDbType = (typeof AuthzBuiltinDbType)[keyof typeof AuthzBuiltinDbType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzBuiltinDbType = { @@ -1166,7 +1176,7 @@ export interface AuthzBuiltinDb { max_rules?: number } -export type AuthzApiFileType = typeof AuthzApiFileType[keyof typeof AuthzApiFileType] +export type AuthzApiFileType = (typeof AuthzApiFileType)[keyof typeof AuthzApiFileType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthzApiFileType = { diff --git a/src/types/schemas/bridges.schemas.ts b/src/types/schemas/bridges.schemas.ts index 2c3295f9f..415fdc966 100644 --- a/src/types/schemas/bridges.schemas.ts +++ b/src/types/schemas/bridges.schemas.ts @@ -334,6 +334,11 @@ export interface EmqxSslClientOpts { server_name_indication?: EmqxSslClientOptsServerNameIndication } +export interface ConnectorMqttStaticClientidEntry { + node: string + ids: string[] +} + export interface ConnectorMqttIngressRemote { topic: string qos?: number @@ -445,6 +450,7 @@ export interface BridgeMqttPut { mode?: BridgeMqttPutMode server: string clientid_prefix?: string + static_clientids?: ConnectorMqttStaticClientidEntry[] /** @deprecated */ reconnect_interval?: string proto_ver?: BridgeMqttPutProtoVer @@ -498,6 +504,7 @@ export interface BridgeMqttPost { mode?: BridgeMqttPostMode server: string clientid_prefix?: string + static_clientids?: ConnectorMqttStaticClientidEntry[] /** @deprecated */ reconnect_interval?: string proto_ver?: BridgeMqttPostProtoVer @@ -554,6 +561,7 @@ export interface BridgeMqttGet { mode?: BridgeMqttGetMode server: string clientid_prefix?: string + static_clientids?: ConnectorMqttStaticClientidEntry[] /** @deprecated */ reconnect_interval?: string proto_ver?: BridgeMqttGetProtoVer diff --git a/src/types/schemas/configs.schemas.ts b/src/types/schemas/configs.schemas.ts index 0036c30c8..15c054abd 100644 --- a/src/types/schemas/configs.schemas.ts +++ b/src/types/schemas/configs.schemas.ts @@ -1,4 +1,4 @@ -export type PutConfigsLog403Code = typeof PutConfigsLog403Code[keyof typeof PutConfigsLog403Code] +export type PutConfigsLog403Code = (typeof PutConfigsLog403Code)[keyof typeof PutConfigsLog403Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsLog403Code = { @@ -10,7 +10,7 @@ export type PutConfigsLog403 = { message?: string } -export type PutConfigsLog400Code = typeof PutConfigsLog400Code[keyof typeof PutConfigsLog400Code] +export type PutConfigsLog400Code = (typeof PutConfigsLog400Code)[keyof typeof PutConfigsLog400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsLog400Code = { @@ -23,7 +23,7 @@ export type PutConfigsLog400 = { message?: string } -export type GetConfigsLog404Code = typeof GetConfigsLog404Code[keyof typeof GetConfigsLog404Code] +export type GetConfigsLog404Code = (typeof GetConfigsLog404Code)[keyof typeof GetConfigsLog404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetConfigsLog404Code = { @@ -35,7 +35,7 @@ export type GetConfigsLog404 = { message?: string } -export type PutConfigs400Code = typeof PutConfigs400Code[keyof typeof PutConfigs400Code] +export type PutConfigs400Code = (typeof PutConfigs400Code)[keyof typeof PutConfigs400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigs400Code = { @@ -47,7 +47,7 @@ export type PutConfigs400 = { message?: string } -export type PutConfigsMode = typeof PutConfigsMode[keyof typeof PutConfigsMode] +export type PutConfigsMode = (typeof PutConfigsMode)[keyof typeof PutConfigsMode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsMode = { @@ -60,7 +60,7 @@ export type PutConfigsParams = { ignore_readonly?: boolean } -export type GetConfigs500Code = typeof GetConfigs500Code[keyof typeof GetConfigs500Code] +export type GetConfigs500Code = (typeof GetConfigs500Code)[keyof typeof GetConfigs500Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetConfigs500Code = { @@ -72,7 +72,7 @@ export type GetConfigs500 = { message?: string } -export type GetConfigs404Code = typeof GetConfigs404Code[keyof typeof GetConfigs404Code] +export type GetConfigs404Code = (typeof GetConfigs404Code)[keyof typeof GetConfigs404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetConfigs404Code = { @@ -84,7 +84,7 @@ export type GetConfigs404 = { message?: string } -export type GetConfigs400Code = typeof GetConfigs400Code[keyof typeof GetConfigs400Code] +export type GetConfigs400Code = (typeof GetConfigs400Code)[keyof typeof GetConfigs400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetConfigs400Code = { @@ -98,7 +98,7 @@ export type GetConfigs400 = { export type GetConfigs200Two = { [key: string]: any } -export type GetConfigsKey = typeof GetConfigsKey[keyof typeof GetConfigsKey] +export type GetConfigsKey = (typeof GetConfigsKey)[keyof typeof GetConfigsKey] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetConfigsKey = { @@ -128,7 +128,6 @@ export const GetConfigsKey = { log: 'log', mqtt: 'mqtt', node: 'node', - opentelemetry: 'opentelemetry', overload_protection: 'overload_protection', prometheus: 'prometheus', psk_authentication: 'psk_authentication', @@ -150,7 +149,7 @@ export type GetConfigsParams = { } export type PostConfigsResetRootname403Code = - typeof PostConfigsResetRootname403Code[keyof typeof PostConfigsResetRootname403Code] + (typeof PostConfigsResetRootname403Code)[keyof typeof PostConfigsResetRootname403Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostConfigsResetRootname403Code = { @@ -163,7 +162,7 @@ export type PostConfigsResetRootname403 = { } export type PostConfigsResetRootname400Code = - typeof PostConfigsResetRootname400Code[keyof typeof PostConfigsResetRootname400Code] + (typeof PostConfigsResetRootname400Code)[keyof typeof PostConfigsResetRootname400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostConfigsResetRootname400Code = { @@ -181,7 +180,7 @@ export type PostConfigsResetRootnameParams = { } export type PutConfigsBroker403Code = - typeof PutConfigsBroker403Code[keyof typeof PutConfigsBroker403Code] + (typeof PutConfigsBroker403Code)[keyof typeof PutConfigsBroker403Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsBroker403Code = { @@ -194,7 +193,7 @@ export type PutConfigsBroker403 = { } export type PutConfigsBroker400Code = - typeof PutConfigsBroker400Code[keyof typeof PutConfigsBroker400Code] + (typeof PutConfigsBroker400Code)[keyof typeof PutConfigsBroker400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsBroker400Code = { @@ -208,7 +207,7 @@ export type PutConfigsBroker400 = { } export type GetConfigsBroker404Code = - typeof GetConfigsBroker404Code[keyof typeof GetConfigsBroker404Code] + (typeof GetConfigsBroker404Code)[keyof typeof GetConfigsBroker404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetConfigsBroker404Code = { @@ -221,7 +220,7 @@ export type GetConfigsBroker404 = { } export type PutConfigsDashboard403Code = - typeof PutConfigsDashboard403Code[keyof typeof PutConfigsDashboard403Code] + (typeof PutConfigsDashboard403Code)[keyof typeof PutConfigsDashboard403Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsDashboard403Code = { @@ -234,7 +233,7 @@ export type PutConfigsDashboard403 = { } export type PutConfigsDashboard400Code = - typeof PutConfigsDashboard400Code[keyof typeof PutConfigsDashboard400Code] + (typeof PutConfigsDashboard400Code)[keyof typeof PutConfigsDashboard400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsDashboard400Code = { @@ -248,7 +247,7 @@ export type PutConfigsDashboard400 = { } export type GetConfigsDashboard404Code = - typeof GetConfigsDashboard404Code[keyof typeof GetConfigsDashboard404Code] + (typeof GetConfigsDashboard404Code)[keyof typeof GetConfigsDashboard404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetConfigsDashboard404Code = { @@ -261,7 +260,7 @@ export type GetConfigsDashboard404 = { } export type PutConfigsAlarm403Code = - typeof PutConfigsAlarm403Code[keyof typeof PutConfigsAlarm403Code] + (typeof PutConfigsAlarm403Code)[keyof typeof PutConfigsAlarm403Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsAlarm403Code = { @@ -274,7 +273,7 @@ export type PutConfigsAlarm403 = { } export type PutConfigsAlarm400Code = - typeof PutConfigsAlarm400Code[keyof typeof PutConfigsAlarm400Code] + (typeof PutConfigsAlarm400Code)[keyof typeof PutConfigsAlarm400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsAlarm400Code = { @@ -288,7 +287,7 @@ export type PutConfigsAlarm400 = { } export type GetConfigsAlarm404Code = - typeof GetConfigsAlarm404Code[keyof typeof GetConfigsAlarm404Code] + (typeof GetConfigsAlarm404Code)[keyof typeof GetConfigsAlarm404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetConfigsAlarm404Code = { @@ -301,7 +300,7 @@ export type GetConfigsAlarm404 = { } export type PutConfigsGlobalZone403Code = - typeof PutConfigsGlobalZone403Code[keyof typeof PutConfigsGlobalZone403Code] + (typeof PutConfigsGlobalZone403Code)[keyof typeof PutConfigsGlobalZone403Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsGlobalZone403Code = { @@ -314,7 +313,7 @@ export type PutConfigsGlobalZone403 = { } export type PutConfigsGlobalZone400Code = - typeof PutConfigsGlobalZone400Code[keyof typeof PutConfigsGlobalZone400Code] + (typeof PutConfigsGlobalZone400Code)[keyof typeof PutConfigsGlobalZone400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsGlobalZone400Code = { @@ -351,7 +350,7 @@ export type GetConfigsGlobalZone200 = { } export type PutConfigsSysmon403Code = - typeof PutConfigsSysmon403Code[keyof typeof PutConfigsSysmon403Code] + (typeof PutConfigsSysmon403Code)[keyof typeof PutConfigsSysmon403Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsSysmon403Code = { @@ -364,7 +363,7 @@ export type PutConfigsSysmon403 = { } export type PutConfigsSysmon400Code = - typeof PutConfigsSysmon400Code[keyof typeof PutConfigsSysmon400Code] + (typeof PutConfigsSysmon400Code)[keyof typeof PutConfigsSysmon400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsSysmon400Code = { @@ -378,7 +377,7 @@ export type PutConfigsSysmon400 = { } export type GetConfigsSysmon404Code = - typeof GetConfigsSysmon404Code[keyof typeof GetConfigsSysmon404Code] + (typeof GetConfigsSysmon404Code)[keyof typeof GetConfigsSysmon404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetConfigsSysmon404Code = { @@ -391,7 +390,7 @@ export type GetConfigsSysmon404 = { } export type PutConfigsSysTopics403Code = - typeof PutConfigsSysTopics403Code[keyof typeof PutConfigsSysTopics403Code] + (typeof PutConfigsSysTopics403Code)[keyof typeof PutConfigsSysTopics403Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsSysTopics403Code = { @@ -404,7 +403,7 @@ export type PutConfigsSysTopics403 = { } export type PutConfigsSysTopics400Code = - typeof PutConfigsSysTopics400Code[keyof typeof PutConfigsSysTopics400Code] + (typeof PutConfigsSysTopics400Code)[keyof typeof PutConfigsSysTopics400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutConfigsSysTopics400Code = { @@ -418,7 +417,7 @@ export type PutConfigsSysTopics400 = { } export type GetConfigsSysTopics404Code = - typeof GetConfigsSysTopics404Code[keyof typeof GetConfigsSysTopics404Code] + (typeof GetConfigsSysTopics404Code)[keyof typeof GetConfigsSysTopics404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetConfigsSysTopics404Code = { @@ -461,6 +460,8 @@ export interface EmqxSysmonOs { export interface EmqxSysmon { vm?: EmqxSysmonVm os?: EmqxSysmonOs + mnesia_tm_mailbox_size_alarm_threshold?: number + broker_pool_mailbox_size_alarm_threshold?: number } export type EmqxSysTopicsSysHeartbeatInterval = string | 'disabled' @@ -478,7 +479,7 @@ export type EmqxMqttMaxSubscriptions = 'infinity' | number export type EmqxMqttMaxMqueueLen = 'infinity' | number export type EmqxMqttMqueueDefaultPriority = - typeof EmqxMqttMqueueDefaultPriority[keyof typeof EmqxMqttMqueueDefaultPriority] + (typeof EmqxMqttMqueueDefaultPriority)[keyof typeof EmqxMqttMqueueDefaultPriority] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxMqttMqueueDefaultPriority = { @@ -494,8 +495,10 @@ export type EmqxMqttMaxAwaitingRel = 'infinity' | number export type EmqxMqttMessageExpiryInterval = 'infinity' | string +export type EmqxMqttClientidOverride = string | 'disabled' + export type EmqxMqttPeerCertAsClientid = - typeof EmqxMqttPeerCertAsClientid[keyof typeof EmqxMqttPeerCertAsClientid] + (typeof EmqxMqttPeerCertAsClientid)[keyof typeof EmqxMqttPeerCertAsClientid] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxMqttPeerCertAsClientid = { @@ -508,7 +511,7 @@ export const EmqxMqttPeerCertAsClientid = { } as const export type EmqxMqttPeerCertAsUsername = - typeof EmqxMqttPeerCertAsUsername[keyof typeof EmqxMqttPeerCertAsUsername] + (typeof EmqxMqttPeerCertAsUsername)[keyof typeof EmqxMqttPeerCertAsUsername] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxMqttPeerCertAsUsername = { @@ -525,7 +528,7 @@ export type EmqxMqttRetryInterval = string | 'infinity' export type EmqxMqttServerKeepalive = 'disabled' | number export type EmqxMqttSharedSubscriptionInitialStickyPick = - typeof EmqxMqttSharedSubscriptionInitialStickyPick[keyof typeof EmqxMqttSharedSubscriptionInitialStickyPick] + (typeof EmqxMqttSharedSubscriptionInitialStickyPick)[keyof typeof EmqxMqttSharedSubscriptionInitialStickyPick] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxMqttSharedSubscriptionInitialStickyPick = { @@ -536,7 +539,7 @@ export const EmqxMqttSharedSubscriptionInitialStickyPick = { } as const export type EmqxMqttSharedSubscriptionStrategy = - typeof EmqxMqttSharedSubscriptionStrategy[keyof typeof EmqxMqttSharedSubscriptionStrategy] + (typeof EmqxMqttSharedSubscriptionStrategy)[keyof typeof EmqxMqttSharedSubscriptionStrategy] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxMqttSharedSubscriptionStrategy = { @@ -574,6 +577,7 @@ export interface EmqxMqtt { peer_cert_as_username?: EmqxMqttPeerCertAsUsername peer_cert_as_clientid?: EmqxMqttPeerCertAsClientid client_attrs_init?: EmqxClientAttrsInit[] + clientid_override?: EmqxMqttClientidOverride session_expiry_interval?: string message_expiry_interval?: EmqxMqttMessageExpiryInterval max_awaiting_rel?: EmqxMqttMaxAwaitingRel @@ -593,7 +597,7 @@ export interface EmqxLogThrottling { } export type EmqxLogFileHandlerPayloadEncode = - typeof EmqxLogFileHandlerPayloadEncode[keyof typeof EmqxLogFileHandlerPayloadEncode] + (typeof EmqxLogFileHandlerPayloadEncode)[keyof typeof EmqxLogFileHandlerPayloadEncode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxLogFileHandlerPayloadEncode = { @@ -603,7 +607,7 @@ export const EmqxLogFileHandlerPayloadEncode = { } as const export type EmqxLogFileHandlerTimestampFormat = - typeof EmqxLogFileHandlerTimestampFormat[keyof typeof EmqxLogFileHandlerTimestampFormat] + (typeof EmqxLogFileHandlerTimestampFormat)[keyof typeof EmqxLogFileHandlerTimestampFormat] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxLogFileHandlerTimestampFormat = { @@ -613,7 +617,7 @@ export const EmqxLogFileHandlerTimestampFormat = { } as const export type EmqxLogFileHandlerFormatter = - typeof EmqxLogFileHandlerFormatter[keyof typeof EmqxLogFileHandlerFormatter] + (typeof EmqxLogFileHandlerFormatter)[keyof typeof EmqxLogFileHandlerFormatter] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxLogFileHandlerFormatter = { @@ -622,7 +626,7 @@ export const EmqxLogFileHandlerFormatter = { } as const export type EmqxLogFileHandlerLevel = - typeof EmqxLogFileHandlerLevel[keyof typeof EmqxLogFileHandlerLevel] + (typeof EmqxLogFileHandlerLevel)[keyof typeof EmqxLogFileHandlerLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxLogFileHandlerLevel = { @@ -694,7 +698,7 @@ export interface EmqxDurableSessions { } export type EmqxConsoleHandlerPayloadEncode = - typeof EmqxConsoleHandlerPayloadEncode[keyof typeof EmqxConsoleHandlerPayloadEncode] + (typeof EmqxConsoleHandlerPayloadEncode)[keyof typeof EmqxConsoleHandlerPayloadEncode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxConsoleHandlerPayloadEncode = { @@ -704,7 +708,7 @@ export const EmqxConsoleHandlerPayloadEncode = { } as const export type EmqxConsoleHandlerTimestampFormat = - typeof EmqxConsoleHandlerTimestampFormat[keyof typeof EmqxConsoleHandlerTimestampFormat] + (typeof EmqxConsoleHandlerTimestampFormat)[keyof typeof EmqxConsoleHandlerTimestampFormat] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxConsoleHandlerTimestampFormat = { @@ -714,7 +718,7 @@ export const EmqxConsoleHandlerTimestampFormat = { } as const export type EmqxConsoleHandlerFormatter = - typeof EmqxConsoleHandlerFormatter[keyof typeof EmqxConsoleHandlerFormatter] + (typeof EmqxConsoleHandlerFormatter)[keyof typeof EmqxConsoleHandlerFormatter] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxConsoleHandlerFormatter = { @@ -723,7 +727,7 @@ export const EmqxConsoleHandlerFormatter = { } as const export type EmqxConsoleHandlerLevel = - typeof EmqxConsoleHandlerLevel[keyof typeof EmqxConsoleHandlerLevel] + (typeof EmqxConsoleHandlerLevel)[keyof typeof EmqxConsoleHandlerLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxConsoleHandlerLevel = { @@ -763,7 +767,7 @@ export interface EmqxBroker { session_history_retain?: string } -export type EmqxAlarmActionsItem = typeof EmqxAlarmActionsItem[keyof typeof EmqxAlarmActionsItem] +export type EmqxAlarmActionsItem = (typeof EmqxAlarmActionsItem)[keyof typeof EmqxAlarmActionsItem] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxAlarmActionsItem = { @@ -778,7 +782,7 @@ export interface EmqxAlarm { } export type DashboardSslOptionsLogLevel = - typeof DashboardSslOptionsLogLevel[keyof typeof DashboardSslOptionsLogLevel] + (typeof DashboardSslOptionsLogLevel)[keyof typeof DashboardSslOptionsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DashboardSslOptionsLogLevel = { @@ -795,7 +799,7 @@ export const DashboardSslOptionsLogLevel = { } as const export type DashboardSslOptionsVerify = - typeof DashboardSslOptionsVerify[keyof typeof DashboardSslOptionsVerify] + (typeof DashboardSslOptionsVerify)[keyof typeof DashboardSslOptionsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DashboardSslOptionsVerify = { diff --git a/src/types/schemas/connectors.schemas.ts b/src/types/schemas/connectors.schemas.ts index 4571989a4..dbb3b64d0 100644 --- a/src/types/schemas/connectors.schemas.ts +++ b/src/types/schemas/connectors.schemas.ts @@ -307,6 +307,11 @@ export interface ConnectorNodeStatus { status_reason?: string } +export interface ConnectorMqttStaticClientidEntry { + node: string + ids: string[] +} + export interface ConnectorMqttResourceOpts { health_check_interval?: string start_after_created?: boolean @@ -344,6 +349,7 @@ export interface ConnectorMqttPutConnector { mode?: ConnectorMqttPutConnectorMode server: string clientid_prefix?: string + static_clientids?: ConnectorMqttStaticClientidEntry[] /** @deprecated */ reconnect_interval?: string proto_ver?: ConnectorMqttPutConnectorProtoVer @@ -398,6 +404,7 @@ export interface ConnectorMqttPostConnector { mode?: ConnectorMqttPostConnectorMode server: string clientid_prefix?: string + static_clientids?: ConnectorMqttStaticClientidEntry[] /** @deprecated */ reconnect_interval?: string proto_ver?: ConnectorMqttPostConnectorProtoVer @@ -467,6 +474,7 @@ export interface ConnectorMqttGetConnector { mode?: ConnectorMqttGetConnectorMode server: string clientid_prefix?: string + static_clientids?: ConnectorMqttStaticClientidEntry[] /** @deprecated */ reconnect_interval?: string proto_ver?: ConnectorMqttGetConnectorProtoVer diff --git a/src/types/schemas/gatewayListeners.schemas.ts b/src/types/schemas/gatewayListeners.schemas.ts index e97824746..29ab3b2c4 100644 --- a/src/types/schemas/gatewayListeners.schemas.ts +++ b/src/types/schemas/gatewayListeners.schemas.ts @@ -1,5 +1,5 @@ export type PostGatewaysNameListenersIdAuthenticationUsers404Code = - typeof PostGatewaysNameListenersIdAuthenticationUsers404Code[keyof typeof PostGatewaysNameListenersIdAuthenticationUsers404Code] + (typeof PostGatewaysNameListenersIdAuthenticationUsers404Code)[keyof typeof PostGatewaysNameListenersIdAuthenticationUsers404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostGatewaysNameListenersIdAuthenticationUsers404Code = { @@ -13,7 +13,7 @@ export type PostGatewaysNameListenersIdAuthenticationUsers404 = { } export type PostGatewaysNameListenersIdAuthenticationUsers400Code = - typeof PostGatewaysNameListenersIdAuthenticationUsers400Code[keyof typeof PostGatewaysNameListenersIdAuthenticationUsers400Code] + (typeof PostGatewaysNameListenersIdAuthenticationUsers400Code)[keyof typeof PostGatewaysNameListenersIdAuthenticationUsers400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostGatewaysNameListenersIdAuthenticationUsers400Code = { @@ -26,7 +26,7 @@ export type PostGatewaysNameListenersIdAuthenticationUsers400 = { } export type GetGatewaysNameListenersIdAuthenticationUsers404Code = - typeof GetGatewaysNameListenersIdAuthenticationUsers404Code[keyof typeof GetGatewaysNameListenersIdAuthenticationUsers404Code] + (typeof GetGatewaysNameListenersIdAuthenticationUsers404Code)[keyof typeof GetGatewaysNameListenersIdAuthenticationUsers404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysNameListenersIdAuthenticationUsers404Code = { @@ -40,7 +40,7 @@ export type GetGatewaysNameListenersIdAuthenticationUsers404 = { } export type GetGatewaysNameListenersIdAuthenticationUsers400Code = - typeof GetGatewaysNameListenersIdAuthenticationUsers400Code[keyof typeof GetGatewaysNameListenersIdAuthenticationUsers400Code] + (typeof GetGatewaysNameListenersIdAuthenticationUsers400Code)[keyof typeof GetGatewaysNameListenersIdAuthenticationUsers400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysNameListenersIdAuthenticationUsers400Code = { @@ -58,7 +58,7 @@ export type GetGatewaysNameListenersIdAuthenticationUsersParams = { } export type DeleteGatewaysNameListenersIdAuthenticationUsersUid404Code = - typeof DeleteGatewaysNameListenersIdAuthenticationUsersUid404Code[keyof typeof DeleteGatewaysNameListenersIdAuthenticationUsersUid404Code] + (typeof DeleteGatewaysNameListenersIdAuthenticationUsersUid404Code)[keyof typeof DeleteGatewaysNameListenersIdAuthenticationUsersUid404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteGatewaysNameListenersIdAuthenticationUsersUid404Code = { @@ -72,7 +72,7 @@ export type DeleteGatewaysNameListenersIdAuthenticationUsersUid404 = { } export type DeleteGatewaysNameListenersIdAuthenticationUsersUid400Code = - typeof DeleteGatewaysNameListenersIdAuthenticationUsersUid400Code[keyof typeof DeleteGatewaysNameListenersIdAuthenticationUsersUid400Code] + (typeof DeleteGatewaysNameListenersIdAuthenticationUsersUid400Code)[keyof typeof DeleteGatewaysNameListenersIdAuthenticationUsersUid400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteGatewaysNameListenersIdAuthenticationUsersUid400Code = { @@ -85,7 +85,7 @@ export type DeleteGatewaysNameListenersIdAuthenticationUsersUid400 = { } export type PutGatewaysNameListenersIdAuthenticationUsersUid404Code = - typeof PutGatewaysNameListenersIdAuthenticationUsersUid404Code[keyof typeof PutGatewaysNameListenersIdAuthenticationUsersUid404Code] + (typeof PutGatewaysNameListenersIdAuthenticationUsersUid404Code)[keyof typeof PutGatewaysNameListenersIdAuthenticationUsersUid404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutGatewaysNameListenersIdAuthenticationUsersUid404Code = { @@ -99,7 +99,7 @@ export type PutGatewaysNameListenersIdAuthenticationUsersUid404 = { } export type PutGatewaysNameListenersIdAuthenticationUsersUid400Code = - typeof PutGatewaysNameListenersIdAuthenticationUsersUid400Code[keyof typeof PutGatewaysNameListenersIdAuthenticationUsersUid400Code] + (typeof PutGatewaysNameListenersIdAuthenticationUsersUid400Code)[keyof typeof PutGatewaysNameListenersIdAuthenticationUsersUid400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutGatewaysNameListenersIdAuthenticationUsersUid400Code = { @@ -112,7 +112,7 @@ export type PutGatewaysNameListenersIdAuthenticationUsersUid400 = { } export type GetGatewaysNameListenersIdAuthenticationUsersUid404Code = - typeof GetGatewaysNameListenersIdAuthenticationUsersUid404Code[keyof typeof GetGatewaysNameListenersIdAuthenticationUsersUid404Code] + (typeof GetGatewaysNameListenersIdAuthenticationUsersUid404Code)[keyof typeof GetGatewaysNameListenersIdAuthenticationUsersUid404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysNameListenersIdAuthenticationUsersUid404Code = { @@ -126,7 +126,7 @@ export type GetGatewaysNameListenersIdAuthenticationUsersUid404 = { } export type GetGatewaysNameListenersIdAuthenticationUsersUid400Code = - typeof GetGatewaysNameListenersIdAuthenticationUsersUid400Code[keyof typeof GetGatewaysNameListenersIdAuthenticationUsersUid400Code] + (typeof GetGatewaysNameListenersIdAuthenticationUsersUid400Code)[keyof typeof GetGatewaysNameListenersIdAuthenticationUsersUid400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysNameListenersIdAuthenticationUsersUid400Code = { @@ -139,7 +139,7 @@ export type GetGatewaysNameListenersIdAuthenticationUsersUid400 = { } export type DeleteGatewaysNameListenersId404Code = - typeof DeleteGatewaysNameListenersId404Code[keyof typeof DeleteGatewaysNameListenersId404Code] + (typeof DeleteGatewaysNameListenersId404Code)[keyof typeof DeleteGatewaysNameListenersId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteGatewaysNameListenersId404Code = { @@ -153,7 +153,7 @@ export type DeleteGatewaysNameListenersId404 = { } export type DeleteGatewaysNameListenersId400Code = - typeof DeleteGatewaysNameListenersId400Code[keyof typeof DeleteGatewaysNameListenersId400Code] + (typeof DeleteGatewaysNameListenersId400Code)[keyof typeof DeleteGatewaysNameListenersId400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteGatewaysNameListenersId400Code = { @@ -166,7 +166,7 @@ export type DeleteGatewaysNameListenersId400 = { } export type PutGatewaysNameListenersId404Code = - typeof PutGatewaysNameListenersId404Code[keyof typeof PutGatewaysNameListenersId404Code] + (typeof PutGatewaysNameListenersId404Code)[keyof typeof PutGatewaysNameListenersId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutGatewaysNameListenersId404Code = { @@ -180,7 +180,7 @@ export type PutGatewaysNameListenersId404 = { } export type PutGatewaysNameListenersId400Code = - typeof PutGatewaysNameListenersId400Code[keyof typeof PutGatewaysNameListenersId400Code] + (typeof PutGatewaysNameListenersId400Code)[keyof typeof PutGatewaysNameListenersId400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutGatewaysNameListenersId400Code = { @@ -209,7 +209,7 @@ export type PutGatewaysNameListenersIdBody = | EmqxGatewayApiTcpListener export type GetGatewaysNameListenersId404Code = - typeof GetGatewaysNameListenersId404Code[keyof typeof GetGatewaysNameListenersId404Code] + (typeof GetGatewaysNameListenersId404Code)[keyof typeof GetGatewaysNameListenersId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysNameListenersId404Code = { @@ -223,7 +223,7 @@ export type GetGatewaysNameListenersId404 = { } export type GetGatewaysNameListenersId400Code = - typeof GetGatewaysNameListenersId400Code[keyof typeof GetGatewaysNameListenersId400Code] + (typeof GetGatewaysNameListenersId400Code)[keyof typeof GetGatewaysNameListenersId400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysNameListenersId400Code = { @@ -244,7 +244,7 @@ export type GetGatewaysNameListenersId200 = | EmqxGatewayApiTcpListener export type PostGatewaysNameListeners404Code = - typeof PostGatewaysNameListeners404Code[keyof typeof PostGatewaysNameListeners404Code] + (typeof PostGatewaysNameListeners404Code)[keyof typeof PostGatewaysNameListeners404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostGatewaysNameListeners404Code = { @@ -258,7 +258,7 @@ export type PostGatewaysNameListeners404 = { } export type PostGatewaysNameListeners400Code = - typeof PostGatewaysNameListeners400Code[keyof typeof PostGatewaysNameListeners400Code] + (typeof PostGatewaysNameListeners400Code)[keyof typeof PostGatewaysNameListeners400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostGatewaysNameListeners400Code = { @@ -287,7 +287,7 @@ export type PostGatewaysNameListenersBody = | EmqxGatewayApiTcpListener export type GetGatewaysNameListeners404Code = - typeof GetGatewaysNameListeners404Code[keyof typeof GetGatewaysNameListeners404Code] + (typeof GetGatewaysNameListeners404Code)[keyof typeof GetGatewaysNameListeners404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysNameListeners404Code = { @@ -301,7 +301,7 @@ export type GetGatewaysNameListeners404 = { } export type GetGatewaysNameListeners400Code = - typeof GetGatewaysNameListeners400Code[keyof typeof GetGatewaysNameListeners400Code] + (typeof GetGatewaysNameListeners400Code)[keyof typeof GetGatewaysNameListeners400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysNameListeners400Code = { @@ -320,7 +320,7 @@ export type GetGatewaysNameListeners200Item = | EmqxGatewayApiListenersTcpListener export type PostGatewaysNameListenersIdAuthentication404Code = - typeof PostGatewaysNameListenersIdAuthentication404Code[keyof typeof PostGatewaysNameListenersIdAuthentication404Code] + (typeof PostGatewaysNameListenersIdAuthentication404Code)[keyof typeof PostGatewaysNameListenersIdAuthentication404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostGatewaysNameListenersIdAuthentication404Code = { @@ -334,7 +334,7 @@ export type PostGatewaysNameListenersIdAuthentication404 = { } export type PostGatewaysNameListenersIdAuthentication400Code = - typeof PostGatewaysNameListenersIdAuthentication400Code[keyof typeof PostGatewaysNameListenersIdAuthentication400Code] + (typeof PostGatewaysNameListenersIdAuthentication400Code)[keyof typeof PostGatewaysNameListenersIdAuthentication400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostGatewaysNameListenersIdAuthentication400Code = { @@ -383,7 +383,7 @@ export type PostGatewaysNameListenersIdAuthenticationBody = | AuthnBuiltinDb export type DeleteGatewaysNameListenersIdAuthentication404Code = - typeof DeleteGatewaysNameListenersIdAuthentication404Code[keyof typeof DeleteGatewaysNameListenersIdAuthentication404Code] + (typeof DeleteGatewaysNameListenersIdAuthentication404Code)[keyof typeof DeleteGatewaysNameListenersIdAuthentication404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteGatewaysNameListenersIdAuthentication404Code = { @@ -397,7 +397,7 @@ export type DeleteGatewaysNameListenersIdAuthentication404 = { } export type DeleteGatewaysNameListenersIdAuthentication400Code = - typeof DeleteGatewaysNameListenersIdAuthentication400Code[keyof typeof DeleteGatewaysNameListenersIdAuthentication400Code] + (typeof DeleteGatewaysNameListenersIdAuthentication400Code)[keyof typeof DeleteGatewaysNameListenersIdAuthentication400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteGatewaysNameListenersIdAuthentication400Code = { @@ -410,7 +410,7 @@ export type DeleteGatewaysNameListenersIdAuthentication400 = { } export type PutGatewaysNameListenersIdAuthentication404Code = - typeof PutGatewaysNameListenersIdAuthentication404Code[keyof typeof PutGatewaysNameListenersIdAuthentication404Code] + (typeof PutGatewaysNameListenersIdAuthentication404Code)[keyof typeof PutGatewaysNameListenersIdAuthentication404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutGatewaysNameListenersIdAuthentication404Code = { @@ -424,7 +424,7 @@ export type PutGatewaysNameListenersIdAuthentication404 = { } export type PutGatewaysNameListenersIdAuthentication400Code = - typeof PutGatewaysNameListenersIdAuthentication400Code[keyof typeof PutGatewaysNameListenersIdAuthentication400Code] + (typeof PutGatewaysNameListenersIdAuthentication400Code)[keyof typeof PutGatewaysNameListenersIdAuthentication400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutGatewaysNameListenersIdAuthentication400Code = { @@ -473,7 +473,7 @@ export type PutGatewaysNameListenersIdAuthenticationBody = | AuthnBuiltinDb export type GetGatewaysNameListenersIdAuthentication404Code = - typeof GetGatewaysNameListenersIdAuthentication404Code[keyof typeof GetGatewaysNameListenersIdAuthentication404Code] + (typeof GetGatewaysNameListenersIdAuthentication404Code)[keyof typeof GetGatewaysNameListenersIdAuthentication404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysNameListenersIdAuthentication404Code = { @@ -487,7 +487,7 @@ export type GetGatewaysNameListenersIdAuthentication404 = { } export type GetGatewaysNameListenersIdAuthentication400Code = - typeof GetGatewaysNameListenersIdAuthentication400Code[keyof typeof GetGatewaysNameListenersIdAuthentication400Code] + (typeof GetGatewaysNameListenersIdAuthentication400Code)[keyof typeof GetGatewaysNameListenersIdAuthentication400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysNameListenersIdAuthentication400Code = { @@ -547,7 +547,7 @@ export interface ListenersNodeStatus { export type LdapSslServerNameIndication = string | 'disable' -export type LdapSslLogLevel = typeof LdapSslLogLevel[keyof typeof LdapSslLogLevel] +export type LdapSslLogLevel = (typeof LdapSslLogLevel)[keyof typeof LdapSslLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const LdapSslLogLevel = { @@ -563,7 +563,7 @@ export const LdapSslLogLevel = { all: 'all', } as const -export type LdapSslVerify = typeof LdapSslVerify[keyof typeof LdapSslVerify] +export type LdapSslVerify = (typeof LdapSslVerify)[keyof typeof LdapSslVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const LdapSslVerify = { @@ -593,7 +593,7 @@ export interface LdapSsl { export type GatewayWebsocketMaxFrameSize = number | 'infinity' export type GatewayWebsocketPiggyback = - typeof GatewayWebsocketPiggyback[keyof typeof GatewayWebsocketPiggyback] + (typeof GatewayWebsocketPiggyback)[keyof typeof GatewayWebsocketPiggyback] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GatewayWebsocketPiggyback = { @@ -631,7 +631,7 @@ export interface GatewayUdpHealthCheck { } export type GatewayDtlsOptsLogLevel = - typeof GatewayDtlsOptsLogLevel[keyof typeof GatewayDtlsOptsLogLevel] + (typeof GatewayDtlsOptsLogLevel)[keyof typeof GatewayDtlsOptsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GatewayDtlsOptsLogLevel = { @@ -647,7 +647,8 @@ export const GatewayDtlsOptsLogLevel = { all: 'all', } as const -export type GatewayDtlsOptsVerify = typeof GatewayDtlsOptsVerify[keyof typeof GatewayDtlsOptsVerify] +export type GatewayDtlsOptsVerify = + (typeof GatewayDtlsOptsVerify)[keyof typeof GatewayDtlsOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GatewayDtlsOptsVerify = { @@ -690,6 +691,7 @@ export interface EmqxTcpOpts { buffer?: string high_watermark?: string nodelay?: boolean + nolinger?: boolean reuseaddr?: boolean keepalive?: string } @@ -697,7 +699,7 @@ export interface EmqxTcpOpts { export type EmqxSslClientOptsServerNameIndication = string | 'disable' export type EmqxSslClientOptsLogLevel = - typeof EmqxSslClientOptsLogLevel[keyof typeof EmqxSslClientOptsLogLevel] + (typeof EmqxSslClientOptsLogLevel)[keyof typeof EmqxSslClientOptsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxSslClientOptsLogLevel = { @@ -714,7 +716,7 @@ export const EmqxSslClientOptsLogLevel = { } as const export type EmqxSslClientOptsVerify = - typeof EmqxSslClientOptsVerify[keyof typeof EmqxSslClientOptsVerify] + (typeof EmqxSslClientOptsVerify)[keyof typeof EmqxSslClientOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxSslClientOptsVerify = { @@ -750,7 +752,7 @@ export interface EmqxOcsp { } export type EmqxListenerWssOptsLogLevel = - typeof EmqxListenerWssOptsLogLevel[keyof typeof EmqxListenerWssOptsLogLevel] + (typeof EmqxListenerWssOptsLogLevel)[keyof typeof EmqxListenerWssOptsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxListenerWssOptsLogLevel = { @@ -767,7 +769,7 @@ export const EmqxListenerWssOptsLogLevel = { } as const export type EmqxListenerWssOptsVerify = - typeof EmqxListenerWssOptsVerify[keyof typeof EmqxListenerWssOptsVerify] + (typeof EmqxListenerWssOptsVerify)[keyof typeof EmqxListenerWssOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxListenerWssOptsVerify = { @@ -798,7 +800,7 @@ export interface EmqxListenerWssOpts { } export type EmqxListenerSslOptsLogLevel = - typeof EmqxListenerSslOptsLogLevel[keyof typeof EmqxListenerSslOptsLogLevel] + (typeof EmqxListenerSslOptsLogLevel)[keyof typeof EmqxListenerSslOptsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxListenerSslOptsLogLevel = { @@ -815,7 +817,7 @@ export const EmqxListenerSslOptsLogLevel = { } as const export type EmqxListenerSslOptsVerify = - typeof EmqxListenerSslOptsVerify[keyof typeof EmqxListenerSslOptsVerify] + (typeof EmqxListenerSslOptsVerify)[keyof typeof EmqxListenerSslOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxListenerSslOptsVerify = { @@ -849,7 +851,7 @@ export interface EmqxListenerSslOpts { } export type EmqxDeflateOptsClientContextTakeover = - typeof EmqxDeflateOptsClientContextTakeover[keyof typeof EmqxDeflateOptsClientContextTakeover] + (typeof EmqxDeflateOptsClientContextTakeover)[keyof typeof EmqxDeflateOptsClientContextTakeover] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxDeflateOptsClientContextTakeover = { @@ -858,7 +860,7 @@ export const EmqxDeflateOptsClientContextTakeover = { } as const export type EmqxDeflateOptsServerContextTakeover = - typeof EmqxDeflateOptsServerContextTakeover[keyof typeof EmqxDeflateOptsServerContextTakeover] + (typeof EmqxDeflateOptsServerContextTakeover)[keyof typeof EmqxDeflateOptsServerContextTakeover] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxDeflateOptsServerContextTakeover = { @@ -867,7 +869,7 @@ export const EmqxDeflateOptsServerContextTakeover = { } as const export type EmqxDeflateOptsStrategy = - typeof EmqxDeflateOptsStrategy[keyof typeof EmqxDeflateOptsStrategy] + (typeof EmqxDeflateOptsStrategy)[keyof typeof EmqxDeflateOptsStrategy] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxDeflateOptsStrategy = { @@ -877,7 +879,7 @@ export const EmqxDeflateOptsStrategy = { rle: 'rle', } as const -export type EmqxDeflateOptsLevel = typeof EmqxDeflateOptsLevel[keyof typeof EmqxDeflateOptsLevel] +export type EmqxDeflateOptsLevel = (typeof EmqxDeflateOptsLevel)[keyof typeof EmqxDeflateOptsLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxDeflateOptsLevel = { @@ -900,7 +902,7 @@ export interface EmqxDeflateOpts { export type EmqxGatewayApiWssListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiWssListenerType = - typeof EmqxGatewayApiWssListenerType[keyof typeof EmqxGatewayApiWssListenerType] + (typeof EmqxGatewayApiWssListenerType)[keyof typeof EmqxGatewayApiWssListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiWssListenerType = { @@ -930,7 +932,7 @@ export interface EmqxGatewayApiWssListener { export type EmqxGatewayApiWsListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiWsListenerType = - typeof EmqxGatewayApiWsListenerType[keyof typeof EmqxGatewayApiWsListenerType] + (typeof EmqxGatewayApiWsListenerType)[keyof typeof EmqxGatewayApiWsListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiWsListenerType = { @@ -959,7 +961,7 @@ export interface EmqxGatewayApiWsListener { export type EmqxGatewayApiUdpListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiUdpListenerType = - typeof EmqxGatewayApiUdpListenerType[keyof typeof EmqxGatewayApiUdpListenerType] + (typeof EmqxGatewayApiUdpListenerType)[keyof typeof EmqxGatewayApiUdpListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiUdpListenerType = { @@ -985,7 +987,7 @@ export interface EmqxGatewayApiUdpListener { export type EmqxGatewayApiTcpListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiTcpListenerType = - typeof EmqxGatewayApiTcpListenerType[keyof typeof EmqxGatewayApiTcpListenerType] + (typeof EmqxGatewayApiTcpListenerType)[keyof typeof EmqxGatewayApiTcpListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiTcpListenerType = { @@ -1013,7 +1015,7 @@ export interface EmqxGatewayApiTcpListener { export type EmqxGatewayApiSslListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiSslListenerType = - typeof EmqxGatewayApiSslListenerType[keyof typeof EmqxGatewayApiSslListenerType] + (typeof EmqxGatewayApiSslListenerType)[keyof typeof EmqxGatewayApiSslListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiSslListenerType = { @@ -1042,7 +1044,7 @@ export interface EmqxGatewayApiSslListener { export type EmqxGatewayApiDtlsListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiDtlsListenerType = - typeof EmqxGatewayApiDtlsListenerType[keyof typeof EmqxGatewayApiDtlsListenerType] + (typeof EmqxGatewayApiDtlsListenerType)[keyof typeof EmqxGatewayApiDtlsListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiDtlsListenerType = { @@ -1070,7 +1072,7 @@ export interface EmqxGatewayApiDtlsListener { export type EmqxGatewayApiListenersUdpListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiListenersUdpListenerType = - typeof EmqxGatewayApiListenersUdpListenerType[keyof typeof EmqxGatewayApiListenersUdpListenerType] + (typeof EmqxGatewayApiListenersUdpListenerType)[keyof typeof EmqxGatewayApiListenersUdpListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiListenersUdpListenerType = { @@ -1098,7 +1100,7 @@ export interface EmqxGatewayApiListenersUdpListener { export type EmqxGatewayApiListenersTcpListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiListenersTcpListenerType = - typeof EmqxGatewayApiListenersTcpListenerType[keyof typeof EmqxGatewayApiListenersTcpListenerType] + (typeof EmqxGatewayApiListenersTcpListenerType)[keyof typeof EmqxGatewayApiListenersTcpListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiListenersTcpListenerType = { @@ -1128,7 +1130,7 @@ export interface EmqxGatewayApiListenersTcpListener { export type EmqxGatewayApiListenersSslListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiListenersSslListenerType = - typeof EmqxGatewayApiListenersSslListenerType[keyof typeof EmqxGatewayApiListenersSslListenerType] + (typeof EmqxGatewayApiListenersSslListenerType)[keyof typeof EmqxGatewayApiListenersSslListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiListenersSslListenerType = { @@ -1159,7 +1161,7 @@ export interface EmqxGatewayApiListenersSslListener { export type EmqxGatewayApiListenersDtlsListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiListenersDtlsListenerType = - typeof EmqxGatewayApiListenersDtlsListenerType[keyof typeof EmqxGatewayApiListenersDtlsListenerType] + (typeof EmqxGatewayApiListenersDtlsListenerType)[keyof typeof EmqxGatewayApiListenersDtlsListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiListenersDtlsListenerType = { @@ -1214,7 +1216,7 @@ export interface ConnectorHttpRequest { } export type AuthnRedisSingleRedisType = - typeof AuthnRedisSingleRedisType[keyof typeof AuthnRedisSingleRedisType] + (typeof AuthnRedisSingleRedisType)[keyof typeof AuthnRedisSingleRedisType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnRedisSingleRedisType = { @@ -1227,7 +1229,7 @@ export type AuthnRedisSinglePasswordHashAlgorithm = | AuthnHashBcrypt export type AuthnRedisSingleBackend = - typeof AuthnRedisSingleBackend[keyof typeof AuthnRedisSingleBackend] + (typeof AuthnRedisSingleBackend)[keyof typeof AuthnRedisSingleBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnRedisSingleBackend = { @@ -1235,7 +1237,7 @@ export const AuthnRedisSingleBackend = { } as const export type AuthnRedisSingleMechanism = - typeof AuthnRedisSingleMechanism[keyof typeof AuthnRedisSingleMechanism] + (typeof AuthnRedisSingleMechanism)[keyof typeof AuthnRedisSingleMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnRedisSingleMechanism = { @@ -1260,7 +1262,7 @@ export interface AuthnRedisSingle { } export type AuthnRedisSentinelRedisType = - typeof AuthnRedisSentinelRedisType[keyof typeof AuthnRedisSentinelRedisType] + (typeof AuthnRedisSentinelRedisType)[keyof typeof AuthnRedisSentinelRedisType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnRedisSentinelRedisType = { @@ -1273,7 +1275,7 @@ export type AuthnRedisSentinelPasswordHashAlgorithm = | AuthnHashBcrypt export type AuthnRedisSentinelBackend = - typeof AuthnRedisSentinelBackend[keyof typeof AuthnRedisSentinelBackend] + (typeof AuthnRedisSentinelBackend)[keyof typeof AuthnRedisSentinelBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnRedisSentinelBackend = { @@ -1281,7 +1283,7 @@ export const AuthnRedisSentinelBackend = { } as const export type AuthnRedisSentinelMechanism = - typeof AuthnRedisSentinelMechanism[keyof typeof AuthnRedisSentinelMechanism] + (typeof AuthnRedisSentinelMechanism)[keyof typeof AuthnRedisSentinelMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnRedisSentinelMechanism = { @@ -1307,7 +1309,7 @@ export interface AuthnRedisSentinel { } export type AuthnRedisClusterRedisType = - typeof AuthnRedisClusterRedisType[keyof typeof AuthnRedisClusterRedisType] + (typeof AuthnRedisClusterRedisType)[keyof typeof AuthnRedisClusterRedisType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnRedisClusterRedisType = { @@ -1320,7 +1322,7 @@ export type AuthnRedisClusterPasswordHashAlgorithm = | AuthnHashBcrypt export type AuthnRedisClusterBackend = - typeof AuthnRedisClusterBackend[keyof typeof AuthnRedisClusterBackend] + (typeof AuthnRedisClusterBackend)[keyof typeof AuthnRedisClusterBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnRedisClusterBackend = { @@ -1328,7 +1330,7 @@ export const AuthnRedisClusterBackend = { } as const export type AuthnRedisClusterMechanism = - typeof AuthnRedisClusterMechanism[keyof typeof AuthnRedisClusterMechanism] + (typeof AuthnRedisClusterMechanism)[keyof typeof AuthnRedisClusterMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnRedisClusterMechanism = { @@ -1357,7 +1359,7 @@ export type AuthnPostgresqlPasswordHashAlgorithm = | AuthnHashBcrypt export type AuthnPostgresqlBackend = - typeof AuthnPostgresqlBackend[keyof typeof AuthnPostgresqlBackend] + (typeof AuthnPostgresqlBackend)[keyof typeof AuthnPostgresqlBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnPostgresqlBackend = { @@ -1365,7 +1367,7 @@ export const AuthnPostgresqlBackend = { } as const export type AuthnPostgresqlMechanism = - typeof AuthnPostgresqlMechanism[keyof typeof AuthnPostgresqlMechanism] + (typeof AuthnPostgresqlMechanism)[keyof typeof AuthnPostgresqlMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnPostgresqlMechanism = { @@ -1391,14 +1393,14 @@ export interface AuthnPostgresql { export type AuthnMysqlPasswordHashAlgorithm = AuthnHashSimple | AuthnHashPbkdf2 | AuthnHashBcrypt -export type AuthnMysqlBackend = typeof AuthnMysqlBackend[keyof typeof AuthnMysqlBackend] +export type AuthnMysqlBackend = (typeof AuthnMysqlBackend)[keyof typeof AuthnMysqlBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMysqlBackend = { mysql: 'mysql', } as const -export type AuthnMysqlMechanism = typeof AuthnMysqlMechanism[keyof typeof AuthnMysqlMechanism] +export type AuthnMysqlMechanism = (typeof AuthnMysqlMechanism)[keyof typeof AuthnMysqlMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMysqlMechanism = { @@ -1423,7 +1425,7 @@ export interface AuthnMysql { } export type AuthnMongoSingleUseLegacyProtocol = - typeof AuthnMongoSingleUseLegacyProtocol[keyof typeof AuthnMongoSingleUseLegacyProtocol] + (typeof AuthnMongoSingleUseLegacyProtocol)[keyof typeof AuthnMongoSingleUseLegacyProtocol] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoSingleUseLegacyProtocol = { @@ -1432,7 +1434,8 @@ export const AuthnMongoSingleUseLegacyProtocol = { false: 'false', } as const -export type AuthnMongoSingleWMode = typeof AuthnMongoSingleWMode[keyof typeof AuthnMongoSingleWMode] +export type AuthnMongoSingleWMode = + (typeof AuthnMongoSingleWMode)[keyof typeof AuthnMongoSingleWMode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoSingleWMode = { @@ -1441,7 +1444,7 @@ export const AuthnMongoSingleWMode = { } as const export type AuthnMongoSingleMongoType = - typeof AuthnMongoSingleMongoType[keyof typeof AuthnMongoSingleMongoType] + (typeof AuthnMongoSingleMongoType)[keyof typeof AuthnMongoSingleMongoType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoSingleMongoType = { @@ -1456,7 +1459,7 @@ export type AuthnMongoSinglePasswordHashAlgorithm = export type AuthnMongoSingleFilter = { [key: string]: any } export type AuthnMongoSingleBackend = - typeof AuthnMongoSingleBackend[keyof typeof AuthnMongoSingleBackend] + (typeof AuthnMongoSingleBackend)[keyof typeof AuthnMongoSingleBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoSingleBackend = { @@ -1464,7 +1467,7 @@ export const AuthnMongoSingleBackend = { } as const export type AuthnMongoSingleMechanism = - typeof AuthnMongoSingleMechanism[keyof typeof AuthnMongoSingleMechanism] + (typeof AuthnMongoSingleMechanism)[keyof typeof AuthnMongoSingleMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoSingleMechanism = { @@ -1496,7 +1499,7 @@ export interface AuthnMongoSingle { } export type AuthnMongoShardedUseLegacyProtocol = - typeof AuthnMongoShardedUseLegacyProtocol[keyof typeof AuthnMongoShardedUseLegacyProtocol] + (typeof AuthnMongoShardedUseLegacyProtocol)[keyof typeof AuthnMongoShardedUseLegacyProtocol] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoShardedUseLegacyProtocol = { @@ -1506,7 +1509,7 @@ export const AuthnMongoShardedUseLegacyProtocol = { } as const export type AuthnMongoShardedWMode = - typeof AuthnMongoShardedWMode[keyof typeof AuthnMongoShardedWMode] + (typeof AuthnMongoShardedWMode)[keyof typeof AuthnMongoShardedWMode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoShardedWMode = { @@ -1515,7 +1518,7 @@ export const AuthnMongoShardedWMode = { } as const export type AuthnMongoShardedMongoType = - typeof AuthnMongoShardedMongoType[keyof typeof AuthnMongoShardedMongoType] + (typeof AuthnMongoShardedMongoType)[keyof typeof AuthnMongoShardedMongoType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoShardedMongoType = { @@ -1530,7 +1533,7 @@ export type AuthnMongoShardedPasswordHashAlgorithm = export type AuthnMongoShardedFilter = { [key: string]: any } export type AuthnMongoShardedBackend = - typeof AuthnMongoShardedBackend[keyof typeof AuthnMongoShardedBackend] + (typeof AuthnMongoShardedBackend)[keyof typeof AuthnMongoShardedBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoShardedBackend = { @@ -1538,7 +1541,7 @@ export const AuthnMongoShardedBackend = { } as const export type AuthnMongoShardedMechanism = - typeof AuthnMongoShardedMechanism[keyof typeof AuthnMongoShardedMechanism] + (typeof AuthnMongoShardedMechanism)[keyof typeof AuthnMongoShardedMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoShardedMechanism = { @@ -1570,7 +1573,7 @@ export interface AuthnMongoSharded { } export type AuthnMongoRsUseLegacyProtocol = - typeof AuthnMongoRsUseLegacyProtocol[keyof typeof AuthnMongoRsUseLegacyProtocol] + (typeof AuthnMongoRsUseLegacyProtocol)[keyof typeof AuthnMongoRsUseLegacyProtocol] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoRsUseLegacyProtocol = { @@ -1579,7 +1582,7 @@ export const AuthnMongoRsUseLegacyProtocol = { false: 'false', } as const -export type AuthnMongoRsRMode = typeof AuthnMongoRsRMode[keyof typeof AuthnMongoRsRMode] +export type AuthnMongoRsRMode = (typeof AuthnMongoRsRMode)[keyof typeof AuthnMongoRsRMode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoRsRMode = { @@ -1587,7 +1590,7 @@ export const AuthnMongoRsRMode = { slave_ok: 'slave_ok', } as const -export type AuthnMongoRsWMode = typeof AuthnMongoRsWMode[keyof typeof AuthnMongoRsWMode] +export type AuthnMongoRsWMode = (typeof AuthnMongoRsWMode)[keyof typeof AuthnMongoRsWMode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoRsWMode = { @@ -1595,7 +1598,8 @@ export const AuthnMongoRsWMode = { safe: 'safe', } as const -export type AuthnMongoRsMongoType = typeof AuthnMongoRsMongoType[keyof typeof AuthnMongoRsMongoType] +export type AuthnMongoRsMongoType = + (typeof AuthnMongoRsMongoType)[keyof typeof AuthnMongoRsMongoType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoRsMongoType = { @@ -1606,14 +1610,15 @@ export type AuthnMongoRsPasswordHashAlgorithm = AuthnHashSimple | AuthnHashPbkdf export type AuthnMongoRsFilter = { [key: string]: any } -export type AuthnMongoRsBackend = typeof AuthnMongoRsBackend[keyof typeof AuthnMongoRsBackend] +export type AuthnMongoRsBackend = (typeof AuthnMongoRsBackend)[keyof typeof AuthnMongoRsBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoRsBackend = { mongodb: 'mongodb', } as const -export type AuthnMongoRsMechanism = typeof AuthnMongoRsMechanism[keyof typeof AuthnMongoRsMechanism] +export type AuthnMongoRsMechanism = + (typeof AuthnMongoRsMechanism)[keyof typeof AuthnMongoRsMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnMongoRsMechanism = { @@ -1647,7 +1652,7 @@ export interface AuthnMongoRs { } export type AuthnLdapDeprecatedBackend = - typeof AuthnLdapDeprecatedBackend[keyof typeof AuthnLdapDeprecatedBackend] + (typeof AuthnLdapDeprecatedBackend)[keyof typeof AuthnLdapDeprecatedBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnLdapDeprecatedBackend = { @@ -1655,7 +1660,7 @@ export const AuthnLdapDeprecatedBackend = { } as const export type AuthnLdapDeprecatedMechanism = - typeof AuthnLdapDeprecatedMechanism[keyof typeof AuthnLdapDeprecatedMechanism] + (typeof AuthnLdapDeprecatedMechanism)[keyof typeof AuthnLdapDeprecatedMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnLdapDeprecatedMechanism = { @@ -1681,14 +1686,14 @@ export interface AuthnLdapDeprecated { export type AuthnLdapMethod = AuthnBindMethod | AuthnHashMethod -export type AuthnLdapBackend = typeof AuthnLdapBackend[keyof typeof AuthnLdapBackend] +export type AuthnLdapBackend = (typeof AuthnLdapBackend)[keyof typeof AuthnLdapBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnLdapBackend = { ldap: 'ldap', } as const -export type AuthnLdapMechanism = typeof AuthnLdapMechanism[keyof typeof AuthnLdapMechanism] +export type AuthnLdapMechanism = (typeof AuthnLdapMechanism)[keyof typeof AuthnLdapMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnLdapMechanism = { @@ -1711,7 +1716,8 @@ export interface AuthnLdap { method?: AuthnLdapMethod } -export type AuthnJwtPublicKeyFrom = typeof AuthnJwtPublicKeyFrom[keyof typeof AuthnJwtPublicKeyFrom] +export type AuthnJwtPublicKeyFrom = + (typeof AuthnJwtPublicKeyFrom)[keyof typeof AuthnJwtPublicKeyFrom] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnJwtPublicKeyFrom = { @@ -1722,7 +1728,7 @@ export const AuthnJwtPublicKeyFrom = { export type AuthnJwtPublicKeyVerifyClaims = { [key: string]: any } export type AuthnJwtPublicKeyMechanism = - typeof AuthnJwtPublicKeyMechanism[keyof typeof AuthnJwtPublicKeyMechanism] + (typeof AuthnJwtPublicKeyMechanism)[keyof typeof AuthnJwtPublicKeyMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnJwtPublicKeyMechanism = { @@ -1730,7 +1736,7 @@ export const AuthnJwtPublicKeyMechanism = { } as const export type AuthnJwtPublicKeyAlgorithm = - typeof AuthnJwtPublicKeyAlgorithm[keyof typeof AuthnJwtPublicKeyAlgorithm] + (typeof AuthnJwtPublicKeyAlgorithm)[keyof typeof AuthnJwtPublicKeyAlgorithm] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnJwtPublicKeyAlgorithm = { @@ -1748,7 +1754,7 @@ export interface AuthnJwtPublicKey { enable?: boolean } -export type AuthnJwtJwksFrom = typeof AuthnJwtJwksFrom[keyof typeof AuthnJwtJwksFrom] +export type AuthnJwtJwksFrom = (typeof AuthnJwtJwksFrom)[keyof typeof AuthnJwtJwksFrom] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnJwtJwksFrom = { @@ -1758,7 +1764,8 @@ export const AuthnJwtJwksFrom = { export type AuthnJwtJwksVerifyClaims = { [key: string]: any } -export type AuthnJwtJwksMechanism = typeof AuthnJwtJwksMechanism[keyof typeof AuthnJwtJwksMechanism] +export type AuthnJwtJwksMechanism = + (typeof AuthnJwtJwksMechanism)[keyof typeof AuthnJwtJwksMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnJwtJwksMechanism = { @@ -1767,7 +1774,7 @@ export const AuthnJwtJwksMechanism = { export type AuthnJwtJwksHeaders = { [key: string]: any } -export type AuthnJwtJwksUseJwks = typeof AuthnJwtJwksUseJwks[keyof typeof AuthnJwtJwksUseJwks] +export type AuthnJwtJwksUseJwks = (typeof AuthnJwtJwksUseJwks)[keyof typeof AuthnJwtJwksUseJwks] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnJwtJwksUseJwks = { @@ -1789,7 +1796,7 @@ export interface AuthnJwtJwks { enable?: boolean } -export type AuthnJwtHmacFrom = typeof AuthnJwtHmacFrom[keyof typeof AuthnJwtHmacFrom] +export type AuthnJwtHmacFrom = (typeof AuthnJwtHmacFrom)[keyof typeof AuthnJwtHmacFrom] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnJwtHmacFrom = { @@ -1799,14 +1806,16 @@ export const AuthnJwtHmacFrom = { export type AuthnJwtHmacVerifyClaims = { [key: string]: any } -export type AuthnJwtHmacMechanism = typeof AuthnJwtHmacMechanism[keyof typeof AuthnJwtHmacMechanism] +export type AuthnJwtHmacMechanism = + (typeof AuthnJwtHmacMechanism)[keyof typeof AuthnJwtHmacMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnJwtHmacMechanism = { jwt: 'jwt', } as const -export type AuthnJwtHmacAlgorithm = typeof AuthnJwtHmacAlgorithm[keyof typeof AuthnJwtHmacAlgorithm] +export type AuthnJwtHmacAlgorithm = + (typeof AuthnJwtHmacAlgorithm)[keyof typeof AuthnJwtHmacAlgorithm] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnJwtHmacAlgorithm = { @@ -1827,7 +1836,7 @@ export interface AuthnJwtHmac { export type AuthnHttpPostBody = { [key: string]: any } -export type AuthnHttpPostBackend = typeof AuthnHttpPostBackend[keyof typeof AuthnHttpPostBackend] +export type AuthnHttpPostBackend = (typeof AuthnHttpPostBackend)[keyof typeof AuthnHttpPostBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHttpPostBackend = { @@ -1835,7 +1844,7 @@ export const AuthnHttpPostBackend = { } as const export type AuthnHttpPostMechanism = - typeof AuthnHttpPostMechanism[keyof typeof AuthnHttpPostMechanism] + (typeof AuthnHttpPostMechanism)[keyof typeof AuthnHttpPostMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHttpPostMechanism = { @@ -1844,7 +1853,7 @@ export const AuthnHttpPostMechanism = { export type AuthnHttpPostHeaders = { [key: string]: any } -export type AuthnHttpPostMethod = typeof AuthnHttpPostMethod[keyof typeof AuthnHttpPostMethod] +export type AuthnHttpPostMethod = (typeof AuthnHttpPostMethod)[keyof typeof AuthnHttpPostMethod] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHttpPostMethod = { @@ -1873,14 +1882,15 @@ export interface AuthnHttpPost { export type AuthnHttpGetBody = { [key: string]: any } -export type AuthnHttpGetBackend = typeof AuthnHttpGetBackend[keyof typeof AuthnHttpGetBackend] +export type AuthnHttpGetBackend = (typeof AuthnHttpGetBackend)[keyof typeof AuthnHttpGetBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHttpGetBackend = { http: 'http', } as const -export type AuthnHttpGetMechanism = typeof AuthnHttpGetMechanism[keyof typeof AuthnHttpGetMechanism] +export type AuthnHttpGetMechanism = + (typeof AuthnHttpGetMechanism)[keyof typeof AuthnHttpGetMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHttpGetMechanism = { @@ -1889,7 +1899,7 @@ export const AuthnHttpGetMechanism = { export type AuthnHttpGetHeaders = { [key: string]: any } -export type AuthnHttpGetMethod = typeof AuthnHttpGetMethod[keyof typeof AuthnHttpGetMethod] +export type AuthnHttpGetMethod = (typeof AuthnHttpGetMethod)[keyof typeof AuthnHttpGetMethod] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHttpGetMethod = { @@ -1916,7 +1926,7 @@ export interface AuthnHttpGet { enable_pipelining?: number } -export type AuthnHashMethodType = typeof AuthnHashMethodType[keyof typeof AuthnHashMethodType] +export type AuthnHashMethodType = (typeof AuthnHashMethodType)[keyof typeof AuthnHashMethodType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHashMethodType = { @@ -1930,7 +1940,7 @@ export interface AuthnHashMethod { } export type AuthnBuiltinDbBootstrapType = - typeof AuthnBuiltinDbBootstrapType[keyof typeof AuthnBuiltinDbBootstrapType] + (typeof AuthnBuiltinDbBootstrapType)[keyof typeof AuthnBuiltinDbBootstrapType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnBuiltinDbBootstrapType = { @@ -1939,7 +1949,7 @@ export const AuthnBuiltinDbBootstrapType = { } as const export type AuthnBuiltinDbUserIdType = - typeof AuthnBuiltinDbUserIdType[keyof typeof AuthnBuiltinDbUserIdType] + (typeof AuthnBuiltinDbUserIdType)[keyof typeof AuthnBuiltinDbUserIdType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnBuiltinDbUserIdType = { @@ -1947,7 +1957,8 @@ export const AuthnBuiltinDbUserIdType = { username: 'username', } as const -export type AuthnBuiltinDbBackend = typeof AuthnBuiltinDbBackend[keyof typeof AuthnBuiltinDbBackend] +export type AuthnBuiltinDbBackend = + (typeof AuthnBuiltinDbBackend)[keyof typeof AuthnBuiltinDbBackend] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnBuiltinDbBackend = { @@ -1955,7 +1966,7 @@ export const AuthnBuiltinDbBackend = { } as const export type AuthnBuiltinDbMechanism = - typeof AuthnBuiltinDbMechanism[keyof typeof AuthnBuiltinDbMechanism] + (typeof AuthnBuiltinDbMechanism)[keyof typeof AuthnBuiltinDbMechanism] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnBuiltinDbMechanism = { @@ -1977,7 +1988,7 @@ export interface AuthnBuiltinDb { enable?: boolean } -export type AuthnBindMethodType = typeof AuthnBindMethodType[keyof typeof AuthnBindMethodType] +export type AuthnBindMethodType = (typeof AuthnBindMethodType)[keyof typeof AuthnBindMethodType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnBindMethodType = { @@ -1990,7 +2001,7 @@ export interface AuthnBindMethod { } export type AuthnHashSimpleSaltPosition = - typeof AuthnHashSimpleSaltPosition[keyof typeof AuthnHashSimpleSaltPosition] + (typeof AuthnHashSimpleSaltPosition)[keyof typeof AuthnHashSimpleSaltPosition] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHashSimpleSaltPosition = { @@ -1999,7 +2010,7 @@ export const AuthnHashSimpleSaltPosition = { suffix: 'suffix', } as const -export type AuthnHashSimpleName = typeof AuthnHashSimpleName[keyof typeof AuthnHashSimpleName] +export type AuthnHashSimpleName = (typeof AuthnHashSimpleName)[keyof typeof AuthnHashSimpleName] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHashSimpleName = { @@ -2015,7 +2026,8 @@ export interface AuthnHashSimple { salt_position?: AuthnHashSimpleSaltPosition } -export type AuthnHashPbkdf2MacFun = typeof AuthnHashPbkdf2MacFun[keyof typeof AuthnHashPbkdf2MacFun] +export type AuthnHashPbkdf2MacFun = + (typeof AuthnHashPbkdf2MacFun)[keyof typeof AuthnHashPbkdf2MacFun] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHashPbkdf2MacFun = { @@ -2029,7 +2041,7 @@ export const AuthnHashPbkdf2MacFun = { sha512: 'sha512', } as const -export type AuthnHashPbkdf2Name = typeof AuthnHashPbkdf2Name[keyof typeof AuthnHashPbkdf2Name] +export type AuthnHashPbkdf2Name = (typeof AuthnHashPbkdf2Name)[keyof typeof AuthnHashPbkdf2Name] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHashPbkdf2Name = { @@ -2043,7 +2055,8 @@ export interface AuthnHashPbkdf2 { dk_length?: number } -export type AuthnHashBcryptRwName = typeof AuthnHashBcryptRwName[keyof typeof AuthnHashBcryptRwName] +export type AuthnHashBcryptRwName = + (typeof AuthnHashBcryptRwName)[keyof typeof AuthnHashBcryptRwName] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHashBcryptRwName = { @@ -2055,7 +2068,7 @@ export interface AuthnHashBcryptRw { salt_rounds?: number } -export type AuthnHashBcryptName = typeof AuthnHashBcryptName[keyof typeof AuthnHashBcryptName] +export type AuthnHashBcryptName = (typeof AuthnHashBcryptName)[keyof typeof AuthnHashBcryptName] // eslint-disable-next-line @typescript-eslint/no-redeclare export const AuthnHashBcryptName = { diff --git a/src/types/schemas/gateways.schemas.ts b/src/types/schemas/gateways.schemas.ts index 6ef83128b..9572b99da 100644 --- a/src/types/schemas/gateways.schemas.ts +++ b/src/types/schemas/gateways.schemas.ts @@ -1,5 +1,5 @@ export type PutGatewaysName404Code = - typeof PutGatewaysName404Code[keyof typeof PutGatewaysName404Code] + (typeof PutGatewaysName404Code)[keyof typeof PutGatewaysName404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutGatewaysName404Code = { @@ -13,7 +13,7 @@ export type PutGatewaysName404 = { } export type PutGatewaysName400Code = - typeof PutGatewaysName400Code[keyof typeof PutGatewaysName400Code] + (typeof PutGatewaysName400Code)[keyof typeof PutGatewaysName400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutGatewaysName400Code = { @@ -48,7 +48,7 @@ export type PutGatewaysNameBody = | EmqxGatewayApiCoap export type GetGatewaysName404Code = - typeof GetGatewaysName404Code[keyof typeof GetGatewaysName404Code] + (typeof GetGatewaysName404Code)[keyof typeof GetGatewaysName404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysName404Code = { @@ -68,7 +68,7 @@ export type GetGatewaysName200 = | EmqxGatewayApiExproto | EmqxGatewayApiCoap -export type GetGateways400Code = typeof GetGateways400Code[keyof typeof GetGateways400Code] +export type GetGateways400Code = (typeof GetGateways400Code)[keyof typeof GetGateways400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGateways400Code = { @@ -80,7 +80,7 @@ export type GetGateways400 = { message?: string } -export type GetGatewaysStatus = typeof GetGatewaysStatus[keyof typeof GetGatewaysStatus] +export type GetGatewaysStatus = (typeof GetGatewaysStatus)[keyof typeof GetGatewaysStatus] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetGatewaysStatus = { @@ -94,7 +94,7 @@ export type GetGatewaysParams = { } export type PutGatewaysNameEnableEnable404Code = - typeof PutGatewaysNameEnableEnable404Code[keyof typeof PutGatewaysNameEnableEnable404Code] + (typeof PutGatewaysNameEnableEnable404Code)[keyof typeof PutGatewaysNameEnableEnable404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutGatewaysNameEnableEnable404Code = { @@ -132,7 +132,7 @@ export interface GatewayStompFrame { } export type GatewaySslServerOptsLogLevel = - typeof GatewaySslServerOptsLogLevel[keyof typeof GatewaySslServerOptsLogLevel] + (typeof GatewaySslServerOptsLogLevel)[keyof typeof GatewaySslServerOptsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GatewaySslServerOptsLogLevel = { @@ -149,7 +149,7 @@ export const GatewaySslServerOptsLogLevel = { } as const export type GatewaySslServerOptsVerify = - typeof GatewaySslServerOptsVerify[keyof typeof GatewaySslServerOptsVerify] + (typeof GatewaySslServerOptsVerify)[keyof typeof GatewaySslServerOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GatewaySslServerOptsVerify = { @@ -198,7 +198,7 @@ export interface GatewayExprotoGrpcServer { } export type GatewayExprotoGrpcHandlerServiceName = - typeof GatewayExprotoGrpcHandlerServiceName[keyof typeof GatewayExprotoGrpcHandlerServiceName] + (typeof GatewayExprotoGrpcHandlerServiceName)[keyof typeof GatewayExprotoGrpcHandlerServiceName] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GatewayExprotoGrpcHandlerServiceName = { @@ -213,7 +213,7 @@ export interface GatewayExprotoGrpcHandler { } export type GatewayDtlsOptsLogLevel = - typeof GatewayDtlsOptsLogLevel[keyof typeof GatewayDtlsOptsLogLevel] + (typeof GatewayDtlsOptsLogLevel)[keyof typeof GatewayDtlsOptsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GatewayDtlsOptsLogLevel = { @@ -229,7 +229,8 @@ export const GatewayDtlsOptsLogLevel = { all: 'all', } as const -export type GatewayDtlsOptsVerify = typeof GatewayDtlsOptsVerify[keyof typeof GatewayDtlsOptsVerify] +export type GatewayDtlsOptsVerify = + (typeof GatewayDtlsOptsVerify)[keyof typeof GatewayDtlsOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GatewayDtlsOptsVerify = { @@ -253,6 +254,7 @@ export interface EmqxTcpOpts { buffer?: string high_watermark?: string nodelay?: boolean + nolinger?: boolean reuseaddr?: boolean keepalive?: string } @@ -260,7 +262,7 @@ export interface EmqxTcpOpts { export type EmqxSslClientOptsServerNameIndication = string | 'disable' export type EmqxSslClientOptsLogLevel = - typeof EmqxSslClientOptsLogLevel[keyof typeof EmqxSslClientOptsLogLevel] + (typeof EmqxSslClientOptsLogLevel)[keyof typeof EmqxSslClientOptsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxSslClientOptsLogLevel = { @@ -277,7 +279,7 @@ export const EmqxSslClientOptsLogLevel = { } as const export type EmqxSslClientOptsVerify = - typeof EmqxSslClientOptsVerify[keyof typeof EmqxSslClientOptsVerify] + (typeof EmqxSslClientOptsVerify)[keyof typeof EmqxSslClientOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxSslClientOptsVerify = { @@ -338,7 +340,7 @@ export interface GatewayDtlsOpts { } export type EmqxListenerSslOptsLogLevel = - typeof EmqxListenerSslOptsLogLevel[keyof typeof EmqxListenerSslOptsLogLevel] + (typeof EmqxListenerSslOptsLogLevel)[keyof typeof EmqxListenerSslOptsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxListenerSslOptsLogLevel = { @@ -355,7 +357,7 @@ export const EmqxListenerSslOptsLogLevel = { } as const export type EmqxListenerSslOptsVerify = - typeof EmqxListenerSslOptsVerify[keyof typeof EmqxListenerSslOptsVerify] + (typeof EmqxListenerSslOptsVerify)[keyof typeof EmqxListenerSslOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxListenerSslOptsVerify = { @@ -411,7 +413,7 @@ export interface EmqxGatewayApiUpdateMqttsn { } export type EmqxGatewayApiUpdateLwm2mUpdateMsgPublishCondition = - typeof EmqxGatewayApiUpdateLwm2mUpdateMsgPublishCondition[keyof typeof EmqxGatewayApiUpdateLwm2mUpdateMsgPublishCondition] + (typeof EmqxGatewayApiUpdateLwm2mUpdateMsgPublishCondition)[keyof typeof EmqxGatewayApiUpdateLwm2mUpdateMsgPublishCondition] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiUpdateLwm2mUpdateMsgPublishCondition = { @@ -435,7 +437,7 @@ export interface EmqxGatewayApiUpdateLwm2m { } export type EmqxGatewayApiUpdateCoapPublishQos = - typeof EmqxGatewayApiUpdateCoapPublishQos[keyof typeof EmqxGatewayApiUpdateCoapPublishQos] + (typeof EmqxGatewayApiUpdateCoapPublishQos)[keyof typeof EmqxGatewayApiUpdateCoapPublishQos] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiUpdateCoapPublishQos = { @@ -446,7 +448,7 @@ export const EmqxGatewayApiUpdateCoapPublishQos = { } as const export type EmqxGatewayApiUpdateCoapSubscribeQos = - typeof EmqxGatewayApiUpdateCoapSubscribeQos[keyof typeof EmqxGatewayApiUpdateCoapSubscribeQos] + (typeof EmqxGatewayApiUpdateCoapSubscribeQos)[keyof typeof EmqxGatewayApiUpdateCoapSubscribeQos] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiUpdateCoapSubscribeQos = { @@ -457,7 +459,7 @@ export const EmqxGatewayApiUpdateCoapSubscribeQos = { } as const export type EmqxGatewayApiUpdateCoapNotifyType = - typeof EmqxGatewayApiUpdateCoapNotifyType[keyof typeof EmqxGatewayApiUpdateCoapNotifyType] + (typeof EmqxGatewayApiUpdateCoapNotifyType)[keyof typeof EmqxGatewayApiUpdateCoapNotifyType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiUpdateCoapNotifyType = { @@ -482,7 +484,7 @@ export interface EmqxGatewayApiUpdateCoap { export type EmqxGatewayApiUdpListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiUdpListenerType = - typeof EmqxGatewayApiUdpListenerType[keyof typeof EmqxGatewayApiUdpListenerType] + (typeof EmqxGatewayApiUdpListenerType)[keyof typeof EmqxGatewayApiUdpListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiUdpListenerType = { @@ -508,7 +510,7 @@ export interface EmqxGatewayApiUdpListener { export type EmqxGatewayApiTcpListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiTcpListenerType = - typeof EmqxGatewayApiTcpListenerType[keyof typeof EmqxGatewayApiTcpListenerType] + (typeof EmqxGatewayApiTcpListenerType)[keyof typeof EmqxGatewayApiTcpListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiTcpListenerType = { @@ -534,7 +536,7 @@ export interface EmqxGatewayApiTcpListener { } export type EmqxGatewayApiStompName = - typeof EmqxGatewayApiStompName[keyof typeof EmqxGatewayApiStompName] + (typeof EmqxGatewayApiStompName)[keyof typeof EmqxGatewayApiStompName] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiStompName = { @@ -555,7 +557,7 @@ export interface EmqxGatewayApiStomp { export type EmqxGatewayApiSslListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiSslListenerType = - typeof EmqxGatewayApiSslListenerType[keyof typeof EmqxGatewayApiSslListenerType] + (typeof EmqxGatewayApiSslListenerType)[keyof typeof EmqxGatewayApiSslListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiSslListenerType = { @@ -588,7 +590,7 @@ export type EmqxGatewayApiMqttsnListenersItem = | EmqxGatewayApiUdpListener export type EmqxGatewayApiMqttsnName = - typeof EmqxGatewayApiMqttsnName[keyof typeof EmqxGatewayApiMqttsnName] + (typeof EmqxGatewayApiMqttsnName)[keyof typeof EmqxGatewayApiMqttsnName] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiMqttsnName = { @@ -615,7 +617,7 @@ export type EmqxGatewayApiLwm2mListenersItem = | EmqxGatewayApiUdpListener export type EmqxGatewayApiLwm2mUpdateMsgPublishCondition = - typeof EmqxGatewayApiLwm2mUpdateMsgPublishCondition[keyof typeof EmqxGatewayApiLwm2mUpdateMsgPublishCondition] + (typeof EmqxGatewayApiLwm2mUpdateMsgPublishCondition)[keyof typeof EmqxGatewayApiLwm2mUpdateMsgPublishCondition] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiLwm2mUpdateMsgPublishCondition = { @@ -624,7 +626,7 @@ export const EmqxGatewayApiLwm2mUpdateMsgPublishCondition = { } as const export type EmqxGatewayApiLwm2mName = - typeof EmqxGatewayApiLwm2mName[keyof typeof EmqxGatewayApiLwm2mName] + (typeof EmqxGatewayApiLwm2mName)[keyof typeof EmqxGatewayApiLwm2mName] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiLwm2mName = { @@ -649,7 +651,7 @@ export interface EmqxGatewayApiLwm2m { } export type EmqxGatewayApiGatewayOverviewStatus = - typeof EmqxGatewayApiGatewayOverviewStatus[keyof typeof EmqxGatewayApiGatewayOverviewStatus] + (typeof EmqxGatewayApiGatewayOverviewStatus)[keyof typeof EmqxGatewayApiGatewayOverviewStatus] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiGatewayOverviewStatus = { @@ -671,7 +673,7 @@ export interface EmqxGatewayApiGatewayOverview { } export type EmqxGatewayApiGatewayNodeStatusStatus = - typeof EmqxGatewayApiGatewayNodeStatusStatus[keyof typeof EmqxGatewayApiGatewayNodeStatusStatus] + (typeof EmqxGatewayApiGatewayNodeStatusStatus)[keyof typeof EmqxGatewayApiGatewayNodeStatusStatus] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiGatewayNodeStatusStatus = { @@ -681,7 +683,7 @@ export const EmqxGatewayApiGatewayNodeStatusStatus = { } as const export type EmqxGatewayApiGatewayNodeStatusNode = - typeof EmqxGatewayApiGatewayNodeStatusNode[keyof typeof EmqxGatewayApiGatewayNodeStatusNode] + (typeof EmqxGatewayApiGatewayNodeStatusNode)[keyof typeof EmqxGatewayApiGatewayNodeStatusNode] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiGatewayNodeStatusNode = { @@ -696,7 +698,7 @@ export interface EmqxGatewayApiGatewayNodeStatus { } export type EmqxGatewayApiGatewayListenerOverviewType = - typeof EmqxGatewayApiGatewayListenerOverviewType[keyof typeof EmqxGatewayApiGatewayListenerOverviewType] + (typeof EmqxGatewayApiGatewayListenerOverviewType)[keyof typeof EmqxGatewayApiGatewayListenerOverviewType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiGatewayListenerOverviewType = { @@ -719,7 +721,7 @@ export type EmqxGatewayApiExprotoListenersItem = | EmqxGatewayApiTcpListener export type EmqxGatewayApiExprotoName = - typeof EmqxGatewayApiExprotoName[keyof typeof EmqxGatewayApiExprotoName] + (typeof EmqxGatewayApiExprotoName)[keyof typeof EmqxGatewayApiExprotoName] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiExprotoName = { @@ -741,7 +743,7 @@ export interface EmqxGatewayApiExproto { export type EmqxGatewayApiDtlsListenerMaxConnections = 'infinity' | number export type EmqxGatewayApiDtlsListenerType = - typeof EmqxGatewayApiDtlsListenerType[keyof typeof EmqxGatewayApiDtlsListenerType] + (typeof EmqxGatewayApiDtlsListenerType)[keyof typeof EmqxGatewayApiDtlsListenerType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiDtlsListenerType = { @@ -769,7 +771,7 @@ export interface EmqxGatewayApiDtlsListener { export type EmqxGatewayApiCoapListenersItem = EmqxGatewayApiDtlsListener | EmqxGatewayApiUdpListener export type EmqxGatewayApiCoapPublishQos = - typeof EmqxGatewayApiCoapPublishQos[keyof typeof EmqxGatewayApiCoapPublishQos] + (typeof EmqxGatewayApiCoapPublishQos)[keyof typeof EmqxGatewayApiCoapPublishQos] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiCoapPublishQos = { @@ -780,7 +782,7 @@ export const EmqxGatewayApiCoapPublishQos = { } as const export type EmqxGatewayApiCoapSubscribeQos = - typeof EmqxGatewayApiCoapSubscribeQos[keyof typeof EmqxGatewayApiCoapSubscribeQos] + (typeof EmqxGatewayApiCoapSubscribeQos)[keyof typeof EmqxGatewayApiCoapSubscribeQos] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiCoapSubscribeQos = { @@ -791,7 +793,7 @@ export const EmqxGatewayApiCoapSubscribeQos = { } as const export type EmqxGatewayApiCoapNotifyType = - typeof EmqxGatewayApiCoapNotifyType[keyof typeof EmqxGatewayApiCoapNotifyType] + (typeof EmqxGatewayApiCoapNotifyType)[keyof typeof EmqxGatewayApiCoapNotifyType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiCoapNotifyType = { @@ -801,7 +803,7 @@ export const EmqxGatewayApiCoapNotifyType = { } as const export type EmqxGatewayApiCoapName = - typeof EmqxGatewayApiCoapName[keyof typeof EmqxGatewayApiCoapName] + (typeof EmqxGatewayApiCoapName)[keyof typeof EmqxGatewayApiCoapName] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxGatewayApiCoapName = { diff --git a/src/types/schemas/listeners.schemas.ts b/src/types/schemas/listeners.schemas.ts index a55a74900..258ee363d 100644 --- a/src/types/schemas/listeners.schemas.ts +++ b/src/types/schemas/listeners.schemas.ts @@ -1,5 +1,5 @@ export type PostListenersId400Code = - typeof PostListenersId400Code[keyof typeof PostListenersId400Code] + (typeof PostListenersId400Code)[keyof typeof PostListenersId400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostListenersId400Code = { @@ -20,7 +20,7 @@ export type PostListenersIdBody = | ListenersQuicRequiredBind export type DeleteListenersId404Code = - typeof DeleteListenersId404Code[keyof typeof DeleteListenersId404Code] + (typeof DeleteListenersId404Code)[keyof typeof DeleteListenersId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteListenersId404Code = { @@ -32,7 +32,8 @@ export type DeleteListenersId404 = { message?: string } -export type PutListenersId404Code = typeof PutListenersId404Code[keyof typeof PutListenersId404Code] +export type PutListenersId404Code = + (typeof PutListenersId404Code)[keyof typeof PutListenersId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutListenersId404Code = { @@ -45,7 +46,8 @@ export type PutListenersId404 = { message?: string } -export type PutListenersId400Code = typeof PutListenersId400Code[keyof typeof PutListenersId400Code] +export type PutListenersId400Code = + (typeof PutListenersId400Code)[keyof typeof PutListenersId400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutListenersId400Code = { @@ -64,7 +66,8 @@ export type PutListenersId200 = | ListenersSslRequiredBind | ListenersQuicRequiredBind -export type GetListenersId404Code = typeof GetListenersId404Code[keyof typeof GetListenersId404Code] +export type GetListenersId404Code = + (typeof GetListenersId404Code)[keyof typeof GetListenersId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetListenersId404Code = { @@ -85,7 +88,7 @@ export type GetListenersId200 = | ListenersQuicRequiredBind export type PostListenersIdRestart400Code = - typeof PostListenersIdRestart400Code[keyof typeof PostListenersIdRestart400Code] + (typeof PostListenersIdRestart400Code)[keyof typeof PostListenersIdRestart400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostListenersIdRestart400Code = { @@ -99,7 +102,7 @@ export type PostListenersIdRestart400 = { } export type PostListenersIdStart400Code = - typeof PostListenersIdStart400Code[keyof typeof PostListenersIdStart400Code] + (typeof PostListenersIdStart400Code)[keyof typeof PostListenersIdStart400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostListenersIdStart400Code = { @@ -113,7 +116,7 @@ export type PostListenersIdStart400 = { } export type PostListenersIdStop400Code = - typeof PostListenersIdStop400Code[keyof typeof PostListenersIdStop400Code] + (typeof PostListenersIdStop400Code)[keyof typeof PostListenersIdStop400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostListenersIdStop400Code = { @@ -126,7 +129,7 @@ export type PostListenersIdStop400 = { message?: string } -export type PostListeners400Code = typeof PostListeners400Code[keyof typeof PostListeners400Code] +export type PostListeners400Code = (typeof PostListeners400Code)[keyof typeof PostListeners400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostListeners400Code = { @@ -153,7 +156,7 @@ export type PostListenersBody = | ListenersWithNameSslRequiredBind | ListenersWithNameTcpRequiredBind -export type GetListenersType = typeof GetListenersType[keyof typeof GetListenersType] +export type GetListenersType = (typeof GetListenersType)[keyof typeof GetListenersType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetListenersType = { @@ -169,7 +172,7 @@ export type GetListenersParams = { } export type ListenersWssRequiredBindEnableAuthn = - typeof ListenersWssRequiredBindEnableAuthn[keyof typeof ListenersWssRequiredBindEnableAuthn] + (typeof ListenersWssRequiredBindEnableAuthn)[keyof typeof ListenersWssRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWssRequiredBindEnableAuthn = { @@ -181,7 +184,7 @@ export const ListenersWssRequiredBindEnableAuthn = { export type ListenersWssRequiredBindMaxConnections = number | 'infinity' export type ListenersWssRequiredBindType = - typeof ListenersWssRequiredBindType[keyof typeof ListenersWssRequiredBindType] + (typeof ListenersWssRequiredBindType)[keyof typeof ListenersWssRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWssRequiredBindType = { @@ -219,7 +222,7 @@ export type PostListenersId200 = | ListenersQuicRequiredBind export type ListenersWssNotRequiredBindEnableAuthn = - typeof ListenersWssNotRequiredBindEnableAuthn[keyof typeof ListenersWssNotRequiredBindEnableAuthn] + (typeof ListenersWssNotRequiredBindEnableAuthn)[keyof typeof ListenersWssNotRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWssNotRequiredBindEnableAuthn = { @@ -231,7 +234,7 @@ export const ListenersWssNotRequiredBindEnableAuthn = { export type ListenersWssNotRequiredBindMaxConnections = number | 'infinity' export type ListenersWssNotRequiredBindType = - typeof ListenersWssNotRequiredBindType[keyof typeof ListenersWssNotRequiredBindType] + (typeof ListenersWssNotRequiredBindType)[keyof typeof ListenersWssNotRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWssNotRequiredBindType = { @@ -269,7 +272,7 @@ export type PutListenersIdBody = | ListenersQuicNotRequiredBind export type ListenersWsRequiredBindEnableAuthn = - typeof ListenersWsRequiredBindEnableAuthn[keyof typeof ListenersWsRequiredBindEnableAuthn] + (typeof ListenersWsRequiredBindEnableAuthn)[keyof typeof ListenersWsRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWsRequiredBindEnableAuthn = { @@ -281,7 +284,7 @@ export const ListenersWsRequiredBindEnableAuthn = { export type ListenersWsRequiredBindMaxConnections = number | 'infinity' export type ListenersWsRequiredBindType = - typeof ListenersWsRequiredBindType[keyof typeof ListenersWsRequiredBindType] + (typeof ListenersWsRequiredBindType)[keyof typeof ListenersWsRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWsRequiredBindType = { @@ -311,7 +314,7 @@ export interface ListenersWsRequiredBind { } export type ListenersWsNotRequiredBindEnableAuthn = - typeof ListenersWsNotRequiredBindEnableAuthn[keyof typeof ListenersWsNotRequiredBindEnableAuthn] + (typeof ListenersWsNotRequiredBindEnableAuthn)[keyof typeof ListenersWsNotRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWsNotRequiredBindEnableAuthn = { @@ -323,7 +326,7 @@ export const ListenersWsNotRequiredBindEnableAuthn = { export type ListenersWsNotRequiredBindMaxConnections = number | 'infinity' export type ListenersWsNotRequiredBindType = - typeof ListenersWsNotRequiredBindType[keyof typeof ListenersWsNotRequiredBindType] + (typeof ListenersWsNotRequiredBindType)[keyof typeof ListenersWsNotRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWsNotRequiredBindType = { @@ -353,7 +356,7 @@ export interface ListenersWsNotRequiredBind { } export type ListenersWithNameWssRequiredBindEnableAuthn = - typeof ListenersWithNameWssRequiredBindEnableAuthn[keyof typeof ListenersWithNameWssRequiredBindEnableAuthn] + (typeof ListenersWithNameWssRequiredBindEnableAuthn)[keyof typeof ListenersWithNameWssRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWithNameWssRequiredBindEnableAuthn = { @@ -365,7 +368,7 @@ export const ListenersWithNameWssRequiredBindEnableAuthn = { export type ListenersWithNameWssRequiredBindMaxConnections = number | 'infinity' export type ListenersWithNameWssRequiredBindType = - typeof ListenersWithNameWssRequiredBindType[keyof typeof ListenersWithNameWssRequiredBindType] + (typeof ListenersWithNameWssRequiredBindType)[keyof typeof ListenersWithNameWssRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWithNameWssRequiredBindType = { @@ -396,7 +399,7 @@ export interface ListenersWithNameWssRequiredBind { } export type ListenersWithNameWsRequiredBindEnableAuthn = - typeof ListenersWithNameWsRequiredBindEnableAuthn[keyof typeof ListenersWithNameWsRequiredBindEnableAuthn] + (typeof ListenersWithNameWsRequiredBindEnableAuthn)[keyof typeof ListenersWithNameWsRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWithNameWsRequiredBindEnableAuthn = { @@ -408,7 +411,7 @@ export const ListenersWithNameWsRequiredBindEnableAuthn = { export type ListenersWithNameWsRequiredBindMaxConnections = number | 'infinity' export type ListenersWithNameWsRequiredBindType = - typeof ListenersWithNameWsRequiredBindType[keyof typeof ListenersWithNameWsRequiredBindType] + (typeof ListenersWithNameWsRequiredBindType)[keyof typeof ListenersWithNameWsRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWithNameWsRequiredBindType = { @@ -438,7 +441,7 @@ export interface ListenersWithNameWsRequiredBind { } export type ListenersWithNameTcpRequiredBindEnableAuthn = - typeof ListenersWithNameTcpRequiredBindEnableAuthn[keyof typeof ListenersWithNameTcpRequiredBindEnableAuthn] + (typeof ListenersWithNameTcpRequiredBindEnableAuthn)[keyof typeof ListenersWithNameTcpRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWithNameTcpRequiredBindEnableAuthn = { @@ -450,7 +453,7 @@ export const ListenersWithNameTcpRequiredBindEnableAuthn = { export type ListenersWithNameTcpRequiredBindMaxConnections = number | 'infinity' export type ListenersWithNameTcpRequiredBindType = - typeof ListenersWithNameTcpRequiredBindType[keyof typeof ListenersWithNameTcpRequiredBindType] + (typeof ListenersWithNameTcpRequiredBindType)[keyof typeof ListenersWithNameTcpRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWithNameTcpRequiredBindType = { @@ -458,7 +461,7 @@ export const ListenersWithNameTcpRequiredBindType = { } as const export type ListenersWithNameSslRequiredBindEnableAuthn = - typeof ListenersWithNameSslRequiredBindEnableAuthn[keyof typeof ListenersWithNameSslRequiredBindEnableAuthn] + (typeof ListenersWithNameSslRequiredBindEnableAuthn)[keyof typeof ListenersWithNameSslRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWithNameSslRequiredBindEnableAuthn = { @@ -470,7 +473,7 @@ export const ListenersWithNameSslRequiredBindEnableAuthn = { export type ListenersWithNameSslRequiredBindMaxConnections = number | 'infinity' export type ListenersWithNameSslRequiredBindType = - typeof ListenersWithNameSslRequiredBindType[keyof typeof ListenersWithNameSslRequiredBindType] + (typeof ListenersWithNameSslRequiredBindType)[keyof typeof ListenersWithNameSslRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWithNameSslRequiredBindType = { @@ -478,7 +481,7 @@ export const ListenersWithNameSslRequiredBindType = { } as const export type ListenersWithNameQuicRequiredBindEnableAuthn = - typeof ListenersWithNameQuicRequiredBindEnableAuthn[keyof typeof ListenersWithNameQuicRequiredBindEnableAuthn] + (typeof ListenersWithNameQuicRequiredBindEnableAuthn)[keyof typeof ListenersWithNameQuicRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWithNameQuicRequiredBindEnableAuthn = { @@ -490,7 +493,7 @@ export const ListenersWithNameQuicRequiredBindEnableAuthn = { export type ListenersWithNameQuicRequiredBindMaxConnections = number | 'infinity' export type ListenersWithNameQuicRequiredBindType = - typeof ListenersWithNameQuicRequiredBindType[keyof typeof ListenersWithNameQuicRequiredBindType] + (typeof ListenersWithNameQuicRequiredBindType)[keyof typeof ListenersWithNameQuicRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersWithNameQuicRequiredBindType = { @@ -517,7 +520,7 @@ export interface ListenersWithNameQuicRequiredBind { } export type ListenersTcpRequiredBindEnableAuthn = - typeof ListenersTcpRequiredBindEnableAuthn[keyof typeof ListenersTcpRequiredBindEnableAuthn] + (typeof ListenersTcpRequiredBindEnableAuthn)[keyof typeof ListenersTcpRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersTcpRequiredBindEnableAuthn = { @@ -529,7 +532,7 @@ export const ListenersTcpRequiredBindEnableAuthn = { export type ListenersTcpRequiredBindMaxConnections = number | 'infinity' export type ListenersTcpRequiredBindType = - typeof ListenersTcpRequiredBindType[keyof typeof ListenersTcpRequiredBindType] + (typeof ListenersTcpRequiredBindType)[keyof typeof ListenersTcpRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersTcpRequiredBindType = { @@ -558,7 +561,7 @@ export interface ListenersTcpRequiredBind { } export type ListenersTcpNotRequiredBindEnableAuthn = - typeof ListenersTcpNotRequiredBindEnableAuthn[keyof typeof ListenersTcpNotRequiredBindEnableAuthn] + (typeof ListenersTcpNotRequiredBindEnableAuthn)[keyof typeof ListenersTcpNotRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersTcpNotRequiredBindEnableAuthn = { @@ -570,7 +573,7 @@ export const ListenersTcpNotRequiredBindEnableAuthn = { export type ListenersTcpNotRequiredBindMaxConnections = number | 'infinity' export type ListenersTcpNotRequiredBindType = - typeof ListenersTcpNotRequiredBindType[keyof typeof ListenersTcpNotRequiredBindType] + (typeof ListenersTcpNotRequiredBindType)[keyof typeof ListenersTcpNotRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersTcpNotRequiredBindType = { @@ -609,7 +612,7 @@ export interface ListenersStatus { } export type ListenersSslRequiredBindEnableAuthn = - typeof ListenersSslRequiredBindEnableAuthn[keyof typeof ListenersSslRequiredBindEnableAuthn] + (typeof ListenersSslRequiredBindEnableAuthn)[keyof typeof ListenersSslRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersSslRequiredBindEnableAuthn = { @@ -621,7 +624,7 @@ export const ListenersSslRequiredBindEnableAuthn = { export type ListenersSslRequiredBindMaxConnections = number | 'infinity' export type ListenersSslRequiredBindType = - typeof ListenersSslRequiredBindType[keyof typeof ListenersSslRequiredBindType] + (typeof ListenersSslRequiredBindType)[keyof typeof ListenersSslRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersSslRequiredBindType = { @@ -651,7 +654,7 @@ export interface ListenersSslRequiredBind { } export type ListenersSslNotRequiredBindEnableAuthn = - typeof ListenersSslNotRequiredBindEnableAuthn[keyof typeof ListenersSslNotRequiredBindEnableAuthn] + (typeof ListenersSslNotRequiredBindEnableAuthn)[keyof typeof ListenersSslNotRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersSslNotRequiredBindEnableAuthn = { @@ -663,7 +666,7 @@ export const ListenersSslNotRequiredBindEnableAuthn = { export type ListenersSslNotRequiredBindMaxConnections = number | 'infinity' export type ListenersSslNotRequiredBindType = - typeof ListenersSslNotRequiredBindType[keyof typeof ListenersSslNotRequiredBindType] + (typeof ListenersSslNotRequiredBindType)[keyof typeof ListenersSslNotRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersSslNotRequiredBindType = { @@ -693,7 +696,7 @@ export interface ListenersSslNotRequiredBind { } export type ListenersQuicRequiredBindEnableAuthn = - typeof ListenersQuicRequiredBindEnableAuthn[keyof typeof ListenersQuicRequiredBindEnableAuthn] + (typeof ListenersQuicRequiredBindEnableAuthn)[keyof typeof ListenersQuicRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersQuicRequiredBindEnableAuthn = { @@ -705,7 +708,7 @@ export const ListenersQuicRequiredBindEnableAuthn = { export type ListenersQuicRequiredBindMaxConnections = number | 'infinity' export type ListenersQuicRequiredBindType = - typeof ListenersQuicRequiredBindType[keyof typeof ListenersQuicRequiredBindType] + (typeof ListenersQuicRequiredBindType)[keyof typeof ListenersQuicRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersQuicRequiredBindType = { @@ -732,7 +735,7 @@ export interface ListenersQuicRequiredBind { } export type ListenersQuicNotRequiredBindEnableAuthn = - typeof ListenersQuicNotRequiredBindEnableAuthn[keyof typeof ListenersQuicNotRequiredBindEnableAuthn] + (typeof ListenersQuicNotRequiredBindEnableAuthn)[keyof typeof ListenersQuicNotRequiredBindEnableAuthn] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersQuicNotRequiredBindEnableAuthn = { @@ -744,7 +747,7 @@ export const ListenersQuicNotRequiredBindEnableAuthn = { export type ListenersQuicNotRequiredBindMaxConnections = number | 'infinity' export type ListenersQuicNotRequiredBindType = - typeof ListenersQuicNotRequiredBindType[keyof typeof ListenersQuicNotRequiredBindType] + (typeof ListenersQuicNotRequiredBindType)[keyof typeof ListenersQuicNotRequiredBindType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersQuicNotRequiredBindType = { @@ -776,7 +779,7 @@ export interface ListenersNodeStatus { } export type ListenersListenerTypeStatusType = - typeof ListenersListenerTypeStatusType[keyof typeof ListenersListenerTypeStatusType] + (typeof ListenersListenerTypeStatusType)[keyof typeof ListenersListenerTypeStatusType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersListenerTypeStatusType = { @@ -796,7 +799,7 @@ export interface ListenersListenerTypeStatus { } export type ListenersListenerIdStatusType = - typeof ListenersListenerIdStatusType[keyof typeof ListenersListenerIdStatusType] + (typeof ListenersListenerIdStatusType)[keyof typeof ListenersListenerIdStatusType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const ListenersListenerIdStatusType = { @@ -822,7 +825,7 @@ export interface ListenersListenerIdStatus { export type EmqxWsOptsMaxFrameSize = number | 'infinity' export type EmqxWsOptsMqttPiggyback = - typeof EmqxWsOptsMqttPiggyback[keyof typeof EmqxWsOptsMqttPiggyback] + (typeof EmqxWsOptsMqttPiggyback)[keyof typeof EmqxWsOptsMqttPiggyback] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxWsOptsMqttPiggyback = { @@ -857,6 +860,7 @@ export interface EmqxTcpOpts { buffer?: string high_watermark?: string nodelay?: boolean + nolinger?: boolean reuseaddr?: boolean keepalive?: string } @@ -891,7 +895,7 @@ export interface EmqxOcsp { } export type EmqxListenerWssOptsLogLevel = - typeof EmqxListenerWssOptsLogLevel[keyof typeof EmqxListenerWssOptsLogLevel] + (typeof EmqxListenerWssOptsLogLevel)[keyof typeof EmqxListenerWssOptsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxListenerWssOptsLogLevel = { @@ -908,7 +912,7 @@ export const EmqxListenerWssOptsLogLevel = { } as const export type EmqxListenerWssOptsVerify = - typeof EmqxListenerWssOptsVerify[keyof typeof EmqxListenerWssOptsVerify] + (typeof EmqxListenerWssOptsVerify)[keyof typeof EmqxListenerWssOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxListenerWssOptsVerify = { @@ -939,7 +943,7 @@ export interface EmqxListenerWssOpts { } export type EmqxListenerSslOptsLogLevel = - typeof EmqxListenerSslOptsLogLevel[keyof typeof EmqxListenerSslOptsLogLevel] + (typeof EmqxListenerSslOptsLogLevel)[keyof typeof EmqxListenerSslOptsLogLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxListenerSslOptsLogLevel = { @@ -956,7 +960,7 @@ export const EmqxListenerSslOptsLogLevel = { } as const export type EmqxListenerSslOptsVerify = - typeof EmqxListenerSslOptsVerify[keyof typeof EmqxListenerSslOptsVerify] + (typeof EmqxListenerSslOptsVerify)[keyof typeof EmqxListenerSslOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxListenerSslOptsVerify = { @@ -1012,7 +1016,7 @@ export interface ListenersWithNameSslRequiredBind { } export type EmqxListenerQuicSslOptsVerify = - typeof EmqxListenerQuicSslOptsVerify[keyof typeof EmqxListenerQuicSslOptsVerify] + (typeof EmqxListenerQuicSslOptsVerify)[keyof typeof EmqxListenerQuicSslOptsVerify] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxListenerQuicSslOptsVerify = { @@ -1030,7 +1034,7 @@ export interface EmqxListenerQuicSslOpts { } export type EmqxDeflateOptsClientContextTakeover = - typeof EmqxDeflateOptsClientContextTakeover[keyof typeof EmqxDeflateOptsClientContextTakeover] + (typeof EmqxDeflateOptsClientContextTakeover)[keyof typeof EmqxDeflateOptsClientContextTakeover] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxDeflateOptsClientContextTakeover = { @@ -1039,7 +1043,7 @@ export const EmqxDeflateOptsClientContextTakeover = { } as const export type EmqxDeflateOptsServerContextTakeover = - typeof EmqxDeflateOptsServerContextTakeover[keyof typeof EmqxDeflateOptsServerContextTakeover] + (typeof EmqxDeflateOptsServerContextTakeover)[keyof typeof EmqxDeflateOptsServerContextTakeover] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxDeflateOptsServerContextTakeover = { @@ -1048,7 +1052,7 @@ export const EmqxDeflateOptsServerContextTakeover = { } as const export type EmqxDeflateOptsStrategy = - typeof EmqxDeflateOptsStrategy[keyof typeof EmqxDeflateOptsStrategy] + (typeof EmqxDeflateOptsStrategy)[keyof typeof EmqxDeflateOptsStrategy] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxDeflateOptsStrategy = { @@ -1058,7 +1062,7 @@ export const EmqxDeflateOptsStrategy = { rle: 'rle', } as const -export type EmqxDeflateOptsLevel = typeof EmqxDeflateOptsLevel[keyof typeof EmqxDeflateOptsLevel] +export type EmqxDeflateOptsLevel = (typeof EmqxDeflateOptsLevel)[keyof typeof EmqxDeflateOptsLevel] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxDeflateOptsLevel = { diff --git a/src/types/schemas/metrics.schemas.ts b/src/types/schemas/metrics.schemas.ts index 403289b7f..692f4acf2 100644 --- a/src/types/schemas/metrics.schemas.ts +++ b/src/types/schemas/metrics.schemas.ts @@ -313,42 +313,42 @@ export interface EmqxMgmtApiMetricsAggregatedMetrics { } export interface EmqxDashboardMonitorApiSamplerCurrentNode { + connections?: number + disconnected_durable_sessions?: number dropped_msg_rate?: number - sent_msg_rate?: number + live_connections?: number + node_uptime?: number persisted_rate?: number received_msg_rate?: number + retained_msg_count?: number + sent_msg_rate?: number + shared_subscriptions?: number + subscriptions?: number + subscriptions_durable?: number + topics?: number transformation_failed_rate?: number transformation_succeeded_rate?: number validation_failed_rate?: number validation_succeeded_rate?: number - disconnected_durable_sessions?: number - subscriptions_durable?: number - subscriptions?: number - topics?: number - connections?: number - live_connections?: number - node_uptime?: number - retained_msg_count?: number - shared_subscriptions?: number } export interface EmqxDashboardMonitorApiSamplerCurrent { + connections?: number + disconnected_durable_sessions?: number dropped_msg_rate?: number - sent_msg_rate?: number + live_connections?: number persisted_rate?: number received_msg_rate?: number + retained_msg_count?: number + sent_msg_rate?: number + shared_subscriptions?: number + subscriptions?: number + subscriptions_durable?: number + topics?: number transformation_failed_rate?: number transformation_succeeded_rate?: number validation_failed_rate?: number validation_succeeded_rate?: number - disconnected_durable_sessions?: number - subscriptions_durable?: number - subscriptions?: number - topics?: number - connections?: number - live_connections?: number - retained_msg_count?: number - shared_subscriptions?: number } export interface EmqxDashboardMonitorApiSampler { diff --git a/src/types/schemas/monitor.schemas.ts b/src/types/schemas/monitor.schemas.ts index 8b705ad4c..30dd95b69 100644 --- a/src/types/schemas/monitor.schemas.ts +++ b/src/types/schemas/monitor.schemas.ts @@ -1,24 +1,13 @@ -export type PutOpentelemetry400Code = - typeof PutOpentelemetry400Code[keyof typeof PutOpentelemetry400Code] - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const PutOpentelemetry400Code = { - BAD_REQUEST: 'BAD_REQUEST', -} as const - -export type PutOpentelemetry400 = { - code?: PutOpentelemetry400Code - message?: string -} - export type GetPrometheusAuth200Two = { [key: string]: any } export type GetPrometheusStats200Two = { [key: string]: any } export type GetPrometheusDataIntegration200Two = { [key: string]: any } +export type PutPrometheusBody = PrometheusLegacyDeprecatedSetting | PrometheusRecommendSetting + export type EmqxPrometheusApiModeParameter = - typeof EmqxPrometheusApiModeParameter[keyof typeof EmqxPrometheusApiModeParameter] + (typeof EmqxPrometheusApiModeParameter)[keyof typeof EmqxPrometheusApiModeParameter] // eslint-disable-next-line @typescript-eslint/no-redeclare export const EmqxPrometheusApiModeParameter = { @@ -55,10 +44,8 @@ export interface PrometheusRecommendSetting { collectors?: PrometheusCollectors } -export type PutPrometheusBody = PrometheusLegacyDeprecatedSetting | PrometheusRecommendSetting - export type PrometheusLegacyDeprecatedSettingVmMsaccCollector = - typeof PrometheusLegacyDeprecatedSettingVmMsaccCollector[keyof typeof PrometheusLegacyDeprecatedSettingVmMsaccCollector] + (typeof PrometheusLegacyDeprecatedSettingVmMsaccCollector)[keyof typeof PrometheusLegacyDeprecatedSettingVmMsaccCollector] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusLegacyDeprecatedSettingVmMsaccCollector = { @@ -67,7 +54,7 @@ export const PrometheusLegacyDeprecatedSettingVmMsaccCollector = { } as const export type PrometheusLegacyDeprecatedSettingVmMemoryCollector = - typeof PrometheusLegacyDeprecatedSettingVmMemoryCollector[keyof typeof PrometheusLegacyDeprecatedSettingVmMemoryCollector] + (typeof PrometheusLegacyDeprecatedSettingVmMemoryCollector)[keyof typeof PrometheusLegacyDeprecatedSettingVmMemoryCollector] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusLegacyDeprecatedSettingVmMemoryCollector = { @@ -76,7 +63,7 @@ export const PrometheusLegacyDeprecatedSettingVmMemoryCollector = { } as const export type PrometheusLegacyDeprecatedSettingVmSystemInfoCollector = - typeof PrometheusLegacyDeprecatedSettingVmSystemInfoCollector[keyof typeof PrometheusLegacyDeprecatedSettingVmSystemInfoCollector] + (typeof PrometheusLegacyDeprecatedSettingVmSystemInfoCollector)[keyof typeof PrometheusLegacyDeprecatedSettingVmSystemInfoCollector] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusLegacyDeprecatedSettingVmSystemInfoCollector = { @@ -85,7 +72,7 @@ export const PrometheusLegacyDeprecatedSettingVmSystemInfoCollector = { } as const export type PrometheusLegacyDeprecatedSettingVmStatisticsCollector = - typeof PrometheusLegacyDeprecatedSettingVmStatisticsCollector[keyof typeof PrometheusLegacyDeprecatedSettingVmStatisticsCollector] + (typeof PrometheusLegacyDeprecatedSettingVmStatisticsCollector)[keyof typeof PrometheusLegacyDeprecatedSettingVmStatisticsCollector] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusLegacyDeprecatedSettingVmStatisticsCollector = { @@ -94,7 +81,7 @@ export const PrometheusLegacyDeprecatedSettingVmStatisticsCollector = { } as const export type PrometheusLegacyDeprecatedSettingMnesiaCollector = - typeof PrometheusLegacyDeprecatedSettingMnesiaCollector[keyof typeof PrometheusLegacyDeprecatedSettingMnesiaCollector] + (typeof PrometheusLegacyDeprecatedSettingMnesiaCollector)[keyof typeof PrometheusLegacyDeprecatedSettingMnesiaCollector] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusLegacyDeprecatedSettingMnesiaCollector = { @@ -103,7 +90,7 @@ export const PrometheusLegacyDeprecatedSettingMnesiaCollector = { } as const export type PrometheusLegacyDeprecatedSettingVmDistCollector = - typeof PrometheusLegacyDeprecatedSettingVmDistCollector[keyof typeof PrometheusLegacyDeprecatedSettingVmDistCollector] + (typeof PrometheusLegacyDeprecatedSettingVmDistCollector)[keyof typeof PrometheusLegacyDeprecatedSettingVmDistCollector] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusLegacyDeprecatedSettingVmDistCollector = { @@ -128,7 +115,7 @@ export interface PrometheusLegacyDeprecatedSetting { } export type PrometheusCollectorsVmMsacc = - typeof PrometheusCollectorsVmMsacc[keyof typeof PrometheusCollectorsVmMsacc] + (typeof PrometheusCollectorsVmMsacc)[keyof typeof PrometheusCollectorsVmMsacc] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusCollectorsVmMsacc = { @@ -137,7 +124,7 @@ export const PrometheusCollectorsVmMsacc = { } as const export type PrometheusCollectorsVmMemory = - typeof PrometheusCollectorsVmMemory[keyof typeof PrometheusCollectorsVmMemory] + (typeof PrometheusCollectorsVmMemory)[keyof typeof PrometheusCollectorsVmMemory] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusCollectorsVmMemory = { @@ -146,7 +133,7 @@ export const PrometheusCollectorsVmMemory = { } as const export type PrometheusCollectorsVmSystemInfo = - typeof PrometheusCollectorsVmSystemInfo[keyof typeof PrometheusCollectorsVmSystemInfo] + (typeof PrometheusCollectorsVmSystemInfo)[keyof typeof PrometheusCollectorsVmSystemInfo] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusCollectorsVmSystemInfo = { @@ -155,7 +142,7 @@ export const PrometheusCollectorsVmSystemInfo = { } as const export type PrometheusCollectorsVmStatistics = - typeof PrometheusCollectorsVmStatistics[keyof typeof PrometheusCollectorsVmStatistics] + (typeof PrometheusCollectorsVmStatistics)[keyof typeof PrometheusCollectorsVmStatistics] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusCollectorsVmStatistics = { @@ -164,7 +151,7 @@ export const PrometheusCollectorsVmStatistics = { } as const export type PrometheusCollectorsMnesia = - typeof PrometheusCollectorsMnesia[keyof typeof PrometheusCollectorsMnesia] + (typeof PrometheusCollectorsMnesia)[keyof typeof PrometheusCollectorsMnesia] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusCollectorsMnesia = { @@ -173,7 +160,7 @@ export const PrometheusCollectorsMnesia = { } as const export type PrometheusCollectorsVmDist = - typeof PrometheusCollectorsVmDist[keyof typeof PrometheusCollectorsVmDist] + (typeof PrometheusCollectorsVmDist)[keyof typeof PrometheusCollectorsVmDist] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PrometheusCollectorsVmDist = { @@ -189,99 +176,3 @@ export interface PrometheusCollectors { vm_memory: PrometheusCollectorsVmMemory vm_msacc: PrometheusCollectorsVmMsacc } - -export interface OpentelemetryTraceFilter { - trace_all?: boolean -} - -export interface OpentelemetryOtelTraces { - enable?: boolean - scheduled_delay?: string - filter?: OpentelemetryTraceFilter -} - -export interface OpentelemetryOtelMetrics { - enable: boolean - interval?: string -} - -export type OpentelemetryOtelLogsLevel = - typeof OpentelemetryOtelLogsLevel[keyof typeof OpentelemetryOtelLogsLevel] - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const OpentelemetryOtelLogsLevel = { - debug: 'debug', - info: 'info', - notice: 'notice', - warning: 'warning', - error: 'error', - critical: 'critical', - alert: 'alert', - emergency: 'emergency', - all: 'all', -} as const - -export interface OpentelemetryOtelLogs { - level?: OpentelemetryOtelLogsLevel - enable?: boolean - scheduled_delay?: string -} - -export interface OpentelemetryOtelExporter { - endpoint?: string - ssl_options?: EmqxSslClientOpts -} - -export interface OpentelemetryOpentelemetry { - metrics?: OpentelemetryOtelMetrics - logs?: OpentelemetryOtelLogs - traces?: OpentelemetryOtelTraces - exporter?: OpentelemetryOtelExporter -} - -export type EmqxSslClientOptsServerNameIndication = string | 'disable' - -export type EmqxSslClientOptsLogLevel = - typeof EmqxSslClientOptsLogLevel[keyof typeof EmqxSslClientOptsLogLevel] - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const EmqxSslClientOptsLogLevel = { - emergency: 'emergency', - alert: 'alert', - critical: 'critical', - error: 'error', - warning: 'warning', - notice: 'notice', - info: 'info', - debug: 'debug', - none: 'none', - all: 'all', -} as const - -export type EmqxSslClientOptsVerify = - typeof EmqxSslClientOptsVerify[keyof typeof EmqxSslClientOptsVerify] - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const EmqxSslClientOptsVerify = { - verify_peer: 'verify_peer', - verify_none: 'verify_none', -} as const - -export interface EmqxSslClientOpts { - cacertfile?: string - /** @deprecated */ - cacerts?: boolean - certfile?: string - keyfile?: string - verify?: EmqxSslClientOptsVerify - reuse_sessions?: boolean - depth?: number - password?: string - versions?: string[] - ciphers?: string[] - secure_renegotiate?: boolean - log_level?: EmqxSslClientOptsLogLevel - hibernate_after?: string - enable?: boolean - server_name_indication?: EmqxSslClientOptsServerNameIndication -} diff --git a/src/types/schemas/plugins.schemas.ts b/src/types/schemas/plugins.schemas.ts index b7f7eb6d2..d31271fd6 100644 --- a/src/types/schemas/plugins.schemas.ts +++ b/src/types/schemas/plugins.schemas.ts @@ -1,24 +1,18 @@ -export type PostPluginsInstall400Code = - typeof PostPluginsInstall400Code[keyof typeof PostPluginsInstall400Code] +export type PutPluginsNameAction404Code = + (typeof PutPluginsNameAction404Code)[keyof typeof PutPluginsNameAction404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare -export const PostPluginsInstall400Code = { - UNEXPECTED_ERROR: 'UNEXPECTED_ERROR', - ALREADY_INSTALLED: 'ALREADY_INSTALLED', - BAD_PLUGIN_INFO: 'BAD_PLUGIN_INFO', +export const PutPluginsNameAction404Code = { + NOT_FOUND: 'NOT_FOUND', } as const -export type PostPluginsInstall400 = { - code?: PostPluginsInstall400Code +export type PutPluginsNameAction404 = { + code?: PutPluginsNameAction404Code message?: string } -export type PostPluginsInstallBody = { - plugin?: Blob -} - export type PostPluginsNameMove400Code = - typeof PostPluginsNameMove400Code[keyof typeof PostPluginsNameMove400Code] + (typeof PostPluginsNameMove400Code)[keyof typeof PostPluginsNameMove400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostPluginsNameMove400Code = { @@ -30,21 +24,47 @@ export type PostPluginsNameMove400 = { message?: string } -export type PutPluginsNameAction404Code = - typeof PutPluginsNameAction404Code[keyof typeof PutPluginsNameAction404Code] +export type DeletePluginsName404Code = + (typeof DeletePluginsName404Code)[keyof typeof DeletePluginsName404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare -export const PutPluginsNameAction404Code = { +export const DeletePluginsName404Code = { NOT_FOUND: 'NOT_FOUND', } as const -export type PutPluginsNameAction404 = { - code?: PutPluginsNameAction404Code +export type DeletePluginsName404 = { + code?: DeletePluginsName404Code + message?: string +} + +export type DeletePluginsName400Code = + (typeof DeletePluginsName400Code)[keyof typeof DeletePluginsName400Code] + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const DeletePluginsName400Code = { + PARAM_ERROR: 'PARAM_ERROR', +} as const + +export type DeletePluginsName400 = { + code?: DeletePluginsName400Code + message?: string +} + +export type GetPluginsName404Code = + (typeof GetPluginsName404Code)[keyof typeof GetPluginsName404Code] + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const GetPluginsName404Code = { + NOT_FOUND: 'NOT_FOUND', +} as const + +export type GetPluginsName404 = { + code?: GetPluginsName404Code message?: string } export type PutPluginsNameConfig404Code = - typeof PutPluginsNameConfig404Code[keyof typeof PutPluginsNameConfig404Code] + (typeof PutPluginsNameConfig404Code)[keyof typeof PutPluginsNameConfig404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutPluginsNameConfig404Code = { @@ -57,7 +77,7 @@ export type PutPluginsNameConfig404 = { } export type PutPluginsNameConfig400Code = - typeof PutPluginsNameConfig400Code[keyof typeof PutPluginsNameConfig400Code] + (typeof PutPluginsNameConfig400Code)[keyof typeof PutPluginsNameConfig400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutPluginsNameConfig400Code = { @@ -70,10 +90,10 @@ export type PutPluginsNameConfig400 = { message?: string } -export type PutPluginsNameConfigBody = { [key: string]: any } +export type PutPluginsNameConfigBody = { [key: string]: unknown } export type GetPluginsNameConfig404Code = - typeof GetPluginsNameConfig404Code[keyof typeof GetPluginsNameConfig404Code] + (typeof GetPluginsNameConfig404Code)[keyof typeof GetPluginsNameConfig404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetPluginsNameConfig404Code = { @@ -86,7 +106,7 @@ export type GetPluginsNameConfig404 = { } export type GetPluginsNameConfig400Code = - typeof GetPluginsNameConfig400Code[keyof typeof GetPluginsNameConfig400Code] + (typeof GetPluginsNameConfig400Code)[keyof typeof GetPluginsNameConfig400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetPluginsNameConfig400Code = { @@ -98,46 +118,54 @@ export type GetPluginsNameConfig400 = { message?: string } -export type DeletePluginsName404Code = - typeof DeletePluginsName404Code[keyof typeof DeletePluginsName404Code] +export type PostPluginsClusterSync404Code = + (typeof PostPluginsClusterSync404Code)[keyof typeof PostPluginsClusterSync404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare -export const DeletePluginsName404Code = { +export const PostPluginsClusterSync404Code = { NOT_FOUND: 'NOT_FOUND', } as const -export type DeletePluginsName404 = { - code?: DeletePluginsName404Code +export type PostPluginsClusterSync404 = { + code?: PostPluginsClusterSync404Code message?: string } -export type DeletePluginsName400Code = - typeof DeletePluginsName400Code[keyof typeof DeletePluginsName400Code] +export type PostPluginsClusterSync400Code = + (typeof PostPluginsClusterSync400Code)[keyof typeof PostPluginsClusterSync400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare -export const DeletePluginsName400Code = { - PARAM_ERROR: 'PARAM_ERROR', +export const PostPluginsClusterSync400Code = { + BAD_NODE: 'BAD_NODE', + BAD_PLUGIN_INFO: 'BAD_PLUGIN_INFO', } as const -export type DeletePluginsName400 = { - code?: DeletePluginsName400Code +export type PostPluginsClusterSync400 = { + code?: PostPluginsClusterSync400Code message?: string } -export type GetPluginsName404Code = typeof GetPluginsName404Code[keyof typeof GetPluginsName404Code] +export type PostPluginsInstall400Code = + (typeof PostPluginsInstall400Code)[keyof typeof PostPluginsInstall400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare -export const GetPluginsName404Code = { - NOT_FOUND: 'NOT_FOUND', +export const PostPluginsInstall400Code = { + UNEXPECTED_ERROR: 'UNEXPECTED_ERROR', + ALREADY_INSTALLED: 'ALREADY_INSTALLED', + BAD_PLUGIN_INFO: 'BAD_PLUGIN_INFO', } as const -export type GetPluginsName404 = { - code?: GetPluginsName404Code +export type PostPluginsInstall400 = { + code?: PostPluginsInstall400Code message?: string } +export type PostPluginsInstallBody = { + plugin?: Blob +} + export type GetPluginsNameSchema404Code = - typeof GetPluginsNameSchema404Code[keyof typeof GetPluginsNameSchema404Code] + (typeof GetPluginsNameSchema404Code)[keyof typeof GetPluginsNameSchema404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetPluginsNameSchema404Code = { @@ -150,8 +178,13 @@ export type GetPluginsNameSchema404 = { message?: string } +export interface PluginsSyncRequest { + name: string + node: string +} + export type PluginsRunningStatusStatus = - typeof PluginsRunningStatusStatus[keyof typeof PluginsRunningStatusStatus] + (typeof PluginsRunningStatusStatus)[keyof typeof PluginsRunningStatusStatus] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PluginsRunningStatusStatus = { @@ -170,7 +203,7 @@ export interface PluginsPosition { position?: PluginsPositionPosition } -export type PluginsPluginCompatibility = { [key: string]: any } +export type PluginsPluginCompatibility = { [key: string]: unknown } export interface PluginsBuilder { contact?: string @@ -179,19 +212,19 @@ export interface PluginsBuilder { } export interface PluginsPlugin { - name: string author?: string[] builder?: PluginsBuilder built_on_otp_release?: string compatibility?: PluginsPluginCompatibility - git_commit_or_build_date?: string + description: string functionality?: string[] + git_commit_or_build_date?: string git_ref?: string metadata_vsn?: string - rel_vsn: string + name: string + readme?: string rel_apps: string[] + rel_vsn: string repo?: string - description: string running_status: PluginsRunningStatus[] - readme?: string } diff --git a/src/types/schemas/retainer.schemas.ts b/src/types/schemas/retainer.schemas.ts index f36095dfe..625529a74 100644 --- a/src/types/schemas/retainer.schemas.ts +++ b/src/types/schemas/retainer.schemas.ts @@ -1,5 +1,5 @@ export type PutMqttRetainer400Code = - typeof PutMqttRetainer400Code[keyof typeof PutMqttRetainer400Code] + (typeof PutMqttRetainer400Code)[keyof typeof PutMqttRetainer400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutMqttRetainer400Code = { @@ -12,7 +12,7 @@ export type PutMqttRetainer400 = { } export type GetMqttRetainer404Code = - typeof GetMqttRetainer404Code[keyof typeof GetMqttRetainer404Code] + (typeof GetMqttRetainer404Code)[keyof typeof GetMqttRetainer404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetMqttRetainer404Code = { @@ -25,7 +25,7 @@ export type GetMqttRetainer404 = { } export type DeleteMqttRetainerMessageTopic404Code = - typeof DeleteMqttRetainerMessageTopic404Code[keyof typeof DeleteMqttRetainerMessageTopic404Code] + (typeof DeleteMqttRetainerMessageTopic404Code)[keyof typeof DeleteMqttRetainerMessageTopic404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteMqttRetainerMessageTopic404Code = { @@ -38,7 +38,7 @@ export type DeleteMqttRetainerMessageTopic404 = { } export type DeleteMqttRetainerMessageTopic400Code = - typeof DeleteMqttRetainerMessageTopic400Code[keyof typeof DeleteMqttRetainerMessageTopic400Code] + (typeof DeleteMqttRetainerMessageTopic400Code)[keyof typeof DeleteMqttRetainerMessageTopic400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteMqttRetainerMessageTopic400Code = { @@ -51,7 +51,7 @@ export type DeleteMqttRetainerMessageTopic400 = { } export type GetMqttRetainerMessageTopic404Code = - typeof GetMqttRetainerMessageTopic404Code[keyof typeof GetMqttRetainerMessageTopic404Code] + (typeof GetMqttRetainerMessageTopic404Code)[keyof typeof GetMqttRetainerMessageTopic404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetMqttRetainerMessageTopic404Code = { @@ -64,7 +64,7 @@ export type GetMqttRetainerMessageTopic404 = { } export type GetMqttRetainerMessageTopic400Code = - typeof GetMqttRetainerMessageTopic400Code[keyof typeof GetMqttRetainerMessageTopic400Code] + (typeof GetMqttRetainerMessageTopic400Code)[keyof typeof GetMqttRetainerMessageTopic400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetMqttRetainerMessageTopic400Code = { @@ -77,7 +77,7 @@ export type GetMqttRetainerMessageTopic400 = { } export type GetMqttRetainerMessages400Code = - typeof GetMqttRetainerMessages400Code[keyof typeof GetMqttRetainerMessages400Code] + (typeof GetMqttRetainerMessages400Code)[keyof typeof GetMqttRetainerMessages400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetMqttRetainerMessages400Code = { @@ -103,7 +103,7 @@ export type GetMqttRetainerMessagesParams = { export type RetainerRetainerMsgExpiryIntervalOverride = string | 'disabled' export type RetainerMnesiaConfigStorageType = - typeof RetainerMnesiaConfigStorageType[keyof typeof RetainerMnesiaConfigStorageType] + (typeof RetainerMnesiaConfigStorageType)[keyof typeof RetainerMnesiaConfigStorageType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RetainerMnesiaConfigStorageType = { @@ -112,7 +112,7 @@ export const RetainerMnesiaConfigStorageType = { } as const export type RetainerMnesiaConfigType = - typeof RetainerMnesiaConfigType[keyof typeof RetainerMnesiaConfigType] + (typeof RetainerMnesiaConfigType)[keyof typeof RetainerMnesiaConfigType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RetainerMnesiaConfigType = { @@ -136,6 +136,7 @@ export interface RetainerRetainer { max_payload_size?: string stop_publish_clear_msg?: boolean delivery_rate?: string + max_publish_rate?: string backend?: RetainerMnesiaConfig } diff --git a/src/types/schemas/rules.schemas.ts b/src/types/schemas/rules.schemas.ts index 4beaf83b2..5a4af311e 100644 --- a/src/types/schemas/rules.schemas.ts +++ b/src/types/schemas/rules.schemas.ts @@ -1,4 +1,4 @@ -export type PutRuleEngine400Code = typeof PutRuleEngine400Code[keyof typeof PutRuleEngine400Code] +export type PutRuleEngine400Code = (typeof PutRuleEngine400Code)[keyof typeof PutRuleEngine400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutRuleEngine400Code = { @@ -10,7 +10,7 @@ export type PutRuleEngine400 = { message?: string } -export type DeleteRulesId404Code = typeof DeleteRulesId404Code[keyof typeof DeleteRulesId404Code] +export type DeleteRulesId404Code = (typeof DeleteRulesId404Code)[keyof typeof DeleteRulesId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteRulesId404Code = { @@ -22,7 +22,7 @@ export type DeleteRulesId404 = { message?: string } -export type PutRulesId400Code = typeof PutRulesId400Code[keyof typeof PutRulesId400Code] +export type PutRulesId400Code = (typeof PutRulesId400Code)[keyof typeof PutRulesId400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutRulesId400Code = { @@ -34,7 +34,7 @@ export type PutRulesId400 = { message?: string } -export type GetRulesId404Code = typeof GetRulesId404Code[keyof typeof GetRulesId404Code] +export type GetRulesId404Code = (typeof GetRulesId404Code)[keyof typeof GetRulesId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetRulesId404Code = { @@ -47,7 +47,7 @@ export type GetRulesId404 = { } export type PutRulesIdMetricsReset404Code = - typeof PutRulesIdMetricsReset404Code[keyof typeof PutRulesIdMetricsReset404Code] + (typeof PutRulesIdMetricsReset404Code)[keyof typeof PutRulesIdMetricsReset404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutRulesIdMetricsReset404Code = { @@ -60,7 +60,7 @@ export type PutRulesIdMetricsReset404 = { } export type GetRulesIdMetrics404Code = - typeof GetRulesIdMetrics404Code[keyof typeof GetRulesIdMetrics404Code] + (typeof GetRulesIdMetrics404Code)[keyof typeof GetRulesIdMetrics404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetRulesIdMetrics404Code = { @@ -72,7 +72,7 @@ export type GetRulesIdMetrics404 = { message?: string } -export type PostRules400Code = typeof PostRules400Code[keyof typeof PostRules400Code] +export type PostRules400Code = (typeof PostRules400Code)[keyof typeof PostRules400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostRules400Code = { @@ -84,7 +84,7 @@ export type PostRules400 = { message?: string } -export type GetRules400Code = typeof GetRules400Code[keyof typeof GetRules400Code] +export type GetRules400Code = (typeof GetRules400Code)[keyof typeof GetRules400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetRules400Code = { @@ -115,7 +115,7 @@ export type GetRulesParams = { } export type PostRulesIdTest412Code = - typeof PostRulesIdTest412Code[keyof typeof PostRulesIdTest412Code] + (typeof PostRulesIdTest412Code)[keyof typeof PostRulesIdTest412Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostRulesIdTest412Code = { @@ -128,7 +128,7 @@ export type PostRulesIdTest412 = { } export type PostRulesIdTest404Code = - typeof PostRulesIdTest404Code[keyof typeof PostRulesIdTest404Code] + (typeof PostRulesIdTest404Code)[keyof typeof PostRulesIdTest404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostRulesIdTest404Code = { @@ -141,7 +141,7 @@ export type PostRulesIdTest404 = { } export type PostRulesIdTest400Code = - typeof PostRulesIdTest400Code[keyof typeof PostRulesIdTest400Code] + (typeof PostRulesIdTest400Code)[keyof typeof PostRulesIdTest400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostRulesIdTest400Code = { @@ -153,7 +153,7 @@ export type PostRulesIdTest400 = { message?: string } -export type PostRuleTest412Code = typeof PostRuleTest412Code[keyof typeof PostRuleTest412Code] +export type PostRuleTest412Code = (typeof PostRuleTest412Code)[keyof typeof PostRuleTest412Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostRuleTest412Code = { @@ -165,7 +165,7 @@ export type PostRuleTest412 = { message?: string } -export type PostRuleTest400Code = typeof PostRuleTest400Code[keyof typeof PostRuleTest400Code] +export type PostRuleTest400Code = (typeof PostRuleTest400Code)[keyof typeof PostRuleTest400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostRuleTest400Code = { @@ -189,21 +189,23 @@ export interface RuleEngineUserProvidedFunction { } export type RuleEngineRuleTestContext = - | RuleEngineCtxMessageTransformationFailed + | RuleEngineCtxUnsub + | RuleEngineCtxSub | RuleEngineCtxSchemaValidationFailed + | RuleEngineCtxMessageTransformationFailed + | RuleEngineCtxPub + | RuleEngineCtxDropped + | RuleEngineCtxDelivered + | RuleEngineCtxAcked | RuleEngineCtxDeliveryDropped - | RuleEngineCtxBridgeMqtt - | RuleEngineCtxCheckAuthnComplete - | RuleEngineCtxCheckAuthzComplete - | RuleEngineCtxConnack | RuleEngineCtxDisconnected | RuleEngineCtxConnected - | RuleEngineCtxDropped - | RuleEngineCtxAcked - | RuleEngineCtxDelivered - | RuleEngineCtxUnsub - | RuleEngineCtxSub - | RuleEngineCtxPub + | RuleEngineCtxConnack + | RuleEngineCtxCheckAuthzComplete + | RuleEngineCtxCheckAuthnComplete + | RuleEngineCtxAlarmDeactivated + | RuleEngineCtxAlarmActivated + | RuleEngineCtxBridgeMqtt export interface RuleEngineRuleTest { context?: RuleEngineRuleTestContext @@ -241,10 +243,12 @@ export type RuleEngineRuleEventsTestColumns = { [key: string]: any } export type RuleEngineRuleEventsColumns = { [key: string]: any } export type RuleEngineRuleEventsEvent = - typeof RuleEngineRuleEventsEvent[keyof typeof RuleEngineRuleEventsEvent] + (typeof RuleEngineRuleEventsEvent)[keyof typeof RuleEngineRuleEventsEvent] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineRuleEventsEvent = { + '$events/sys/alarm_activated': '$events/sys/alarm_activated', + '$events/sys/alarm_deactivated': '$events/sys/alarm_deactivated', '$events/client_connected': '$events/client_connected', '$events/client_disconnected': '$events/client_disconnected', '$events/client_connack': '$events/client_connack', @@ -290,6 +294,25 @@ export interface RuleEngineRuleCreation { metadata?: RuleEngineRuleCreationMetadata } +export type RuleEngineRuleApplyTestContext = + | RuleEngineCtxUnsub + | RuleEngineCtxSub + | RuleEngineCtxSchemaValidationFailed + | RuleEngineCtxMessageTransformationFailed + | RuleEngineCtxPub + | RuleEngineCtxDropped + | RuleEngineCtxDelivered + | RuleEngineCtxAcked + | RuleEngineCtxDeliveryDropped + | RuleEngineCtxDisconnected + | RuleEngineCtxConnected + | RuleEngineCtxConnack + | RuleEngineCtxCheckAuthzComplete + | RuleEngineCtxCheckAuthnComplete + | RuleEngineCtxAlarmDeactivated + | RuleEngineCtxAlarmActivated + | RuleEngineCtxBridgeMqtt + export interface RuleEngineRuleApplyTest { context?: RuleEngineRuleApplyTestContext stop_action_after_template_rendering?: boolean @@ -355,7 +378,7 @@ export interface RuleEngineMetrics { } export type RuleEngineCtxUnsubEventType = - typeof RuleEngineCtxUnsubEventType[keyof typeof RuleEngineCtxUnsubEventType] + (typeof RuleEngineCtxUnsubEventType)[keyof typeof RuleEngineCtxUnsubEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxUnsubEventType = { @@ -374,7 +397,7 @@ export interface RuleEngineCtxUnsub { } export type RuleEngineCtxSubEventType = - typeof RuleEngineCtxSubEventType[keyof typeof RuleEngineCtxSubEventType] + (typeof RuleEngineCtxSubEventType)[keyof typeof RuleEngineCtxSubEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxSubEventType = { @@ -393,7 +416,7 @@ export interface RuleEngineCtxSub { } export type RuleEngineCtxSchemaValidationFailedEventType = - typeof RuleEngineCtxSchemaValidationFailedEventType[keyof typeof RuleEngineCtxSchemaValidationFailedEventType] + (typeof RuleEngineCtxSchemaValidationFailedEventType)[keyof typeof RuleEngineCtxSchemaValidationFailedEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxSchemaValidationFailedEventType = { @@ -413,7 +436,7 @@ export interface RuleEngineCtxSchemaValidationFailed { } export type RuleEngineCtxPubEventType = - typeof RuleEngineCtxPubEventType[keyof typeof RuleEngineCtxPubEventType] + (typeof RuleEngineCtxPubEventType)[keyof typeof RuleEngineCtxPubEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxPubEventType = { @@ -433,7 +456,7 @@ export interface RuleEngineCtxPub { } export type RuleEngineCtxMessageTransformationFailedEventType = - typeof RuleEngineCtxMessageTransformationFailedEventType[keyof typeof RuleEngineCtxMessageTransformationFailedEventType] + (typeof RuleEngineCtxMessageTransformationFailedEventType)[keyof typeof RuleEngineCtxMessageTransformationFailedEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxMessageTransformationFailedEventType = { @@ -453,7 +476,7 @@ export interface RuleEngineCtxMessageTransformationFailed { } export type RuleEngineCtxDroppedEventType = - typeof RuleEngineCtxDroppedEventType[keyof typeof RuleEngineCtxDroppedEventType] + (typeof RuleEngineCtxDroppedEventType)[keyof typeof RuleEngineCtxDroppedEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxDroppedEventType = { @@ -473,25 +496,8 @@ export interface RuleEngineCtxDropped { qos?: number } -export type RuleEngineRuleApplyTestContext = - | RuleEngineCtxMessageTransformationFailed - | RuleEngineCtxSchemaValidationFailed - | RuleEngineCtxDeliveryDropped - | RuleEngineCtxBridgeMqtt - | RuleEngineCtxCheckAuthnComplete - | RuleEngineCtxCheckAuthzComplete - | RuleEngineCtxConnack - | RuleEngineCtxDisconnected - | RuleEngineCtxConnected - | RuleEngineCtxDropped - | RuleEngineCtxAcked - | RuleEngineCtxDelivered - | RuleEngineCtxUnsub - | RuleEngineCtxSub - | RuleEngineCtxPub - export type RuleEngineCtxDisconnectedEventType = - typeof RuleEngineCtxDisconnectedEventType[keyof typeof RuleEngineCtxDisconnectedEventType] + (typeof RuleEngineCtxDisconnectedEventType)[keyof typeof RuleEngineCtxDisconnectedEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxDisconnectedEventType = { @@ -509,7 +515,7 @@ export interface RuleEngineCtxDisconnected { } export type RuleEngineCtxDeliveryDroppedEventType = - typeof RuleEngineCtxDeliveryDroppedEventType[keyof typeof RuleEngineCtxDeliveryDroppedEventType] + (typeof RuleEngineCtxDeliveryDroppedEventType)[keyof typeof RuleEngineCtxDeliveryDroppedEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxDeliveryDroppedEventType = { @@ -532,7 +538,7 @@ export interface RuleEngineCtxDeliveryDropped { } export type RuleEngineCtxDeliveredEventType = - typeof RuleEngineCtxDeliveredEventType[keyof typeof RuleEngineCtxDeliveredEventType] + (typeof RuleEngineCtxDeliveredEventType)[keyof typeof RuleEngineCtxDeliveredEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxDeliveredEventType = { @@ -554,7 +560,7 @@ export interface RuleEngineCtxDelivered { } export type RuleEngineCtxConnectedEventType = - typeof RuleEngineCtxConnectedEventType[keyof typeof RuleEngineCtxConnectedEventType] + (typeof RuleEngineCtxConnectedEventType)[keyof typeof RuleEngineCtxConnectedEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxConnectedEventType = { @@ -578,7 +584,7 @@ export interface RuleEngineCtxConnected { } export type RuleEngineCtxConnackEventType = - typeof RuleEngineCtxConnackEventType[keyof typeof RuleEngineCtxConnackEventType] + (typeof RuleEngineCtxConnackEventType)[keyof typeof RuleEngineCtxConnackEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxConnackEventType = { @@ -601,7 +607,7 @@ export interface RuleEngineCtxConnack { } export type RuleEngineCtxCheckAuthzCompleteEventType = - typeof RuleEngineCtxCheckAuthzCompleteEventType[keyof typeof RuleEngineCtxCheckAuthzCompleteEventType] + (typeof RuleEngineCtxCheckAuthzCompleteEventType)[keyof typeof RuleEngineCtxCheckAuthzCompleteEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxCheckAuthzCompleteEventType = { @@ -620,7 +626,7 @@ export interface RuleEngineCtxCheckAuthzComplete { } export type RuleEngineCtxCheckAuthnCompleteEventType = - typeof RuleEngineCtxCheckAuthnCompleteEventType[keyof typeof RuleEngineCtxCheckAuthnCompleteEventType] + (typeof RuleEngineCtxCheckAuthnCompleteEventType)[keyof typeof RuleEngineCtxCheckAuthnCompleteEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxCheckAuthnCompleteEventType = { @@ -638,7 +644,7 @@ export interface RuleEngineCtxCheckAuthnComplete { } export type RuleEngineCtxBridgeMqttEventType = - typeof RuleEngineCtxBridgeMqttEventType[keyof typeof RuleEngineCtxBridgeMqttEventType] + (typeof RuleEngineCtxBridgeMqttEventType)[keyof typeof RuleEngineCtxBridgeMqttEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxBridgeMqttEventType = { @@ -657,8 +663,45 @@ export interface RuleEngineCtxBridgeMqtt { qos?: number } +export type RuleEngineCtxAlarmDeactivatedDetails = { [key: string]: any } + +export type RuleEngineCtxAlarmDeactivatedEventType = + (typeof RuleEngineCtxAlarmDeactivatedEventType)[keyof typeof RuleEngineCtxAlarmDeactivatedEventType] + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const RuleEngineCtxAlarmDeactivatedEventType = { + alarm_deactivated: 'alarm_deactivated', +} as const + +export interface RuleEngineCtxAlarmDeactivated { + event_type: RuleEngineCtxAlarmDeactivatedEventType + name?: string + message?: string + details?: RuleEngineCtxAlarmDeactivatedDetails + activated_at?: number + deactivated_at?: number +} + +export type RuleEngineCtxAlarmActivatedDetails = { [key: string]: any } + +export type RuleEngineCtxAlarmActivatedEventType = + (typeof RuleEngineCtxAlarmActivatedEventType)[keyof typeof RuleEngineCtxAlarmActivatedEventType] + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const RuleEngineCtxAlarmActivatedEventType = { + alarm_activated: 'alarm_activated', +} as const + +export interface RuleEngineCtxAlarmActivated { + event_type: RuleEngineCtxAlarmActivatedEventType + name?: string + message?: string + details?: RuleEngineCtxAlarmActivatedDetails + activated_at?: number +} + export type RuleEngineCtxAckedEventType = - typeof RuleEngineCtxAckedEventType[keyof typeof RuleEngineCtxAckedEventType] + (typeof RuleEngineCtxAckedEventType)[keyof typeof RuleEngineCtxAckedEventType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineCtxAckedEventType = { @@ -680,7 +723,7 @@ export interface RuleEngineCtxAcked { } export type RuleEngineBuiltinActionRepublishFunction = - typeof RuleEngineBuiltinActionRepublishFunction[keyof typeof RuleEngineBuiltinActionRepublishFunction] + (typeof RuleEngineBuiltinActionRepublishFunction)[keyof typeof RuleEngineBuiltinActionRepublishFunction] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineBuiltinActionRepublishFunction = { @@ -693,7 +736,7 @@ export interface RuleEngineBuiltinActionRepublish { } export type RuleEngineBuiltinActionConsoleFunction = - typeof RuleEngineBuiltinActionConsoleFunction[keyof typeof RuleEngineBuiltinActionConsoleFunction] + (typeof RuleEngineBuiltinActionConsoleFunction)[keyof typeof RuleEngineBuiltinActionConsoleFunction] // eslint-disable-next-line @typescript-eslint/no-redeclare export const RuleEngineBuiltinActionConsoleFunction = { diff --git a/src/types/schemas/sources.schemas.ts b/src/types/schemas/sources.schemas.ts index 864cad339..87edeb618 100644 --- a/src/types/schemas/sources.schemas.ts +++ b/src/types/schemas/sources.schemas.ts @@ -1,5 +1,5 @@ export type PostSourcesIdOperation503Code = - typeof PostSourcesIdOperation503Code[keyof typeof PostSourcesIdOperation503Code] + (typeof PostSourcesIdOperation503Code)[keyof typeof PostSourcesIdOperation503Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostSourcesIdOperation503Code = { @@ -12,7 +12,7 @@ export type PostSourcesIdOperation503 = { } export type PostSourcesIdOperation501Code = - typeof PostSourcesIdOperation501Code[keyof typeof PostSourcesIdOperation501Code] + (typeof PostSourcesIdOperation501Code)[keyof typeof PostSourcesIdOperation501Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostSourcesIdOperation501Code = { @@ -25,7 +25,7 @@ export type PostSourcesIdOperation501 = { } export type PostSourcesIdOperation404Code = - typeof PostSourcesIdOperation404Code[keyof typeof PostSourcesIdOperation404Code] + (typeof PostSourcesIdOperation404Code)[keyof typeof PostSourcesIdOperation404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostSourcesIdOperation404Code = { @@ -38,7 +38,7 @@ export type PostSourcesIdOperation404 = { } export type PostSourcesIdOperation400Code = - typeof PostSourcesIdOperation400Code[keyof typeof PostSourcesIdOperation400Code] + (typeof PostSourcesIdOperation400Code)[keyof typeof PostSourcesIdOperation400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostSourcesIdOperation400Code = { @@ -51,7 +51,7 @@ export type PostSourcesIdOperation400 = { } export type GetSourcesIdMetrics404Code = - typeof GetSourcesIdMetrics404Code[keyof typeof GetSourcesIdMetrics404Code] + (typeof GetSourcesIdMetrics404Code)[keyof typeof GetSourcesIdMetrics404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetSourcesIdMetrics404Code = { @@ -69,7 +69,7 @@ export type GetSourcesIdMetrics200 = { } export type PostSourcesProbe400Code = - typeof PostSourcesProbe400Code[keyof typeof PostSourcesProbe400Code] + (typeof PostSourcesProbe400Code)[keyof typeof PostSourcesProbe400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostSourcesProbe400Code = { @@ -82,7 +82,7 @@ export type PostSourcesProbe400 = { } export type PutSourcesIdEnableEnable503Code = - typeof PutSourcesIdEnableEnable503Code[keyof typeof PutSourcesIdEnableEnable503Code] + (typeof PutSourcesIdEnableEnable503Code)[keyof typeof PutSourcesIdEnableEnable503Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutSourcesIdEnableEnable503Code = { @@ -95,7 +95,7 @@ export type PutSourcesIdEnableEnable503 = { } export type PutSourcesIdEnableEnable404Code = - typeof PutSourcesIdEnableEnable404Code[keyof typeof PutSourcesIdEnableEnable404Code] + (typeof PutSourcesIdEnableEnable404Code)[keyof typeof PutSourcesIdEnableEnable404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutSourcesIdEnableEnable404Code = { @@ -108,7 +108,7 @@ export type PutSourcesIdEnableEnable404 = { } export type PutSourcesIdMetricsReset404Code = - typeof PutSourcesIdMetricsReset404Code[keyof typeof PutSourcesIdMetricsReset404Code] + (typeof PutSourcesIdMetricsReset404Code)[keyof typeof PutSourcesIdMetricsReset404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutSourcesIdMetricsReset404Code = { @@ -120,7 +120,8 @@ export type PutSourcesIdMetricsReset404 = { message?: string } -export type GetSourceTypes200Item = typeof GetSourceTypes200Item[keyof typeof GetSourceTypes200Item] +export type GetSourceTypes200Item = + (typeof GetSourceTypes200Item)[keyof typeof GetSourceTypes200Item] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetSourceTypes200Item = { @@ -128,7 +129,7 @@ export const GetSourceTypes200Item = { } as const export type DeleteSourcesId503Code = - typeof DeleteSourcesId503Code[keyof typeof DeleteSourcesId503Code] + (typeof DeleteSourcesId503Code)[keyof typeof DeleteSourcesId503Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteSourcesId503Code = { @@ -141,7 +142,7 @@ export type DeleteSourcesId503 = { } export type DeleteSourcesId404Code = - typeof DeleteSourcesId404Code[keyof typeof DeleteSourcesId404Code] + (typeof DeleteSourcesId404Code)[keyof typeof DeleteSourcesId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteSourcesId404Code = { @@ -154,7 +155,7 @@ export type DeleteSourcesId404 = { } export type DeleteSourcesId400Code = - typeof DeleteSourcesId400Code[keyof typeof DeleteSourcesId400Code] + (typeof DeleteSourcesId400Code)[keyof typeof DeleteSourcesId400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const DeleteSourcesId400Code = { @@ -171,7 +172,7 @@ export type DeleteSourcesIdParams = { also_delete_dep_actions?: boolean } -export type PutSourcesId503Code = typeof PutSourcesId503Code[keyof typeof PutSourcesId503Code] +export type PutSourcesId503Code = (typeof PutSourcesId503Code)[keyof typeof PutSourcesId503Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutSourcesId503Code = { @@ -183,7 +184,7 @@ export type PutSourcesId503 = { message?: string } -export type PutSourcesId404Code = typeof PutSourcesId404Code[keyof typeof PutSourcesId404Code] +export type PutSourcesId404Code = (typeof PutSourcesId404Code)[keyof typeof PutSourcesId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutSourcesId404Code = { @@ -195,7 +196,7 @@ export type PutSourcesId404 = { message?: string } -export type PutSourcesId400Code = typeof PutSourcesId400Code[keyof typeof PutSourcesId400Code] +export type PutSourcesId400Code = (typeof PutSourcesId400Code)[keyof typeof PutSourcesId400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PutSourcesId400Code = { @@ -207,7 +208,7 @@ export type PutSourcesId400 = { message?: string } -export type GetSourcesId404Code = typeof GetSourcesId404Code[keyof typeof GetSourcesId404Code] +export type GetSourcesId404Code = (typeof GetSourcesId404Code)[keyof typeof GetSourcesId404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const GetSourcesId404Code = { @@ -219,7 +220,7 @@ export type GetSourcesId404 = { message?: string } -export type PostSources400Code = typeof PostSources400Code[keyof typeof PostSources400Code] +export type PostSources400Code = (typeof PostSources400Code)[keyof typeof PostSources400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostSources400Code = { @@ -232,7 +233,7 @@ export type PostSources400 = { } export type PostNodesNodeSourcesIdOperation503Code = - typeof PostNodesNodeSourcesIdOperation503Code[keyof typeof PostNodesNodeSourcesIdOperation503Code] + (typeof PostNodesNodeSourcesIdOperation503Code)[keyof typeof PostNodesNodeSourcesIdOperation503Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostNodesNodeSourcesIdOperation503Code = { @@ -245,7 +246,7 @@ export type PostNodesNodeSourcesIdOperation503 = { } export type PostNodesNodeSourcesIdOperation501Code = - typeof PostNodesNodeSourcesIdOperation501Code[keyof typeof PostNodesNodeSourcesIdOperation501Code] + (typeof PostNodesNodeSourcesIdOperation501Code)[keyof typeof PostNodesNodeSourcesIdOperation501Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostNodesNodeSourcesIdOperation501Code = { @@ -258,7 +259,7 @@ export type PostNodesNodeSourcesIdOperation501 = { } export type PostNodesNodeSourcesIdOperation404Code = - typeof PostNodesNodeSourcesIdOperation404Code[keyof typeof PostNodesNodeSourcesIdOperation404Code] + (typeof PostNodesNodeSourcesIdOperation404Code)[keyof typeof PostNodesNodeSourcesIdOperation404Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostNodesNodeSourcesIdOperation404Code = { @@ -271,7 +272,7 @@ export type PostNodesNodeSourcesIdOperation404 = { } export type PostNodesNodeSourcesIdOperation400Code = - typeof PostNodesNodeSourcesIdOperation400Code[keyof typeof PostNodesNodeSourcesIdOperation400Code] + (typeof PostNodesNodeSourcesIdOperation400Code)[keyof typeof PostNodesNodeSourcesIdOperation400Code] // eslint-disable-next-line @typescript-eslint/no-redeclare export const PostNodesNodeSourcesIdOperation400Code = { @@ -284,7 +285,7 @@ export type PostNodesNodeSourcesIdOperation400 = { } export type BridgeNodeStatusStatus = - typeof BridgeNodeStatusStatus[keyof typeof BridgeNodeStatusStatus] + (typeof BridgeNodeStatusStatus)[keyof typeof BridgeNodeStatusStatus] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeNodeStatusStatus = { @@ -328,7 +329,7 @@ export interface BridgeMqttPublisherSourceResourceOpts { } export type BridgeMqttPublisherPostSourceType = - typeof BridgeMqttPublisherPostSourceType[keyof typeof BridgeMqttPublisherPostSourceType] + (typeof BridgeMqttPublisherPostSourceType)[keyof typeof BridgeMqttPublisherPostSourceType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeMqttPublisherPostSourceType = { @@ -336,6 +337,7 @@ export const BridgeMqttPublisherPostSourceType = { } as const export interface BridgeMqttPublisherIngressParameters { + no_local?: boolean topic: string qos?: number } @@ -361,7 +363,7 @@ export interface BridgeMqttPublisherPostSource { } export type BridgeMqttPublisherGetSourceStatus = - typeof BridgeMqttPublisherGetSourceStatus[keyof typeof BridgeMqttPublisherGetSourceStatus] + (typeof BridgeMqttPublisherGetSourceStatus)[keyof typeof BridgeMqttPublisherGetSourceStatus] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeMqttPublisherGetSourceStatus = { @@ -372,7 +374,7 @@ export const BridgeMqttPublisherGetSourceStatus = { } as const export type BridgeMqttPublisherGetSourceType = - typeof BridgeMqttPublisherGetSourceType[keyof typeof BridgeMqttPublisherGetSourceType] + (typeof BridgeMqttPublisherGetSourceType)[keyof typeof BridgeMqttPublisherGetSourceType] // eslint-disable-next-line @typescript-eslint/no-redeclare export const BridgeMqttPublisherGetSourceType = { @@ -392,3 +394,22 @@ export interface BridgeMqttPublisherGetSource { description?: string resource_opts?: BridgeMqttPublisherSourceResourceOpts } + +export interface ActionsAndSourcesResponseNodeStatus { + node?: string + status?: string + status_reason?: string +} + +export interface ActionsAndSourcesResponseSummary { + enable?: boolean + name?: string + type?: string + description?: string + created_at?: number + last_modified_at?: number + node_status?: ActionsAndSourcesResponseNodeStatus[] + rules?: string[] + status?: string + status_reason?: string +} diff --git a/src/types/typeAlias.ts b/src/types/typeAlias.ts new file mode 100644 index 000000000..dfe0e4f3c --- /dev/null +++ b/src/types/typeAlias.ts @@ -0,0 +1,30 @@ +import { GetAuthentication200Item, AuthnBuiltinDb } from './schemas/authentication.schemas' +import { + EmqxAuthzApiMnesiaRuleItemAction, + EmqxAuthzApiMnesiaRuleItemPermission, +} from './schemas/authorization.schemas' +import { PostGatewaysNameListenersBody } from './schemas/gatewayListeners.schemas' +import { + EmqxGatewayApiUpdateCoap, + EmqxGatewayApiUpdateExproto, + EmqxGatewayApiUpdateStomp, + EmqxGatewayApiUpdateLwm2m, + EmqxGatewayApiUpdateMqttsn, +} from './schemas/gateways.schemas' + +/* GATEWAY */ +export type StompGatewayConfig = EmqxGatewayApiUpdateStomp +export type CoapGatewayConfig = EmqxGatewayApiUpdateCoap +export type ExprotoGatewayConfig = EmqxGatewayApiUpdateExproto +export type Lwm2mGatewayConfig = EmqxGatewayApiUpdateLwm2m +export type MqttsnGatewayConfig = EmqxGatewayApiUpdateMqttsn + +export type GatewayListener = PostGatewaysNameListenersBody + +/* AUTHENTICATION */ +export type AuthenticationBuiltInDbConfig = AuthnBuiltinDb +export type AuthenticationConfig = GetAuthentication200Item & { id: string } + +/* AUTHORIZATION */ +export const AuthzRulePermission = EmqxAuthzApiMnesiaRuleItemPermission +export const AuthzRuleAction = EmqxAuthzApiMnesiaRuleItemAction diff --git a/src/views/Auth/Authn.vue b/src/views/Auth/Authn.vue index 84efffec6..ed5275642 100644 --- a/src/views/Auth/Authn.vue +++ b/src/views/Auth/Authn.vue @@ -2,13 +2,8 @@
- - {{ $t('Base.create') }} - + +
- diff --git a/src/views/Auth/components/DatabaseConfig.vue b/src/views/Auth/components/DatabaseConfig.vue index 6aafa1f45..bbad69958 100644 --- a/src/views/Auth/components/DatabaseConfig.vue +++ b/src/views/Auth/components/DatabaseConfig.vue @@ -79,12 +79,7 @@ - + @@ -177,7 +172,7 @@ - + @@ -290,35 +297,16 @@ diff --git a/src/views/Auth/components/FileConfig.vue b/src/views/Auth/components/FileConfig.vue index 91a56317e..cfc00a913 100644 --- a/src/views/Auth/components/FileConfig.vue +++ b/src/views/Auth/components/FileConfig.vue @@ -32,17 +32,8 @@ diff --git a/src/views/Auth/components/HelpBlock.vue b/src/views/Auth/components/HelpBlock.vue index e74901627..fb032d299 100644 --- a/src/views/Auth/components/HelpBlock.vue +++ b/src/views/Auth/components/HelpBlock.vue @@ -1,7 +1,15 @@ diff --git a/src/views/Base/QuickPanel.vue b/src/views/Base/QuickPanel.vue index b4caf7c74..13bd05ee6 100644 --- a/src/views/Base/QuickPanel.vue +++ b/src/views/Base/QuickPanel.vue @@ -34,17 +34,8 @@ diff --git a/src/views/Config/BasicConfig/Limiter.vue b/src/views/Config/BasicConfig/Limiter.vue index 90f79d981..e14f266df 100644 --- a/src/views/Config/BasicConfig/Limiter.vue +++ b/src/views/Config/BasicConfig/Limiter.vue @@ -19,16 +19,8 @@ - - diff --git a/src/views/Config/Monitoring/assets/emqx5_grafana_template.json b/src/views/Config/Monitoring/assets/emqx5_grafana_template.json deleted file mode 100644 index 3b5958194..000000000 --- a/src/views/Config/Monitoring/assets/emqx5_grafana_template.json +++ /dev/null @@ -1,2897 +0,0 @@ -{ - "__inputs": [ - { - "name": "DS_EMQX_PROMETHEUS", - "label": "EMQX Prometheus", - "description": "", - "type": "datasource", - "pluginId": "prometheus", - "pluginName": "Prometheus" - } - ], - "__elements": {}, - "__requires": [ - { - "type": "grafana", - "id": "grafana", - "name": "Grafana", - "version": "9.0.5" - }, - { - "type": "panel", - "id": "piechart", - "name": "Pie chart", - "version": "" - }, - { - "type": "datasource", - "id": "prometheus", - "name": "Prometheus", - "version": "1.0.0" - }, - { - "type": "panel", - "id": "stat", - "name": "Stat", - "version": "" - }, - { - "type": "panel", - "id": "timeseries", - "name": "Time series", - "version": "" - } - ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "description": "Default EMQX Grafana Monitoring Dashboard Template", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": null, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 24, - "panels": [], - "title": "General", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "green", - "mode": "fixed" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 1 - }, - "id": 4, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "expr": "sum(emqx_connections_count{instance=~\".*\",job=\"emqx\"})", - "refId": "A" - } - ], - "title": "Active Connections", - "transparent": true, - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-yellow", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 1 - }, - "id": 6, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "/^Active Topics$/", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "max(emqx_topics_count{instance=~\".*\",job=\"emqx\"})", - "interval": "", - "legendFormat": "Active Topics", - "range": true, - "refId": "A" - } - ], - "title": "Active Topics", - "transparent": true, - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "light-blue", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 1 - }, - "id": 8, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "expr": "sum(emqx_suboptions_count{instance=~\".*\",job=\"emqx\"})", - "refId": "A" - } - ], - "title": "Active Subscriptions", - "transparent": true, - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "super-light-green", - "value": null - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "emqx_connections_count{instance=\"emqx~172.17.0.2\", job=\"emqx\"}" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 7 - }, - "id": 18, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(emqx_connections_count{instance=~\".*\",job=\"emqx\"})", - "legendFormat": "Connections", - "range": true, - "refId": "A" - } - ], - "title": "Connections", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "emqx_topics_count{instance=\"emqx~172.17.0.2\", job=\"emqx\"}" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Topics" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-yellow", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 7 - }, - "id": 20, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "emqx_topics_count{instance=~\".*\",job=\"emqx\"}", - "legendFormat": "Topics", - "range": true, - "refId": "A" - } - ], - "title": "Topics", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "super-light-blue", - "value": null - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Subscriptions" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "super-light-blue", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 7 - }, - "id": 22, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(emqx_suboptions_count{instance=~\".*\",job=\"emqx\"})", - "legendFormat": "Subscriptions", - "range": true, - "refId": "A" - } - ], - "title": "Subscriptions", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 14 - }, - "id": 26, - "panels": [], - "title": "Messages", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Incoming Message" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "purple", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Outgoing Message" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dropped Message" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "light-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Messages Received" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "purple", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Messages Sent" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Message Dropped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Messages Dropped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 15 - }, - "id": 14, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max", - "mean", - "sum" - ], - "displayMode": "table", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(rate(emqx_messages_received{instance=~\".*\",job=\"emqx\"}[20s]) or irate(emqx_messages_received{instance=~\".*\",job=\"emqx\"}[20s]))", - "interval": "20s", - "legendFormat": "Messages Received", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_messages_sent{instance=~\".*\",job=\"emqx\"}[20s]) or irate(emqx_messages_sent{instance=~\".*\",job=\"emqx\"}[20s]))", - "hide": false, - "interval": "20s", - "legendFormat": "Messages Sent", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_messages_dropped{instance=~\".*\",job=\"emqx\"}[20s]) or irate(emqx_messages_dropped{instance=~\".*\",job=\"emqx\"}[20s]))", - "hide": false, - "interval": "20s", - "legendFormat": "Messages Dropped", - "range": true, - "refId": "C" - } - ], - "title": "Messages", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue", - "value": null - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 15 - }, - "id": 40, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "expr": "sum(emqx_messages_sent{instance=~\".*\",job=\"emqx\"})", - "refId": "A" - } - ], - "title": "Messages Sent Total", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "purple", - "value": null - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 15 - }, - "id": 42, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "expr": "sum(emqx_messages_received{instance=~\".*\",job=\"emqx\"})", - "refId": "A" - } - ], - "title": "Messages Received Total", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 11, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 4, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - }, - "unit": "decbytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Bytes received" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#4aef34", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Bytes sent" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#ffd500", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 21 - }, - "id": 10, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max", - "mean", - "sum" - ], - "displayMode": "table", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(rate(emqx_bytes_received{instance=~\".*\",job=\"emqx\"}[20s]) or irate(emqx_bytes_received{instance=~\".*\",job=\"emqx\"}[20s]))", - "format": "time_series", - "instant": false, - "interval": "20s", - "legendFormat": "Bytes received", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_bytes_sent{instance=~\".*\",job=\"emqx\"}[20s]) or irate(emqx_bytes_sent{instance=~\".*\",job=\"emqx\"}[20s]))", - "hide": false, - "interval": "20s", - "legendFormat": "Bytes sent", - "range": true, - "refId": "B" - } - ], - "title": "Traffic Statistics", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#3eba9a" - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 24 - }, - "id": 38, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "expr": "sum(emqx_retained_count{instance=~\".*\",job=\"emqx\"})", - "refId": "A" - } - ], - "title": "Retained Messages", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "light-red" - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 24 - }, - "id": 44, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "expr": "sum(emqx_messages_dropped{instance=~\".*\",job=\"emqx\"})", - "refId": "A" - } - ], - "title": "Messages Dropped Total", - "type": "stat" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 30 - }, - "id": 28, - "panels": [], - "title": "System", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 0, - "y": 31 - }, - "id": 30, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "expr": "count(count(node_cpu_seconds_total{instance=~\".*\"}) by (cpu))", - "refId": "A" - } - ], - "title": "CPU Cores", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 4, - "y": 31 - }, - "id": 32, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "expr": "node_memory_total_bytes{instance=~\".*\"}", - "refId": "A" - } - ], - "title": "RAM Total", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 8, - "y": 31 - }, - "id": 36, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "expr": "node_filesystem_size_bytes{instance=~\".*\",mountpoint=\"/\",fstype!=\"rootfs\"}", - "refId": "A" - } - ], - "title": "RootFS Total", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 31 - }, - "id": 34, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "expr": "node_time_seconds{instance=~\".*\"} - node_boot_time_seconds{instance=~\".*\"}", - "refId": "A" - } - ], - "title": "Uptime", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - } - }, - "mappings": [] - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "EMQX Nodes stopped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "EMQX Nodes running" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 12, - "w": 6, - "x": 18, - "y": 31 - }, - "id": 12, - "options": { - "displayLabels": [ - "value" - ], - "legend": { - "displayMode": "list", - "placement": "bottom", - "values": [ - "value" - ] - }, - "pieType": "pie", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "max(emqx_cluster_nodes_running{instance=~\".*\",job=\"emqx\"})", - "legendFormat": "EMQX Nodes running", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "max(emqx_cluster_nodes_stopped{instance=~\".*\",job=\"emqx\"})", - "hide": false, - "legendFormat": "EMQX Nodes stopped", - "range": true, - "refId": "B" - } - ], - "title": "Nodes status", - "type": "piechart" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 9, - "x": 0, - "y": 35 - }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.0.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "100 - (avg(irate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)", - "legendFormat": "CPU Usage", - "range": true, - "refId": "A" - } - ], - "title": "CPU Usage", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 9, - "x": 9, - "y": 35 - }, - "id": 16, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(emqx_vm_used_memory{instance=~\".*\",job=\"emqx\"})", - "legendFormat": "VM Memory Used", - "range": true, - "refId": "A" - } - ], - "title": "Erlang VM Memory Used", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 43 - }, - "id": 48, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(erlang_mnesia_memory_usage_bytes{instance=~\".*\",job=\"emqx\"})", - "legendFormat": "Mnesia (built-in database) Memory Usage", - "range": true, - "refId": "A" - } - ], - "title": "Mnesia (built-in database) Memory Usage", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 43 - }, - "id": 46, - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "bottom" - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(erlang_vm_process_count{instance=~\".*\",job=\"emqx\"})", - "legendFormat": "Process Count", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(erlang_vm_statistics_run_queues_length_total{instance=~\".*\",job=\"emqx\"})", - "hide": false, - "legendFormat": "Run Queue Length", - "range": true, - "refId": "B" - } - ], - "title": "Erlang VM Process", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 43 - }, - "id": 50, - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "bottom" - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(erlang_vm_threads{instance=~\".*\",job=\"emqx\"})", - "legendFormat": "Threads", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(erlang_vm_thread_pool_size{instance=~\".*\",job=\"emqx\"})", - "hide": false, - "legendFormat": "Thread Pool size", - "range": true, - "refId": "B" - } - ], - "title": "Erlang VM Threads", - "type": "timeseries" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 51 - }, - "id": 52, - "panels": [], - "title": "Packets", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Packets Connect" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Connack Sent" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Connack Error" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 52 - }, - "id": 54, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max", - "mean", - "sum" - ], - "displayMode": "table", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_connect{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_connect{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "legendFormat": "Packets Connect", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_connack_sent{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_connack_sent{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "hide": false, - "legendFormat": "Packets Connack Sent", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_connack_error{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_connack_error{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "hide": false, - "legendFormat": "Packets Connack Error", - "range": true, - "refId": "C" - } - ], - "title": "Packets Connections", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Packets Connect" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Connack Sent" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Connack Error" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Disconnect Sent" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "semi-dark-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Disconnect Received" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "super-light-red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 52 - }, - "id": 57, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max", - "mean", - "sum" - ], - "displayMode": "table", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_disconnect_sent{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_disconnect_sent{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "legendFormat": "Packets Disconnect Sent", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_disconnect_received{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_disconnect_received{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "hide": false, - "legendFormat": "Packets Disconnect Received", - "range": true, - "refId": "B" - } - ], - "title": "Packets Disconnect", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Packets Disconnect Sent" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "light-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Disconnect Received" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#a54572", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Publish Sent" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Publish Received" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-purple", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Publish Dropped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "super-light-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Publish Error" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 60 - }, - "id": 56, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max", - "mean", - "sum" - ], - "displayMode": "table", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_publish_sent{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_publish_sent{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "legendFormat": "Packets Publish Sent", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_publish_received{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_publish_received{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "hide": false, - "legendFormat": "Packets Publish Received", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_publish_dropped{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_publish_dropped{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "hide": false, - "legendFormat": "Packets Publish Dropped", - "range": true, - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_publish_error{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_publish_error{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "hide": false, - "legendFormat": "Packets Publish Error", - "range": true, - "refId": "D" - } - ], - "title": "Packets Publish", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 18, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Packets Disconnect Sent" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "light-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Disconnect Received" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#a54572", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Publish Sent" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Publish Received" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-purple", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Publish Dropped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "super-light-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Publish Error" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Subscribe Error" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Packets Unsubscribe Error" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "super-light-red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 60 - }, - "id": 58, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max", - "mean", - "sum" - ], - "displayMode": "table", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_subscribe_received{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_subscribe_received{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "legendFormat": "Packets Subscribe Received", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_suback_sent{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_suback_sent{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "hide": false, - "legendFormat": "Packets Suback Sent", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_subscribe_error{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_subscribe_error{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "hide": false, - "legendFormat": "Packets Subscribe Error", - "range": true, - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_unsubscribe_received{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_unsubscribe_received{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "hide": false, - "legendFormat": "Packets Unsubscribe Received", - "range": true, - "refId": "D" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${DS_EMQX_PROMETHEUS}" - }, - "editorMode": "code", - "expr": "sum(rate(emqx_packets_unsubscribe_error{instance=~\".*\",job=\"emqx\"}[$__interval]) or irate(emqx_packets_unsubscribe_error{instance=~\".*\",job=\"emqx\"}[$__interval]))", - "hide": false, - "legendFormat": "Packets Unsubscribe Error", - "range": true, - "refId": "E" - } - ], - "title": "Packets Subscribe/Unsubscribe", - "type": "timeseries" - } - ], - "refresh": "5s", - "schemaVersion": 36, - "style": "dark", - "tags": [ - "EMQX", - "MQTT" - ], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "EMQX", - "uid": "uAUUbySVze", - "version": 2, - "weekStart": "" -} \ No newline at end of file diff --git a/src/views/Config/Monitoring/assets/usePromConfig.ts b/src/views/Config/Monitoring/assets/usePromConfig.ts deleted file mode 100644 index 0278a8a02..000000000 --- a/src/views/Config/Monitoring/assets/usePromConfig.ts +++ /dev/null @@ -1,146 +0,0 @@ -import type { Ref } from 'vue' -import { reactive, ref, watch } from 'vue' -import useI18nTl from '@/hooks/useI18nTl' - -const usePromConfig = (): { - promConfigWithPg: { - promHost: string - pushgatewayHost: string - nodeExporterHost: string - } - promConfigDefault: { - emqxHost: string - metricsPath: string - nodeExporterHost: string - } - promPgContent: Ref - promDefaultContent: Ref - rulesWithPg: Record - rulesDefault: Record -} => { - const { tl } = useI18nTl('MonitoringIntegration') - const promConfigWithPg = reactive({ - promHost: '', - pushgatewayHost: '', - nodeExporterHost: '', - }) - const rulesWithPg = { - pushgatewayHost: [ - { - required: true, - message: tl('pushgatewayRequired'), - }, - ], - } - const rulesDefault = { - emqxHost: [ - { - required: true, - message: tl('emqxRequired'), - }, - ], - metricsPath: [ - { - required: true, - message: tl('metricsPathRequired'), - }, - ], - } - const promConfigDefault = reactive({ - emqxHost: '127.0.0.1:18083', - metricsPath: '/api/v5/prometheus/stats', - nodeExporterHost: '', - }) - watch(promConfigWithPg, (val) => { - promPgContent.value = getPromConfigWithPushgateway(val) - }) - watch(promConfigDefault, (val) => { - promDefaultContent.value = getPromConfigDefault(val) - }) - const getPromConfigDefault = (configs: { - emqxHost: string - metricsPath: string - nodeExporterHost: string - }) => `# prometheus.yaml -global: - scrape_interval: 10s # The default scrape interval is every 10 seconds. - evaluation_interval: 10s # The default evaluation interval is every 10 seconds. - # On this machine, every time series will be exported by default. - external_labels: - monitor: 'emqx-monitor' -# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. -rule_files: - # - "first.rules" - # - "second.rules" - - "/etc/prometheus/rules/*.rules" -# Data pull configuration -scrape_configs: - # EMQX monitoring - - job_name: 'emqx' - metrics_path: ${configs.metricsPath} - scrape_interval: 5s - honor_labels: true - static_configs: - # EMQX IP address and port - - targets: [${configs.emqxHost}] - - job_name: 'node-exporter' - scrape_interval: 5s - static_configs: - # node-exporter IP address and port - - targets: ['${configs.nodeExporterHost || '127.0.0.1:9100'}'] - labels: - instance: dashboard-local -` - const getPromConfigWithPushgateway = (configs: { - promHost: string - pushgatewayHost: string - nodeExporterHost: string - }) => `# prometheus.yaml -global: - scrape_interval: 10s # The default scrape interval is every 10 seconds. - evaluation_interval: 10s # The default evaluation interval is every 10 seconds. - # On this machine, every time series will be exported by default. - external_labels: - monitor: 'emqx-monitor' -# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. -rule_files: - # - "first.rules" - # - "second.rules" - - "/etc/prometheus/rules/*.rules" -# Data pull configuration -scrape_configs: - # Meaning that in this configuration, each time series will automatically add this {job_name: "prometheus"} label. - - job_name: 'prometheus' - scrape_interval: 5s - static_configs: - # Prometheus IP address and port - - targets: ['${configs.promHost || '127.0.0.1:9090'}'] - # Server physical machine monitoring - - job_name: 'node-exporter' - scrape_interval: 5s - static_configs: - # node-exporter IP address and port - - targets: ['${configs.nodeExporterHost || '127.0.0.1:9100'}'] - labels: - instance: dashboard-local - # EMQX Pushgateway monitoring - - job_name: 'pushgateway' - scrape_interval: 5s - honor_labels: true - static_configs: - # Pushgateway IP address and port - - targets: ['${configs.pushgatewayHost}'] -` - const promPgContent = ref(getPromConfigWithPushgateway(promConfigWithPg)) - const promDefaultContent = ref(getPromConfigDefault(promConfigDefault)) - return { - promConfigWithPg, - promPgContent, - rulesWithPg, - promConfigDefault, - promDefaultContent, - rulesDefault, - } -} - -export default usePromConfig diff --git a/src/views/Config/Monitoring/components/HelpDrawer.vue b/src/views/Config/Monitoring/components/HelpDrawer.vue deleted file mode 100644 index 2f8477c29..000000000 --- a/src/views/Config/Monitoring/components/HelpDrawer.vue +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - - diff --git a/src/views/Dashboard/Metrics.vue b/src/views/Dashboard/Metrics.vue index fd1d8896e..e9c5fbc32 100644 --- a/src/views/Dashboard/Metrics.vue +++ b/src/views/Dashboard/Metrics.vue @@ -14,9 +14,7 @@ - - {{ $t('Base.refresh') }} - +
@@ -148,8 +146,6 @@ diff --git a/src/views/Gateway/components/stompBasic.vue b/src/views/Gateway/components/stompBasic.vue index 076040db7..ee9f3319a 100644 --- a/src/views/Gateway/components/stompBasic.vue +++ b/src/views/Gateway/components/stompBasic.vue @@ -4,8 +4,7 @@ - @@ -13,8 +12,7 @@ - @@ -33,22 +31,17 @@ - - - - + - - - + @@ -59,61 +52,46 @@ - + diff --git a/src/views/General/components/APIKeyDialog.vue b/src/views/General/components/APIKeyDialog.vue index 8bfddc8d0..e75ad6258 100644 --- a/src/views/General/components/APIKeyDialog.vue +++ b/src/views/General/components/APIKeyDialog.vue @@ -3,7 +3,7 @@ v-model="showDialog" :width="600" class="API-key-dialog" - :title="dialogTitle" + :title="t('Base.create')" :z-index="2000" > + + diff --git a/src/views/Plugins/components/TableItemDropdown.vue b/src/views/Plugins/components/TableItemDropdown.vue index 14b9f449d..c5320425b 100644 --- a/src/views/Plugins/components/TableItemDropdown.vue +++ b/src/views/Plugins/components/TableItemDropdown.vue @@ -4,14 +4,14 @@ @visible-change="dropdownVisibleChanged" popper-class="table-dropdown-popper" > - + {{ $t('Base.more') }} - + diff --git a/src/views/RuleEngine/Bridge/BridgeCreate.vue b/src/views/RuleEngine/Bridge/BridgeCreate.vue index ac6e279a0..2f991f47e 100644 --- a/src/views/RuleEngine/Bridge/BridgeCreate.vue +++ b/src/views/RuleEngine/Bridge/BridgeCreate.vue @@ -17,7 +17,7 @@ - + diff --git a/src/views/RuleEngine/Bridge/Components/MQTTBridgeTransConfiguration.vue b/src/views/RuleEngine/Bridge/Components/MQTTBridgeTransConfiguration.vue index 35b4f4cac..9f5e6170e 100644 --- a/src/views/RuleEngine/Bridge/Components/MQTTBridgeTransConfiguration.vue +++ b/src/views/RuleEngine/Bridge/Components/MQTTBridgeTransConfiguration.vue @@ -56,13 +56,7 @@ diff --git a/src/views/RuleEngine/Connector/Connector.vue b/src/views/RuleEngine/Connector/Connector.vue index 842d6f8fc..5ff73c83e 100644 --- a/src/views/RuleEngine/Connector/Connector.vue +++ b/src/views/RuleEngine/Connector/Connector.vue @@ -3,9 +3,7 @@
- - {{ tl('create') }} - +
@@ -71,22 +69,20 @@ :content="tl('canNotViewConnectorTip')" >
- {{ $t('RuleEngine.reconnect') }} - - + {{ $t('Base.setting') }} - +
- diff --git a/src/views/RuleEngine/Connector/components/DisableConnectorConfirm.vue b/src/views/RuleEngine/Connector/components/DisableConnectorConfirm.vue index 0390c2b1a..5e7559156 100644 --- a/src/views/RuleEngine/Connector/components/DisableConnectorConfirm.vue +++ b/src/views/RuleEngine/Connector/components/DisableConnectorConfirm.vue @@ -46,11 +46,8 @@ diff --git a/src/views/RuleEngine/Connector/components/TypeSelect.vue b/src/views/RuleEngine/Connector/components/TypeSelect.vue index c37471b8b..9aea5ce76 100644 --- a/src/views/RuleEngine/Connector/components/TypeSelect.vue +++ b/src/views/RuleEngine/Connector/components/TypeSelect.vue @@ -2,7 +2,7 @@ - + diff --git a/src/views/RuleEngine/components/ActionAndSourceList.vue b/src/views/RuleEngine/components/ActionAndSourceList.vue new file mode 100644 index 000000000..5c0167815 --- /dev/null +++ b/src/views/RuleEngine/components/ActionAndSourceList.vue @@ -0,0 +1,362 @@ + + + + + diff --git a/src/views/RuleEngine/components/ConsoleForm.vue b/src/views/RuleEngine/components/ConsoleForm.vue index 19a4f7e98..ab3d6a519 100644 --- a/src/views/RuleEngine/components/ConsoleForm.vue +++ b/src/views/RuleEngine/components/ConsoleForm.vue @@ -5,7 +5,5 @@ diff --git a/src/views/RuleEngine/components/CopySubmitDialog.vue b/src/views/RuleEngine/components/CopySubmitDialog.vue index f92dbe547..a66171f26 100644 --- a/src/views/RuleEngine/components/CopySubmitDialog.vue +++ b/src/views/RuleEngine/components/CopySubmitDialog.vue @@ -21,14 +21,7 @@ - - diff --git a/src/views/RuleEngine/components/FromSelect.vue b/src/views/RuleEngine/components/FromSelect.vue index 5bcdb4006..7941b7cd0 100644 --- a/src/views/RuleEngine/components/FromSelect.vue +++ b/src/views/RuleEngine/components/FromSelect.vue @@ -59,23 +59,15 @@ diff --git a/src/views/RuleEngine/components/RuleForm.vue b/src/views/RuleEngine/components/RuleForm.vue index 1ca404c8d..b3658fd5f 100644 --- a/src/views/RuleEngine/components/RuleForm.vue +++ b/src/views/RuleEngine/components/RuleForm.vue @@ -79,6 +79,9 @@ {{ savedAfterDataChange ? tl('backToRuleList') : $t('Base.cancel') }} + + {{ tl('saveAsCopy') }} + {{ isEdit ? $t('Base.update') : $t('Base.save') }} - - {{ tl('saveAsCopy') }} -
@@ -97,44 +97,14 @@ diff --git a/src/views/RuleEngine/components/RuleOutputsDrawer.vue b/src/views/RuleEngine/components/RuleOutputsDrawer.vue index e2609922f..287d1b528 100644 --- a/src/views/RuleEngine/components/RuleOutputsDrawer.vue +++ b/src/views/RuleEngine/components/RuleOutputsDrawer.vue @@ -15,7 +15,7 @@ > - + - +