ts-module-graph
v0.1.0
Published
A modest package for constructing a module graph from TypeScript source files.
Readme
ts-module-graph
A modest package for constructing a module graph from TypeScript source files.
Install
pnpm add ts-module-graphUsage
import { createModuleGraph } from 'ts-module-graph'
import path from 'node:path'
// The entry points must be absolute paths.
const moduleGraph = await createModuleGraph([path.resolve('src/index.ts')])
// The module graph is a Map of ts.SourceFile objects to ModuleGraphNode objects.
console.log(moduleGraph)ModuleGraphNode
Each source file has a ModuleGraphNode object associated with it. Each node has the following properties:
imports: An array of import objects, each containing information about an import statement.id: The module specifier text (e.g. 'lodash', './my-module')importSpecifiers: An array ofImportSpecifierobjects, representing the individual elements being imported.resolvedImports: An array ofResolvedImportobjects, providing semantic information about the resolved imports.resolvedModule: Ats.ResolvedModuleFullobject, containing information about the resolved module, if available.
dependencies: A Set ofts.SourceFileobjects, representing the direct dependencies of this module.
ResolvedImport
Each import resolution has the following properties:
kind: The kind of import specifier (e.g. 'name', 'namespace', 'default').name: Thets.Identifierrepresenting the imported name.exportName: Thets.ModuleExportNamerepresenting the original exported name, if different from the imported name.symbol: Thets.Symbolassociated with the imported entity.aliasedSymbol: The originalts.Symbolif the imported symbol is an alias.declarations: An array ofts.Declarationobjects where the imported symbol is declared.
ImportSpecifier
Each import specifier has the following properties:
kind: The kind of import specifier. Can be:'name': A named import (e.g.{ foo })name: Thets.ModuleExportNamerepresenting the imported name.alias: An optionalts.Identifierrepresenting the alias used for the import (e.g.{ foo as bar }).
'namespace': A namespace import (e.g.* as foo)name: Thets.Identifierrepresenting the namespace.
'default': A default import (e.g.foo)name: Thets.Identifierrepresenting the default import.
Roadmap
Contribution is welcome to implement these features:
- [ ] Namespace imports should have their usage tracked to determine which symbols are actually used.
- [ ] Add a tree-shaking API that whittles down the module graph to only the necessary modules. It doesn't need to be fine-grained; i.e. just filter out modules not used by the entry points (directly or indirectly).
Command-line API
ts-module-graph <...entries>The entry points are resolved relative to the current working directory. Globs are supported.
This command will print the flattened module graph to the console, using colorization to help with readability.
Thanks
This project wouldn't be possible without these amazing dependencies:
- tsc-extra - For providing a clean API to work with TypeScript's compiler API
- ts-expose-internals - For exposing TypeScript's internal types
