npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

piuccio.madge

v1.3.3

Published

Create graphs from module dependencies.

Downloads

7

Readme

MaDGe - Module Dependency Graph

Last version Build Status Dependency status Dev Dependencies Status NPM Status Donate

Madge is a developer tool for generating a visual graph of your module dependencies, finding circular dependencies, and give you other useful info. Joel Kemp's awesome dependency-tree is used for extracting the dependency tree.

  • Works for JavaScript (AMD, CommonJS, ES6 modules) and CSS preprocessors (Sass, Stylus)
  • NPM installed dependencies are excluded by default (can be enabled in config)
  • All core Node.js modules (assert, path, fs, etc) are excluded
  • Recurse into child dependencies to get a complete dependency tree of a file

Read the changelog for latest changes.

Examples

Graph generated from madge's own code and dependencies.

A graph with circular dependencies. Blue has dependencies, green has no dependencies, and red has circular dependencies.

See it in action

Installation

$ npm -g install madge

Graphviz (optional)

Only required if you want to generate the visual graphs using Graphviz.

Mac OS X

$ brew install graphviz || port install graphviz

Ubuntu

$ apt-get install graphviz

API

madge(path: string|array|object, config: object)

path is a single file or directory, or an array of files/directories to read. A predefined tree can also be passed in as an object.

config is optional and should be the configuration to use.

Returns a Promise resolved with the Madge instance object.

Functions

.obj()

Returns an Object with all dependencies.

const madge = require('madge');

madge('path/to/app.js').then((res) => {
	console.log(res.obj());
});

.circular()

Returns an Array with all modules that has circular dependencies.

const madge = require('madge');

madge('path/to/app.js').then((res) => {
	console.log(res.circular());
});

.depends()

Returns an Array with all modules that depends on a given module.

const madge = require('madge');

madge('path/to/app.js').then((res) => {
	console.log(res.depends());
});

.dot()

Returns a Promise resolved with a DOT representation of the module dependency graph.

const madge = require('madge');

madge('path/to/app.js')
	.then((res) => res.dot())
	.then((output) => {
		console.log(output);
	});

.image(imagePath: string)

Write the graph as an image to the given image path. The image format to use is determined from the file extension. Returns a Promise resolved with a full path to the written image.

const madge = require('madge');

madge('path/to/app.js')
	.then((res) => res.image('path/to/image.svg'))
	.then((writtenImagePath) => {
		console.log('Image written to ' + writtenImagePath);
	});
});

Configuration

Property | Type | Default | Description --- | --- | --- | --- baseDir | String | null | Base directory to use instead of the default includeNpm | Boolean | false | If node_modules should be included fileExtensions | Array | ['js'] | Valid file extensions used to find files in directories showFileExtension | Boolean | false | If file extension should be included in module name excludeRegExp | Array | false | An array of RegExp for excluding modules requireConfig | String | null | RequireJS config for resolving aliased modules webpackConfig | String | null | Webpack config for resolving aliased modules layout | String | dot | Layout to use in the graph fontName | String | Arial | Font name to use in the graph fontSize | String | 14px | Font size to use in the graph backgroundColor | String | #000000 | Background color for the graph nodeColor | String | #c6c5fe | Default node color to use in the graph noDependencyColor | String | #cfffac | Color to use for nodes with no dependencies cyclicNodeColor | String | #ff6c60 | Color to use for circular dependencies edgeColor | String | #757575 | Edge color to use in the graph graphVizOptions | Object | false | Custom GraphViz options graphVizPath | String | null | Custom GraphViz path detectiveOptions | Object | false | Custom detective options for dependency-tree

Note that when running the CLI it's possible to use a runtime configuration file. The config should placed in .madgerc in your project or home folder. Look here for alternative locations for the file. Here's an example:

{
	"showFileExtension": true,
	"fontSize": "10px",
	"graphVizOptions": {
		"G": {
			"rankdir": "LR"
		}
	}
}

CLI

Examples

List dependencies from a single file

$ madge path/src/app.js

List dependencies from multiple files

$ madge path/src/foo.js path/src/bar.js

List dependencies from all *.js files found in a directory

$ madge path/src

List dependencies from multiple directories

$ madge path/src/foo path/src/bar

List dependencies from all *.js and *.jsx files found in a directory

$ madge --extensions js,jsx path/src

Finding circular dependencies

$ madge --circular path/src/app.js

Show modules that depends on a given module

$ madge --depends 'wheels' path/src/app.js

Excluding modules

$ madge --exclude '^(foo|bar)$' path/src/app.js

Save graph as a SVG image (graphviz required)

$ madge --image graph.svg path/src/app.js

Save graph as a DOT file for further processing (graphviz required)

$ madge --dot path/src/app.js > graph.gv

Using pipe to transform tree (this example will uppercase all paths)

$ madge --json path/src/app.js | tr '[a-z]' '[A-Z]' | madge --stdin

Debugging

To enable debugging output if you encounter problems, run madge with the --debug option then throw the result in a gist when creating issues on GitHub.

$ madge --debug path/src/app.js

Running tests

$ npm test

FAQ

What's the "Error: write EPIPE" when exporting graph to image?

Ensure you have Graphviz installed. And if you're running Windows graphviz is not setting PATH variable during install. You should add folder of gvpr.exe (typically %Graphviz_folder%/bin) to PATH variable.

The image produced by madge is very hard to read, what's wrong?

Try running madge with a different layout, here's a list of the ones you can try:

  • dot "hierarchical" or layered drawings of directed graphs. This is the default tool to use if edges have directionality.

  • neato "spring model'' layouts. This is the default tool to use if the graph is not too large (about 100 nodes) and you don't know anything else about it. Neato attempts to minimize a global energy function, which is equivalent to statistical multi-dimensional scaling.

  • fdp "spring model'' layouts similar to those of neato, but does this by reducing forces rather than working with energy.

  • sfdp multiscale version of fdp for the layout of large graphs.

  • twopi radial layouts, after Graham Wills 97. Nodes are placed on concentric circles depending their distance from a given root node.

  • circo circular layout, after Six and Tollis 99, Kauffman and Wiese 02. This is suitable for certain diagrams of multiple cyclic structures, such as certain telecommunications networks.

License

MIT License