返回 slidev
addons.ts
根目录 / packages / slidev / node / integrations / addons.ts
1 import fs from 'node:fs/promises'
2 import { resolve } from 'pathe'
3 import { satisfies } from 'verkit'
4 import { version } from '../../package.json'
5 import { createResolver, getRoots } from '../resolver'
6
7 export async function resolveAddons(addonsInConfig: string[]) {
8 const { userRoot, userPkgJson } = await getRoots()
9 const resolved: string[] = []
10
11 const resolveAddonNameAndRoot = createResolver('addon', {})
12
13 async function resolveAddon(name: string, parent: string) {
14 const [, pkgRoot] = await resolveAddonNameAndRoot(name, parent)
15 if (!pkgRoot)
16 return
17 resolved.push(pkgRoot)
18 const { slidev = {}, engines = {} } = JSON.parse(await fs.readFile(resolve(pkgRoot, 'package.json'), 'utf-8'))
19
20 if (engines.slidev && !satisfies(version, engines.slidev, { includePrerelease: true }))
21 throw new Error(`[slidev] addon "${name}" requires Slidev version range "${engines.slidev}" but found "${version}"`)
22
23 if (Array.isArray(slidev.addons))
24 await Promise.all(slidev.addons.map((addon: string) => resolveAddon(addon, pkgRoot)))
25 }
26
27 if (Array.isArray(addonsInConfig))
28 await Promise.all(addonsInConfig.map((addon: string) => resolveAddon(addon, userRoot)))
29 if (Array.isArray(userPkgJson.slidev?.addons))
30 await Promise.all(userPkgJson.slidev.addons.map((addon: string) => resolveAddon(addon, userRoot)))
31
32 return resolved
33 }
34
34 lines TYPESCRIPT