diff --git a/ui-vue3/README.md b/ui-vue3/README.md index 875176edc..db22c0bb3 100644 --- a/ui-vue3/README.md +++ b/ui-vue3/README.md @@ -209,6 +209,42 @@ function globalQuestion() { ``` +3. Config a tab route + + > Note: /tab is a middle layer for left-menu-item: must use LayoutTab as component; meta.tab must be true + + ```ts + { + path: '/tab', + name: 'tabDemo', + component: LayoutTab, + redirect: 'index', + meta: { + tab_parent: true + }, + children: [ + { + path: '/index', + name: 'applications_index', + component: () => import('../views/resources/applications/index.vue'), + meta: { + // hidden: true, + } + }, + { + path: '/tab1', + name: 'tab1', + component: () => import('../views/common/tab_demo/tab1.vue'), + meta: { + icon: 'simple-icons:podman', + tab: true, + } + }, + + ] + }, + ``` + diff --git a/ui-vue3/package.json b/ui-vue3/package.json index 7ae1563b4..541c37655 100644 --- a/ui-vue3/package.json +++ b/ui-vue3/package.json @@ -5,11 +5,10 @@ "type": "module", "scripts": { "dev": "vite", - "build": "run-p type-check \"build-only {@}\" --", + "check:i18n": "node --loader ts-node/esm src/base/i18n/sortI18n.ts", + "build": "prettier --write src/ && vite build", "preview": "vite preview", "test:unit": "vitest", - "test:e2e": "start-server-and-test preview http://localhost:4173 'cypress run --e2e'", - "test:e2e:dev": "start-server-and-test 'vite dev --port 4173' http://localhost:4173 'cypress open --e2e'", "build-only": "vite build", "type-check": "vue-tsc --build --force", "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", @@ -24,11 +23,15 @@ "@iconify/vue": "^4.1.1", "@types/lodash": "^4.14.202", "@types/lodash-es": "^4.17.12", + "@types/nprogress": "^0.2.3", "ant-design-vue": "4.x", "less": "^4.2.0", "lodash": "^4.17.21", "mockjs": "^1.1.0", + "nprogress": "^0.2.0", "pinia": "^2.1.7", + "ts-node": "^10.9.2", + "tslib": "^2.6.2", "vue": "^3.3.10", "vue-i18n": "^9.8.0", "vue-router": "^4.2.5", @@ -39,7 +42,7 @@ "@tsconfig/node18": "^18.2.2", "@types/jsdom": "^21.1.6", "@types/mockjs": "^1.0.10", - "@types/node": "^18.19.2", + "@types/node": "^20.10.6", "@vitejs/plugin-vue": "^4.5.1", "@vitejs/plugin-vue-jsx": "^3.1.0", "@vue/eslint-config-prettier": "^8.0.0", diff --git a/ui-vue3/src/api/mock/mockCluster.ts b/ui-vue3/src/api/mock/mockCluster.ts index 69f064f13..461b20d4b 100644 --- a/ui-vue3/src/api/mock/mockCluster.ts +++ b/ui-vue3/src/api/mock/mockCluster.ts @@ -17,14 +17,13 @@ import Mock from 'mockjs' Mock.mock('/mock/metrics/cluster', 'get', { - code: 200, - message: '成功', - data: { - all: Mock.mock('@integer(100, 500)'), - application: Mock.mock('@integer(80, 200)'), - consumers: Mock.mock('@integer(80, 200)'), - providers: Mock.mock('@integer(80, 200)'), - services: Mock.mock('@integer(80, 200)'), - - } + code: 200, + message: '成功', + data: { + all: Mock.mock('@integer(100, 500)'), + application: Mock.mock('@integer(80, 200)'), + consumers: Mock.mock('@integer(80, 200)'), + providers: Mock.mock('@integer(80, 200)'), + services: Mock.mock('@integer(80, 200)') + } }) diff --git a/ui-vue3/src/api/mock/mockServer.ts b/ui-vue3/src/api/mock/mockServer.ts index 1b12d44f1..0a325da0d 100644 --- a/ui-vue3/src/api/mock/mockServer.ts +++ b/ui-vue3/src/api/mock/mockServer.ts @@ -17,19 +17,18 @@ import Mock from 'mockjs' - Mock.mock('/mock/metrics/metadata', 'get', { code: 200, message: '成功', data: { - versions: ["dubbo-golang-3.0.4"], - protocols: ["tri"], - rules:["DemoService:1.0.0:test.configurators","DemoService4:bb:aa.configurators"], - configCenter: "127.0.0.1:2181", - registry: "127.0.0.1:2181", - metadataCenter: "127.0.0.1:2181", + versions: ['dubbo-golang-3.0.4'], + protocols: ['tri'], + rules: ['DemoService:1.0.0:test.configurators', 'DemoService4:bb:aa.configurators'], + configCenter: '127.0.0.1:2181', + registry: '127.0.0.1:2181', + metadataCenter: '127.0.0.1:2181', // make sure the X-Frame-Options is forbidden grafana: `http://${window.location.host}/admin/home`, - prometheus: "127.0.0.1:9090" + prometheus: '127.0.0.1:9090' } }) diff --git a/ui-vue3/src/api/service/clusterInfo.ts b/ui-vue3/src/api/service/clusterInfo.ts index e351bf414..2f75cf0c6 100644 --- a/ui-vue3/src/api/service/clusterInfo.ts +++ b/ui-vue3/src/api/service/clusterInfo.ts @@ -17,10 +17,10 @@ import request from '@/base/http/request' -export const getClusterInfo = (params: any):Promise => { - return request({ - url: '/metrics/cluster', - method: 'get', - params - }) +export const getClusterInfo = (params: any): Promise => { + return request({ + url: '/metrics/cluster', + method: 'get', + params + }) } diff --git a/ui-vue3/src/api/service/serverInfo.ts b/ui-vue3/src/api/service/serverInfo.ts index 15a7fc059..7bbb981d9 100644 --- a/ui-vue3/src/api/service/serverInfo.ts +++ b/ui-vue3/src/api/service/serverInfo.ts @@ -15,13 +15,12 @@ * limitations under the License. */ +import request from '@/base/http/request' -import request from "@/base/http/request"; - -export const getMetricsMetadata = (params: any):Promise => { - return request({ - url: '/metrics/metadata', - method: 'get', - params - }) +export const getMetricsMetadata = (params: any): Promise => { + return request({ + url: '/metrics/metadata', + method: 'get', + params + }) } diff --git a/ui-vue3/src/base/constants.ts b/ui-vue3/src/base/constants.ts index 1a97a1741..0d00fe2ce 100644 --- a/ui-vue3/src/base/constants.ts +++ b/ui-vue3/src/base/constants.ts @@ -15,15 +15,13 @@ * limitations under the License. */ -import {ref} from 'vue' +import { ref } from 'vue' export const PRIMARY_COLOR_DEFAULT = '#17b392' - export const LOCAL_STORAGE_LOCALE = 'LOCAL_STORAGE_LOCALE' export const LOCAL_STORAGE_THEME = 'LOCAL_STORAGE_THEME' +let item = localStorage.getItem(LOCAL_STORAGE_THEME) -let item = localStorage.getItem(LOCAL_STORAGE_THEME); - -export const PRIMARY_COLOR = ref(item || PRIMARY_COLOR_DEFAULT) \ No newline at end of file +export const PRIMARY_COLOR = ref(item || PRIMARY_COLOR_DEFAULT) diff --git a/ui-vue3/src/base/enums/Storage.ts b/ui-vue3/src/base/enums/Storage.ts new file mode 100644 index 000000000..1e4aff486 --- /dev/null +++ b/ui-vue3/src/base/enums/Storage.ts @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const KEY_PREFIX = '__DUBBO_KUBE_' + +export const STORAGE_KEY = {} diff --git a/ui-vue3/src/base/http/request.ts b/ui-vue3/src/base/http/request.ts index 8dea0deb2..607777eb0 100644 --- a/ui-vue3/src/base/http/request.ts +++ b/ui-vue3/src/base/http/request.ts @@ -16,46 +16,51 @@ */ import type { - AxiosInstance, - AxiosInterceptorManager, - AxiosRequestHeaders, - AxiosResponse, - InternalAxiosRequestConfig + AxiosInstance, + AxiosInterceptorManager, + AxiosRequestHeaders, + AxiosResponse, + InternalAxiosRequestConfig } from 'axios' import axios from 'axios' -import {message} from 'ant-design-vue' +import { message } from 'ant-design-vue' +import NProgress from 'nprogress' const service: AxiosInstance = axios.create({ - // change this to decide where to go - baseURL: '/mock', - timeout: 30 * 1000 + // change this to decide where to go + baseURL: '/mock', + timeout: 30 * 1000 }) const request: AxiosInterceptorManager = service.interceptors.request const response: AxiosInterceptorManager = service.interceptors.response request.use( - (config) => { - config.data = JSON.stringify(config.data) //数据转化,也可以使用qs转换 - config.headers = { - 'Content-Type': 'application/json' //配置请求头 - } - return config - }, - (error) => { - Promise.reject(error) + (config) => { + config.data = JSON.stringify(config.data) //数据转化,也可以使用qs转换 + config.headers = { + 'Content-Type': 'application/json' //配置请求头 } + NProgress.start() + return config + }, + (error) => { + Promise.reject(error) + } ) response.use( - (response) => { - if (response.status === 200) { - return Promise.resolve(response.data) - } - return Promise.reject(response) - }, - (error) => { - message.error(error.message) - return Promise.resolve(error.response) + (response) => { + NProgress.done() + + if (response.status === 200) { + return Promise.resolve(response.data) } + return Promise.reject(response) + }, + (error) => { + NProgress.done() + message.error(error.message) + return Promise.resolve(error.response) + } ) export default service diff --git a/ui-vue3/src/base/i18n/en.ts b/ui-vue3/src/base/i18n/en.ts index db547cb54..0d2248081 100644 --- a/ui-vue3/src/base/i18n/en.ts +++ b/ui-vue3/src/base/i18n/en.ts @@ -14,7 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export default { + +import type { I18nType } from './type.ts' + +const words: I18nType = { service: 'Service', serviceSearch: 'Search Service', serviceGovernance: 'Routing Rule', @@ -36,6 +39,7 @@ export default { serviceInfo: 'Service Info', providers: 'Providers', consumers: 'Consumers', + common: 'Common', version: 'Version', app: 'Application', services: 'Services', @@ -255,5 +259,10 @@ export default { trafficAccesslog: 'Accesslog', trafficHost: 'Host', homePage: 'Cluster Overview', - serviceManagement: 'Dev & Test' + serviceManagement: 'Dev & Test', + resources: 'Resources', + applications: 'Applications', + instances: 'Instances' } + +export default words diff --git a/ui-vue3/src/base/i18n/sortI18n.ts b/ui-vue3/src/base/i18n/sortI18n.ts new file mode 100644 index 000000000..4fc1aac64 --- /dev/null +++ b/ui-vue3/src/base/i18n/sortI18n.ts @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// resort words in en.ts and zh.ts; +// check words exist in en.ts and zh.ts; + +import EN_MAP from './en' +import ZH_MAP from './zh' + +let sortArr: { label: string; value: any }[] = [] +let checkArr: string[] = [] + +function mapToArr() { + for (let enKey in EN_MAP) { + sortArr.push({ + label: enKey, + value: EN_MAP[enKey] + }) + let zh = ZH_MAP[enKey] + if (!zh) { + checkArr.push(enKey) + } + } +} + +mapToArr() +console.log(sortArr.sort((a, b) => (a.label > b.label ? 1 : -1))) diff --git a/ui-vue3/src/base/i18n/type.ts b/ui-vue3/src/base/i18n/type.ts new file mode 100644 index 000000000..18c8a73f6 --- /dev/null +++ b/ui-vue3/src/base/i18n/type.ts @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type I18nType = { + [key: string]: string | I18nType +} diff --git a/ui-vue3/src/base/i18n/zh.ts b/ui-vue3/src/base/i18n/zh.ts index aaea77290..5754e7bfa 100644 --- a/ui-vue3/src/base/i18n/zh.ts +++ b/ui-vue3/src/base/i18n/zh.ts @@ -14,7 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export default { + +import type { I18nType } from './type.ts' + +const words: I18nType = { service: '服务', serviceSearch: '服务查询', serviceGovernance: '路由规则', @@ -35,8 +38,9 @@ export default { consumers: '消费者', application: '应用', all: '全部', + common: '通用', - metrics: '统计', + metrics: '可观测', relation: '关系', group: '组', version: '版本', @@ -253,5 +257,10 @@ export default { serviceManagement: '开发测试', groupInputPrompt: '请输入服务group(可选)', - versionInputPrompt: '请输入服务version(可选)' + versionInputPrompt: '请输入服务version(可选)', + resources: '资源详情', + applications: '应用', + instances: '实例' } + +export default words diff --git a/ui-vue3/src/layout/breadcrumb/layout_bread.vue b/ui-vue3/src/layout/breadcrumb/layout_bread.vue index 0fc432571..d9dc64712 100644 --- a/ui-vue3/src/layout/breadcrumb/layout_bread.vue +++ b/ui-vue3/src/layout/breadcrumb/layout_bread.vue @@ -18,6 +18,7 @@
{{ $t(r.name) }} + {{ pathId }}
@@ -29,10 +30,13 @@ import { computed } from 'vue' const route = useRoute() const router = useRouter() +let pathId = computed(() => { + return route.params?.pathId ? route.params.pathId : '' +}) const routes = computed(() => { return route.matched.slice(1).map((x, idx) => { return { - name: x.name, + name: x.name, handle: router.push(x) } }) diff --git a/ui-vue3/src/layout/header/layout_header.vue b/ui-vue3/src/layout/header/layout_header.vue index 8c78fb230..8d53f1d59 100644 --- a/ui-vue3/src/layout/header/layout_header.vue +++ b/ui-vue3/src/layout/header/layout_header.vue @@ -66,7 +66,12 @@ import { MenuFoldOutlined, MenuUnfoldOutlined, UserOutlined } from '@ant-design/ import { inject, ref, watch } from 'vue' import { PROVIDE_INJECT_KEY } from '@/base/enums/ProvideInject' import { changeLanguage, localeConfig } from '@/base/i18n' -import {LOCAL_STORAGE_LOCALE, LOCAL_STORAGE_THEME, PRIMARY_COLOR, PRIMARY_COLOR_DEFAULT} from '@/base/constants' +import { + LOCAL_STORAGE_LOCALE, + LOCAL_STORAGE_THEME, + PRIMARY_COLOR, + PRIMARY_COLOR_DEFAULT +} from '@/base/constants' import devTool from '@/utils/DevToolUtil' import { Icon } from '@iconify/vue' diff --git a/ui-vue3/src/layout/index.vue b/ui-vue3/src/layout/index.vue index a6133c98b..523e0bf78 100644 --- a/ui-vue3/src/layout/index.vue +++ b/ui-vue3/src/layout/index.vue @@ -36,7 +36,11 @@ - + + + + + todo @@ -51,10 +55,21 @@ import Layout_header from '@/layout/header/layout_header.vue' import { PROVIDE_INJECT_KEY } from '@/base/enums/ProvideInject' import Layout_bread from '@/layout/breadcrumb/layout_bread.vue' import { PRIMARY_COLOR } from '@/base/constants' +import { useRoute, useRouter } from 'vue-router' let __null = PRIMARY_COLOR const collapsed = ref(false) provide(PROVIDE_INJECT_KEY.COLLAPSED, collapsed) +const route = useRoute() +const router = useRouter() +let transitionFlag = ref(true) +router.beforeEach((to, from, next) => { + transitionFlag.value = false + next() + setTimeout(() => { + transitionFlag.value = true + }, 500) +}) + diff --git a/ui-vue3/src/layout/menu/layout_menu.vue b/ui-vue3/src/layout/menu/layout_menu.vue index 8cc342227..432c4f76c 100644 --- a/ui-vue3/src/layout/menu/layout_menu.vue +++ b/ui-vue3/src/layout/menu/layout_menu.vue @@ -16,46 +16,70 @@ --> diff --git a/ui-vue3/src/layout/tab/layout_tab.vue b/ui-vue3/src/layout/tab/layout_tab.vue new file mode 100644 index 000000000..aa0c5f7ec --- /dev/null +++ b/ui-vue3/src/layout/tab/layout_tab.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/ui-vue3/src/main.ts b/ui-vue3/src/main.ts index 774d6f154..736014e97 100644 --- a/ui-vue3/src/main.ts +++ b/ui-vue3/src/main.ts @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {createApp} from 'vue' +import { createApp } from 'vue' import Antd from 'ant-design-vue' import router from './router' import App from './App.vue' import 'ant-design-vue/dist/reset.css' -import {i18n} from '@/base/i18n' +import { i18n } from '@/base/i18n' import './api/mock/mockServer' import './api/mock/mockCluster' import './api/mock/mockVersion' import Vue3ColorPicker from 'vue3-colorpicker' import 'vue3-colorpicker/style.css' +import 'nprogress/nprogress.css' const app = createApp(App) diff --git a/ui-vue3/src/router/RouterMeta.ts b/ui-vue3/src/router/RouterMeta.ts index 8482ed44b..f3a407b34 100644 --- a/ui-vue3/src/router/RouterMeta.ts +++ b/ui-vue3/src/router/RouterMeta.ts @@ -15,9 +15,14 @@ * limitations under the License. */ import type { RouteMeta } from 'vue-router' +import type { RouteRecordType } from '@/router/defaultRoutes' export interface RouterMeta extends RouteMeta { icon?: string hidden?: boolean skip?: boolean + tab_parent?: boolean + tab?: boolean + _router_key?: string + parent?: RouteRecordType } diff --git a/ui-vue3/src/router/defaultRoutes.ts b/ui-vue3/src/router/defaultRoutes.ts index b827e6726..a36f9e526 100644 --- a/ui-vue3/src/router/defaultRoutes.ts +++ b/ui-vue3/src/router/defaultRoutes.ts @@ -17,6 +17,8 @@ import type { RouterMeta } from '@/router/RouterMeta' import type { RouteRecordRaw } from 'vue-router' +import LayoutTab from '../layout/tab/layout_tab.vue' +import _ from 'lodash' export declare type RouteRecordType = RouteRecordRaw & { key?: string @@ -44,125 +46,148 @@ export const routes: Readonly = [ } }, { - path: '/service', - name: 'serviceSearch', - component: () => import('../views/service/index.vue'), + path: '/resources', + name: 'resources', meta: { - icon: 'material-symbols-light:screen-search-desktop-outline-rounded' - } - }, - { - path: '/traffic', - name: 'trafficManagement', - meta: { - icon: 'carbon:traffic-flow' + icon: 'carbon:web-services-cluster' }, - children: [ { - path: '/timeout', - name: 'trafficTimeout', - component: () => import('../views/traffic/timeout/index.vue'), - meta: {} - }, - { - path: '/retry', - name: 'trafficRetry', - component: () => import('../views/traffic/retry/index.vue'), - meta: {} - }, - { - path: '/region', - name: 'trafficRegion', - component: () => import('../views/traffic/region/index.vue'), - meta: {} - }, - { - path: '/weight', - name: 'trafficWeight', - component: () => import('../views/traffic/weight/index.vue'), - meta: {} - }, - { - path: '/arguments', - name: 'trafficArguments', - component: () => import('../views/traffic/arguments/index.vue'), - meta: {} - }, - { - path: '/mock', - name: 'trafficMock', - component: () => import('../views/traffic/mock/index.vue'), - meta: {} + path: '/applications', + name: 'applications', + component: LayoutTab, + redirect: 'index', + meta: { + tab_parent: true + }, + children: [ + { + path: '/index', + name: 'index', + component: () => import('../views/resources/applications/index.vue'), + meta: { + hidden: true + } + }, + { + path: '/detail/:pathId', + name: 'application-tab1', + component: () => import('../views/resources/applications/tabs/tab1.vue'), + meta: { + tab: true + } + }, + { + path: '/detail2/:pathId', + name: 'application-tab2', + component: () => import('../views/resources/applications/tabs/tab2.vue'), + meta: { + tab: true + } + } + ] }, { - path: '/accesslog', - name: 'trafficAccesslog', - component: () => import('../views/traffic/accesslog/index.vue'), + path: '/instances', + name: 'instances', + component: () => import('../views/resources/instances/index.vue'), meta: {} }, { - path: '/gray', - name: 'trafficGray', - component: () => import('../views/traffic/gray/index.vue'), - meta: {} - }, - { - path: '/routingRule', - name: 'routingRule', - component: () => import('../views/traffic/routingRule/index.vue'), - meta: {} - }, - { - path: '/tagRule', - name: 'tagRule', - component: () => import('../views/traffic/tagRule/index.vue'), - meta: {} - }, - { - path: '/dynamicConfig', - name: 'dynamicConfig', - component: () => import('../views/traffic/dynamicConfig/index.vue'), + path: '/services', + name: 'services', + component: () => import('../views/resources/services/index.vue'), meta: {} } ] }, { - path: '/test', - name: 'serviceManagement', - redirect: '/test', + path: '/common', + name: 'commonDemo', + redirect: 'tab', meta: { - icon: 'file-icons:testcafe' + icon: 'tdesign:play-demo' }, children: [ { - path: '/test', - name: 'serviceTest', - component: () => import('../views/test/test/index.vue') + path: '/tab', + name: 'tabDemo', + component: LayoutTab, + redirect: 'index', + meta: { + tab_parent: true + }, + children: [ + { + path: '/index', + name: 'applications_index', + component: () => import('../views/resources/applications/index.vue'), + meta: { + // hidden: true, + } + }, + { + path: '/tab1', + name: 'tab1', + component: () => import('../views/common/tab_demo/tab1.vue'), + meta: { + icon: 'simple-icons:podman', + tab: true + } + }, + { + path: '/tab2', + name: 'tab2', + component: () => import('../views/common/tab_demo/tab2.vue'), + meta: { + icon: 'fontisto:docker', + tab: true + } + } + ] }, { - path: '/mock', - name: 'serviceMock', - component: () => import('../views/test/mock/index.vue') + path: '/placeholder', + name: 'placeholder_demo', + component: () => import('../views/common/placeholder_demo/index.vue') } ] - }, - { - path: '/metrics', - name: 'serviceMetrics', - component: () => import('../views/metrics/index.vue'), - meta: { - icon: 'material-symbols-light:screen-search-desktop-outline-rounded' - } - }, - { - path: '/kubernetes', - name: 'kubernetes', - component: () => import('../views/kubernetes/index.vue'), - meta: { - icon: 'carbon:logo-kubernetes' - } } ] } ] + +function handlePath(...paths: any[]) { + return paths.join('/').replace(/\/+/g, '/') +} + +function handleRoutes( + routes: readonly RouteRecordType[] | undefined, + parent: RouteRecordType | undefined +) { + if (!routes) return + for (let route of routes) { + if (parent) { + route.path = handlePath(parent?.path, route.path) + } + if (route.redirect) { + route.redirect = handlePath(route.path, route.redirect || '') + } + + if (route.meta) { + route.meta._router_key = _.uniqueId('__router_key') + route.meta.parent = parent + // fixme, its really useful for tab_router judging how to show tab + route.meta.skip = route.meta.skip === true ? true : false + } else { + route.meta = { + _router_key: _.uniqueId('__router_key'), + skip: false + } + } + handleRoutes(route.children, route) + } +} + +handleRoutes(routes, undefined) +console.log(routes) diff --git a/ui-vue3/src/views/common/index.vue b/ui-vue3/src/views/common/index.vue new file mode 100644 index 000000000..c9f2c01c8 --- /dev/null +++ b/ui-vue3/src/views/common/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/ui-vue3/src/views/common/placeholder_demo/index.vue b/ui-vue3/src/views/common/placeholder_demo/index.vue new file mode 100644 index 000000000..42ebb4554 --- /dev/null +++ b/ui-vue3/src/views/common/placeholder_demo/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/ui-vue3/src/views/common/tab_demo/index.vue b/ui-vue3/src/views/common/tab_demo/index.vue new file mode 100644 index 000000000..05afadf5c --- /dev/null +++ b/ui-vue3/src/views/common/tab_demo/index.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/ui-vue3/src/views/common/tab_demo/tab1.vue b/ui-vue3/src/views/common/tab_demo/tab1.vue new file mode 100644 index 000000000..be048989b --- /dev/null +++ b/ui-vue3/src/views/common/tab_demo/tab1.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/ui-vue3/src/views/common/tab_demo/tab2.vue b/ui-vue3/src/views/common/tab_demo/tab2.vue new file mode 100644 index 000000000..55c136f3e --- /dev/null +++ b/ui-vue3/src/views/common/tab_demo/tab2.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/ui-vue3/src/views/home/index.vue b/ui-vue3/src/views/home/index.vue index a2e36dab2..21a8c3ead 100644 --- a/ui-vue3/src/views/home/index.vue +++ b/ui-vue3/src/views/home/index.vue @@ -18,9 +18,7 @@

{{ $t(routeName) }}

- + diff --git a/ui-vue3/src/views/metrics/index.vue b/ui-vue3/src/views/metrics/index.vue index ef13fc1d3..4e33d2fd9 100644 --- a/ui-vue3/src/views/metrics/index.vue +++ b/ui-vue3/src/views/metrics/index.vue @@ -24,14 +24,13 @@ + diff --git a/ui-vue3/src/views/resources/applications/tabs/tab1.vue b/ui-vue3/src/views/resources/applications/tabs/tab1.vue new file mode 100644 index 000000000..be048989b --- /dev/null +++ b/ui-vue3/src/views/resources/applications/tabs/tab1.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/ui-vue3/src/views/resources/applications/tabs/tab2.vue b/ui-vue3/src/views/resources/applications/tabs/tab2.vue new file mode 100644 index 000000000..55c136f3e --- /dev/null +++ b/ui-vue3/src/views/resources/applications/tabs/tab2.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/ui-vue3/src/views/resources/instances/index.vue b/ui-vue3/src/views/resources/instances/index.vue new file mode 100644 index 000000000..6a4db5cc1 --- /dev/null +++ b/ui-vue3/src/views/resources/instances/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/ui-vue3/src/views/resources/services/index.vue b/ui-vue3/src/views/resources/services/index.vue new file mode 100644 index 000000000..d7a299942 --- /dev/null +++ b/ui-vue3/src/views/resources/services/index.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/ui-vue3/src/views/service/index.vue b/ui-vue3/src/views/service/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/service/index.vue +++ b/ui-vue3/src/views/service/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/test/mock/index.vue b/ui-vue3/src/views/test/mock/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/test/mock/index.vue +++ b/ui-vue3/src/views/test/mock/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/test/test/index.vue b/ui-vue3/src/views/test/test/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/test/test/index.vue +++ b/ui-vue3/src/views/test/test/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/traffic/accesslog/index.vue b/ui-vue3/src/views/traffic/accesslog/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/traffic/accesslog/index.vue +++ b/ui-vue3/src/views/traffic/accesslog/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/traffic/arguments/index.vue b/ui-vue3/src/views/traffic/arguments/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/traffic/arguments/index.vue +++ b/ui-vue3/src/views/traffic/arguments/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/traffic/dynamicConfig/index.vue b/ui-vue3/src/views/traffic/dynamicConfig/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/traffic/dynamicConfig/index.vue +++ b/ui-vue3/src/views/traffic/dynamicConfig/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/traffic/gray/index.vue b/ui-vue3/src/views/traffic/gray/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/traffic/gray/index.vue +++ b/ui-vue3/src/views/traffic/gray/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/traffic/mock/index.vue b/ui-vue3/src/views/traffic/mock/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/traffic/mock/index.vue +++ b/ui-vue3/src/views/traffic/mock/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/traffic/region/index.vue b/ui-vue3/src/views/traffic/region/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/traffic/region/index.vue +++ b/ui-vue3/src/views/traffic/region/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/traffic/retry/index.vue b/ui-vue3/src/views/traffic/retry/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/traffic/retry/index.vue +++ b/ui-vue3/src/views/traffic/retry/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/traffic/routingRule/index.vue b/ui-vue3/src/views/traffic/routingRule/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/traffic/routingRule/index.vue +++ b/ui-vue3/src/views/traffic/routingRule/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/traffic/tagRule/index.vue b/ui-vue3/src/views/traffic/tagRule/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/traffic/tagRule/index.vue +++ b/ui-vue3/src/views/traffic/tagRule/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/traffic/timeout/index.vue b/ui-vue3/src/views/traffic/timeout/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/traffic/timeout/index.vue +++ b/ui-vue3/src/views/traffic/timeout/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/src/views/traffic/weight/index.vue b/ui-vue3/src/views/traffic/weight/index.vue index 72b402ab0..c97d82189 100644 --- a/ui-vue3/src/views/traffic/weight/index.vue +++ b/ui-vue3/src/views/traffic/weight/index.vue @@ -23,7 +23,7 @@ diff --git a/ui-vue3/tsconfig.json b/ui-vue3/tsconfig.json index 5304731b8..fb320488b 100644 --- a/ui-vue3/tsconfig.json +++ b/ui-vue3/tsconfig.json @@ -6,12 +6,14 @@ }, { "path": "./tsconfig.app.json" - }, - { - "path": "./tsconfig.vitest.json" } + ], "compilerOptions": { - "module": "NodeNext" - } + "target": "esnext", + "module": "ESNext" + }, + "include": ["src/base/i18n/*"], + "esm": true + } diff --git a/ui-vue3/yarn.lock b/ui-vue3/yarn.lock index d5ee52eb3..9cc6265b8 100644 --- a/ui-vue3/yarn.lock +++ b/ui-vue3/yarn.lock @@ -546,6 +546,13 @@ resolved "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@ctrl/tinycolor@^3.4.0", "@ctrl/tinycolor@^3.5.0": version "3.6.1" resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" @@ -823,7 +830,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== @@ -838,6 +845,14 @@ resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.20" resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" @@ -1008,6 +1023,26 @@ resolved "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + "@tsconfig/node18@^18.2.2": version "18.2.2" resolved "https://registry.npmmirror.com/@tsconfig/node18/-/node18-18.2.2.tgz#81fb16ecff0d400b1cbadbf76713b50f331029ce" @@ -1051,18 +1086,30 @@ dependencies: undici-types "~5.26.4" -"@types/node@^18.17.5", "@types/node@^18.19.2": +"@types/node@^18.17.5": version "18.19.3" resolved "https://registry.npmmirror.com/@types/node/-/node-18.19.3.tgz#e4723c4cb385641d61b983f6fe0b716abd5f8fc0" integrity sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg== dependencies: undici-types "~5.26.4" +"@types/node@^20.10.6": + version "20.10.6" + resolved "https://registry.npmmirror.com/@types/node/-/node-20.10.6.tgz#a3ec84c22965802bf763da55b2394424f22bfbb5" + integrity sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw== + dependencies: + undici-types "~5.26.4" + "@types/normalize-package-data@^2.4.1": version "2.4.4" resolved "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== +"@types/nprogress@^0.2.3": + version "0.2.3" + resolved "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.3.tgz#b2150b054a13622fabcba12cf6f0b54c48b14287" + integrity sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA== + "@types/semver@^7.5.0": version "7.5.6" resolved "https://registry.npmmirror.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" @@ -1456,7 +1503,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.3.0: +acorn-walk@^8.1.1, acorn-walk@^8.3.0: version "8.3.1" resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== @@ -1466,6 +1513,11 @@ acorn@^8.10.0, acorn@^8.9.0: resolved "https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== +acorn@^8.4.1: + version "8.11.3" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.0" resolved "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" @@ -1589,6 +1641,11 @@ arch@^2.2.0: resolved "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + arg@^5.0.2: version "5.0.2" resolved "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -2068,6 +2125,11 @@ core-util-is@1.0.2: resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2371,6 +2433,11 @@ diff-sequences@^29.6.3: resolved "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3942,6 +4009,11 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + map-stream@~0.1.0: version "0.1.0" resolved "https://registry.npmmirror.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" @@ -4144,6 +4216,11 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== + nth-check@^2.1.1: version "2.1.1" resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -5203,6 +5280,25 @@ ts-api-utils@^1.0.1: resolved "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.5.3, tslib@^2.6.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" @@ -5379,6 +5475,11 @@ uuid@^8.3.2: resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -5707,6 +5808,11 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"