Skip to content

Graph introspection

Because the request/boot pipeline is an explicit dependency graph, you can inspect it directly — visualize the whole thing, or explain exactly which nodes a single route runs.

app.toMermaid() renders a flowchart of every node and route. app.toDOT() produces the same graph as Graphviz DOT.

console.log(app.toMermaid()); // flowchart diagram of all nodes and routes

Enable a live GET /__graph__ endpoint — it renders an HTML viewer with Mermaid, or the raw Mermaid source with Accept: text/plain:

const app = createApp({ modules: [ApiModule], devGraph: true });
// GET /__graph__ → HTML viewer
// GET /__graph__ (text/plain) → raw Mermaid source

app.explain(route) returns the exact execution chain for one route — the ordered nodes, each with its kind, origin, and declared needs/provides:

const e = app.explain('/api/users/:id');
// { pattern, method, transport, chain: [{ name, kind, origin, needs, provides }, ...] }
console.log(e.chain.map((n) => `${n.kind}:${n.name}`));
// → ['provider:db', 'step:user', 'handler:getUser']

The chain is the transitive closure of the handler’s @needs — the same set the framework actually runs for that route, and nothing more.

app.graph() returns the underlying graph structure programmatically if you’d rather walk it yourself than render it.

app.degraded() returns the names of optional providers that are running in a degraded state — for example, an optional dependency that failed to initialize but didn’t abort boot. Use it as a health signal to surface partial availability.