# core/coordinators/code.coordinator.ts

> 19 lines of code and 4 definitions.

Tree: GovLab Docs
Language: typescript
Layer: application
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-coordinators-code-coordinator-ts
Source text: https://banes-lab.com/source/docs/core/coordinators/code.coordinator.ts.txt

Listed in [core/coordinators](https://banes-lab.com/api/source/docs/core/coordinators.md), after [core/coordinators/catalog.coordinator.ts](https://banes-lab.com/source/docs/core/coordinators/catalog.coordinator.ts.md) and before [core/coordinators/dependency.coordinator.ts](https://banes-lab.com/source/docs/core/coordinators/dependency.coordinator.ts.md).

## Definitions

- `deriveCodeGraph` (lexical_declaration, line 8, exported)
- `loaded` (lexical_declaration, line 6)
- `analyzer` (lexical_declaration, line 15, exported)
- `recognizers` (lexical_declaration, line 19, exported)

## Contained in

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

## Uses

- [core/loaders/code.loader.ts](https://banes-lab.com/source/docs/core/loaders/code.loader.ts.md)
- [core/loaders/syntax.loader.ts](https://banes-lab.com/source/docs/core/loaders/syntax.loader.ts.md)

## Linked from

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

## Source

```typescript
import type { Analyzer, Recognizer } from "#types/code.types";
import type { CodeGraph } from "#types/graph.types";
import { loadAnalyzers } from "#core/loaders/code.loader";
import { loadRecognizers } from "#core/loaders/syntax.loader";

const loaded: { analyzers?: Promise<Analyzer[]>; recognizers?: Promise<Recognizer[]> } = {};

export const deriveCodeGraph = async function deriveCodeGraph(
    moduleDir: string,
    pkg: Record<string, unknown>,
    logger?: (message: string) => void,
): Promise<CodeGraph | null> {
    loaded.analyzers ??= loadAnalyzers();
    loaded.recognizers ??= loadRecognizers();
    const analyzer = (await loaded.analyzers).find((candidate) => candidate.canAnalyze(moduleDir, pkg));
    if (!analyzer) {
        return null;
    }
    const recognizers = await loaded.recognizers;
    return analyzer.analyze({ moduleDir, pkg, recognizers, ...(logger ? { logger } : {}) });
};
```
