# core/plugins/diagram.machine.plugin.ts

> 37 lines of code and 6 definitions.

Tree: GovLab Docs
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-plugins-diagram-machine-plugin-ts
Source text: https://banes-lab.com/source/docs/core/plugins/diagram.machine.plugin.ts.txt

Listed in [core/plugins](https://banes-lab.com/api/source/docs/core/plugins.md), after [core/plugins/diagram.invocation.plugin.ts](https://banes-lab.com/source/docs/core/plugins/diagram.invocation.plugin.ts.md) and before [core/plugins/diagram.package.plugin.ts](https://banes-lab.com/source/docs/core/plugins/diagram.package.plugin.ts.md).

## Definitions

- `render` (method_definition, line 20, exported)
- `MIN_STATES` (lexical_declaration, line 11)
- `diagram` (lexical_declaration, line 13, exported)
- `appliesTo` (method_definition, line 14, exported)
- `state` (lexical_declaration, line 21, exported)
- `model` (lexical_declaration, line 25, exported)

## Contained in

- [core/plugins](https://banes-lab.com/anatomy/docs/folder-docs-core-plugins.md)

## Uses

- [core/formatters/diagram.machine.formatter.ts](https://banes-lab.com/source/docs/core/formatters/diagram.machine.formatter.ts.md)

## Linked from

- [core/formatters](https://banes-lab.com/anatomy/docs/folder-docs-core-formatters.md)

## Source

```typescript
import {
    DIAGRAM_DESCRIPTIONS,
    DIAGRAM_LEGENDS,
    DIAGRAM_TITLES,
    stateTitle,
} from "#configuration/strings/figure.strings";
import type { DiagramKind } from "#types/figure.types";
import type { StateModel } from "#types/diagram.types";
import { emitStateDiagram } from "#core/formatters/diagram.machine.formatter";

const MIN_STATES = 2;

export const diagram: DiagramKind = {
    appliesTo(context) {
        const state = context.codeGraph?.state ?? null;
        return state !== null && state.states.length >= MIN_STATES && state.transitions.length > 0;
    },
    id: "state",
    order: 4,
    render(context) {
        const state = context.codeGraph?.state ?? null;
        if (state === null || state.transitions.length === 0) {
            return null;
        }
        const model: StateModel = {
            accDescr: DIAGRAM_DESCRIPTIONS.state,
            accTitle: stateTitle(context.moduleName),
            nodes: state.states.map((name) => ({ id: name, label: name })),
            transitions: state.transitions.map((transition) => ({
                from: transition.from,
                label: transition.label,
                to: transition.to,
            })),
            ...(state.initial === null ? {} : { initial: state.initial }),
        };
        return { legend: DIAGRAM_LEGENDS.state, mermaid: emitStateDiagram(model), sources: [] };
    },
    title: DIAGRAM_TITLES.state,
};
```
