pahen / madge Goto Github PK
View Code? Open in Web Editor NEWCreate graphs from your CommonJS, AMD or ES6 module dependencies
License: MIT License
Create graphs from your CommonJS, AMD or ES6 module dependencies
License: MIT License
Right now, the ouput as dot and the output as image are very different. One of the reasons appears, to be that ...image()
will call g.output()
with a lot of options that's missing from ...dot()
's call to g.to_dot()
.
This is probably due to the fact that to_dot doesn't accept options in the first place. If i were unifying this behaviour, would this be a valuable patch for you? I guess, what i'm asking is: would you prefer the way it is now (dot being very clean, image being called with more options) or would you consider a patch that creates a dot-file that will contain all the attributes that would lead to the very same image?
Command line dump:
>madge --version
0.3.1
>madge --image graph.png --format amd scripts
events.js:72
throw er; // Unhandled 'error' event
^
Error: This socket is closed.
at Socket._write (net.js:637:19)
at doWrite (_stream_writable.js:226:10)
at writeOrBuffer (_stream_writable.js:216:5)
at Socket.Writable.write (_stream_writable.js:183:11)
at Socket.write (net.js:615:40)
at Graph.render (C:\Users\Felix\AppData\Roaming\npm\node_modules\madge\node_modules\graphviz\lib\deps\graph.js:380:18)
at Graph.output (C:\Users\Felix\AppData\Roaming\npm\node_modules\madge\node_modules\graphviz\lib\deps\graph.js:385:8)
at Object.module.exports.image (C:\Users\Felix\AppData\Roaming\npm\node_modules\madge\lib\graph.js:109:4)
at Madge.image (C:\Users\Felix\AppData\Roaming\npm\node_modules\madge\lib\madge.js:135:8)
at run (C:\Users\Felix\AppData\Roaming\npm\node_modules\madge\bin\madge:102:7)
Big fan of madge! Thanks for the great work.
Semantically, it seems like madge is a visualization layer of an app's dependency tree. The generation of the tree is also done within madge though.
I wrote https://github.com/mrjoelkemp/node-dependency-tree as a way to generate the dependency tree of any JS codebase (amd, cjs, es6). It outputs a nested JSON structure (or a list of visited files) representing the tree of a file. Is there any interest in using that to power madge?
Thanks for your time.
Problem:
It says no circular dependencies even though there is one.
To reproduce:
Directory structure
a.coffee
foo/b.coffee
a.coffee:
define 'a', ['./foo/b'], ->
b.coffee:
define 'foo/b', ['a'], ->
Now run madge --circular --format amd ./
and notice that it doesn't detect the circular dependency.
If you remove the ./
from a.coffee
it detects the circularity.
I noticed this on Windows. I didn't have time yet to try on *nix.
I was having trouble to get my generated image to render with any of my custom colors passed using API:
Looking thru the code, I found in lib/graph.js some code where reference was made to an opts.colors variable, however the API uses the imageColors property instead.
For example:
if (opts.colors) {
G.bgcolor = opts.imageColors.bgcolor || '#000000';
E.color = opts.imageColors.edge || '#757575';
N.color = opts.imageColors.dependencies || '#c6c5fe';
N.fontcolor = opts.imageColors.fontColor || opts.imageColors.dependencies || '#c6c5fe';
}
should be:
if (opts.imageColors) {
G.bgcolor = opts.imageColors.bgcolor || '#000000';
E.color = opts.imageColors.edge || '#757575';
N.color = opts.imageColors.dependencies || '#c6c5fe';
N.fontcolor = opts.imageColors.fontColor || opts.imageColors.dependencies || '#c6c5fe';
}
When I did a search and replace on this file alone, my images rendered based on my customized colors as expected ;)
If i was good enough with Git, i would create a pull, patch, or whatever to try and contribute... but if you do search/replace on this one file.. that is the only change.
The output of --circular only prints two modules of the circuit. The two that are printed are not always the problem spot. It can be a chore to sort out the complete circuit. It would be much more helpful if --circular printed the whole circuit.
Hi,
I'm attempting to find orphaned modules, using the --depends
option, but it doesn't seem to consider paths in the require config.
madge --require-config modules/main.js --depends underscore modules
yields no results even though underscore is one of my most common dependencies.
modules/main.js
require.config({
paths: {
underscore: '../bower_components/underscore/underscore'
// (etc)
}
});
modules/app.js
define(function (require) {
'use strict';
var $ = require('jquery'),
_ = require('underscore');
//...etc
});
In a senario like RequireJS, it's more like there's only one entry in the HTML, the optimizer of RequireJS analyses the main file, then all dependencies are figured out, instead of scanning a whole directory to figure out the depencies.
I can't find a parameter for scanning file like that? How about it, can we add that?
Currently madge does not seem to resolve the module IDs from the RequireJS paths-config:
if I use madge with the requireConfig
option and the config-file contains path-settings, then madge will create 2 entries in the dependency graph, e.g. for the paths
entry
{paths: {
"someModuleA": "some/module/at/location/a"
}}
the resulting tree object will have the entries
some/module/at/location/a
)someModuleA
)where the first one seems to be created, when madge evaluates the file of "module a", and the second one is created if/when "module a" is require
by its ID from somewhere else (i.e. form a module other than "module a"), e.g. something like this:
{
...
"someModuleA": [/* list of dependencies for module a */],
...
"some/module/at/location/a": [/* list of dependencies of module a */],
...
}
This issue is not resolved by convertAliases
since the problem manifests in the ID entries themselves, and not in their dependency-lists (which are processed by convertAliases
), i.e.
{
...
"moduleId": //<- this is NOT processed by convertAliases()
[/* list of dependencies of moduleId */] //<- these entries ARE processed by convertAliases()
...
}
I patched this behavior in this fork/commit, with the following changes:
convertAliases
) which will
convertAliases
)baseUrl
property, if one is set (otherwise the paths may not get matched against the module IDs correctly) this may also be necessary for convertAliases
... I did not checkuseModuleIds
(boolean): if omitted or false
will use the old default behavior, if true
will use this new alternative instead of convertAliases
NOTE:
I did not make a pull request, since the npm test
did not execute on my machine without failures -- but this is also true for the current master
branch.
I am running the tests on a Windows 64bit machine ... is there some special setting/configuration I have to use, to get the tests running?
For instance I noticed, that the files are referenced by absolute paths, but the test-values expect relative paths... also in some tests, there is an unexpected "dangling-symlink": [],
entry which causes the test to fail...
This may be related to windows, i am getting a lot of nodes duplicated. In one instance, they have their "regular" forward slash, in one instance, they'll have the backslash (probably from the filesystem).
this also happens, if i run madge from a cygwin-bash on windows.
Right now, i can mitigate the problem like this:
madge('www', {format: "amd"}).dot().replace(/\\/g, '/')
But it also means that i can't just use the commandline tool to generate an image.
In cjs.js, madge is mapping some parameters to require such that they're fullly resolved paths. I need a way to map these back to what they were originally required as.
How can I do that? Does this need to be an added feature?
https://github.com/adobe/brackets
) on both a Mac and a Windows machinemadge --format cjs --exclude "/node_modules/|/extensions/|/nls/|/node/|/jquery-ui/|/tests/|/test/|/spec/" --circular <<cloned repo>>/src
Result:
Windows: "No circular dependencies found!"
Mac: Lists about 30 circular dependency chains
If I do --depends
instead, it seems to work except it prints absolute paths for everything instead of module names (relative paths without ".js"). Maybe a clue as to what's breaking --circular
?
In the madge ...circular.js the resolver function parameter modules is a dependences tree with the structure like: { 'lib\A' : ['lib/B'], 'lib\B' : ['lib/C'] }, so for the id = 'lib\A' modules[id] is ['lib/B']. In the first call to the recursion we have id = 'lib\A', and the second call will be with dependences array first element 'lib/B', but in the modules there is no key 'lib/B' - it has key 'lib\B' - the slashes are in the wrong direction. Fixed it as below, in order all slashes will have the same direction. Please review and update the circular.js.
function resolver(id, modules, circular, resolved, unresolved) {
id = id.replace(///g, '');
unresolved[id] = true;
if (modules[id]) {
modules[id].forEach(function (dependency) {
dependency = dependency.replace(///g, '');
if (!resolved[dependency]) {
if (unresolved[dependency]) {
circular.push(getPath(dependency, unresolved));
return;
}
resolver(dependency, modules, circular, resolved, unresolved);
}
});
}
resolved[id] = true;
unresolved[id] = false;
}
@pahen just started to play around madge and have encountered a strange issue with the image output.
The image generated is squashed and a fixed height. When I zoom in I can see the dependencies. Is this likely caused by too many files to process?
Given:
// app.js
define(['a'], function (a) {
console.log('a');
});
// a.js
define(['b'], function (b) {
console.log('a');
});
// b.js
define([], function () {
return {};
});
When I run:
// api.js
var madge = require('madge');
var dependencyObject = madge('app.js', {
format: 'amd',
findNestedDependencies: true
});
console.log(dependencyObject.tree);
The output is:
$ node api.js
{ app: [ 'a' ] }
How come madge is not finding the nested AMD dependencies?
For those using private npm repositories or npm enterprise with a different domain and those who cannot access npm registry, they cannot install this because of npm shrinkwrap.
I suggest removing it so others can install the dependencies through their proxy.
Hi, according to https://www.npmjs.com/package/madge, the current version on the npm registry is still 0.3.5. Is there any reason why version 0.4 hasn't been placed in the npm registry?
If I have multiple references to the same module but they use different paths (relative / absolute) the graph won't show the proper connections.
string/trim
, ./trim
and ../string/trim
doesn't resolve to same module (I think it should).
PS: I saw that behavior on AMD.
using nodejs, in a simple program, i trid to change bgcolor.
i use an object in parameters named colors like in docs.
var graph = dependencyObject.image({
'layout': 'sfdp',
'colors': {
'bgcolor': '#ffffff',
'edge' : '#666666',
'dependencies' : '#00ff00',
'fontColor' : '#bada55',
'fontFace' : 'Arial'
}
}, function(data){
require("fs").writeFile("out.jpg", data, 'binary', function(err) {
console.log(err);
});
});
but line 53 of graph.js
colors = opts.imageColors || {};
and not colors = opts.colors || {};
support for coffeescript ?
PS: superb tool!
We use madge to find circular deps in Angular. We had been outputting to ES6, which lets us do a symbol-level graph (instead of file-level like commonjs)
But we no longer use the ES6 output for anything else, so I'd like to remove it.
I tried pointing madge at our sources
{
format: 'es6',
paths: ['modules/angular2'],
extensions: ['.ts']
}
but I get an empty set of deps for each module, so I think node-detective-es6
or node-source-walk
are getting confused parsing the TS files (even though we use ES6 module syntax).
Hello,
Fantastic tool you've got here. Just wondering if you would considered supporting ES6 modules? I know the final spec wasn't out for a while but it seems like it has stabilized and might be worth considering. There is actually a project called node-detective-e6 as well: https://www.npmjs.com/package/detective-es6
Thanks much!
http://stackoverflow.com/questions/8452957/synchronously-reading-stdin-in-windows
In bin/madge, line 39:
src = JSON.parse(fs.readFileSync('/dev/stdin').toString());
Fails with
fs.js:427
return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
^
Error: ENOENT, no such file or directory 'C:\dev\stdin'
at Object.fs.openSync (fs.js:427:18)
at Object.fs.readFileSync (fs.js:284:15)
at Object. (C:\Users\jdl\AppData\Roaming\npm\node_modules\madge\bin\madge:39:22)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:901:3
Similar issue for chaplinjs was fixed here:
Please assist. Thanks!
Hi. Tahnks very much for your tool! I found me cycle :)
I tried to generate a dependency map with madge --image graph.png --format amd .
The output is an image where I cant see the project because it is "scalled down".
when i only draw the map with a part of my project like madge --image graph.png --format amd common/
everything works fine. any idea?
For all of our require statements, we use this form:
require(path.join(__dirname, '..', 'config', 'config.js'))
I tested removing path.join
, so that it's simply
require('../config/config.js')
And that works. But as it is, it's only finding our external dependencies and none of our own code.
Hi there
this one works well
$ madge --exclude node_modules --image source_map.png .
however, if I try to exclude more than 1 directory, it seems to really slow down and choke
$ madge --exclude node_modules doc test artifiacts --image source_map.png .
am I doing something wrong?
With require.js, you can write AMD modules using the sugared syntax:
define(function(require){
var mod1 = require('mod1') ;
});
I've run madge over a project which uses this, but it only seems to detect the top most module dependencies and not the rest.
I just discovered madge today. It's great!
I'm attempting to generate a diagram of a fairly large RequireJS-based codebase, with a big mix of AMD modules and shim'd non-AMD dependencies.
The diagram I'm getting is pretty huge, partly because the codebase is huge, but also because the module id's are being replaced with their relative file paths.
I added this line inside converAliases's inner forEach:
console.log("replacing " + array[i] + " with " + aliases[moduleName]);
And sure enough, many lines to the effect of replacing jquery with j/lib/jquery.min
.
I find looking at the module id's more pleasant, so I've commented out convertAliases. What's the reasoning behind displaying file paths instead of module id's?
thanks!
(also, sorry about opening this issue with a title of "cd" and no content... I thought focus was on my terminal :) )
Dude, this project is money in the bank. Thank you.
How can I plot a graph of a single module and its dependencies?
When I tried the following command it did not generate a graph, but rather print the dependencies. Is in that case only one --option used?
madge --image graph.png --depends 'module' project/src/
I need the following for my work... and I'm prepared to do this as a pull request if it is welcome, but want to check first. If you feel it makes more sense to do outside of madge, then I'm fine with that. If potential use cases don't pop out at you, I'd be happy to discuss them. But in short, I have at least two goals:
inverted tree with hash object instead of array
In addition to being able to browse by module with an array of the modules on which each depends, I need the inversion with a hash instead of an array. So, where .tree
now gives me:
{
"moduleA": ["moduleB", "moduleC"],
"moduleD": ["moduleB"],
"moduleE": ["moduleA"]
}
I need, if I called something like .invertedHash()
, something like:
{
"moduleA": {
"moduleE": true
},
"moduleB": {
"moduleA": true,
"moduleD": true
},
"moduleC": {
"moduleA": true
},
subsetting the tree/deep dependencies
There is currently a depends(moduleId)
function that gives you a shallow list of dependencies. I need a way to get a set of deep dependencies expressed in two forms:
A) as the .tree
property currently expresses them such that I can draw graphs of the subset. If this were to be implemented as an overload of .tree
, and I gave it .tree('moduleB')
, I'd expect the example above to return
{
"moduleA": ["moduleB"],
"moduleD": ["moduleB"],
"moduleE": ["moduleA"]
}
Note the absence of moduleC
. What remains is the part of the graph of modules that depend on moduleB.
B) as the .depends(moduleId)
function currently expresses them, but deep instead of shallow. So in the example, if I called deepDepends('moduleB')
I'd get:
[
"moduleA",
"moduleD",
"moduleE"
]
As I said above, I can do this outside of madge if you don't think it fits into the madge use cases sufficiently, but wanted to offer to do it as a PR, as that would be my preference. If you'd like to discuss alternatives which might be (a) sufficient for my needs and (b) more in line with the vision, please let me know! I've implemented this in the past for Google Closure Library dependencies and it makes for a great on-the-fly testing environment for developers, as well as for new developers when they're trying to get a handle on the structure of an app (the subsetted graphs use case).
I get this error when attempting this command
$ sudo madge --exclude ./node_modules --image graph.png .
https://www.dropbox.com/s/n4xd3k9xywgdtyp/Screenshot%202015-11-11%2012.36.10.png?dl=0
the error is "Error: spawn dot ENOENT"
even with sudo I get the ENOENT, it is an "unhandled error event", please advise thanks
Hello; I'm trying to export a graph of my CoffeeScript/Webpack application to PNG on Windows. I installed GraphWiz from http://www.graphviz.org/Download_windows.php. When I run "madge --image dep.png desktop/influx/parser/src" I see:
events.js:141
throw er; // Unhandled 'error' event
^
Error: write EPIPE
at exports._errnoException (util.js:870:11)
at Socket._writeGeneric (net.js:675:26)
at Socket._write (net.js:694:8)
at doWrite (_stream_writable.js:292:12)
at writeOrBuffer (_stream_writable.js:278:5)
at Socket.Writable.write (_stream_writable.js:207:11)
at Socket.write (net.js:618:40)
at Graph.render (C:\Users\james\AppData\Roaming\npm\node_modules\madge\node_modules\graphviz\lib\deps\graph.js:380:18)
at Graph.output (C:\Users\james\AppData\Roaming\npm\node_modules\madge\node_modules\graphviz\lib\deps\graph.js:385:8)
at Object.module.exports.image (C:\Users\james\AppData\Roaming\npm\node_modules\madge\lib\graph.js:110:4)
Have I installed the wrong package, or installed it incorrectly?
Thanks, James.
I do not know, if this should be part of the master branch, but I found it extremely helpful:
the possibility to modify file contents before they are parsed.
I used the onParseFile
callback functions for this (see this commit here):
the passed in argument {src: ..., filename: ...}
can be modified within the callback and these --possibly modified-- data are then used in the further processing (i.e. parsing the file contents etc).
This has the possible drawback that an unsuspecting programmer may produce unintentional side effects when modifying the argument of onParseFile
without knowing that these modified data will be used in the further processing ...
However this could be rectified by requiring that an additional property is set on the argument, if it should be used in further processing, e.g. something like
{
src: "....",
filename: "....",
useModified: true
}
and if useModified
is missing or not true
, then the passed in argument for onParseFile
will be ignored during further processing.
Hi, I just installed it on Windows 7, 64 bit, Using Node 0.10.24
F:\dev\www\SnapClip\frontend\api\public\assets\js>madge --image graph.png app.js
events.js:72
throw er; // Unhandled 'error' event
^
Error: This socket is closed.
at Socket._write (net.js:635:19)
at doWrite (_stream_writable.js:221:10)
at writeOrBuffer (_stream_writable.js:211:5)
at Socket.Writable.write (_stream_writable.js:180:11)
at Socket.write (net.js:613:40)
at Graph.render (C:\Users\Kow\AppData\Roaming\npm\node_modules\madge\node_modules\graphviz\lib\deps\graph.js:380:18)
at Graph.output (C:\Users\Kow\AppData\Roaming\npm\node_modules\madge\node_modules\graphviz\lib\deps\graph.js:385:8)
at Object.module.exports.image (C:\Users\Kow\AppData\Roaming\npm\node_modules\madge\lib\graph.js:110:4)
at Madge.image (C:\Users\Kow\AppData\Roaming\npm\node_modules\madge\lib\madge.js:211:8)
at run (C:\Users\Kow\AppData\Roaming\npm\node_modules\madge\bin\madge:110:7)
Is there some dependency I miss?
When rendering with .image multiple times, the generated graph's nodes do not clear, leading to doubled, tripled, ... lines in the resulting image.
It's a simple fix:
module.exports.image = function (modules, opts, callback) {
checkGraphvizInstalled();
/* patched by adding this here */
g = graphviz.digraph('G');
require.js lets you use an extensive config, that may contain dependencies as well. This is quite common, if you use libraries that were not written amd-style themselves. This is, what shim
is for. In this example, we're using three jQuery-plugins, that depend on jquery being loaded first.
require.config({
shim: {
'jquery.animate-enhanced': {deps: ['jquery']},
'jquery.imagesloaded': {deps: ['jquery']},
},
paths: {
jquery: 'lib/jquery-2.0.3',
less: 'lib/less-1.6.1',
"jquery.animate-enhanced": 'lib/jquery.animate-enhanced-1.08',
"jquery.imagesloaded": 'lib/jquery.imagesloaded-2.1.2',
}
});
also: with paths
you can define paths independent from the require-strings. It would be awesome if madge would use these, too.
When I have a simple file with the dependency e.g. to react
require("react");
the madge
only finds
{ index: [ '../node_modules/react/react' ] }
and does not recurse any further.
I must be missing something. I want to get all transitive dependencies, too.
HI, I just found that madge doesn't show Require.JS Plugins like require-text, require-async.
Is it a bug? or not supported feature?
If it is not supported feature, can you add this to future plan?
madge doesn't find deep nested modules because it either doesn't honour the baseUrl
from require.config
, or because the baseUrl
doesn't necessarily reflect the local directory structure.
When using AMD (RequireJS) modules, the module paths may not reflect file system paths. It would help if madge honoured the baseUrl in require.config
object, however that won't solve all (or my) cases.
Consider this:
directory structure:
/resources
└─── /js
├─── main.js // entry point for RequireJS
└─── /js_modules
└─── /map
├─── map.js
└─── tiles.js
main.js
require.config({
baseUrl: '/application_context/resources/js/js_modules/
});
define(['map/map'], function(map) {
console.log('application loaded');
});
map.js
define(['map/tiles'], function(tiles) {
return {
mapTiles: tiles
}
});
Honouring the baseUrl won't be enough in this case, because it's purpose is for the deployed context, not necessarily the directory structure where main.js is found.
I would suggest adding a configurable property, such as --require-base-url
which madge can use to evaluate AMD module paths
I was trying to analyse dependencies written in es6 syntax and had some trouble and then discovered that the es6 related tests are failing. This is on master sha 3b4957b
after checkout out the repo I ran npm install
and npm test
and got the following output.
module format (ES6)
1) should behave as expected on ok files
✓ should tackle errors in files
2) should be able to exclude modules
3) should find circular dependencies
4) should find absolute imports from the root
...
1) module format (ES6) should behave as expected on ok files:
AssertionError: expected Object {
a: Array [],
d: Array [],
'fancy-main/not-index': Array [],
'sub/b': Array [],
'sub/c': Array []
} to equal Object {
a: Array [ 'sub/b' ],
d: Array [],
'fancy-main/not-index': Array [],
'sub/b': Array [ 'sub/c' ],
'sub/c': Array [ 'd' ]
} (at a -> length, A has 0 and B has 1)
+ expected - actual
{
+ "a": [
+ "sub/b"
+ ],
- "a": [],
"d": [],
"fancy-main/not-index": [],
+ "sub/b": [
+ "sub/c"
+ ],
+ "sub/c": [
+ "d"
+ ]
- "sub/b": [],
- "sub/c": []
}
(there is more output, but i figure this should be easy to reproduce).
Thanks
npm shrinkwrap is broken.
there is a discussion on it here: npm/npm#3581
Until it is fixed package authors (i.e. you) have to resort to cleaning the npm-shrinkwrap.json file.
For example, angular: https://github.com/angular/angular.js/blob/master/scripts/clean-shrinkwrap.js
I'd be most grateful if you could clean your npm-shrinkwrap.json file. I would like to use madge as part of my repeatable builds but MUST use a private NPM respository.
resolve 0.2.3 is based on node 0.6, this means newer core modules like "domain"
(introduced in 0.8) cannot be used
My app contains dependencies to the internal component/app and external JS libraries. For each external/vendor (like backbone/underscore/etc.), I hope the tree could show that I use which version of it. This is great as when I run Madge across all my sites I can detect different versions of the same library and so on.
Also, it seems like when I use cjs instead of amd, some vendors are shown by name (jquery), but some are shown by the full path. Any advice? Thanks a lot!
The analyse always stops at the first layer and consider my dependencies to have no deps, which is of course not the case.
using madge -f amd -R myconf.js -N -i out.png src
Anyway to update the package.json to use node-commander 1.0?
Otherwise, npm install madge on node 0.8 fails to install, with node-commander 0.6 not supporting node 0.8
npm ERR! notsup Not compatible with your version of node/npm: [email protected]
npm ERR! notsup Required: {"node":">= 0.4.x < 0.7.0"}
npm ERR! notsup Actual: {"npm":"1.1.32","node":"0.8.0"}
Thanks
Hi, I just found that madge couldn't find relationship on nested require() calls.
r.js optimizer finds nested require calls by using findNestedDependencies
key.
(Related r.js optimizer source link)
Can you support nested require calls?
a.js: require('b'); // not the same as ./b
b.js: require('./a');
$ madge -c .
a -> b
but this is not a circular dependency - looks like it's confusing b
with ./b
.
v0.4.1
detective.find
returns a list of "expressions" which are requires which essentially couldn't be analyzed because it doesn't know which files they were. Madge should have an option to return the expressions, or better yet, should always return them.
These are important for a dependency package builder I'm making, since if a dependency is missing from the package, things are broken. I need a way to know at least if some requires weren't able to be analyzed, so I can throw an exception.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.