export type Deferred = () => void | Promise export type Plugin = { readonly name: Name readonly needs: N readonly build: (ctx: BuildContext) => T | Promise } export type AnyPlugin = { readonly name: string readonly needs: readonly AnyPlugin[] readonly build: (ctx: never) => unknown } export type ServiceOf

= Awaited> export type BuildContext = { readonly get:

(plugin: P) => Promise> readonly defer: (fn: Deferred) => void } export function definePlugin( spec: Plugin, ): Plugin { return spec }