All Projects → pahen → Madge

pahen / Madge

Licence: mit
Create graphs from your CommonJS, AMD or ES6 module dependencies

Programming Languages

javascript
184084 projects - #8 most used programming language
typescript
32286 projects
shell
77523 projects

Projects that are alternatives of or similar to Madge

Node Dependency Tree
Get the dependency tree of a module
Stars: ✭ 383 (-93.2%)
Mutual labels:  commonjs, amd, sass
Ngd
View the dependencies tree of you Angular application
Stars: ✭ 570 (-89.88%)
Mutual labels:  dependencies, graph
Aws Security Viz
Visualize your aws security groups.
Stars: ✭ 511 (-90.93%)
Mutual labels:  graph, graphviz
array-sort-by
Powerful mechanism to sort arrays or array of objects by one or more properties. You can also specify a custom comparer function.
Stars: ✭ 37 (-99.34%)
Mutual labels:  commonjs, amd
Steal
Gets JavaScript
Stars: ✭ 1,353 (-75.99%)
Mutual labels:  commonjs, amd
Requirejs Demo
《RequreJS学习笔记》
Stars: ✭ 164 (-97.09%)
Mutual labels:  commonjs, amd
babel-plugin-transform-amd-to-commonjs
✨ Babel plugin that transforms AMD to CommonJS
Stars: ✭ 44 (-99.22%)
Mutual labels:  commonjs, amd
A Journey Toward Better Style
A Journey toward better style
Stars: ✭ 245 (-95.65%)
Mutual labels:  sass, less
Rollup Plugin Postcss
Seamless integration between Rollup and PostCSS.
Stars: ✭ 507 (-91%)
Mutual labels:  sass, less
Modgv
Converts 'go mod graph' output into Graphviz's DOT language
Stars: ✭ 358 (-93.65%)
Mutual labels:  dependencies, graphviz
Protodot
transforming your .proto files into .dot files (and .svg, .png if you happen to have graphviz installed)
Stars: ✭ 107 (-98.1%)
Mutual labels:  graph, graphviz
Fontisto
The iconic font and CSS toolkit. Fontisto gives you scalable vector icons that can instantly be customized: size, color, drop shadow and anything that can be done with the power of CSS.
Stars: ✭ 413 (-92.67%)
Mutual labels:  sass, less
Vzl
💠 DOT Language Live Editor (GraphViz)
Stars: ✭ 83 (-98.53%)
Mutual labels:  graph, graphviz
Webpack
A bundler for javascript and friends. Packs many modules into a few bundled assets. Code Splitting allows for loading parts of the application on demand. Through "loaders", modules can be CommonJs, AMD, ES6 modules, CSS, Images, JSON, Coffeescript, LESS, ... and your custom stuff.
Stars: ✭ 60,034 (+965.38%)
Mutual labels:  commonjs, amd
Material Colors
Colors of Google's Material Design made available to coders
Stars: ✭ 252 (-95.53%)
Mutual labels:  sass, less
Cargo Deps
Cargo subcommand for building dependency graphs of Rust projects
Stars: ✭ 168 (-97.02%)
Mutual labels:  dependencies, graph
Prejss
Get the power of PostCSS with plugins in your JSS styles. 🎨 Just put CSS into JS and get it as JSS object.
Stars: ✭ 238 (-95.78%)
Mutual labels:  sass, less
Reset Css
An unmodified* copy of Eric Meyer's CSS reset. PostCSS, webpack, Sass, and Less friendly.
Stars: ✭ 244 (-95.67%)
Mutual labels:  sass, less
Vscode Stylelint
A Visual Studio Code extension to lint CSS/SCSS/Less with stylelint
Stars: ✭ 260 (-95.39%)
Mutual labels:  sass, less
Detective
Find all calls to require() no matter how deeply nested using a proper walk of the AST
Stars: ✭ 387 (-93.13%)
Mutual labels:  dependencies, commonjs

madge

Last version Build Status Dependency status Donate

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

  • Works for JavaScript (AMD, CommonJS, and ES6 modules)
  • Also works for CSS preprocessors (Sass, Stylus, and Less)
  • NPM installed dependencies are excluded by default (can be enabled)
  • All core Node.js modules (assert, path, fs, etc) are excluded
  • Will traverse child dependencies automatically

Read the changelog for latest changes.

I've worked with Madge on my free time for the last couple of years and it's been a great experience. It started as an experiment but turned out to be a very useful tool for many developers. I have many ideas for the project and it would definitely be easier to dedicate more time to it with some financial support 🙏

Regardless of your contribution, thanks for your support!

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)

Graphviz is only required if you want to generate visual graphs (e.g. in SVG or DOT format).

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());
});

.warnings()

Returns an Object of warnings.

const madge = require('madge');

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

.circular()

Returns an Array of all modules that have circular dependencies.

const madge = require('madge');

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

.circularGraph()

Returns an Object with only circular dependencies.

const madge = require('madge');

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

.depends()

Returns an Array of all modules that depend on a given module.

const madge = require('madge');

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

.orphans()

Return an Array of all modules that no one is depending on.

const madge = require('madge');

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

.leaves()

Return an Array of all modules that have no dependencies.

const madge = require('madge');

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

.dot([circularOnly: boolean])

Returns a Promise resolved with a DOT representation of the module dependency graph. Set circularOnly to only include circular dependencies.

const madge = require('madge');

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

.image(imagePath: string, [circularOnly: boolean])

Write the graph as an image to the given image path. Set circularOnly to only include circular dependencies. 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);
	});

.svg()

Return a Promise resolved with the XML SVG representation of the dependency graph as a Buffer.

const madge = require('madge');

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

Configuration

Property Type Default Description
baseDir String null Base directory to use instead of the default
includeNpm Boolean false If shallow NPM modules should be included
fileExtensions Array ['js'] Valid file extensions used to find files in directories
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
tsConfig String|Object null TypeScript config for resolving aliased modules - Either a path to a tsconfig file or an object containing the config
layout String  dot Layout to use in the graph
rankdir String  LR Sets the direction of the graph layout
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
nodeShape String box A string specifying the shape of a node in the graph
nodeStyle String rounded A string specifying the style of a node in 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 and precinct
dependencyFilter Function false Function called with a dependency filepath (exclude substree by returning false)

You can use configuration file either in .madgerc in your project or home folder or directly in package.json. Look here for alternative locations for the file.

.madgerc

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

package.json

{
	"name": "foo",
	"version": "0.0.1",
	...
	"madge": {
		"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.js path/src/app.js

Show modules that no one is depending on

madge --orphans path/src/

Show modules that have no dependencies

madge --leaves path/src/

Excluding modules

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

Save graph as a SVG image (requires Graphviz)

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

Save graph with only circular dependencies

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

Save graph as a DOT file for further processing (requires Graphviz)

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 install
npm test

FAQ

Missing dependencies?

It could happen that the files you're not seeing have been skipped due to errors or that they can't be resolved. Run madge with the --warning option to see skipped files. If you need even more info run with the --debug option.

Using both Javascript and Typescript in your project?

Madge uses dependency-tree which uses filing-cabinet to resolve modules. However it requires configurations for each file type (js/jsx) and (ts/tsx). So provide both webpackConfig and tsConfig options to madge.

Using mixed import syntax in the same file?

Only one syntax is used by default. You can use both though if you're willing to take the degraded performance. Put this in your madge config to enable mixed imports.

For ES6 + CommonJS:

{
	"detectiveOptions": {
		"es6": {
			"mixedImports": true
		}
	}
}

For TypeScript + CommonJS:

{
	"detectiveOptions": {
		"ts": {
			"mixedImports": true
		}
	}
}

How to ignore import type statements in ES6 + Flow?

Put this in your madge config.

{
	"detectiveOptions": {
		"es6": {
			"skipTypeImports": true
		}
	}
}

How to ignore import in type annotations in TypeScript?

Put this in your madge config.

{
	"detectiveOptions": {
		"ts": {
			"skipTypeImports": true
		}
	}
}

Mixing TypesScript and Javascript imports?

Ensure you have this in your .tsconfig file.

{
	"compilerOptions": {
		"module": "commonjs",
		"allowJs": true
	}
}

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

Ensure you have installed Graphviz. If you're running Windows, note that Graphviz is not added to the PATH variable during install. You should add the folder of gvpr.exe (typically %Graphviz_folder%/bin) to the PATH variable manually.

How do I fix the "Graphviz not built with triangulation library" error when using sfdp layout?

Homebrew doesn't include GTS by default. Fix this by doing:

brew uninstall graphviz
brew install gts
brew install graphviz

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.

Credits

Contributors

This project exists thanks to all the people who contribute. Contributors

Donations ❤️

Thanks to the awesome people below for making donations! 🙏[Donate]

License

MIT License

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].