dpdm-fast
A robust static dependency analyzer for your JavaScript
and TypeScript
projects with Rust
!
Highlights
|
Install
|
Usage
|
Options
|
API
Highlights
This is fork from acrazing/dpdm, and compability with dpdm
99%. It's faster and bring a performance improvement of more than ten times!(Please use --no-progress
to be fastest, progress
will be slower than dpdm
with node
).
- Supports
CommonJS
, ESM
. - Supports
JavaScript
and TypeScript
completely.
- Supports TypeScript path mapping.
- Supports ignore TypeScript type dependencies.
- Light weight: use TypeScript to parse all modules.
- Fast: use
Rust
and swc-parser
to parse all modules. This will bring a performance improvement of more than ten times! - Stable output: This is compared to
madge
, whose results are completely inconclusive when analyze TypeScript
.
Install
-
For command line
npm i -g dpdm-fast
yarn global add dpdm-fast
-
As a module
npm i -D dpdm-fast
yarn add -D dpdm-fast
Usage in command line
-
Simple usage
dpdm ./src/index.ts
-
Print circular dependencies only
dpdm --no-warning --no-tree ./src/index.ts
-
Exit with a non-zero code if a circular dependency is found.
dpdm --exit-code circular:1 ./src/index.ts
-
Ignore type dependencies for TypeScript modules
dpdm -T ./src/index.ts
-
Find unused files by index.js
in src
directory:
dpdm --no-tree --no-warning --no-circular --detect-unused-files-from 'src/**/*.*' 'index.js'
-
Skip dynamic imports:
dpdm --skip-dynamic-imports circular index.js
Options
$ dpdm --help
Analyze the files' dependencies.
Usage: dpdm [OPTIONS] <FILES>...
Arguments:
<FILES>... The file paths or globs
Options:
--context <CONTEXT>
The context directory to shorten path, default is current directory
-e, --extensions <EXTENSIONS>
Comma separated extensions to resolve [default: ts,tsx,mjs,js,jsx,json]
--js <JS>
Comma separated extensions indicate the file is js like [default: ts,tsx,mjs,js,jsx]
--include <INCLUDE>
Included filenames regexp in string, default includes all files [default: .*]
--exclude <EXCLUDE>
Excluded filenames regexp in string, set as empty string to include all files [default: node_modules]
-o, --output <OUTPUT>
Output json to file
--no-tree
Print tree to stdout
--circular
Print circular to stdout
--no-warning
Print warning to stdout
--tsconfig <TSCONFIG>
The tsconfig path, which is used for resolve path alias
-T, --transform
Transform typescript modules to javascript before analyze
--exit-code <EXIT_CODE>
Exit with specified code
--no-progress
Show progress bar
--detect-unused-files-from <DETECT_UNUSED_FILES_FROM>
This file is a glob, used for finding unused files
--skip-dynamic-imports <SKIP_DYNAMIC_IMPORTS>
Skip parse import(...) statement
-h, --help
Print help
-V, --version
Print version
Example output

Usage as a package
TODO: This part has not yet been completed. So if you call the API, it will auto use dpdm-ts
. Next time I will use wasm-bindgen
to call rust api.
import { parseDependencyTree, parseCircular, prettyCircular } from 'dpdm';
parseDependencyTree('./index', {
}).then((tree) => {
const circulars = parseCircular(tree);
console.log(prettyCircular(circulars));
});
API Reference
-
parseDependencyTree(entries, option, output)
: parse dependencies for glob entries
export declare function parseDependencyTree(
entries: string | string[],
options: ParserOptions,
): Promise<DependencyTree>;
export interface ParseOptions {
context: string;
extensions: string[];
include: RegExp;
exclude: RegExp;
}
export enum DependencyKind {
CommonJS = 'CommonJS',
StaticImport = 'StaticImport',
DynamicImport = 'DynamicImport',
StaticExport = 'StaticExport',
}
export interface Dependency {
issuer: string;
request: string;
kind: DependencyKind;
id: string | null;
}
export type DependencyTree = Record<string, Dependency[] | null>;
-
parseCircular(tree)
: parse circulars in dependency tree
export declare function parseCircular(tree: DependencyTree): string[][];
TODOs