feat(devtools): add update frontmatter api

This commit is contained in:
YunYouJun 2024-02-14 23:45:44 +08:00
parent 13fa21990f
commit f375568cf6
21 changed files with 458 additions and 91 deletions

View File

@ -30,6 +30,7 @@
},
"cSpell.words": [
"AGUI",
"algoliasearch",
"beian",
"codepen",

View File

@ -8,12 +8,18 @@
"build": "npm run fuse && npm run build:ssg",
"build:spa": "valaxy build",
"build:ssg": "valaxy build --ssg --log=info",
"dev": "nodemon -w \"../../packages/valaxy/dist/*.mjs\" --exec \"valaxy . --port 4860\"",
"dev": "nodemon --exec \"valaxy . --port 4860\"",
"fuse": "valaxy fuse",
"new": "valaxy new",
"rss": "valaxy rss",
"serve": "vite preview"
},
"nodemonConfig": {
"watch": [
"../../packages/valaxy/dist/*.mjs",
"../../packages/devtools/dist/*"
]
},
"dependencies": {
"valaxy": "workspace:*",
"valaxy-addon-algolia": "workspace:*",

View File

@ -22,7 +22,7 @@
"build:node": "unbuild",
"dev": "npm run stub && npm run dev:client",
"dev:client": "vite build src/client --watch",
"dev:src": "vite dev src/client",
"dev:src": "vite dev src/client --port 5001",
"stub": "unbuild --stub",
"prepublishOnly": "npm run build",
"release": "bumpp && npm publish"
@ -33,8 +33,12 @@
"sirv": "^2.0.4"
},
"devDependencies": {
"@advjs/gui": "0.0.5-beta.0",
"@iconify-json/ri": "^1.1.19",
"@types/body-parser": "^1.19.5",
"@types/splitpanes": "^2.2.6",
"axios": "^1.6.7",
"http-proxy-middleware": "^2.0.6",
"splitpanes": "^3.1.5",
"typescript": "^5.3.3",
"unbuild": "^2.0.0",

View File

@ -1,3 +1,12 @@
<script lang="ts" setup>
import { onMounted } from 'vue'
import { initDevtoolsClient } from './utils'
onMounted(() => {
initDevtoolsClient()
})
</script>
<template>
<RouterView />
</template>

View File

@ -1,15 +1,66 @@
<script lang="ts" setup>
defineProps<{
frontmatter?: object
import { ref, toRaw } from 'vue'
import type { PostFrontMatter } from 'valaxy'
import axios from 'axios'
import consola from 'consola'
import { pageData } from '../composables/app'
const props = defineProps<{
frontmatter: PostFrontMatter
}>()
const newFm = ref<PostFrontMatter>(props.frontmatter)
async function saveNewFm() {
// const data = await fetch('/valaxy-devtools-api/frontmatter', {
// method: 'POST',
// // body: JSON.stringify(toRaw(newFm.value)),
// })
const res = await axios.post('/valaxy-devtools-api/frontmatter', {
pageData: pageData.value,
frontmatter: toRaw(newFm.value),
})
if (res)
consola.success('Frontmatter saved')
// console.log(res)
}
</script>
<template>
<div>
<ul v-if="frontmatter">
<li v-for="(value, key) in frontmatter" :key="key">
<strong>{{ key }}</strong>: {{ value }}
<strong>{{ key }}</strong>
<span mr-1>:</span>
<template v-if="key === 'tags'">
<VDTag v-for="tag in value" :key="tag">
{{ tag }}
</VDTag>
</template>
<template v-else-if="key === 'categories'">
<VDPostCategories :categories="value" />
</template>
<template v-else-if="key === 'encryptedContent'">
[Encrypted]
</template>
<template v-else-if="key === 'partiallyEncryptedContents'">
[Partially Encrypted]
</template>
<template v-else-if="key === 'title'">
<!-- eslint-disable-next-line vue/no-mutating-props -->
<AGUIInput v-model="newFm.title" />
</template>
<template v-else>
{{ value }}
</template>
</li>
</ul>
<AGUIButton @click="saveNewFm">
Save Frontmatter
</AGUIButton>
</div>
</template>

View File

@ -0,0 +1,22 @@
<script lang="ts" setup>
import { getWindowProperty, openInEditor } from '../utils'
import { frontmatter } from '../composables/app'
function launchEditor() {
openInEditor({
file: getWindowProperty('$pageData').path,
})
}
</script>
<template>
<div p="2">
<div class="flex" gap="2" py-2>
<button class="text-xs shadow transition hover:shadow-lg p-2" @click="launchEditor()">
<div i-vscode-icons:file-type-vscode />
</button>
</div>
<PageFrontmatter v-if="frontmatter" :frontmatter="frontmatter" />
</div>
</template>

View File

@ -0,0 +1,26 @@
<script lang="ts" setup>
import type { Post } from 'valaxy'
defineProps<{
categories: Post['categories']
}>()
</script>
<template>
<RouterLink
:to="{
path: '/categories',
query: { category: Array.isArray(categories) ? categories.join('/') : categories },
}"
class="post-category transition text-xs hover:(text-blue-500 border-blue-500)"
px-2 py-1
border rounded-full
inline-flex justify-center items-center
bg="hover:(blue-500 opacity-10)"
>
<div m="x-1" inline-flex i-ri-folder-2-line />
<span>
{{ Array.isArray(categories) ? categories.join(' > ') : categories }}
</span>
</RouterLink>
</template>

View File

@ -1,17 +1,7 @@
<script lang="ts" setup>
import { onMounted, ref } from 'vue'
import type { Router } from 'vue-router/auto'
import { getGlobalValaxyProperty, getWindowProperty, openInEditor } from '../utils'
import { frontmatter } from '../composables/app'
const activePath = ref('')
const __VUE_DEVTOOLS_ROUTER__ = getWindowProperty('__VUE_DEVTOOLS_ROUTER__') as Router
__VUE_DEVTOOLS_ROUTER__.beforeEach((to, _from, next) => {
activePath.value = to.path
frontmatter.value = getWindowProperty('$frontmatter')
next()
})
import { getGlobalValaxyProperty } from '../utils'
import { activePath, devtoolsRouter } from '../composables/app'
const postList = ref()
@ -20,31 +10,21 @@ onMounted(() => {
})
function onClickPost(post: any) {
__VUE_DEVTOOLS_ROUTER__.push(post.path)
}
function launchEditor() {
openInEditor({
file: getWindowProperty('$pageData').path,
})
devtoolsRouter.value?.push(post.path)
}
</script>
<template>
<ul class="h-full" overflow="auto" pl="12" pr="4" py="4">
{{ activePath }}
<li v-for="post in postList" :key="post.path" class="list-decimal">
<div flex>
<span
class="inline-flex flex-grow cursor-pointer underline hover:text-blue-500"
:class="{ 'text-blue-500': activePath === post.path }"
class="inline-flex flex-grow cursor-pointer hover:text-blue-500"
:class="{ 'text-blue-500 font-bold': activePath === post.path }"
@click="onClickPost(post)"
>
{{ post.title }}
</span>
<button class="ml-2 text-xs" @click="launchEditor()">
<div i-vscode-icons:file-type-vscode />
</button>
</div>
</li>
</ul>

View File

@ -0,0 +1,9 @@
<script lang="ts" setup>
</script>
<template>
<div class="vd-tag inline-flex shadow border rounded text-xs" p="x-2 y-1">
<slot />
</div>
</template>

View File

@ -1,3 +1,10 @@
import type { PageData, PostFrontMatter } from 'valaxy'
import { ref } from 'vue'
export const frontmatter = ref<object>({})
import type { Router } from 'vue-router'
export const devtoolsRouter = ref<Router>()
export const activePath = ref('')
export const frontmatter = ref<PostFrontMatter>()
export const pageData = ref<PageData>()

View File

@ -1,25 +1,18 @@
<script lang="ts" setup>
import { Pane, Splitpanes } from 'splitpanes'
import { onMounted } from 'vue'
import { getWindowProperty, isStaticMode } from '../utils'
import type { BlogWindow } from '../types'
import { frontmatter } from '../composables/app'
import { isStaticMode } from '../utils'
onMounted(() => {
if (isStaticMode)
document.title = 'Valaxy DevTools (Production)'
const $frontmatter = getWindowProperty('$frontmatter') as BlogWindow['$frontmatter']
if ($frontmatter)
frontmatter.value = $frontmatter
})
</script>
<template>
<main class="h-full" flex="~ col" text="gray-700 dark:gray-200">
<div class="w-full border-b shadow flex justify-end">
<a href="https://valaxy.site" target="_blank" class="bg-gray-100 inline-flex justify-center items-center w-8 h-8">
<div class="w-full border-b shadow flex justify-end" dark="border-b-black">
<a href="https://valaxy.site" target="_blank" class="bg-gray-100 dark:bg-gray-900 inline-flex justify-center items-center w-8 h-8">
<div i-ri-book-line />
</a>
</div>
@ -30,7 +23,7 @@ onMounted(() => {
<VDPostList />
</Pane>
<Pane>
<PageFrontmatter :frontmatter="frontmatter" />
<PostPanel />
</Pane>
</Splitpanes>
</div>

View File

@ -2,3 +2,7 @@ html,
body {
height: 100%;
}
.dark {
background-color: rgba(12, 16, 21);
}

View File

@ -1,3 +1,4 @@
export * from './init'
export * from './api'
export * from './get'

View File

@ -0,0 +1,27 @@
import { nextTick, onMounted } from 'vue'
import type { Router } from 'vue-router'
import { activePath, devtoolsRouter, frontmatter, pageData } from '../composables/app'
import { getWindowProperty } from './get'
export function initDevtoolsClient() {
const __VUE_DEVTOOLS_ROUTER__ = getWindowProperty('__VUE_DEVTOOLS_ROUTER__') as Router
devtoolsRouter.value = __VUE_DEVTOOLS_ROUTER__
devtoolsRouter.value.beforeEach((to, _from, next) => {
activePath.value = to.path
next()
})
// init $frontmatter and $pageData
onMounted(() => {
frontmatter.value = getWindowProperty('$frontmatter')
pageData.value = getWindowProperty('$pageData')
})
devtoolsRouter.value.afterEach(async () => {
await nextTick()
// get target post $frontmatter
frontmatter.value = getWindowProperty('$frontmatter')
pageData.value = getWindowProperty('$pageData')
})
}

View File

@ -4,6 +4,7 @@ import Vue from '@vitejs/plugin-vue'
import VueRouter from 'unplugin-vue-router/vite'
import VueComponents from 'unplugin-vue-components/vite'
import Unocss from 'unocss/vite'
import { componentsDir } from '@advjs/gui/node'
import { unoConfig } from '../../../../uno.config'
export default defineConfig({
@ -57,7 +58,7 @@ export default defineConfig({
include: [/\.vue$/, /\.md$/],
}),
VueComponents({
dirs: ['components'],
dirs: ['components', componentsDir],
dts: join(__dirname, 'components.d.ts'),
}),
Unocss(unoConfig),

View File

@ -0,0 +1,35 @@
import type { ResolvedConfig, ViteDevServer } from 'vite'
import bodyParser from 'body-parser'
import matter from 'gray-matter'
import fs from 'fs-extra'
const prefix = '/valaxy-devtools-api'
export function registerApi(server: ViteDevServer, _viteConfig: ResolvedConfig) {
const app = server.middlewares
app.use(bodyParser.json())
app.use(`${prefix}/frontmatter`, async (req, _res) => {
// update
if (req.method === 'POST') {
const { pageData, frontmatter: newFm } = await (req as any).body
// filePath
const path = pageData.path
if (fs.existsSync(path)) {
const rawMd = await fs.readFile(path, 'utf-8')
const matterFile = matter(rawMd)
// update frontmatter
matterFile.data = newFm
const newMd = matter.stringify(matterFile.content, matterFile.data)
await fs.writeFile(path, newMd)
}
}
// console.log('update', url, frontmatter)
// console.log('frontmatter', req.url, res)
})
}

View File

@ -1,11 +1,15 @@
import type { Plugin, ResolvedConfig, ViteDevServer } from 'vite'
import c from 'picocolors'
import sirv from 'sirv'
import { createProxyMiddleware } from 'http-proxy-middleware'
import { DIR_CLIENT } from '../dir'
import type { ValaxyDevtoolsOptions } from './types'
import { registerApi } from './api'
const NAME = 'valaxy:devtools'
// import.meta.env.VITE_DEV_VALAXY_DEVTOOLS = 'true'
export default function ValaxyDevtools(options: ValaxyDevtoolsOptions = {}): Plugin {
let config: ResolvedConfig
@ -13,10 +17,19 @@ export default function ValaxyDevtools(options: ValaxyDevtoolsOptions = {}): Plu
const _print = server.printUrls
const base = (options.base ?? server.config.base) || '/'
server.middlewares.use(`${base}__valaxy_devtools__`, sirv(DIR_CLIENT, {
single: true,
dev: true,
}))
const devtoolsUrl = `${base}__valaxy_devtools__/`
if (import.meta.env.VITE_DEV_VALAXY_DEVTOOLS === 'true') {
server.middlewares.use(devtoolsUrl, createProxyMiddleware({
target: 'http://localhost:5001/#/',
changeOrigin: true,
}) as any)
}
else {
server.middlewares.use(devtoolsUrl, sirv(DIR_CLIENT, {
single: true,
dev: true,
}))
}
server.printUrls = () => {
let host = `${config.server.https ? 'https' : 'http'}://localhost:${config.server.port || '80'}`
@ -39,11 +52,15 @@ export default function ValaxyDevtools(options: ValaxyDevtoolsOptions = {}): Plu
// eslint-disable-next-line no-console
console.log(` ${c.green('➜')} ${c.bold('Inspect')}: ${colorUrl(`${host}${base}__inspect/`)}`)
}
registerApi(server, config)
}
const plugin = <Plugin>{
name: NAME,
enforce: 'pre',
configResolved(_config) {
config = _config
},

View File

@ -20,7 +20,7 @@ import '/@valaxyjs/styles'
import 'uno.css'
import setupMain from './setup/main'
import { initDevToolsClientLogic } from './utils/dev'
import { setupValaxyDevTools } from './utils/dev'
const valaxyConfig = initValaxyConfig()
@ -60,7 +60,7 @@ const routesWithLayout = setupLayouts(import.meta.env.DEV
)
if (import.meta.env.DEV)
initDevToolsClientLogic()
setupValaxyDevTools()
// https://github.com/antfu/vite-ssg
export const createApp = ViteSSG(

View File

@ -1,4 +1,4 @@
export function initDevToolsClientLogic() {
export function setupValaxyDevTools() {
}

View File

@ -241,12 +241,24 @@ importers:
specifier: ^2.0.4
version: 2.0.4
devDependencies:
'@advjs/gui':
specifier: 0.0.5-beta.0
version: 0.0.5-beta.0(vue@3.4.19)
'@iconify-json/ri':
specifier: ^1.1.19
version: 1.1.19
'@types/body-parser':
specifier: ^1.19.5
version: 1.19.5
'@types/splitpanes':
specifier: ^2.2.6
version: 2.2.6
axios:
specifier: ^1.6.7
version: 1.6.7
http-proxy-middleware:
specifier: ^2.0.6
version: 2.0.6
splitpanes:
specifier: ^3.1.5
version: 3.1.5
@ -520,7 +532,7 @@ importers:
version: 17.0.32
debug:
specifier: ^4.3.4
version: 4.3.4(supports-color@8.1.1)
version: 4.3.4(supports-color@5.5.0)
diacritics:
specifier: ^1.3.0
version: 1.3.0
@ -633,6 +645,24 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/@advjs/gui@0.0.5-beta.0(vue@3.4.19):
resolution: {integrity: sha512-AfZWMEW1O7HrdT0MAUxJGP4G/Z8F3SXhDEnBH4cwl3T8ZwbvOyU48ybg7MFXUBM8BpG78QFbUiZrE0ER0FoEaw==}
dependencies:
'@headlessui/vue': 1.7.19(vue@3.4.19)
'@iconify-json/vscode-icons': 1.1.33
'@iconify/vue': 4.1.1(vue@3.4.19)
'@radix-ui/colors': 3.0.0
'@types/splitpanes': 2.2.6
'@types/wicg-file-system-access': 2023.10.4
colord: 2.9.3
consola: 3.2.3
radix-vue: 1.4.3(vue@3.4.19)
splitpanes: 3.1.5
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: true
/@algolia/autocomplete-core@1.9.3(algoliasearch@4.22.1)(search-insights@2.13.0):
resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==}
dependencies:
@ -892,7 +922,7 @@ packages:
'@babel/traverse': 7.23.7
'@babel/types': 7.23.6
convert-source-map: 2.0.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
@ -914,7 +944,7 @@ packages:
'@babel/traverse': 7.23.9
'@babel/types': 7.23.9
convert-source-map: 2.0.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
@ -1318,7 +1348,7 @@ packages:
'@babel/helper-split-export-declaration': 7.22.6
'@babel/parser': 7.23.6
'@babel/types': 7.23.6
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@ -1335,7 +1365,7 @@ packages:
'@babel/helper-split-export-declaration': 7.22.6
'@babel/parser': 7.23.9
'@babel/types': 7.23.9
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@ -1705,7 +1735,7 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
ajv: 6.12.6
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
espree: 9.6.1
globals: 13.24.0
ignore: 5.3.0
@ -1726,12 +1756,50 @@ packages:
resolution: {integrity: sha512-BiF9iWE/8jTmqlxcIhSZlJgUlBJ62Wk9I6jTwfkd0zMn0QS2IxTxypOnV4CSo21bsnmsvJxh9ryepAK+D4OJqA==}
dev: false
/@floating-ui/core@1.6.0:
resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==}
dependencies:
'@floating-ui/utils': 0.2.1
dev: true
/@floating-ui/dom@1.6.3:
resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==}
dependencies:
'@floating-ui/core': 1.6.0
'@floating-ui/utils': 0.2.1
dev: true
/@floating-ui/utils@0.2.1:
resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==}
dev: true
/@floating-ui/vue@1.0.6(vue@3.4.19):
resolution: {integrity: sha512-EdrOljjkpkkqZnrpqUcPoz9NvHxuTjUtSInh6GMv3+Mcy+giY2cE2pHh9rpacRcZ2eMSCxel9jWkWXTjLmY55w==}
dependencies:
'@floating-ui/dom': 1.6.3
'@floating-ui/utils': 0.2.1
vue-demi: 0.14.6(vue@3.4.19)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: true
/@headlessui/vue@1.7.19(vue@3.4.19):
resolution: {integrity: sha512-VFjKPybogux/5/QYGSq4zgG/x3RcxId15W8uguAJAjPBxelI23dwjOjTx/mIiMkM/Hd3rzFxcf2aIp56eEWRcA==}
engines: {node: '>=10'}
peerDependencies:
vue: ^3.2.0
dependencies:
'@tanstack/vue-virtual': 3.0.4(vue@3.4.19)
vue: 3.4.19(typescript@5.3.3)
dev: true
/@humanwhocodes/config-array@0.11.14:
resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
engines: {node: '>=10.10.0'}
dependencies:
'@humanwhocodes/object-schema': 2.0.2
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
@ -1789,7 +1857,7 @@ packages:
'@antfu/install-pkg': 0.1.1
'@antfu/utils': 0.7.7
'@iconify/types': 2.0.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
kolorist: 1.8.0
local-pkg: 0.5.0
mlly: 1.5.0
@ -1797,6 +1865,15 @@ packages:
- supports-color
dev: false
/@iconify/vue@4.1.1(vue@3.4.19):
resolution: {integrity: sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==}
peerDependencies:
vue: '>=3'
dependencies:
'@iconify/types': 2.0.0
vue: 3.4.19(typescript@5.3.3)
dev: true
/@intlify/bundle-utils@7.5.0(vue-i18n@9.9.1):
resolution: {integrity: sha512-6DymqusddBQ8kVtVBsVFFF7arNfIhuLacOmmsqayT2vl427j9m0VX12mMC+cgoVIodSpRfzYPaPTdPuJq7mK0Q==}
engines: {node: '>= 14.16'}
@ -1875,7 +1952,7 @@ packages:
'@intlify/shared': 9.9.0
'@rollup/pluginutils': 5.1.0(rollup@3.29.4)
'@vue/compiler-sfc': 3.4.15
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
fast-glob: 3.3.2
js-yaml: 4.1.0
json5: 2.2.3
@ -2075,6 +2152,10 @@ packages:
resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==}
dev: false
/@radix-ui/colors@3.0.0:
resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==}
dev: true
/@rollup/plugin-alias@5.1.0(rollup@3.29.4):
resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==}
engines: {node: '>=14.0.0'}
@ -2381,6 +2462,19 @@ packages:
- typescript
dev: true
/@tanstack/virtual-core@3.0.0:
resolution: {integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==}
dev: true
/@tanstack/vue-virtual@3.0.4(vue@3.4.19):
resolution: {integrity: sha512-SDk3n+dMZnAXEAx+HZ0wQwBN00Ne7Qk4z29QnawJy6jzOOpoajt7Mm6gIEERin1D4ALxW5WpuDqhlnV2TNFQ+A==}
peerDependencies:
vue: ^2.7.0 || ^3.0.0
dependencies:
'@tanstack/virtual-core': 3.0.0
vue: 3.4.19(typescript@5.3.3)
dev: true
/@trysound/sax@0.2.0:
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
@ -2394,10 +2488,23 @@ packages:
resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
dev: true
/@types/body-parser@1.19.5:
resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
dependencies:
'@types/connect': 3.4.38
'@types/node': 20.11.17
dev: true
/@types/body-scroll-lock@3.1.2:
resolution: {integrity: sha512-ELhtuphE/YbhEcpBf/rIV9Tl3/O0A0gpCVD+oYFSS8bWstHFJUgA4nNw1ZakVlRC38XaQEIsBogUZKWIPBvpfQ==}
dev: false
/@types/connect@3.4.38:
resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
dependencies:
'@types/node': 20.11.17
dev: true
/@types/cross-spawn@6.0.6:
resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==}
dependencies:
@ -2441,6 +2548,12 @@ packages:
resolution: {integrity: sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ==}
dev: true
/@types/http-proxy@1.17.14:
resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==}
dependencies:
'@types/node': 20.11.17
dev: true
/@types/json-schema@7.0.15:
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
dev: true
@ -2579,6 +2692,10 @@ packages:
resolution: {integrity: sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==}
dev: true
/@types/wicg-file-system-access@2023.10.4:
resolution: {integrity: sha512-ewOj7hWhsUTS2+aY6zY+7BwlgqGBj5ZXxKuHt3TAWpIJH0bDW/6bO1N1SdUDAzV8r0Nc+/ZtpAEETYTwrehBMw==}
dev: true
/@types/yargs-parser@21.0.3:
resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
dev: true
@ -2614,7 +2731,7 @@ packages:
'@typescript-eslint/type-utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/visitor-keys': 6.20.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
eslint: 8.56.0
graphemer: 1.4.0
ignore: 5.3.0
@ -2640,7 +2757,7 @@ packages:
'@typescript-eslint/types': 6.20.0
'@typescript-eslint/typescript-estree': 6.20.0(typescript@5.3.3)
'@typescript-eslint/visitor-keys': 6.20.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
eslint: 8.56.0
typescript: 5.3.3
transitivePeerDependencies:
@ -2675,7 +2792,7 @@ packages:
dependencies:
'@typescript-eslint/typescript-estree': 6.20.0(typescript@5.3.3)
'@typescript-eslint/utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3)
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
eslint: 8.56.0
ts-api-utils: 1.0.3(typescript@5.3.3)
typescript: 5.3.3
@ -2704,7 +2821,7 @@ packages:
dependencies:
'@typescript-eslint/types': 6.19.0
'@typescript-eslint/visitor-keys': 6.19.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.3
@ -2726,7 +2843,7 @@ packages:
dependencies:
'@typescript-eslint/types': 6.20.0
'@typescript-eslint/visitor-keys': 6.20.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.3
@ -3647,7 +3764,7 @@ packages:
resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
engines: {node: '>= 14'}
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
dev: false
@ -3924,6 +4041,16 @@ packages:
- debug
dev: false
/axios@1.6.7:
resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==}
dependencies:
follow-redirects: 1.15.5
form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
dev: true
/balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@ -5091,7 +5218,6 @@ packages:
dependencies:
ms: 2.1.2
supports-color: 5.5.0
dev: true
/debug@4.3.4(supports-color@8.1.1):
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
@ -5104,6 +5230,7 @@ packages:
dependencies:
ms: 2.1.2
supports-color: 8.1.1
dev: true
/decamelize@1.2.0:
resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
@ -5593,7 +5720,7 @@ packages:
peerDependencies:
eslint: ^7.2.0 || ^8
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
doctrine: 3.0.0
eslint: 8.56.0
eslint-import-resolver-node: 0.3.9
@ -5618,7 +5745,7 @@ packages:
'@es-joy/jsdoccomment': 0.41.0
are-docs-informative: 0.0.2
comment-parser: 1.4.1
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
escape-string-regexp: 4.0.0
eslint: 8.56.0
esquery: 1.5.0
@ -5716,7 +5843,7 @@ packages:
peerDependencies:
eslint: '>=6.0.0'
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
eslint: 8.56.0
eslint-compat-utils: 0.4.1(eslint@8.56.0)
lodash: 4.17.21
@ -5813,7 +5940,7 @@ packages:
peerDependencies:
eslint: '>=6.0.0'
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
eslint: 8.56.0
eslint-compat-utils: 0.4.1(eslint@8.56.0)
lodash: 4.17.21
@ -5866,7 +5993,7 @@ packages:
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
doctrine: 3.0.0
escape-string-regexp: 4.0.0
eslint-scope: 7.2.2
@ -5962,6 +6089,10 @@ packages:
resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==}
dev: true
/eventemitter3@4.0.7:
resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
dev: true
/eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
dev: true
@ -6239,7 +6370,6 @@ packages:
peerDependenciesMeta:
debug:
optional: true
dev: false
/for-each@0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
@ -6275,7 +6405,6 @@ packages:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: false
/formdata-polyfill@4.0.10:
resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
@ -6742,11 +6871,40 @@ packages:
engines: {node: '>= 14'}
dependencies:
agent-base: 7.1.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
dev: false
/http-proxy-middleware@2.0.6:
resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@types/express': ^4.17.13
peerDependenciesMeta:
'@types/express':
optional: true
dependencies:
'@types/http-proxy': 1.17.14
http-proxy: 1.18.1
is-glob: 4.0.3
is-plain-obj: 3.0.0
micromatch: 4.0.5
transitivePeerDependencies:
- debug
dev: true
/http-proxy@1.18.1:
resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
engines: {node: '>=8.0.0'}
dependencies:
eventemitter3: 4.0.7
follow-redirects: 1.15.5
requires-port: 1.0.0
transitivePeerDependencies:
- debug
dev: true
/http-signature@1.3.6:
resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==}
engines: {node: '>=0.10'}
@ -6775,7 +6933,7 @@ packages:
engines: {node: '>= 14'}
dependencies:
agent-base: 7.1.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
dev: false
@ -7081,6 +7239,11 @@ packages:
engines: {node: '>=12'}
dev: false
/is-plain-obj@3.0.0:
resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==}
engines: {node: '>=10'}
dev: true
/is-plain-object@5.0.0:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
@ -7465,7 +7628,7 @@ packages:
dependencies:
chalk: 5.3.0
commander: 11.1.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
execa: 8.0.1
lilconfig: 3.0.0
listr2: 8.0.1
@ -8016,7 +8179,7 @@ packages:
/micromark@2.11.4:
resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==}
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
parse-entities: 2.0.0
transitivePeerDependencies:
- supports-color
@ -8026,7 +8189,7 @@ packages:
resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==}
dependencies:
'@types/debug': 4.1.12
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
decode-named-character-reference: 1.0.2
micromark-core-commonmark: 1.1.0
micromark-factory-space: 1.1.0
@ -9175,7 +9338,6 @@ packages:
/proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
dev: false
/ps-tree@1.2.0:
resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==}
@ -9238,6 +9400,17 @@ packages:
/queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
/radix-vue@1.4.3(vue@3.4.19):
resolution: {integrity: sha512-e0yfnxrzI899NNavSmL8nGIOK2jhP+5J7P4NhSxBtVRBxofgLExwrnR1no5epDx9gqWQdy4KkFftcWZZE7enrg==}
dependencies:
'@floating-ui/dom': 1.6.3
'@floating-ui/vue': 1.0.6(vue@3.4.19)
fast-deep-equal: 3.1.3
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: true
/range-parser@1.2.1:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'}
@ -9827,7 +10000,7 @@ packages:
/spdy-transport@3.0.0:
resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==}
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
detect-node: 2.1.0
hpack.js: 2.1.6
obuf: 1.1.2
@ -9841,7 +10014,7 @@ packages:
resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==}
engines: {node: '>=6.0.0'}
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
handle-thing: 2.0.1
http-deceiver: 1.2.7
select-hose: 2.0.0
@ -10150,7 +10323,7 @@ packages:
cosmiconfig: 9.0.0(typescript@5.3.3)
css-functions-list: 3.2.1
css-tree: 2.3.1
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
fast-glob: 3.3.2
fastest-levenshtein: 1.0.16
file-entry-cache: 8.0.0
@ -10219,6 +10392,7 @@ packages:
engines: {node: '>=10'}
dependencies:
has-flag: 4.0.0
dev: true
/supports-hyperlinks@3.0.0:
resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==}
@ -10437,7 +10611,7 @@ packages:
bundle-require: 4.0.2(esbuild@0.19.11)
cac: 6.7.14
chokidar: 3.5.3
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
esbuild: 0.19.11
execa: 5.1.1
globby: 11.1.0
@ -10748,7 +10922,7 @@ packages:
'@antfu/utils': 0.7.7
'@rollup/pluginutils': 5.1.0(rollup@3.29.4)
chokidar: 3.5.3
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
fast-glob: 3.3.2
local-pkg: 0.4.3
magic-string: 0.30.5
@ -10942,7 +11116,7 @@ packages:
hasBin: true
dependencies:
cac: 6.7.14
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
pathe: 1.1.2
picocolors: 1.0.0
vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0)
@ -10969,7 +11143,7 @@ packages:
dependencies:
'@antfu/utils': 0.7.7
'@rollup/pluginutils': 5.1.0(rollup@3.29.4)
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
error-stack-parser-es: 0.1.1
fs-extra: 11.2.0
open: 10.0.3
@ -11029,7 +11203,7 @@ packages:
vue: ^3.2.4
vue-router: ^4.0.11
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
fast-glob: 3.3.2
vite: 5.1.1(@types/node@20.11.17)(sass@1.70.0)
vue: 3.4.19(typescript@5.3.3)
@ -11203,7 +11377,7 @@ packages:
acorn-walk: 8.3.2
cac: 6.7.14
chai: 4.4.1
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
execa: 8.0.1
local-pkg: 0.5.0
magic-string: 0.30.5
@ -11254,7 +11428,6 @@ packages:
optional: true
dependencies:
vue: 3.4.19(typescript@5.3.3)
dev: false
/vue-eslint-parser@9.4.2(eslint@8.56.0):
resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==}
@ -11262,7 +11435,7 @@ packages:
peerDependencies:
eslint: '>=6.0.0'
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4(supports-color@5.5.0)
eslint: 8.56.0
eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.3

View File

@ -22,7 +22,8 @@
"vitest",
"vite/client",
"vite-plugin-vue-layouts/client",
"@intlify/unplugin-vue-i18n/messages"
"@intlify/unplugin-vue-i18n/messages",
"@types/wicg-file-system-access"
],
"allowJs": true,
"strict": true,