# core/plugins/code.typescript.plugin.ts

> 58 lines of code and 12 definitions.

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

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

## Definitions

- `buildGraph` (lexical_declaration, line 24)
- `analyze` (method_definition, line 40, exported)
- `canAnalyze` (method_definition, line 57, exported)
- `createAnalysis` (lexical_declaration, line 16)
- `program` (lexical_declaration, line 17)
- `store` (lexical_declaration, line 29)
- `visitor` (lexical_declaration, line 30)
- `builder` (lexical_declaration, line 31)
- `analyzer` (lexical_declaration, line 39, exported)
- `seeds` (lexical_declaration, line 41, exported)
- `analysis` (lexical_declaration, line 45, exported)
- `graph` (lexical_declaration, line 46, exported)

## Contained in

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

## Uses

- [configuration/strings/code.strings.ts](https://banes-lab.com/source/docs/configuration/strings/code.strings.ts.md)
- [core/analyzers/machine.analyzer.ts](https://banes-lab.com/source/docs/core/analyzers/machine.analyzer.ts.md)
- [core/analyzers/orchestration.analyzer.ts](https://banes-lab.com/source/docs/core/analyzers/orchestration.analyzer.ts.md)
- [core/resolvers/barrel.resolver.ts](https://banes-lab.com/source/docs/core/resolvers/barrel.resolver.ts.md)
- [core/resolvers/source.resolver.ts](https://banes-lab.com/source/docs/core/resolvers/source.resolver.ts.md)

## Linked from

- [configuration/strings](https://banes-lab.com/anatomy/docs/folder-docs-configuration-strings.md)
- [core/analyzers](https://banes-lab.com/anatomy/docs/folder-docs-core-analyzers.md)
- [core/resolvers](https://banes-lab.com/anatomy/docs/folder-docs-core-resolvers.md)

## Source

```typescript
import type { AnalyzeRequest, Analyzer, EntrySeed, ProgramAnalysis } from "#types/code.types";
import { CallVisitor } from "#core/visitors/code.typescript.visitor";
import type { CodeGraph } from "#types/graph.types";
import { GraphStore } from "#core/stores/graph.store";
import { TsGraphBuilder } from "#core/factories/graph.typescript.factory";
import { detectProtocol } from "#core/analyzers/orchestration.analyzer";
import { detectState } from "#core/analyzers/machine.analyzer";
import { entrySeeds } from "#core/factories/seed.factory";
import { moduleCompilerOptions } from "#core/resolvers/program.resolver";
import { relFromModules } from "#core/resolvers/source.resolver";
import { resolve } from "node:path";
import { resolveSourceBarrels } from "#core/resolvers/barrel.resolver";
import ts from "typescript";
import { unresolvedCalls } from "#configuration/strings/code.strings";

const createAnalysis = function createAnalysis(moduleDir: string, seeds: readonly EntrySeed[]): ProgramAnalysis {
    const program = ts.createProgram({
        options: moduleCompilerOptions(moduleDir),
        rootNames: [...new Set(seeds.map((seed) => seed.barrel))],
    });
    return { checker: program.getTypeChecker(), dirPosix: resolve(moduleDir).split("\\").join("/"), program };
};

const buildGraph = function buildGraph(
    request: AnalyzeRequest,
    analysis: ProgramAnalysis,
    seeds: readonly EntrySeed[],
): CodeGraph {
    const store = new GraphStore();
    const visitor = new CallVisitor({ ...analysis, recognizers: request.recognizers, store });
    const builder = new TsGraphBuilder(analysis, store, visitor);
    builder.seedAll(seeds);
    if (builder.unresolved > 0) {
        request.logger?.(unresolvedCalls(relFromModules(request.moduleDir), builder.unresolved));
    }
    return builder.result();
};

export const analyzer: Analyzer = {
    analyze(request) {
        const seeds = entrySeeds(request.moduleDir, request.pkg);
        if (seeds.length === 0) {
            return null;
        }
        const analysis = createAnalysis(request.moduleDir, seeds);
        const graph = buildGraph(request, analysis, seeds);
        if (graph.nodes.length === 0) {
            return null;
        }
        return {
            edges: graph.edges,
            nodes: graph.nodes,
            protocol: detectProtocol(analysis),
            state: detectState(analysis),
        };
    },
    canAnalyze(dir, pkg) {
        return resolveSourceBarrels(dir, pkg ?? {}).length > 0;
    },
    ecosystem: "typescript",
};
```
