Skip to content

Commit

Permalink
feat(config): use plugin export inject, close #241
Browse files Browse the repository at this point in the history
  • Loading branch information
shigma committed Nov 5, 2023
1 parent 5500a0a commit 7eeffe2
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 21 deletions.
6 changes: 3 additions & 3 deletions plugins/config/client/components/plugin.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@
</k-comment>
<k-comment
v-for="({ required }, name) in env.using" :key="name"
:type="store.services[name] ? 'success' : required ? 'warning' : 'primary'">
:type="name in store.services ? 'success' : required ? 'warning' : 'primary'">
<p>
{{ required ? '必需' : '可选' }}服务:{{ name }} ({{ store.services[name] ? '已加载' : '未加载' }})
{{ required ? '必需' : '可选' }}服务:{{ name }} ({{ name in store.services ? '已加载' : '未加载' }})
</p>
</k-comment>
</k-slot>
Expand All @@ -38,7 +38,7 @@
<!-- implements -->
<k-slot-item :order="400">
<template v-for="name in env.impl" :key="name">
<k-comment v-if="store.services[name] && data.current.disabled" type="warning">
<k-comment v-if="name in store.services && data.current.disabled" type="warning">
<p>此插件将会提供 {{ name }} 服务,但此服务已被其他插件实现。</p>
</k-comment>
<k-comment v-else :type="data.current.disabled ? 'primary' : 'success'">
Expand Down
8 changes: 4 additions & 4 deletions plugins/config/client/components/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,11 @@ function getEnvInfo(name: string) {
}

// check services
for (const name of local.manifest.service.required) {
for (const name of local.runtime?.required ?? []) {
setService(name, true)
}
for (const name of local.manifest.service.optional) {
setService(name, false)
for (const name of local.runtime?.optional ?? []) {
setService(name, true)
}

// check reusability
Expand Down Expand Up @@ -141,7 +141,7 @@ export const type = computed(() => {
if (!env) return
if (env.warning && current.value.disabled) return 'warning'
for (const name in env.using) {
if (store.services?.[name]) {
if (name in store.services || {}) {
if (env.impl.includes(name)) return 'warning'
} else {
if (env.using[name].required) return 'warning'
Expand Down
10 changes: 10 additions & 0 deletions plugins/config/src/shared/packages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,14 @@ export abstract class PackageProvider extends DataService<Dict<PackageProvider.D
result.schema = exports?.Config || exports?.schema
result.usage = exports?.usage
result.filter = exports?.filter
const inject = exports?.using || exports?.inject || []
if (Array.isArray(inject)) {
result.required = inject
result.optional = []
} else {
result.required = inject.required || []
result.optional = inject.optional || []
}

// make sure that result can be serialized into json
JSON.stringify(result)
Expand Down Expand Up @@ -108,6 +116,8 @@ export namespace PackageProvider {
forkable?: boolean
schema?: Schema
usage?: string
required?: string[]
optional?: string[]
failed?: boolean
}
}
17 changes: 11 additions & 6 deletions plugins/config/src/shared/services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,19 @@ export class ServiceProvider extends DataService<Dict<number>> {

async get() {
const services = {} as Dict<number>
for (const [key, { type }] of Object.entries(this.ctx.root[Context.internal])) {
if (type !== 'service') continue
const ctx: Context = this.ctx.get(key)?.[Context.source]
if (ctx?.scope.uid) {
const name = key.replace(/^__/, '').replace(/__$/, '')
services[name] = ctx.scope.uid
const attach = (internal: Context[typeof Context.internal]) => {
if (!internal) return
attach(Object.getPrototypeOf(internal))
for (const [key, { type }] of Object.entries(internal)) {
if (type !== 'service') continue
const ctx: Context = this.ctx.get(key)?.[Context.source]
if (ctx) {
const name = key.replace(/^__/, '').replace(/__$/, '')
services[name] = ctx.scope.uid
}
}
}
attach(this.ctx.root[Context.internal])
return services
}
}
16 changes: 8 additions & 8 deletions plugins/market/client/extensions/dependency.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,17 @@
</p>
</k-comment>
<k-comment
v-for="({ required }, service) in data.env.using" :key="service"
:type="store.services[service] ? 'success' : required ? 'warning' : 'primary'">
v-for="({ required }, name) in data.env.using" :key="name"
:type="name in store.services ? 'success' : required ? 'warning' : 'primary'">
<p>
{{ required ? '必需' : '可选' }}服务:{{ service }}
<span v-if="store.services[service]">(已加载)</span>
<span v-else-if="available[service].length">(未加载,启用下列任一插件可实现此服务)</span>
{{ required ? '必需' : '可选' }}服务:{{ name }}
<span v-if="name in store.services">(已加载)</span>
<span v-else-if="available[name].length">(未加载,启用下列任一插件可实现此服务)</span>
<span v-else>(未加载)</span>
</p>
<ul v-if="!store.services[service] && available[service].length">
<li v-for="name in available[service]">
<k-dep-link :name="name"></k-dep-link>
<ul v-if="!(name in store.services) && available[name].length">
<li v-for="shortname in available[name]">
<k-dep-link :name="shortname"></k-dep-link>
</li>
</ul>
</k-comment>
Expand Down

0 comments on commit 7eeffe2

Please sign in to comment.