diff --git a/packages/cli/src/worker/loader.ts b/packages/cli/src/worker/loader.ts index 1ba6e4183a..91d0aa3f1c 100644 --- a/packages/cli/src/worker/loader.ts +++ b/packages/cli/src/worker/loader.ts @@ -135,8 +135,8 @@ export default class Loader extends ConfigLoader { const { context } = fork.runtime for (const name in plugins || {}) { if (name.startsWith('~') || name.startsWith('$')) continue - if (name.startsWith('+')) { - record[name] = this.loadGroup(name.slice(1), plugins[name], context) + if (name.startsWith('group@')) { + record[name] = this.loadGroup(name.slice(6), plugins[name], context) } else { this.reloadPlugin(fork.runtime, name, plugins[name]) } diff --git a/packages/cli/src/worker/watcher.ts b/packages/cli/src/worker/watcher.ts index 9c6863c6c4..7ba1a2d928 100644 --- a/packages/cli/src/worker/watcher.ts +++ b/packages/cli/src/worker/watcher.ts @@ -143,7 +143,7 @@ class Watcher { for (const name in { ...old, ...neo }) { if (name.startsWith('~') || name.startsWith('$')) continue const fork = runtime[Loader.kRecord][name] - if (name.startsWith('+')) { + if (name.startsWith('group@')) { // handle group config changes if (!fork) { // load new group @@ -153,7 +153,7 @@ class Watcher { } else { fork.dispose() delete runtime[Loader.kRecord][name] - this.ctx.logger('app').info(`unload group %c`, name.slice(1)) + this.ctx.logger('app').info(`unload group %c`, name.slice(6)) } } else { // handle plugin config changes diff --git a/packages/core/package.json b/packages/core/package.json index 8b2cd6d9df..c3f21a8c56 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -36,7 +36,7 @@ }, "dependencies": { "@koishijs/utils": "^5.4.5", - "cordis": "^1.3.1", + "cordis": "^1.3.2", "fastest-levenshtein": "^1.0.12", "minato": "^1.1.0" } diff --git a/plugins/frontend/client/client/index.ts b/plugins/frontend/client/client/index.ts index 9832e86865..d39f0b6960 100644 --- a/plugins/frontend/client/client/index.ts +++ b/plugins/frontend/client/client/index.ts @@ -37,6 +37,7 @@ interface RouteMetaExtension { export interface PageOptions extends RouteMetaExtension, PageExtension { path: string + strict?: boolean component: Component } diff --git a/plugins/frontend/manager/client/index.ts b/plugins/frontend/manager/client/index.ts index 81507e597d..ffbf738841 100644 --- a/plugins/frontend/manager/client/index.ts +++ b/plugins/frontend/manager/client/index.ts @@ -36,6 +36,7 @@ export default (ctx: Context) => { icon: 'cog', order: 630, authority: 4, + strict: true, fields: ['config', 'packages', 'services', 'dependencies'], component: Settings, }) diff --git a/plugins/frontend/manager/client/settings/group.vue b/plugins/frontend/manager/client/settings/group.vue index 3b580e3c63..4bcd595b7f 100644 --- a/plugins/frontend/manager/client/settings/group.vue +++ b/plugins/frontend/manager/client/settings/group.vue @@ -20,7 +20,7 @@ const props = defineProps<{ function addPlugin() { const tree: Tree = { label: '', - path: props.current.path ? props.current.path + '/$' : '$', + path: props.current.path + '$', config: {}, disabled: true, } diff --git a/plugins/frontend/manager/client/settings/index.vue b/plugins/frontend/manager/client/settings/index.vue index e3a6b4e55b..b3ab282426 100644 --- a/plugins/frontend/manager/client/settings/index.vue +++ b/plugins/frontend/manager/client/settings/index.vue @@ -23,8 +23,8 @@ import GroupSettings from './group.vue' import TreeView from './tree.vue' import PluginSettings from './plugin.vue' -function join(source: string | string[]) { - return Array.isArray(source) ? source.join('/') : source || '' +function join(source: string | string[], trailing = false) { + return Array.isArray(source) ? source.join('/') + (trailing ? '/' : '') : source || '' } const route = useRoute() @@ -32,7 +32,7 @@ const router = useRouter() const path = computed({ get() { - const name = join(route.params.name) + const name = join(route.params.name, route.fullPath.endsWith('/')) return name in plugins.value.paths ? name : '@global' }, set(name) { diff --git a/plugins/frontend/manager/client/settings/tree.vue b/plugins/frontend/manager/client/settings/tree.vue index 052f38d17e..5af3f09a70 100644 --- a/plugins/frontend/manager/client/settings/tree.vue +++ b/plugins/frontend/manager/client/settings/tree.vue @@ -69,7 +69,9 @@ function handleDrop(source: Node, target: Node, position: 'before' | 'after' | ' const oldPath = source.data.path const ctxPath = parent.data.path const index = parent.childNodes.findIndex(node => node.data.path === oldPath) - send('manager/teleport', oldPath, ctxPath, index) + if (!oldPath.endsWith('$')) { + send('manager/teleport', oldPath, ctxPath, index) + } const segments1 = oldPath.split('/') const segments2 = ctxPath ? ctxPath.split('/') : [] segments2.push(segments1.pop()) diff --git a/plugins/frontend/manager/client/settings/utils.ts b/plugins/frontend/manager/client/settings/utils.ts index 1a15026b08..d5bbb43f8b 100644 --- a/plugins/frontend/manager/client/settings/utils.ts +++ b/plugins/frontend/manager/client/settings/utils.ts @@ -1,5 +1,5 @@ import { Dict } from 'koishi' -import { computed, reactive, watch } from 'vue' +import { computed } from 'vue' import { PackageJson } from '@koishijs/market' import { MarketProvider } from '@koishijs/plugin-manager' import { store } from '@koishijs/client' @@ -115,8 +115,9 @@ function getTree(prefix: string, plugins: any): Tree[] { if (key.startsWith('~')) { node.disabled = true } - if (key.startsWith('+')) { - node.label = '分组:' + label.slice(1) + if (key.startsWith('group@')) { + node.path += '/' + node.label = '分组:' + label.slice(6) node.children = getTree(path + '/', config) } trees.push(node)