Browse Source

Merge pull request #395 from goxiaoy/base-path

Add admin basePath config
pull/394/head
yedf2 3 years ago
committed by GitHub
parent
commit
f735287faa
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 44
      admin/.eslintrc.js
  2. 24
      admin/index.html
  3. 15
      admin/package.json
  4. 10
      admin/postcss.config.js
  5. 48
      admin/src/api/api_dtm.ts
  6. 4
      admin/src/components.d.ts
  7. 2
      admin/src/components/Screenfull/index.vue
  8. 8
      admin/src/layout/aside.vue
  9. 10
      admin/src/layout/components/content.vue
  10. 22
      admin/src/layout/components/header.vue
  11. 4
      admin/src/layout/components/sidebar.vue
  12. 10
      admin/src/layout/index.vue
  13. 18
      admin/src/main.ts
  14. 1
      admin/src/permission.ts
  15. 129
      admin/src/router/index.ts
  16. 16
      admin/src/store/modules/layout.ts
  17. 3
      admin/src/type/index.d.ts
  18. 2
      admin/src/type/shim.vue.d.ts
  19. 10
      admin/src/utils/util.ts
  20. 239
      admin/src/views/Dashboard/GlobalTransactions/AllTransactions.vue
  21. 16
      admin/src/views/Dashboard/GlobalTransactions/_Components/DialogTransactionDetail.vue
  22. 187
      admin/src/views/Dashboard/KVPairs/Topics.vue
  23. 106
      admin/src/views/Dashboard/KVPairs/_Components/DialogTopicDetail.vue
  24. 96
      admin/src/views/Dashboard/KVPairs/_Components/DialogTopicSubscribe.vue
  25. 10
      admin/tailwind.config.js
  26. 65
      admin/vite.config.ts
  27. 620
      admin/yarn.lock
  28. 1
      conf.sample.yml
  29. 1
      dtmsvr/config/config.go
  30. 26
      main.go

44
admin/.eslintrc.js

@ -1,32 +1,32 @@
module.exports = {
parser: "vue-eslint-parser",
"env": {
"browser": true,
"es2021": true
parser: 'vue-eslint-parser',
env: {
browser: true,
es2021: true
},
"extends": [
"plugin:@typescript-eslint/recommended",
"plugin:vue/vue3-recommended"
extends: [
'plugin:@typescript-eslint/recommended',
'plugin:vue/vue3-recommended'
],
"parserOptions": {
"parser": "@typescript-eslint/parser",
"sourceType": "module",
parserOptions: {
parser: '@typescript-eslint/parser',
sourceType: 'module',
ecmaFeature: {
jsx: true,
tsx: true
}
},
"plugins": [
"@typescript-eslint"
plugins: [
'@typescript-eslint'
],
"rules": {
rules: {
'vue/max-attributes-per-line': ['error', {
singleline: 10,
multiline: {
max: 1,
allowFirstLine: false
max: 1
}
}],
'vue/multi-word-component-names': 0,
'vue/singleline-html-element-content-newline': 'off',
'vue/multiline-html-element-content-newline': 'off',
'vue/html-indent': ['error', 4],
@ -35,7 +35,9 @@ module.exports = {
quotes: ['error', 'single'], // 单引号
// 'vue/html-quotes': ['error', 'single'],
semi: ['error', 'never'], // 禁止使用分号
'space-infix-ops': ['error', { int32Hint: false }], // 要求操作符周围有空格
'space-infix-ops': ['error', {
int32Hint: false
}], // 要求操作符周围有空格
'no-multi-spaces': 'error', // 禁止多个空格
'no-whitespace-before-property': 'error', // 禁止在属性前使用空格
'space-before-blocks': 'error', // 在块之前强制保持一致的间距
@ -48,8 +50,8 @@ module.exports = {
array: true,
object: true
}, {
enforceForRenamedProperties: false
}],
enforceForRenamedProperties: false
}],
'comma-dangle': ['error', 'never'], // 最后一个属性不允许有逗号
'arrow-spacing': 'error', // 箭头函数空格
'prefer-template': 'error',
@ -59,10 +61,12 @@ module.exports = {
'no-unneeded-ternary': 'error', // 禁止可以表达为更简单结构的三元操作符
'no-restricted-syntax': ['error', 'WithStatement', 'BinaryExpression[operator="in"]'], // 禁止with/in语句
'no-lonely-if': 'error', // 禁止 if 语句作为唯一语句出现在 else 语句块中
'newline-per-chained-call': ['error', { ignoreChainWithDepth: 2 }], // 要求方法链中每个调用都有一个换行符
'newline-per-chained-call': ['error', {
ignoreChainWithDepth: 2
}], // 要求方法链中每个调用都有一个换行符
// 路径别名设置
'no-submodule-imports': ['off', '/@'],
'no-implicit-dependencies': ['off', ['/@']],
'@typescript-eslint/no-explicit-any': 'off' // 类型可以使用any
}
}
}

24
admin/index.html

@ -1,13 +1,23 @@
<!DOCTYPE html>
<html lang="en">
<head>
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<link rel="icon" href="<%= PUBLIC_PATH %>/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
</head>
<body>
<title>Dtm</title>
<script type="text/javascript">
window.basePath = '<%= PUBLIC_PATH %>';
window.__assetsPathBuilder = function (importer) {
return window.basePath + "/" + importer;
};
</script>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
</body>
</html>

15
admin/package.json

@ -5,7 +5,9 @@
"scripts": {
"dev": "vite",
"build": "vite build && echo > dist/placeholder",
"preview": "vite preview"
"preview": "vite preview",
"lint": "eslint --ext .tsx,.ts,vue src/",
"lint:fix": "eslint --ext .tsx,.ts,vue src/ --fix"
},
"dependencies": {
"ant-design-vue": "^3.1.1",
@ -18,10 +20,10 @@
"@types/nprogress": "^0.2.0",
"@typescript-eslint/eslint-plugin": "^5.18.0",
"@typescript-eslint/parser": "^5.18.0",
"@vitejs/plugin-vue": "^2.3.0",
"@vitejs/plugin-vue": "^4.0.0",
"autoprefixer": "^10.4.4",
"axios": "^0.26.1",
"eslint": "^8.13.0",
"eslint": "^8.33.0",
"eslint-plugin-vue": "^8.6.0",
"fast-glob": "^3.2.11",
"nprogress": "^0.2.0",
@ -30,12 +32,15 @@
"postcss-import": "^14.1.0",
"postcss-nested": "^5.0.6",
"postcss-simple-vars": "^6.0.3",
"prettier": "^2.8.3",
"prettier-eslint": "^15.0.1",
"screenfull": "^6.0.1",
"tailwindcss": "^3.0.24",
"typescript": "^4.5.4",
"unplugin-vue-components": "^0.19.3",
"vite": "^2.9.13",
"vite-plugin-svg-icons": "^1.1.0",
"vite": "^4.1.1",
"vite-plugin-ejs": "^1.6.4",
"vite-plugin-svg-icons": "^2.0.1",
"vue-router": "^4.0.13",
"vue-tsc": "^0.29.8"
}

10
admin/postcss.config.js

@ -1,6 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}
plugins: {
tailwindcss: {},
autoprefixer: {}
}
}

48
admin/src/api/api_dtm.ts

@ -1,19 +1,21 @@
import {AxiosResponse} from 'axios'
import { AxiosResponse } from 'axios'
import request from '/@/utils/request'
export interface IListAllTransactionsReq {
gid?: string,
limit: number
position?: string
gid?: string;
limit: number;
position?: string;
}
export interface IListAllKVReq {
cat: string
limit: number
position?: string
cat: string;
limit: number;
position?: string;
}
export function listAllTransactions<T>(payload: IListAllTransactionsReq): Promise<AxiosResponse<T>> {
export function listAllTransactions<T>(
payload: IListAllTransactionsReq
): Promise<AxiosResponse<T>> {
return request({
url: '/api/dtmsvr/all',
method: 'get',
@ -25,11 +27,14 @@ export function forceStopTransaction(gid: string): Promise<AxiosResponse> {
return request({
url: '/api/dtmsvr/forceStop',
method: 'post',
data: {gid},
data: { gid }
})
}
export function queryKVPair<T>(payload: { "cat": string, "key": string }): Promise<AxiosResponse<T>> {
export function queryKVPair<T>(payload: {
cat: string;
key: string;
}): Promise<AxiosResponse<T>> {
return request({
url: '/api/dtmsvr/queryKV',
method: 'get',
@ -37,7 +42,9 @@ export function queryKVPair<T>(payload: { "cat": string, "key": string }): Promi
})
}
export function listKVPairs<T>(payload: IListAllKVReq): Promise<AxiosResponse<T>> {
export function listKVPairs<T>(
payload: IListAllKVReq
): Promise<AxiosResponse<T>> {
return request({
url: '/api/dtmsvr/scanKV',
method: 'get',
@ -47,12 +54,16 @@ export function listKVPairs<T>(payload: IListAllKVReq): Promise<AxiosResponse<T>
export function deleteTopic<T>(topicName: string): Promise<AxiosResponse<T>> {
return request({
url: '/api/dtmsvr/topic/' + topicName,
url: `/api/dtmsvr/topic/${topicName}`,
method: 'delete'
})
}
export function subscribe<T>(payload: { topic: string, url: string, remark: string }): Promise<AxiosResponse<T>> {
export function subscribe<T>(payload: {
topic: string;
url: string;
remark: string;
}): Promise<AxiosResponse<T>> {
return request({
url: '/api/dtmsvr/subscribe',
method: 'get',
@ -60,7 +71,10 @@ export function subscribe<T>(payload: { topic: string, url: string, remark: stri
})
}
export function unsubscribe(payload: { topic: string, url: string }): Promise<AxiosResponse> {
export function unsubscribe(payload: {
topic: string;
url: string;
}): Promise<AxiosResponse> {
return request({
url: '/api/dtmsvr/unsubscribe',
method: 'get',
@ -68,7 +82,9 @@ export function unsubscribe(payload: { topic: string, url: string }): Promise<Ax
})
}
export function getTransaction<T>(payload: { gid: string }): Promise<AxiosResponse<T>> {
export function getTransaction<T>(payload: {
gid: string;
}): Promise<AxiosResponse<T>> {
return request({
url: '/api/dtmsvr/query',
method: 'get',
@ -79,6 +95,6 @@ export function getTransaction<T>(payload: { gid: string }): Promise<AxiosRespon
export function getDtmVersion(): Promise<AxiosResponse<any>> {
return request({
url: '/api/dtmsvr/version',
method: 'get',
method: 'get'
})
}

4
admin/src/components.d.ts

@ -1,6 +1,6 @@
// generated by unplugin-vue-components
// We suggest you to commit this file into source control
// Read more: https://github.com/vuejs/vue-next/pull/3399
// Read more: https://github.com/vuejs/core/pull/3399
import '@vue/runtime-core'
declare module '@vue/runtime-core' {
@ -20,9 +20,9 @@ declare module '@vue/runtime-core' {
AMenu: typeof import('ant-design-vue/es')['Menu']
AMenuItem: typeof import('ant-design-vue/es')['MenuItem']
AModal: typeof import('ant-design-vue/es')['Modal']
ASpace: typeof import('ant-design-vue/es')['Space']
ASubMenu: typeof import('ant-design-vue/es')['SubMenu']
ATable: typeof import('ant-design-vue/es')['Table']
ATag: typeof import('ant-design-vue/es')['Tag']
ATextarea: typeof import('ant-design-vue/es')['Textarea']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']

2
admin/src/components/Screenfull/index.vue

@ -5,7 +5,7 @@
</div>
</template>
<script setup lang='ts'>
import { notification } from 'ant-design-vue';
import { notification } from 'ant-design-vue'
import { onMounted, onUnmounted, ref } from 'vue'
import screenfull from 'screenfull'

8
admin/src/layout/aside.vue

@ -4,14 +4,14 @@
<Sidebar />
</a-layout-sider>
<a-layout style="padding: 0 24px 24px">
<div v-if="layout.dtmVersion && layout.dtmVersion != dashVer" style="color:#f00"> !!! admin version: {{dashVer}} != dtm version: {{layout.dtmVersion}}. </div>
<div v-if="layout.dtmVersion && layout.dtmVersion != dashVer" style="color:#f00"> !!! admin version: {{ dashVer }} != dtm version: {{ layout.dtmVersion }}. </div>
<a-breadcrumb style="margin: 16px 0">
<a-breadcrumb-item>{{ mainNav }}</a-breadcrumb-item>
<a-breadcrumb-item>{{ subNav }}</a-breadcrumb-item>
<a-breadcrumb-item>{{ page }}</a-breadcrumb-item>
</a-breadcrumb>
<a-layout-content
:style="{ background: '#fff', padding: '24px', margin: 0, minHeight: '280px' }"
:style="{ background: '#fff', padding: '24px', margin: 0, minHeight: '280px' }"
>
<Content />
</a-layout-content>
@ -24,10 +24,8 @@ import Sidebar from './components/sidebar.vue'
import Content from './components/content.vue'
import { useRoute } from 'vue-router'
import { useLayoutStore } from '../store/modules/layout'
import { IMenubarList } from '../type/store/layout'
import { findCurrentMenubar } from '../utils/util'
import { computed, onMounted, ref } from 'vue'
import { getDtmVersion } from '../api/api_dtm'
import { computed, onMounted } from 'vue'
const dashVer = import.meta.env.VITE_ADMIN_VERSION

10
admin/src/layout/components/content.vue

@ -9,8 +9,8 @@
closable
@close="onClose"
>
<template v-slot:description>
<span v-for="ln of errLines">{{ln}} <br/> </span>
<template #description>
<span v-for="(ln, index) of errLines" :key="index">{{ ln }} <br> </span>
</template>
</a-alert>
<component :is="Component" :key="key" />
@ -30,10 +30,10 @@ const route = useRoute()
const key = computed(() => route.path)
const layoutStore = useLayoutStore()
const errLines = computed(() => layoutStore.globalError.split("\n"))
const onClose = async (e: MouseEvent) => {
const errLines = computed(() => layoutStore.globalError.split('\n'))
const onClose = async() => {
await sleep(1000)
layoutStore.setGlobalError("")
layoutStore.setGlobalError('')
}
</script>

22
admin/src/layout/components/header.vue

@ -1,16 +1,16 @@
<template>
<div>
<a-layout-header class="header flex">
<div class="flex items-center logo h-16">
<a-layout-header class="flex header">
<div class="flex items-center h-16 logo">
<svg-icon style="width: 36px; height: 36px; margin-right: 84px;" icon-class="svg-logo" />
<span class="text-gray-400 text-lg">DTM admin {{ version }}</span>
<span class="text-lg text-gray-400">DTM admin {{ version }}</span>
</div>
<a-menu
v-model:selectedKeys="activeMenu"
theme="dark"
mode="horizontal"
:style="{ lineHeight: '64px' }"
@select="onOpenChange"
v-model:selectedKeys="activeMenu"
theme="dark"
mode="horizontal"
:style="{ lineHeight: '64px' }"
@select="onOpenChange"
>
<a-menu-item v-for="v in getMenubar.menuList" :key="v.path">{{ v.meta.title }}</a-menu-item>
</a-menu>
@ -18,13 +18,13 @@
</div>
</template>
<script setup lang='ts'>
import { computed, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { ref } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useLayoutStore } from '/@/store/modules/layout'
const route = useRoute()
const router = useRouter()
const { getMenubar, getCurrentVersion } = useLayoutStore()
const { getMenubar } = useLayoutStore()
const firstRedirectPath = '/admin'
const version = import.meta.env.VITE_ADMIN_VERSION

4
admin/src/layout/components/sidebar.vue

@ -18,7 +18,7 @@
</template>
<script setup lang='ts'>
import { ref, computed } from 'vue'
import { computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useLayoutStore } from '/@/store/modules/layout'
import { IMenubarList } from '/@/type/store/layout'
@ -36,6 +36,7 @@ const activeMenu = computed({
get: () => {
return [route.path]
},
// eslint-disable-next-line @typescript-eslint/no-unused-vars
set: (val) => {
// do nothing, just for eliminate warn
}
@ -46,6 +47,7 @@ const openKeys = computed({
const pos = route.path.lastIndexOf('/')
return [route.path.substring(0, pos)]
},
// eslint-disable-next-line @typescript-eslint/no-unused-vars
set: (val) => {
// do onthing, just for eliminate warn
}

10
admin/src/layout/index.vue

@ -1,12 +1,12 @@
<script setup lang="ts">
import Header from './components/header.vue'
import Header from './components/header.vue'
</script>
<template>
<a-layout>
<a-layout-header class="header">
<Header />
</a-layout-header>
<a-layout>
<a-layout-header class="header">
<Header />
</a-layout-header>
<router-view />
</a-layout>
</template>

18
admin/src/main.ts

@ -15,18 +15,18 @@ app.use(pinia)
app.mount('#app')
window.onunhandledrejection = (ev: PromiseRejectionEvent) => {
showAlert(ev.reason.stack || ev.reason.message)
showAlert(ev.reason.stack || ev.reason.message)
}
window.onerror = err => {
if (typeof err === "string") {
return showAlert(err)
}
showAlert(JSON.stringify(err))
if (typeof err === 'string') {
return showAlert(err)
}
showAlert(JSON.stringify(err))
}
function showAlert(msg: string) {
let layout = useLayoutStore()
if (!layout.globalError) {
layout.setGlobalError(msg)
}
const layout = useLayoutStore()
if (!layout.globalError) {
layout.setGlobalError(msg)
}
}

1
admin/src/permission.ts

@ -4,6 +4,7 @@ import { useLayoutStore } from './store/modules/layout'
configure({ showSpinner: false })
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const defaultRoutePath = '/'
router.beforeEach((to) => {

129
admin/src/router/index.ts

@ -1,73 +1,80 @@
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import { IMenubarList } from '../type/store/layout';
import { components } from './asyncRouter';
import { IMenubarList } from '../type/store/layout'
import { components } from './asyncRouter'
const Components: IObject<() => Promise<typeof import('*.vue')>> = Object.assign({}, components, {
LayoutHeader: (() => import('/@/layout/index.vue')) as unknown as () => Promise<typeof import('*.vue')>,
LayoutMain: (() => import('/@/layout/aside.vue')) as unknown as () => Promise<typeof import('*.vue')>
})
const Components: IObject<() => Promise<typeof import('*.vue')>> =
Object.assign({}, components, {
LayoutHeader: (() =>
import('/@/layout/index.vue')) as unknown as () => Promise<
typeof import('*.vue')
>,
LayoutMain: (() =>
import('/@/layout/aside.vue')) as unknown as () => Promise<
typeof import('*.vue')
>
})
export const allowRouter: Array<IMenubarList> = [
{
name: 'Admin',
path: '/',
redirect: '/admin/global-transactions/all',
component: Components['LayoutHeader'],
meta: { title: 'Admin', activeMenu: '/admin' },
children: [
{
// name: 'Nodes',
// path: '/admin/nodes',
// component: Components['LayoutMain'],
// meta: { title: 'Nodes' },
// children: [
// {
// name: 'LivingNodes',
// path: '/admin/nodes/living',
// component: Components['LivingNodes'],
// meta: { title: 'Living Nodes' },
// }
// ]
// }, {
name: 'GlobalTransactions',
path: '/admin/global-transactions',
component: Components['LayoutMain'],
meta: { title: 'Global Transactions' },
children: [
{
name: 'AllTransactions',
path: '/admin/global-transactions/all',
component: Components['AllTransactions'],
meta: { title: 'All Transactions' },
// }, {
// name: 'UnfinishedTransactions',
// path: '/admin/global-transactions/unfinished',
// component: Components['UnfinishedTransactions'],
// meta: { title: 'Unfinished Transactions' },
}
]
},{
name: 'KVPairs',
path: '/admin/kv',
component: Components['LayoutMain'],
meta: { title: 'Key-Value Pairs' },
{
name: 'Admin',
path: '/',
redirect: '/admin/global-transactions/all',
component: Components['LayoutHeader'],
meta: { title: 'Admin', activeMenu: '/admin' },
children: [
{
name: 'Topics',
path: '/admin/kv/topics',
component: Components['Topics'],
meta: { title: 'Topics' },
}
{
// name: 'Nodes',
// path: '/admin/nodes',
// component: Components['LayoutMain'],
// meta: { title: 'Nodes' },
// children: [
// {
// name: 'LivingNodes',
// path: '/admin/nodes/living',
// component: Components['LivingNodes'],
// meta: { title: 'Living Nodes' },
// }
// ]
// }, {
name: 'GlobalTransactions',
path: '/admin/global-transactions',
component: Components['LayoutMain'],
meta: { title: 'Global Transactions' },
children: [
{
name: 'AllTransactions',
path: '/admin/global-transactions/all',
component: Components['AllTransactions'],
meta: { title: 'All Transactions' }
// }, {
// name: 'UnfinishedTransactions',
// path: '/admin/global-transactions/unfinished',
// component: Components['UnfinishedTransactions'],
// meta: { title: 'Unfinished Transactions' },
}
]
},
{
name: 'KVPairs',
path: '/admin/kv',
component: Components['LayoutMain'],
meta: { title: 'Key-Value Pairs' },
children: [
{
name: 'Topics',
path: '/admin/kv/topics',
component: Components['Topics'],
meta: { title: 'Topics' }
}
]
}
]
},
]
}
}
]
const router = createRouter({
history: createWebHistory(),
routes: allowRouter as RouteRecordRaw[]
history: createWebHistory(window.basePath || undefined),
routes: allowRouter as RouteRecordRaw[]
})
export default router

16
admin/src/store/modules/layout.ts

@ -1,7 +1,7 @@
import { defineStore } from 'pinia';
import { allowRouter } from '/@/router';
import { ILayout, IMenubar, IMenubarList, IStatus } from '/@/type/store/layout';
import { getDtmVersion } from '/@/api/api_dtm';
import { defineStore } from 'pinia'
import { allowRouter } from '/@/router'
import { ILayout, IMenubar, IMenubarList, IStatus } from '/@/type/store/layout'
import { getDtmVersion } from '/@/api/api_dtm'
export const useLayoutStore = defineStore({
id: 'layout',
@ -12,8 +12,8 @@ export const useLayoutStore = defineStore({
status: {
isLoading: false
},
dtmVersion: "",
globalError: "",
dtmVersion: '',
globalError: ''
}),
getters: {
getMenubar(): IMenubar {
@ -21,7 +21,7 @@ export const useLayoutStore = defineStore({
},
getStatus(): IStatus {
return this.status
},
}
},
actions: {
setRoutes(data: Array<IMenubarList>): void {
@ -36,7 +36,7 @@ export const useLayoutStore = defineStore({
async loadDtmVersion(): Promise<void> {
const { data: { version } } = await getDtmVersion()
this.dtmVersion = version
console.log("dtm version: ", this.dtmVersion)
console.log('dtm version: ', this.dtmVersion)
}
}
})

3
admin/src/type/index.d.ts

@ -14,4 +14,7 @@ declare global {
next_position: number,
size: number
}
interface Window {
basePath: string;
}
}

2
admin/src/type/shim.vue.d.ts

@ -1,5 +1,5 @@
declare module '*.vue' {
import { defineComponent } from 'vue';
import { defineComponent } from 'vue'
const Component: ReturnType<typeof defineComponent>
export default Component
}

10
admin/src/utils/util.ts

@ -1,12 +1,12 @@
import { useRoute } from 'vue-router';
import { IMenubarList } from '../type/store/layout';
import { useRoute } from 'vue-router'
import { IMenubarList } from '../type/store/layout'
export const findCurrentMenubar = (menuList: IMenubarList[], root?: boolean) => {
const route = useRoute()
let arr: IMenubarList[] | IMenubarList = []
for (let i = 0; i < menuList.length; i++) {
const v = menuList[i];
const usePath = v.meta.activeMenu || v.redirect || v.path;
const v = menuList[i]
const usePath = v.meta.activeMenu || v.redirect || v.path
const pos = usePath.lastIndexOf('/')
const rootPath = pos == 0 ? usePath : usePath.substring(0, pos)
if (route.path.indexOf(rootPath) !== -1) {
@ -22,6 +22,6 @@ export const findCurrentMenubar = (menuList: IMenubarList[], root?: boolean) =>
return arr
}
export const sleep = async (ms: number) => {
export const sleep = async(ms: number) => {
return new Promise(resolve => setTimeout(resolve, ms))
}

239
admin/src/views/Dashboard/GlobalTransactions/AllTransactions.vue

@ -1,164 +1,171 @@
<template>
<div>
<a-form
layout="inline"
:model="{}"
@finish="searchFinish"
>
<a-form-item>
<a-input v-model:value="gid" placeholder="gid">
</a-input>
</a-form-item>
<a-form-item>
<a-button
type="primary"
html-type="submit">
搜索
</a-button>
</a-form-item>
</a-form>
</div>
<a-divider />
<div>
<a-table :columns="columns" :data-source="dataSource" :loading="loading" :pagination="false">
<template #bodyCell="{column, record}">
<template v-if="column.key === 'status'">
<div>
<a-form
layout="inline"
:model="{}"
@finish="searchFinish"
>
<a-form-item>
<a-input v-model:value="gid" placeholder="gid" />
</a-form-item>
<a-form-item>
<a-button
type="primary"
html-type="submit"
>
搜索
</a-button>
</a-form-item>
</a-form>
</div>
<a-divider />
<div>
<a-table :columns="columns" :data-source="dataSource" :loading="loading" :pagination="false">
<template #bodyCell="{column, record}">
<template v-if="column.key === 'status'">
<span>
<a-tag :key="record.status"
:color="record.status === 'succeed' ? 'green' : 'volcano'">{{ record.status }}</a-tag>
<a-tag
:key="record.status"
:color="record.status === 'succeed' ? 'green' : 'volcano'"
>{{ record.status }}</a-tag>
</span>
</template>
<template v-else-if="column.key === 'action'">
</template>
<template v-else-if="column.key === 'action'">
<span>
<a class="mr-2 font-medium" @click="handleTransactionDetail(record.gid)">Detail</a>
<a-button danger type="link" :disabled="record.status==='failed' || record.status==='succeed'"
@click="handleTransactionStop(record.gid)">ForceStop</a-button>
<!-- <a class="text-red-400 font-medium" @click="handleTransactionStop(record.gid)">ForceStop</a> -->
<a-button
danger
type="link"
:disabled="record.status==='failed' || record.status==='succeed'"
@click="handleTransactionStop(record.gid)"
>ForceStop</a-button>
<!-- <a class="font-medium text-red-400" @click="handleTransactionStop(record.gid)">ForceStop</a> -->
</span>
</template>
</template>
</a-table>
<div class="flex justify-center mt-2 text-lg pager" v-if="canPrev || canNext">
<a-button type="text" :disabled="!canPrev" @click="handlePrevPage">Previous</a-button>
<a-button type="text" :disabled="!canNext" @click="handleNextPage">Next</a-button>
</template>
</template>
</a-table>
<div v-if="canPrev || canNext" class="flex justify-center mt-2 text-lg pager">
<a-button type="text" :disabled="!canPrev" @click="handlePrevPage">Previous</a-button>
<a-button type="text" :disabled="!canNext" @click="handleNextPage">Next</a-button>
</div>
<DialogTransactionDetail ref="transactionDetail" />
</div>
<DialogTransactionDetail ref="transactionDetail"/>
</div>
</template>
<script setup lang="ts">
import {forceStopTransaction, IListAllTransactionsReq, listAllTransactions} from '/@/api/api_dtm'
import {computed, ref} from 'vue-demi'
import {usePagination} from 'vue-request'
import DialogTransactionDetail from './_Components/DialogTransactionDetail.vue';
const gid = ref("")
const searchFinish = function () {
curPage.value = 1;
const params = {
gid: gid.value,
limit: pageSize.value,
}
run(params)
import { forceStopTransaction, IListAllTransactionsReq, listAllTransactions } from '/@/api/api_dtm'
import { computed, ref } from 'vue-demi'
import { usePagination } from 'vue-request'
import DialogTransactionDetail from './_Components/DialogTransactionDetail.vue'
const gid = ref('')
const searchFinish = function() {
curPage.value = 1
const params = {
gid: gid.value,
limit: pageSize.value
}
run(params)
}
const columns = [
{
title: 'GID',
dataIndex: 'gid',
key: 'gid'
}, {
title: 'TransType',
dataIndex: 'trans_type',
key: 'trans_type'
}, {
title: 'Status',
dataIndex: 'status',
key: 'status'
}, {
title: 'Protocol',
dataIndex: 'protocol',
key: 'protocol'
}, {
title: 'CreateTime',
dataIndex: 'create_time',
key: 'create_time'
}, {
title: 'Action',
key: 'action'
}
{
title: 'GID',
dataIndex: 'gid',
key: 'gid'
}, {
title: 'TransType',
dataIndex: 'trans_type',
key: 'trans_type'
}, {
title: 'Status',
dataIndex: 'status',
key: 'status'
}, {
title: 'Protocol',
dataIndex: 'protocol',
key: 'protocol'
}, {
title: 'CreateTime',
dataIndex: 'create_time',
key: 'create_time'
}, {
title: 'Action',
key: 'action'
}
]
const pages = ref([''])
const curPage = ref(1)
const canPrev = computed(() => {
return curPage.value > 1
return curPage.value > 1
})
const canNext = computed(() => {
return data.value?.data.next_position !== ""
return data.value?.data.next_position !== ''
})
type Data = {
transactions: {
gid: string
trans_type: string
status: string
protocol: string
create_time: string
}[]
next_position: string
transactions: {
gid: string
trans_type: string
status: string
protocol: string
create_time: string
}[]
next_position: string
}
const queryData = (params: IListAllTransactionsReq) => {
return listAllTransactions<Data>(params)
return listAllTransactions<Data>(params)
}
const {data, run, current, loading, pageSize} = usePagination(queryData, {
defaultParams: [
{
limit: 10,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { data, run, current, loading, pageSize } = usePagination(queryData, {
defaultParams: [
{
limit: 10
}
],
pagination: {
pageSizeKey: 'limit'
}
],
pagination: {
pageSizeKey: 'limit'
}
})
const dataSource = computed(() => data.value?.data.transactions || [])
const handlePrevPage = () => {
curPage.value -= 1;
const params = {
limit: pageSize.value,
position: pages.value[curPage.value] as string
}
run(params)
curPage.value -= 1
const params = {
limit: pageSize.value,
position: pages.value[curPage.value] as string
}
run(params)
}
const handleNextPage = () => {
curPage.value += 1;
pages.value[curPage.value] = data.value?.data.next_position as string
curPage.value += 1
pages.value[curPage.value] = data.value?.data.next_position as string
run({
position: data.value?.data.next_position,
limit: pageSize.value,
})
run({
position: data.value?.data.next_position,
limit: pageSize.value
})
}
const transactionDetail = ref<null | { open: (gid: string) => null }>(null)
const handleTransactionDetail = (gid: string) => {
transactionDetail.value?.open(gid)
transactionDetail.value?.open(gid)
}
const handleTransactionStop = async (gid: string) => {
await forceStopTransaction(gid)
run({
position: data.value?.data.next_position,
limit: pageSize.value,
})
const handleTransactionStop = async(gid: string) => {
await forceStopTransaction(gid)
run({
position: data.value?.data.next_position,
limit: pageSize.value
})
}
</script>

16
admin/src/views/Dashboard/GlobalTransactions/_Components/DialogTransactionDetail.vue

@ -2,21 +2,21 @@
<div>
<a-modal v-model:visible="visible" title="Transaction Detail" width="100%" wrap-class-name="full-modal">
<a-table :columns="columns" :data-source="dataSource" :pagination="false">
<template #bodyCell="{column, record}">
</template>
<!-- eslint-disable-next-line vue/no-unused-vars -->
<template #bodyCell="{column, record}" />
</a-table>
<div class="mt-10 relative">
<div class="relative mt-10">
<a-textarea id="qs" v-model:value="textVal" :auto-size="{ minRows: 10, maxRows: 10 }" />
<screenfull class="absolute right-2 top-3 z-50" identity="qs" />
<screenfull class="absolute z-50 right-2 top-3" identity="qs" />
</div>
</a-modal>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { getTransaction } from '/@/api/api_dtm';
import screenfull from '/@/components/Screenfull/index.vue';
import { ref } from 'vue'
import { getTransaction } from '/@/api/api_dtm'
import screenfull from '/@/components/Screenfull/index.vue'
// import VueJsonPretty from 'vue-json-pretty';
// import 'vue-json-pretty/lib/styles.css'
@ -25,7 +25,7 @@ const visible = ref(false)
const textVal = ref('')
const open = async(gid: string) => {
const d = await getTransaction<Data>({gid: gid})
const d = await getTransaction<Data>({ gid: gid })
dataSource.value = d.data.branches
textVal.value = JSON.stringify(d.data, null, 2)
visible.value = true

187
admin/src/views/Dashboard/KVPairs/Topics.vue

@ -1,142 +1,143 @@
<template>
<div>
<a-button type="primary" class="mb-2" @click="handleTopicSubscribe('')">Subscribe</a-button>
<a-table :columns="columns" :data-source="dataSource" :loading="loading" :pagination="false">
<template #bodyCell="{column, record}">
<template v-if="column.key === 'subscribers'">
<span>{{ JSON.parse(record.v).length }}</span>
</template>
<template v-if="column.key === 'action'">
<span>
<a class="mr-2 font-medium" @click="handleTopicSubscribe(record.k)">Subscribe</a>
<a class="mr-2 font-medium" @click="handleTopicDetail(record.k,record.v)">Detail</a>
<a class="text-red-400 font-medium" @click="handleDeleteTopic(record.k)">Delete</a>
</span>
</template>
</template>
</a-table>
<div class="flex justify-center mt-2 text-lg pager" v-if="canPrev || canNext">
<a-button type="text" :disabled="!canPrev" @click="handlePrevPage">Previous</a-button>
<a-button type="text" :disabled="!canNext" @click="handleNextPage">Next</a-button>
<div>
<a-button type="primary" class="mb-2" @click="handleTopicSubscribe('')">Subscribe</a-button>
<a-table :columns="columns" :data-source="dataSource" :loading="loading" :pagination="false">
<template #bodyCell="{column, record}">
<template v-if="column.key === 'subscribers'">
<span>{{ JSON.parse(record.v).length }}</span>
</template>
<template v-if="column.key === 'action'">
<span>
<a class="mr-2 font-medium" @click="handleTopicSubscribe(record.k)">Subscribe</a>
<a class="mr-2 font-medium" @click="handleTopicDetail(record.k,record.v)">Detail</a>
<a class="font-medium text-red-400" @click="handleDeleteTopic(record.k)">Delete</a>
</span>
</template>
</template>
</a-table>
<div v-if="canPrev || canNext" class="flex justify-center mt-2 text-lg pager">
<a-button type="text" :disabled="!canPrev" @click="handlePrevPage">Previous</a-button>
<a-button type="text" :disabled="!canNext" @click="handleNextPage">Next</a-button>
</div>
<DialogTopicDetail ref="topicDetail" @unsubscribed="handleRefreshData" />
<DialogTopicSubscribe ref="topicSubscribe" @subscribed="handleRefreshData" />
</div>
<DialogTopicDetail ref="topicDetail" @unsubscribed="handleRefreshData"/>
<DialogTopicSubscribe ref="topicSubscribe" @subscribed="handleRefreshData"/>
</div>
</template>
<script setup lang="ts">
import {deleteTopic, IListAllKVReq, listKVPairs} from '/@/api/api_dtm'
import {computed, ref} from 'vue-demi'
import {usePagination} from 'vue-request'
import DialogTopicDetail from './_Components/DialogTopicDetail.vue';
import DialogTopicSubscribe from './_Components/DialogTopicSubscribe.vue';
import {message, Modal} from 'ant-design-vue';
import DialogTopicDetail from './_Components/DialogTopicDetail.vue'
import DialogTopicSubscribe from './_Components/DialogTopicSubscribe.vue'
import { deleteTopic, IListAllKVReq, listKVPairs } from '/@/api/api_dtm'
import { computed, ref } from 'vue-demi'
import { usePagination } from 'vue-request'
import { message, Modal } from 'ant-design-vue'
const columns = [
{
title: 'Name',
dataIndex: 'k',
key: 'name'
}, {
title: 'Subscribers',
dataIndex: 'v',
key: 'subscribers'
}, {
title: 'Version',
dataIndex: 'version',
key: 'version'
}, {
title: 'Action',
key: 'action'
}
{
title: 'Name',
dataIndex: 'k',
key: 'name'
}, {
title: 'Subscribers',
dataIndex: 'v',
key: 'subscribers'
}, {
title: 'Version',
dataIndex: 'version',
key: 'version'
}, {
title: 'Action',
key: 'action'
}
]
const pages = ref([''])
const curPage = ref(1)
const canPrev = computed(() => {
return curPage.value > 1
return curPage.value > 1
})
const canNext = computed(() => {
return data.value?.data.next_position !== ""
return data.value?.data.next_position !== ''
})
type Data = {
kv: {
k: string
v: string
version: number
}[]
next_position: string
kv: {
k: string
v: string
version: number
}[]
next_position: string
}
const queryData = (params: IListAllKVReq) => {
return listKVPairs<Data>(params)
return listKVPairs<Data>(params)
}
const {data, run, current, loading, pageSize} = usePagination(queryData, {
defaultParams: [
{
cat: "topics",
limit: 10,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { data, run, current, loading, pageSize } = usePagination(queryData, {
defaultParams: [
{
cat: 'topics',
limit: 10
}
],
pagination: {
pageSizeKey: 'limit'
}
],
pagination: {
pageSizeKey: 'limit'
}
})
const dataSource = computed(() => data.value?.data.kv || [])
const handlePrevPage = () => {
curPage.value -= 1;
const params = {
cat: "topics",
limit: pageSize.value,
position: pages.value[curPage.value] as string
}
run(params)
curPage.value -= 1
const params = {
cat: 'topics',
limit: pageSize.value,
position: pages.value[curPage.value] as string
}
run(params)
}
const handleNextPage = () => {
curPage.value += 1;
pages.value[curPage.value] = data.value?.data.next_position as string
run({
cat: "topics",
position: data.value?.data.next_position,
limit: pageSize.value,
})
curPage.value += 1
pages.value[curPage.value] = data.value?.data.next_position as string
run({
cat: 'topics',
position: data.value?.data.next_position,
limit: pageSize.value
})
}
const handleRefreshData = () => {
run({cat: 'topics', limit: pageSize.value})
run({ cat: 'topics', limit: pageSize.value })
}
const handleDeleteTopic = (topic: string) => {
Modal.confirm({
title: 'Delete',
content: 'Do you want delete this topic? ',
okText: 'Yes',
okType: 'danger',
cancelText: 'Cancel',
onOk: async () => {
await deleteTopic(topic)
message.success('Delete topic succeed')
run({cat: 'topics', limit: pageSize.value})
}
})
Modal.confirm({
title: 'Delete',
content: 'Do you want delete this topic? ',
okText: 'Yes',
okType: 'danger',
cancelText: 'Cancel',
onOk: async() => {
await deleteTopic(topic)
message.success('Delete topic succeed')
run({ cat: 'topics', limit: pageSize.value })
}
})
}
const topicDetail = ref<null | { open: (topic: string, subscribers: string) => null }>(null)
const handleTopicDetail = (topic: string, subscribers: string) => {
topicDetail.value?.open(topic, subscribers)
topicDetail.value?.open(topic, subscribers)
}
const topicSubscribe = ref<null | { open: (topic: string) => null }>(null)
const handleTopicSubscribe = (topic: string) => {
topicSubscribe.value?.open(topic)
topicSubscribe.value?.open(topic)
}
</script>

106
admin/src/views/Dashboard/KVPairs/_Components/DialogTopicDetail.vue

@ -1,80 +1,80 @@
<template>
<div>
<a-modal v-model:visible="visible" :title=topicName width="100%" wrap-class-name="full-modal" :footer="null">
<a-table :columns="columns" :data-source="dataSource" :pagination="false">
<template #bodyCell="{column, record}">
<template v-if="column.key === 'action'">
<span>
<a class="text-red-400 font-medium" @click="handleUnsubscribe(record.url)">Unsubscribe</a>
</span>
</template>
</template>
</a-table>
<!-- <div class="mt-10 relative">
<div>
<a-modal v-model:visible="visible" :title="topicName" width="100%" wrap-class-name="full-modal" :footer="null">
<a-table :columns="columns" :data-source="dataSource" :pagination="false">
<template #bodyCell="{column, record}">
<template v-if="column.key === 'action'">
<span>
<a class="text-red-400 font-medium" @click="handleUnsubscribe(record.url)">Unsubscribe</a>
</span>
</template>
</template>
</a-table>
<!-- <div class="mt-10 relative">
<a-textarea id="qs" v-model:value="textVal" :auto-size="{ minRows: 10, maxRows: 10 }" />
<screenfull class="absolute right-2 top-3 z-50" identity="qs" />
</div> -->
</a-modal>
</div>
</a-modal>
</div>
</template>
<script setup lang="ts">
import {ref} from 'vue';
import {unsubscribe} from "/@/api/api_dtm";
import {message, Modal} from "ant-design-vue";
import { ref } from 'vue'
import { unsubscribe } from '/@/api/api_dtm'
import { message, Modal } from 'ant-design-vue'
// import VueJsonPretty from 'vue-json-pretty';
// import 'vue-json-pretty/lib/styles.css'
const dataSource = ref<Subscriber[]>([])
const visible = ref(false)
const topicName = ref<string>("");
const topicName = ref<string>('')
const open = async (topic: string, subscribers: string) => {
dataSource.value = JSON.parse(subscribers)
topicName.value = topic
visible.value = true
const open = async(topic: string, subscribers: string) => {
dataSource.value = JSON.parse(subscribers)
topicName.value = topic
visible.value = true
}
const columns = [
{
title: 'URL',
dataIndex: 'url',
key: 'url'
}, {
title: 'Remark',
dataIndex: 'remark',
key: 'remark'
}, {
title: 'Action',
key: 'action'
}
{
title: 'URL',
dataIndex: 'url',
key: 'url'
}, {
title: 'Remark',
dataIndex: 'remark',
key: 'remark'
}, {
title: 'Action',
key: 'action'
}
]
interface Subscriber {
url: string
remark: string
url: string
remark: string
}
const handleUnsubscribe = async (url: string) => {
Modal.confirm({
title: 'Unsubscribe',
content: 'Do you want unsubscribe this topic?',
okText: 'Yes',
okType: 'danger',
cancelText: 'Cancel',
onOk: async () => {
await unsubscribe({
topic: topicName.value,
url: url
})
message.success('Unsubscribe topic succeed')
location.reload()
}
})
const handleUnsubscribe = async(url: string) => {
Modal.confirm({
title: 'Unsubscribe',
content: 'Do you want unsubscribe this topic?',
okText: 'Yes',
okType: 'danger',
cancelText: 'Cancel',
onOk: async() => {
await unsubscribe({
topic: topicName.value,
url: url
})
message.success('Unsubscribe topic succeed')
location.reload()
}
})
}
defineExpose({
open
open
})
</script>

96
admin/src/views/Dashboard/KVPairs/_Components/DialogTopicSubscribe.vue

@ -1,71 +1,77 @@
<template>
<div>
<a-modal v-model:visible="visible" width="60%" title="Topic Subscribe" :confirm-loading="confirmLoading"
@ok="handleSubscribe">
<a-form v-bind="layout" :mode="form">
<a-form-item label="Topic: ">
<a-input v-model:value="form.topic" placeholder="Please input your topic..."/>
</a-form-item>
<a-form-item label="URL: ">
<a-input v-model:value="form.url" placeholder="Please input your url..."/>
</a-form-item>
<a-form-item label="Remark">
<a-textarea v-model:value="form.remark" :rows="6" placeholder="Please input your remark..."/>
</a-form-item>
</a-form>
</a-modal>
</div>
<div>
<a-modal
v-model:visible="visible"
width="60%"
title="Topic Subscribe"
:confirm-loading="confirmLoading"
@ok="handleSubscribe"
>
<a-form v-bind="layout" :mode="form">
<a-form-item label="Topic: ">
<a-input v-model:value="form.topic" placeholder="Please input your topic..." />
</a-form-item>
<a-form-item label="URL: ">
<a-input v-model:value="form.url" placeholder="Please input your url..." />
</a-form-item>
<a-form-item label="Remark">
<a-textarea v-model:value="form.remark" :rows="6" placeholder="Please input your remark..." />
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script setup lang="ts">
import {message} from 'ant-design-vue';
import {reactive, ref} from 'vue';
import {subscribe} from '/@/api/api_dtm'
import { message } from 'ant-design-vue'
import { reactive, ref } from 'vue'
import { subscribe } from '/@/api/api_dtm'
interface formState {
topic: string
url: string
remark: string
topic: string
url: string
remark: string
}
const layout = {
labelCol: {span: 4},
wrapperCol: {span: 16},
labelCol: { span: 4 },
wrapperCol: { span: 16 }
}
const form = reactive<formState>({
topic: '',
url: '',
remark: ''
topic: '',
url: '',
remark: ''
})
const visible = ref(false)
const open = async (topic: string) => {
form.topic = topic
visible.value = true
const open = async(topic: string) => {
form.topic = topic
visible.value = true
}
const emit = defineEmits(['subscribed'])
const confirmLoading = ref<boolean>(false)
const handleSubscribe = async () => {
confirmLoading.value = true
await subscribe<string>(form).then(
() => {
visible.value = false
message.success('Subscribe succeed')
confirmLoading.value = false
emit('subscribed')
}
).catch(() => {
message.error('Failed')
confirmLoading.value = false
return
})
const handleSubscribe = async() => {
confirmLoading.value = true
await subscribe<string>(form).then(
() => {
visible.value = false
message.success('Subscribe succeed')
confirmLoading.value = false
emit('subscribed')
}
)
.catch(() => {
message.error('Failed')
confirmLoading.value = false
return
})
}
defineExpose({
open
open
})
</script>

10
admin/tailwind.config.js

@ -1,7 +1,7 @@
module.exports = {
content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
theme: {
extend: {},
},
plugins: [],
content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
theme: {
extend: {}
},
plugins: []
}

65
admin/vite.config.ts

@ -1,39 +1,68 @@
import { ConfigEnv, UserConfigExport } from 'vite';
import path from 'path';
import vue from '@vitejs/plugin-vue';
import viteSvgIcons from 'vite-plugin-svg-icons';
import Components from 'unplugin-vue-components/vite';
import { ConfigEnv, UserConfigExport } from 'vite'
import path from 'path'
import vue from '@vitejs/plugin-vue'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import Components from 'unplugin-vue-components/vite'
import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers'
import { ViteEjsPlugin } from 'vite-plugin-ejs'
import dns from 'dns'
const setAlias = (alias: [string, string][]) => alias.map((v) => {
return { find: v[0], replacement: path.resolve(__dirname, v[1]) };
});
const setAlias = (alias: [string, string][]) =>
alias.map((v) => {
return { find: v[0], replacement: path.resolve(__dirname, v[1]) }
})
// https://cn.vitejs.dev/config/server-options.html#server-host
dns.setDefaultResultOrder('verbatim')
export default ({ }: ConfigEnv): UserConfigExport => {
export default ({ mode }: ConfigEnv): UserConfigExport => {
return {
resolve: {
alias: setAlias([['/@', 'src']]),
alias: setAlias([['/@', 'src']])
},
plugins: [
vue(),
viteSvgIcons({
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/icons')],
symbolId: 'icon-[dir]-[name]'
}),
Components({
dts: 'src/components.d.ts',
resolvers: [
AntDesignVueResolver()
]
resolvers: [AntDesignVueResolver()]
}),
ViteEjsPlugin({
PUBLIC_PATH: mode !== 'development' ? 'PUBLIC-PATH-VARIABLE' : ''
})
],
experimental: {
renderBuiltUrl(
filename: string,
{
hostType
}: {
hostId: string;
hostType: 'js' | 'css' | 'html';
type: 'asset' | 'public';
}
) {
if (hostType === 'js') {
return {
runtime: `window.__assetsPathBuilder(${JSON.stringify(filename)})`
}
}
return filename
}
},
server: {
host: 'localhost',
port: 6789,
base: 'admin',
proxy: {
'/api': {
target: 'http://localhost:36789',
},
changeOrigin: true,
target: 'http://localhost:36789'
}
}
},
css: {
@ -46,5 +75,5 @@ export default ({ }: ConfigEnv): UserConfigExport => {
]
}
}
};
};
}
}

620
admin/yarn.lock

@ -82,39 +82,139 @@
resolved "https://registry.yarnpkg.com/@emmetio/scanner/-/scanner-1.0.0.tgz#065b2af6233fe7474d44823e3deb89724af42b5f"
integrity sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA==
"@esbuild/linux-loong64@0.14.54":
version "0.14.54"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
"@eslint/eslintrc@^1.3.1":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.1.tgz#de0807bfeffc37b964a7d0400e0c348ce5a2543d"
integrity sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==
"@esbuild/android-arm64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23"
integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==
"@esbuild/android-arm@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2"
integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==
"@esbuild/android-x64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e"
integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==
"@esbuild/darwin-arm64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220"
integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==
"@esbuild/darwin-x64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4"
integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==
"@esbuild/freebsd-arm64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27"
integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==
"@esbuild/freebsd-x64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72"
integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==
"@esbuild/linux-arm64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca"
integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==
"@esbuild/linux-arm@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196"
integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==
"@esbuild/linux-ia32@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54"
integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==
"@esbuild/linux-loong64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8"
integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==
"@esbuild/linux-mips64el@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726"
integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==
"@esbuild/linux-ppc64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8"
integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==
"@esbuild/linux-riscv64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9"
integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==
"@esbuild/linux-s390x@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87"
integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==
"@esbuild/linux-x64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f"
integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==
"@esbuild/netbsd-x64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775"
integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==
"@esbuild/openbsd-x64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35"
integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==
"@esbuild/sunos-x64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c"
integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==
"@esbuild/win32-arm64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a"
integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==
"@esbuild/win32-ia32@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09"
integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==
"@esbuild/win32-x64@0.16.17":
version "0.16.17"
resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091"
integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==
"@eslint/eslintrc@^1.4.1":
version "1.4.1"
resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e"
integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
espree "^9.4.0"
globals "^13.15.0"
globals "^13.19.0"
ignore "^5.2.0"
import-fresh "^3.2.1"
js-yaml "^4.1.0"
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@humanwhocodes/config-array@^0.10.4":
version "0.10.4"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c"
integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==
"@humanwhocodes/config-array@^0.11.8":
version "0.11.8"
resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9"
integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==
dependencies:
"@humanwhocodes/object-schema" "^1.2.1"
debug "^4.1.1"
minimatch "^3.0.4"
"@humanwhocodes/gitignore-to-minimatch@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d"
integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==
minimatch "^3.0.5"
"@humanwhocodes/module-importer@^1.0.1":
version "1.0.1"
@ -139,7 +239,7 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
"@nodelib/fs.walk@^1.2.3":
"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
@ -168,7 +268,20 @@
resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
"@types/json-schema@^7.0.9":
"@types/eslint@^8.4.2":
version "8.21.0"
resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.21.0.tgz#21724cfe12b96696feafab05829695d4d7bd7c48"
integrity sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==
dependencies:
"@types/estree" "*"
"@types/json-schema" "*"
"@types/estree@*":
version "1.0.0"
resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2"
integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
"@types/json-schema@*", "@types/json-schema@^7.0.9":
version "7.0.11"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
@ -188,9 +301,14 @@
resolved "https://registry.yarnpkg.com/@types/nprogress/-/nprogress-0.2.0.tgz#86c593682d4199212a0509cc3c4d562bbbd6e45f"
integrity sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==
"@types/svgo@^2.6.0":
"@types/prettier@^2.6.0":
version "2.7.2"
resolved "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0"
integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==
"@types/svgo@^2.6.1":
version "2.6.4"
resolved "https://registry.yarnpkg.com/@types/svgo/-/svgo-2.6.4.tgz#b7298fc1dd687539fd63fc818b00146d96e68836"
resolved "https://registry.npmmirror.com/@types/svgo/-/svgo-2.6.4.tgz#b7298fc1dd687539fd63fc818b00146d96e68836"
integrity sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==
dependencies:
"@types/node" "*"
@ -210,6 +328,16 @@
semver "^7.3.7"
tsutils "^3.21.0"
"@typescript-eslint/parser@^5.10.0":
version "5.50.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.50.0.tgz#a33f44b2cc83d1b7176ec854fbecd55605b0b032"
integrity sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==
dependencies:
"@typescript-eslint/scope-manager" "5.50.0"
"@typescript-eslint/types" "5.50.0"
"@typescript-eslint/typescript-estree" "5.50.0"
debug "^4.3.4"
"@typescript-eslint/parser@^5.18.0":
version "5.36.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.36.1.tgz#931c22c7bacefd17e29734628cdec8b2acdcf1ce"
@ -228,6 +356,14 @@
"@typescript-eslint/types" "5.36.1"
"@typescript-eslint/visitor-keys" "5.36.1"
"@typescript-eslint/scope-manager@5.50.0":
version "5.50.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz#90b8a3b337ad2c52bbfe4eac38f9164614e40584"
integrity sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==
dependencies:
"@typescript-eslint/types" "5.50.0"
"@typescript-eslint/visitor-keys" "5.50.0"
"@typescript-eslint/type-utils@5.36.1":
version "5.36.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz#016fc2bff6679f54c0b2df848a493f0ca3d4f625"
@ -243,6 +379,11 @@
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.36.1.tgz#1cf0e28aed1cb3ee676917966eb23c2f8334ce2c"
integrity sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==
"@typescript-eslint/types@5.50.0":
version "5.50.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.50.0.tgz#c461d3671a6bec6c2f41f38ed60bd87aa8a30093"
integrity sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==
"@typescript-eslint/typescript-estree@5.36.1":
version "5.36.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz#b857f38d6200f7f3f4c65cd0a5afd5ae723f2adb"
@ -256,6 +397,19 @@
semver "^7.3.7"
tsutils "^3.21.0"
"@typescript-eslint/typescript-estree@5.50.0":
version "5.50.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz#0b9b82975bdfa40db9a81fdabc7f93396867ea97"
integrity sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==
dependencies:
"@typescript-eslint/types" "5.50.0"
"@typescript-eslint/visitor-keys" "5.50.0"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
semver "^7.3.7"
tsutils "^3.21.0"
"@typescript-eslint/utils@5.36.1":
version "5.36.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.36.1.tgz#136d5208cc7a3314b11c646957f8f0b5c01e07ad"
@ -276,10 +430,18 @@
"@typescript-eslint/types" "5.36.1"
eslint-visitor-keys "^3.3.0"
"@vitejs/plugin-vue@^2.3.0":
version "2.3.4"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz#966a6279060eb2d9d1a02ea1a331af071afdcf9e"
integrity sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==
"@typescript-eslint/visitor-keys@5.50.0":
version "5.50.0"
resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz#b752ffc143841f3d7bc57d6dd01ac5c40f8c4903"
integrity sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==
dependencies:
"@typescript-eslint/types" "5.50.0"
eslint-visitor-keys "^3.3.0"
"@vitejs/plugin-vue@^4.0.0":
version "4.0.0"
resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz#93815beffd23db46288c787352a8ea31a0c03e5e"
integrity sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==
"@volar/code-gen@0.29.8":
version "0.29.8"
@ -487,6 +649,11 @@ ansi-regex@^2.0.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
ansi-regex@^3.0.0:
version "3.0.1"
resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1"
integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
@ -497,6 +664,13 @@ ansi-styles@^2.2.1:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==
ansi-styles@^3.2.0:
version "3.2.1"
resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
@ -595,6 +769,11 @@ async-validator@^4.0.0:
resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339"
integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
async@^3.2.3:
version "3.2.4"
resolved "https://registry.npmmirror.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
atob@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
@ -761,7 +940,7 @@ chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
chalk@^4.0.0:
chalk@^4.0.0, chalk@^4.0.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@ -814,6 +993,13 @@ collection-visit@^1.0.0:
map-visit "^1.0.0"
object-visit "^1.0.0"
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
dependencies:
color-name "1.1.3"
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
@ -821,6 +1007,11 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@^1.1.4, color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
@ -831,6 +1022,11 @@ commander@^7.2.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
common-tags@^1.4.0:
version "1.8.2"
resolved "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6"
integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==
component-emitter@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
@ -999,7 +1195,7 @@ dir-glob@^3.0.1:
dependencies:
path-type "^4.0.0"
dlv@^1.1.3:
dlv@^1.1.0, dlv@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
@ -1084,6 +1280,13 @@ domutils@^2.8.0:
domelementtype "^2.2.0"
domhandler "^4.2.0"
ejs@^3.1.8:
version "3.1.8"
resolved "https://registry.npmmirror.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b"
integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==
dependencies:
jake "^10.8.5"
electron-to-chromium@^1.4.202:
version "1.4.241"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.241.tgz#5aa03ab94db590d8269f4518157c24b1efad34d6"
@ -1117,132 +1320,33 @@ entities@^3.0.1:
resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4"
integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==
esbuild-android-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==
esbuild-android-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771"
integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==
esbuild-darwin-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25"
integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==
esbuild-darwin-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73"
integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==
esbuild-freebsd-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d"
integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==
esbuild-freebsd-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48"
integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==
esbuild-linux-32@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5"
integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==
esbuild-linux-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652"
integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==
esbuild-linux-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b"
integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==
esbuild-linux-arm@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59"
integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==
esbuild-linux-mips64le@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34"
integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==
esbuild-linux-ppc64le@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e"
integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==
esbuild-linux-riscv64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8"
integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==
esbuild-linux-s390x@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6"
integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==
esbuild-netbsd-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81"
integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==
esbuild-openbsd-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b"
integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==
esbuild-sunos-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da"
integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==
esbuild-windows-32@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31"
integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==
esbuild-windows-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4"
integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==
esbuild-windows-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982"
integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==
esbuild@^0.14.27:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2"
integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==
esbuild@^0.16.14:
version "0.16.17"
resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259"
integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==
optionalDependencies:
"@esbuild/linux-loong64" "0.14.54"
esbuild-android-64 "0.14.54"
esbuild-android-arm64 "0.14.54"
esbuild-darwin-64 "0.14.54"
esbuild-darwin-arm64 "0.14.54"
esbuild-freebsd-64 "0.14.54"
esbuild-freebsd-arm64 "0.14.54"
esbuild-linux-32 "0.14.54"
esbuild-linux-64 "0.14.54"
esbuild-linux-arm "0.14.54"
esbuild-linux-arm64 "0.14.54"
esbuild-linux-mips64le "0.14.54"
esbuild-linux-ppc64le "0.14.54"
esbuild-linux-riscv64 "0.14.54"
esbuild-linux-s390x "0.14.54"
esbuild-netbsd-64 "0.14.54"
esbuild-openbsd-64 "0.14.54"
esbuild-sunos-64 "0.14.54"
esbuild-windows-32 "0.14.54"
esbuild-windows-64 "0.14.54"
esbuild-windows-arm64 "0.14.54"
"@esbuild/android-arm" "0.16.17"
"@esbuild/android-arm64" "0.16.17"
"@esbuild/android-x64" "0.16.17"
"@esbuild/darwin-arm64" "0.16.17"
"@esbuild/darwin-x64" "0.16.17"
"@esbuild/freebsd-arm64" "0.16.17"
"@esbuild/freebsd-x64" "0.16.17"
"@esbuild/linux-arm" "0.16.17"
"@esbuild/linux-arm64" "0.16.17"
"@esbuild/linux-ia32" "0.16.17"
"@esbuild/linux-loong64" "0.16.17"
"@esbuild/linux-mips64el" "0.16.17"
"@esbuild/linux-ppc64" "0.16.17"
"@esbuild/linux-riscv64" "0.16.17"
"@esbuild/linux-s390x" "0.16.17"
"@esbuild/linux-x64" "0.16.17"
"@esbuild/netbsd-x64" "0.16.17"
"@esbuild/openbsd-x64" "0.16.17"
"@esbuild/sunos-x64" "0.16.17"
"@esbuild/win32-arm64" "0.16.17"
"@esbuild/win32-ia32" "0.16.17"
"@esbuild/win32-x64" "0.16.17"
escalade@^3.1.1:
version "3.1.1"
@ -1304,15 +1408,15 @@ eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.3.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
eslint@^8.13.0:
version "8.23.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.0.tgz#a184918d288820179c6041bb3ddcc99ce6eea040"
integrity sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==
eslint@^8.33.0, eslint@^8.7.0:
version "8.33.0"
resolved "https://registry.npmmirror.com/eslint/-/eslint-8.33.0.tgz#02f110f32998cb598c6461f24f4d306e41ca33d7"
integrity sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==
dependencies:
"@eslint/eslintrc" "^1.3.1"
"@humanwhocodes/config-array" "^0.10.4"
"@humanwhocodes/gitignore-to-minimatch" "^1.0.2"
"@eslint/eslintrc" "^1.4.1"
"@humanwhocodes/config-array" "^0.11.8"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
@ -1328,15 +1432,15 @@ eslint@^8.13.0:
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
find-up "^5.0.0"
functional-red-black-tree "^1.0.1"
glob-parent "^6.0.1"
globals "^13.15.0"
globby "^11.1.0"
glob-parent "^6.0.2"
globals "^13.19.0"
grapheme-splitter "^1.0.4"
ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
is-path-inside "^3.0.3"
js-sdsl "^4.1.4"
js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
@ -1479,6 +1583,13 @@ file-entry-cache@^6.0.1:
dependencies:
flat-cache "^3.0.4"
filelist@^1.0.1:
version "1.0.4"
resolved "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==
dependencies:
minimatch "^5.0.1"
fill-range@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
@ -1555,12 +1666,12 @@ fs.realpath@^1.0.0:
fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
functional-red-black-tree@^1.0.1:
@ -1589,7 +1700,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2:
dependencies:
is-glob "^4.0.1"
glob-parent@^6.0.1, glob-parent@^6.0.2:
glob-parent@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
@ -1608,10 +1719,10 @@ glob@^7.1.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
globals@^13.15.0:
version "13.17.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4"
integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==
globals@^13.19.0:
version "13.20.0"
resolved "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82"
integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==
dependencies:
type-fest "^0.20.2"
@ -1699,7 +1810,7 @@ has-values@^1.0.0:
has@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
dependencies:
function-bind "^1.1.1"
@ -1754,6 +1865,11 @@ imurmurhash@^0.1.4:
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
indent-string@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@ -1794,9 +1910,9 @@ is-buffer@^1.1.5:
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-core-module@^2.9.0:
version "2.10.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed"
integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==
version "2.11.0"
resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
dependencies:
has "^1.0.3"
@ -1876,6 +1992,11 @@ is-number@^7.0.0:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
is-path-inside@^3.0.3:
version "3.0.3"
resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
is-plain-obj@^1.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
@ -1933,11 +2054,26 @@ isobject@^3.0.0, isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
jake@^10.8.5:
version "10.8.5"
resolved "https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46"
integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==
dependencies:
async "^3.2.3"
chalk "^4.0.2"
filelist "^1.0.1"
minimatch "^3.0.4"
js-base64@^2.1.9:
version "2.6.4"
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
js-sdsl@^4.1.4:
version "4.3.0"
resolved "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711"
integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==
js-stringify@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
@ -2062,7 +2198,7 @@ lodash-es@^4.17.15:
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
lodash.merge@^4.6.2:
lodash.merge@^4.6.0, lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
@ -2072,6 +2208,19 @@ lodash@^4.17.21:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
loglevel-colored-level-prefix@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e"
integrity sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==
dependencies:
chalk "^1.1.3"
loglevel "^1.4.1"
loglevel@^1.4.1:
version "1.8.1"
resolved "https://registry.npmmirror.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4"
integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==
loose-envify@^1.0.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
@ -2156,13 +2305,20 @@ micromatch@^4.0.4:
braces "^3.0.2"
picomatch "^2.3.1"
minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
minimatch@^5.0.1:
version "5.1.6"
resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
dependencies:
brace-expansion "^2.0.1"
minimatch@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7"
@ -2195,7 +2351,7 @@ ms@2.1.2:
nanoid@^3.3.4:
version "3.3.4"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
nanomatch@^1.2.1:
@ -2347,7 +2503,7 @@ path-key@^3.1.0:
path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-type@^4.0.0:
@ -2355,9 +2511,14 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
pathe@^0.2.0:
version "0.2.0"
resolved "https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz#30fd7bbe0a0d91f0e60bae621f5d19e9e225c339"
integrity sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1:
@ -2447,7 +2608,7 @@ postcss@^5.2.17:
source-map "^0.5.6"
supports-color "^3.2.3"
postcss@^8.1.10, postcss@^8.4.12, postcss@^8.4.13, postcss@^8.4.14:
postcss@^8.1.10, postcss@^8.4.12, postcss@^8.4.14:
version "8.4.18"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.18.tgz#6d50046ea7d3d66a85e0e782074e7203bc7fbca2"
integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==
@ -2456,6 +2617,15 @@ postcss@^8.1.10, postcss@^8.4.12, postcss@^8.4.13, postcss@^8.4.14:
picocolors "^1.0.0"
source-map-js "^1.0.2"
postcss@^8.4.21:
version "8.4.21"
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4"
integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==
dependencies:
nanoid "^3.3.4"
picocolors "^1.0.0"
source-map-js "^1.0.2"
posthtml-parser@^0.2.0, posthtml-parser@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz#35d530de386740c2ba24ff2eb2faf39ccdf271dd"
@ -2499,6 +2669,39 @@ prelude-ls@^1.2.1:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
prettier-eslint@^15.0.1:
version "15.0.1"
resolved "https://registry.npmmirror.com/prettier-eslint/-/prettier-eslint-15.0.1.tgz#2543a43e9acec2a9767ad6458165ce81f353db9c"
integrity sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg==
dependencies:
"@types/eslint" "^8.4.2"
"@types/prettier" "^2.6.0"
"@typescript-eslint/parser" "^5.10.0"
common-tags "^1.4.0"
dlv "^1.1.0"
eslint "^8.7.0"
indent-string "^4.0.0"
lodash.merge "^4.6.0"
loglevel-colored-level-prefix "^1.0.0"
prettier "^2.5.1"
pretty-format "^23.0.1"
require-relative "^0.8.7"
typescript "^4.5.4"
vue-eslint-parser "^8.0.1"
prettier@^2.5.1, prettier@^2.8.3:
version "2.8.3"
resolved "https://registry.npmmirror.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632"
integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==
pretty-format@^23.0.1:
version "23.6.0"
resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760"
integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==
dependencies:
ansi-regex "^3.0.0"
ansi-styles "^3.2.0"
promise@^7.0.1:
version "7.3.1"
resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
@ -2688,6 +2891,11 @@ request-light@^0.5.4:
resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.5.8.tgz#8bf73a07242b9e7b601fac2fa5dc22a094abcc27"
integrity sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==
require-relative@^0.8.7:
version "0.8.7"
resolved "https://registry.npmmirror.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de"
integrity sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==
resize-observer-polyfill@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
@ -2729,10 +2937,10 @@ rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
rollup@^2.59.0:
version "2.79.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
rollup@^3.10.0:
version "3.12.1"
resolved "https://registry.npmmirror.com/rollup/-/rollup-3.12.1.tgz#2975b97713e4af98c15e7024b88292d7fddb3853"
integrity sha512-t9elERrz2i4UU9z7AwISj3CQcXP39cWxgRWLdf4Tm6aKm1eYrqHIgjzXBgb67GNY1sZckTFFi0oMozh3/S++Ig==
optionalDependencies:
fsevents "~2.3.2"
@ -2838,7 +3046,7 @@ snapdragon@^0.8.1:
source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
source-map-resolve@^0.5.0:
@ -2944,7 +3152,7 @@ supports-color@^7.1.0:
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
svg-baker@1.7.0:
@ -3177,28 +3385,36 @@ vary@^1:
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
vite-plugin-svg-icons@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/vite-plugin-svg-icons/-/vite-plugin-svg-icons-1.1.0.tgz#a02dd241c6697565a016ac6197bb1ff2ec1a8c98"
integrity sha512-dmpr7Wq8vQN6ajBrVTrBxy8wJjQfcP30i73q+40uAZc8p7EwphBNZ+bVTI0enFaCrsITI8y0Ruo/mN/SaJQ6Hw==
vite-plugin-ejs@^1.6.4:
version "1.6.4"
resolved "https://registry.npmmirror.com/vite-plugin-ejs/-/vite-plugin-ejs-1.6.4.tgz#aa30820d8235774e717d902754a552480cf7758b"
integrity sha512-23p1RS4PiA0veXY5/gHZ60pl3pPvd8NEqdBsDgxNK8nM1rjFFDcVb0paNmuipzCgNP/Y0f/Id22M7Il4kvZ2jA==
dependencies:
ejs "^3.1.8"
vite-plugin-svg-icons@^2.0.1:
version "2.0.1"
resolved "https://registry.npmmirror.com/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz#7269a0962593509f371b9e2bb344d469db2c6df9"
integrity sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==
dependencies:
"@types/svgo" "^2.6.0"
"@types/svgo" "^2.6.1"
cors "^2.8.5"
debug "^4.3.3"
etag "^1.8.1"
fs-extra "^10.0.0"
pathe "^0.2.0"
svg-baker "1.7.0"
svgo "^2.8.0"
vite@^2.9.13:
version "2.9.13"
resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.13.tgz#859cb5d4c316c0d8c6ec9866045c0f7858ca6abc"
integrity sha512-AsOBAaT0AD7Mhe8DuK+/kE4aWYFMx/i0ZNi98hJclxb4e0OhQcZYUrvLjIaQ8e59Ui7txcvKMiJC1yftqpQoDw==
vite@^4.1.1:
version "4.1.1"
resolved "https://registry.npmmirror.com/vite/-/vite-4.1.1.tgz#3b18b81a4e85ce3df5cbdbf4c687d93ebf402e6b"
integrity sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==
dependencies:
esbuild "^0.14.27"
postcss "^8.4.13"
resolve "^1.22.0"
rollup "^2.59.0"
esbuild "^0.16.14"
postcss "^8.4.21"
resolve "^1.22.1"
rollup "^3.10.0"
optionalDependencies:
fsevents "~2.3.2"

1
conf.sample.yml

@ -63,6 +63,7 @@
### advanced options
# UpdateBranchAsyncGoroutineNum: 1 # num of async goroutine to update branch status
# TimeZoneOffset: '' #default '' using system default. '+8': Asia/Shanghai; '0': GMT
# AdminBasePath: '' #default '' set admin access base path
# ConfigUpdateInterval: 10 # the interval to update configuration in memory such as topics map... (seconds)
# TimeZoneOffset: '' # default '' using system default. '+8': Asia/Shanghai; '0': GMT

1
dtmsvr/config/config.go

@ -101,6 +101,7 @@ type Type struct {
ConfigUpdateInterval int64 `yaml:"ConfigUpdateInterval" default:"3"`
AlertRetryLimit int64 `yaml:"AlertRetryLimit" default:"3"`
AlertWebHook string `yaml:"AlertWebHook"`
AdminBasePath string `yaml:"AdminBasePath"`
}
// Config config

26
main.go

@ -58,23 +58,35 @@ func addAdmin(app *gin.Engine, conf *config.Type) {
// for testing users, proxy admin to target because the build output has not been embed
dist := getSub(admin, "admin", "dist")
index, err := dist.Open("index.html")
var router gin.IRoutes = app
if len(conf.AdminBasePath) > 0 {
router = app.Group(conf.AdminBasePath)
}
if err == nil {
cont, err := ioutil.ReadAll(index)
logger.FatalIfError(err)
_ = index.Close()
sfile := string(cont)
//replace base path
sfile = strings.Replace(sfile, "\"assets/", "\""+conf.AdminBasePath+"/assets/", -1)
sfile = strings.Replace(sfile, "PUBLIC-PATH-VARIABLE", conf.AdminBasePath, -1)
renderIndex := func(c *gin.Context) {
c.Header("content-type", "text/html;charset=utf-8")
c.String(200, sfile)
}
app.StaticFS("/assets", http.FS(getSub(dist, "assets")))
app.GET("/admin/*name", renderIndex)
app.GET("/", renderIndex)
router.StaticFS("/assets", http.FS(getSub(dist, "assets")))
router.GET("/admin/*name", renderIndex)
router.GET("/", renderIndex)
router.GET("/favicon.ico", func(ctx *gin.Context) {
http.StripPrefix(conf.AdminBasePath, http.FileServer(http.FS(dist))).ServeHTTP(ctx.Writer, ctx.Request)
})
logger.Infof("admin is served from dir 'admin/dist/'")
} else {
app.GET("/", proxyAdmin)
app.GET("/assets/*name", proxyAdmin)
app.GET("/admin/*name", proxyAdmin)
router.GET("/", proxyAdmin)
router.GET("/assets/*name", proxyAdmin)
router.GET("/admin/*name", proxyAdmin)
lang := os.Getenv("LANG")
if strings.HasPrefix(lang, "zh_CN") {
target = "cn-admin.dtm.pub"
@ -83,7 +95,7 @@ func addAdmin(app *gin.Engine, conf *config.Type) {
}
logger.Infof("admin is proxied to %s", target)
}
logger.Infof("admin is running at: http://localhost:%d", conf.HTTPPort)
logger.Infof("admin is running at: http://localhost:%d%s", conf.HTTPPort, conf.AdminBasePath)
}
func proxyAdmin(c *gin.Context) {

Loading…
Cancel
Save