# Registry Plugin loading and dependency injection. ### ctx.inject(deps, callback) ```ts cordis-catalog /** * Run a callback once the requested services are available. * * Shorthand for `ctx.plugin({ inject, apply: callback })`: the callback * is unloaded and re-run whenever a required service changes. * * @param deps — required services, as an array or a name → config map. * @param callback — plugin body called with `(ctx, config)`. * @returns the fiber; awaiting it settles once loading finished. */ inject(deps: Inject, callback: Plugin.Function): Fiber & PromiseLike ``` Run a callback once the requested services are available. Shorthand for `ctx.plugin({ inject, apply: callback })`: the callback is unloaded and re-run whenever a required service changes. - `deps` — required services, as an array or a name → config map. - `callback` — plugin body called with `(ctx, config)`. **Returns** the fiber; awaiting it settles once loading finished. [Source](../../vendor/cordis/src/registry.ts#L176) ### ctx.plugin(plugin, ...args) ```ts cordis-catalog /** * Load a plugin in the current context. * * @param plugin — a function, class, or `{ apply }` object plugin. * @param args — the plugin config, validated against its `Config` schema. * @returns the fiber; awaiting it settles once loading finished * (rejecting on config or startup errors). */ plugin

(plugin: P, ...args: Spread>): Fiber & PromiseLike ``` Load a plugin in the current context. - `plugin` — a function, class, or `{ apply }` object plugin. - `args` — the plugin config, validated against its `Config` schema. **Returns** the fiber; awaiting it settles once loading finished (rejecting on config or startup errors). [Source](../../vendor/cordis/src/registry.ts#L185) ## Plugin Supported plugin entrypoint shapes. ```ts cordis-catalog /** Supported plugin entrypoint shapes. */ type Plugin = | Plugin.Function | Plugin.Constructor | Plugin.Object /** Types associated with plugin entrypoints and runtime records. */ namespace Plugin { /** Shared metadata understood by the plugin registry and related tooling. */ export interface Base { /** Display name used for fiber diagnostics and logger names. */ name?: string /** Standard-schema validator applied to config before the plugin starts. */ Config?: StandardSchemaV1 /** Services the plugin requires; it only loads while all are available. */ inject?: Inject /** Service name(s) the plugin provides (read by `Service` and by loaders). */ provide?: string | string[] /** Service names whose intercept config the plugin declares it consumes. */ intercept?: Dict } export interface Transform { /** Marks the transform object as a schema/config transform. */ schema?: true /** Convert user-facing config to runtime config. */ Config: (config: S) => T } /** Function plugin called with `(ctx, config)`. */ export interface Function extends Base { (ctx: Context, config: T): any } /** Class plugin constructed with `(ctx, config)`. */ export interface Constructor extends Base { new (ctx: Context, config: T): any } /** Object plugin with an `apply(ctx, config)` method. */ export interface Object extends Base { apply(ctx: Context, config: T): any } /** Mutable registry record shared by all fibers of one plugin callback. */ export interface Runtime { /** Display name copied from the first registered plugin shape. */ name?: string /** Every live fiber of this plugin (one per `ctx.plugin()` call). */ fibers: DisposableList /** The executable entrypoint all fibers share (registry identity key). */ callback: globalThis.Function /** Standard-schema validator applied to each fiber's config. */ Config?: StandardSchemaV1 } } ``` [Source](../../vendor/cordis/src/registry.ts#L92) ## Inject Service dependency declaration accepted by plugins and the `@Inject` decorator. Array form requests services without intercept config. Object form maps each service name to optional intercept config for the plugin context. ```ts cordis-catalog /** * Service dependency declaration accepted by plugins and the `@Inject` * decorator. * * Array form requests services without intercept config. Object form maps each * service name to optional intercept config for the plugin context. */ type Inject = (keyof M)[] | { [K in keyof M]?: M[K] } /** Utilities for normalizing plugin dependency declarations. */ namespace Inject { /** * Convert array/object/class-inherited inject metadata into a plain map. * * @param inject — the declaration to normalize; `null`/`undefined` add nothing. * @param result — the map to fill (service name → intercept config or `null`). * @returns `result`. */ export function resolve(inject: Inject | null | undefined, result: Dict = Object.create(null)) } ``` [Source](../../vendor/cordis/src/registry.ts#L19)