Shameimaru Aya likes to traverse node_modules and capture the tree.
$ npm install --save shameimaru
const Shameimaru = require("shameimaru");
const shameimaru = new Shameimaru("<YOUR_PROJ_ROOT>");
<YOUR_PROJ_ROOT>
is the root path which contains node_modules of your project.
After create the Shameimaru
instance, you can do traverse()
through it.
const ret = await shameimaru.traverse();
Then you'll get a may-flatten graph-form tree. e.g.
{
"@crand/mt19937": {
"ref": "5c2f5c96-9c29-4f3f-8cc1-ec6ab1f4025b",
"name": "@crand/mt19937",
"version": "2.0.0",
"from": "@crand/mt19937@2.0.0",
"resolved": "http://registry.npm.taobao.org/@crand/mt19937/download/@crand/mt19937-2.0.0.tgz",
"exists": true,
"rawSpec": "*"
},
"any-promise": {
"ref": "78325895-5945-4180-97dd-a01c705b254e",
"name": "any-promise",
"version": "0.2.0",
"from": "any-promise@0.2.0",
"resolved": "http://registry.npm.taobao.org/any-promise/download/any-promise-0.2.0.tgz",
"exists": true,
"rawSpec": "0.2.0"
},
"mz": {
"ref": "63bb611b-232d-4f7a-ba53-3322670ed170",
"name": "mz",
"version": "2.7.0",
"from": "mz@2.7.0",
"resolved": "http://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz",
"exists": true,
"rawSpec": "^2.7.0",
"dependencies": {
"any-promise": {
"ref": "41f0b04f-0904-432f-aa33-13e5cbb8fcdc",
"name": "any-promise",
"version": "1.3.0",
"from": "any-promise@1.3.0",
"resolved": "http://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz",
"exists": true,
"rawSpec": "^1.0.0"
}
},
...
},
...
}
Each element in the result may contains keys as below:
ref
: a random referrence sign in this tree, it's unique; e.g.63bb611b-232d-4f7a-ba53-3322670ed170
name
: the name of this package (dependency); e.g.toshihiko
version
: the name of this package (dependency); e.g.2.7.0
from
: same as_from
in installed package.json; e.g.mz@^2.0.0
resolved
: same as_resolved
in installed package.json;http://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz
exists
: whether it's really exist in current tree folder; e.g.true
ancestor
: if it matches a exactly the same package at any upper directory, it indicates that element'sref
; e.g.63bb611b-232d-4f7a-ba53-3322670ed170
rawSpec
: the raw spec of this package in its parent's package.json; e.g.^2.0.0
adjustHere
: this package is not need by its parent, but some package need it flatten here; e.g.true
missing
: if we can't find this package at any right path, then it will betrue
; e.g.true
You're welcome to fork and make pull requests!