| 1 | import type { Awaitable } from '@antfu/utils' |
| 2 | import { existsSync } from 'node:fs' |
| 3 | import { resolve } from 'pathe' |
| 4 | import { loadModule } from '../utils' |
| 5 | |
| 6 | export async function loadSetups<F extends (...args: any) => any>( |
| 7 | roots: string[], |
| 8 | filename: string, |
| 9 | args: Parameters<F>, |
| 10 | extraLoader?: (root: string) => ReturnType<F>[], |
| 11 | ) { |
| 12 | return await Promise.all(roots.flatMap((root) => { |
| 13 | const tasks: Awaitable<ReturnType<F>>[] = [] |
| 14 | const path = resolve(root, 'setup', filename) |
| 15 | if (existsSync(path)) { |
| 16 | tasks.push(loadModule<{ default: F }>(path).then(mod => mod.default(...args))) |
| 17 | } |
| 18 | if (extraLoader) { |
| 19 | tasks.push(...extraLoader(root)) |
| 20 | } |
| 21 | return tasks |
| 22 | })) |
| 23 | } |
| 24 |