How does unidep work?

Our notion of dependency

The notion of dependency might seem trivial, but it truly is not that obvious. Dependencies between functions and between files are discussed in this chapter.

unidep overview

Here is a diagram of the internal flow between components of unidep used to extract dependencies:

flowchart TB

    subgraph Loader
        in_loader(["Unresolved file paths"]) --> ts_loader["Tree sitter"]
        ts_loader --> ts_ast(["Tree sitter AST"])
    end

    subgraph Resolvers
        direction LR
        resolver_ast(["Tree sitter AST"]) --> resolver["Language-specific resolver"]
        resolver_unmod_in(["Unresolved functions"]) --> resolver
        resolver --> resolver_deps(["Resolved dependencies"])
        resolver --> resolver_undeps(["Unresolved functions"])
        resolver --> resolver_unmod(["Unresolved module names"])
    end

    subgraph Explorers
        direction LR
        in_explorer(["Unresolved module names"]) --> explorer["Language-specific explorer"]
        explorer --> out_explorer(["Unresolved file paths"])
    end

    start(["Path of codebase"]) --> Loader
    Loader --> Resolvers
    Resolvers --> Explorers
    Explorers --> Loader

    Resolvers --> deps(["Dependencies"])

Two components only are language-specific: the resolvers and the explorers. This modularity facilitates support of new languages by unidep.