Skip to content

Commit

Permalink
feat(manager): support manifest in package.json
Browse files Browse the repository at this point in the history
  • Loading branch information
shigma committed May 24, 2022
1 parent d2c24e9 commit 24484c7
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 30 deletions.
15 changes: 9 additions & 6 deletions docs/.vuepress/layouts/market/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,14 @@ function onQuery(word: string) {
}
function validate(data: AnalyzedPackage, word: string) {
const { keywords } = data
const { locales, service } = data.manifest
if (word.startsWith('impl:')) {
return keywords.includes(word)
return service.implements.includes(word.slice(5))
} else if (word.startsWith('locale:')) {
return keywords.includes(word)
return locales.includes(word.slice(7))
} else if (word.startsWith('using:')) {
const name = word.slice(6)
return keywords.includes('required:' + name) || keywords.includes('optional:' + name)
return service.required.includes(name) || service.optional.includes(name)
} else if (word.startsWith('email:')) {
return data.author?.email === word.slice(6)
} else if (word.startsWith('is:')) {
Expand All @@ -76,8 +76,11 @@ function validate(data: AnalyzedPackage, word: string) {
return true
}
}
return data.shortname.includes(word)
|| data.keywords.some(keyword => !keyword.includes(':') && keyword.includes(word))
if (data.shortname.includes(word)) return true
return data.keywords.some((keyword) => {
return !keyword.includes(':') && keyword.includes(word)
})
}
const hasWords = computed(() => {
Expand Down
8 changes: 4 additions & 4 deletions docs/.vuepress/layouts/market/package.vue
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,19 @@
@click="$emit('query', 'is:official')"
>官方</badge>
<badge type="primary"
v-if="data.keywords.includes('impl:database')"
v-if="data.manifest.service.implements.includes('database')"
@click="$emit('query', 'impl:database')"
>数据库</badge>
<badge type="primary"
v-if="data.keywords.includes('impl:adapter')"
v-if="data.manifest.service.implements.includes('adapter')"
@click="$emit('query', 'impl:adapter')"
>适配器</badge>
<badge type="primary"
v-if="data.keywords.includes('impl:assets')"
v-if="data.manifest.service.implements.includes('assets')"
@click="$emit('query', 'impl:assets')"
>资源存储</badge>
<badge type="primary"
v-if="data.keywords.includes('required:console') || data.keywords.includes('optional:console')"
v-if="data.manifest.service.required.includes('console') || data.manifest.service.optional.includes('console')"
@click="$emit('query', 'using:console')"
>控制台</badge>
</div>
Expand Down
81 changes: 69 additions & 12 deletions packages/market/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,36 @@ export interface BasePackage {
}

export interface PackageJson extends BasePackage {
koishi?: Manifest
keywords: string[]
dependencies?: Dict<string>
devDependencies?: Dict<string>
peerDependencies?: Dict<string>
optionalDependencies?: Dict<string>
}

export interface Manifest {
hidden?: boolean
description?: Dict<string>
service?: {
required?: string[]
optional?: string[]
implements?: string[]
}
locales?: string[]
recommends?: string[]
}

export interface RemotePackage extends PackageJson {
deprecated?: string
author: User
maintainers: User[]
license: string
dist: {
dist: RemotePackage.Dist
}

export namespace RemotePackage {
export interface Dist {
shasum: string
integrity: string
tarball: string
Expand Down Expand Up @@ -55,19 +72,25 @@ export interface SearchPackage extends BasePackage {
keywords: string[]
}

export interface ScoreDetail {
quality: number
popularity: number
maintenance: number
}

export interface SearchObject {
package: SearchPackage
score: {
score: SearchObject.Score
searchScore: number
}

export namespace SearchObject {
export interface Score {
final: number
detail: ScoreDetail
detail: Score.Detail
}

export namespace Score {
export interface Detail {
quality: number
popularity: number
maintenance: number
}
}
searchScore: number
}

export interface SearchResult {
Expand All @@ -76,12 +99,13 @@ export interface SearchResult {
objects: SearchObject[]
}

export interface AnalyzedPackage extends SearchPackage, ScoreDetail {
export interface AnalyzedPackage extends SearchPackage, SearchObject.Score.Detail {
shortname: string
official: boolean
size: number
license: string
versions: RemotePackage[]
manifest: Manifest
}

export interface ScanConfig {
Expand All @@ -100,6 +124,37 @@ export default async function scan(config: ScanConfig) {
return result.total
}

function conclusion(remote: RemotePackage) {
const manifest = {
description: {},
locales: [],
recommends: [],
...remote.koishi,
service: {
required: [],
optional: [],
implements: [],
...remote.koishi?.service,
},
}

for (const keyword of remote.keywords ?? []) {
if (keyword === 'market:hidden') {
manifest.hidden = true
} else if (keyword.startsWith('required:')) {
manifest.service.required.push(keyword.slice(9))
} else if (keyword.startsWith('optional:')) {
manifest.service.optional.push(keyword.slice(9))
} else if (keyword.startsWith('impl:')) {
manifest.service.implements.push(keyword.slice(5))
} else if (keyword.startsWith('locale:')) {
manifest.locales.push(keyword.slice(7))
}
}

return manifest
}

async function analyze(object: SearchObject) {
const { name } = object.package
const official = name.startsWith('@koishijs/plugin-')
Expand All @@ -118,11 +173,13 @@ export default async function scan(config: ScanConfig) {

const latest = registry.versions[versions[0].version]
latest.keywords ??= []
if (latest.keywords.includes('market:hidden')) return
const manifest = conclusion(latest)
if (manifest.hidden) return

const shortname = official ? name.slice(17) : name.slice(14)
onItem({
name,
manifest,
shortname,
official,
versions,
Expand Down
8 changes: 4 additions & 4 deletions plugins/frontend/manager/client/market/package.vue
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,19 @@
@click="$emit('query', 'is:official')"
>官方</k-badge>
<k-badge type="primary"
v-if="meta.keywords.includes('impl:database')"
v-if="meta.manifest.service.implements.includes('database')"
@click="$emit('query', 'impl:database')"
>数据库</k-badge>
<k-badge type="primary"
v-if="meta.keywords.includes('impl:adapter')"
v-if="meta.manifest.service.implements.includes('adapter')"
@click="$emit('query', 'impl:adapter')"
>适配器</k-badge>
<k-badge type="primary"
v-if="meta.keywords.includes('impl:assets')"
v-if="meta.manifest.service.implements.includes('manifestassets')"
@click="$emit('query', 'impl:assets')"
>资源存储</k-badge>
<k-badge type="primary"
v-if="meta.keywords.includes('required:console') || meta.keywords.includes('optional:console')"
v-if="meta.manifest.service.required.includes('console') || meta.manifest.service.optional.includes('console')"
@click="$emit('query', 'using:console')"
>控制台</k-badge>
</div>
Expand Down
8 changes: 4 additions & 4 deletions plugins/frontend/manager/client/market/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ export function getKeywords(name: string) {
}

export function validate(data: MarketProvider.Data, word: string) {
const { keywords } = getMixedMeta(data.name)
const { locales, service } = getMixedMeta(data.name).manifest
if (word.startsWith('impl:')) {
return keywords.includes(word)
return service.implements.includes(word.slice(5))
} else if (word.startsWith('locale:')) {
return keywords.includes(word)
return locales.includes(word.slice(7))
} else if (word.startsWith('using:')) {
const name = word.slice(6)
return keywords.includes('required:' + name) || keywords.includes('optional:' + name)
return service.required.includes(name) || service.optional.includes(name)
} else if (word.startsWith('email:')) {
return data.author?.email === word.slice(6)
} else if (word.startsWith('is:')) {
Expand Down

0 comments on commit 24484c7

Please sign in to comment.