module-walker v3.0.2
module-walker
Analyzes and walks down the dependencies from a entry of commonjs or es6 module and creates a B+ dependency tree.
- Fully implemented File Modules of nodejs.
- You can define what extensions should commonjs-walker fallback to by options.extensions, which will be very usefull for browser-side modules.
Install
$ npm install module-walker --savewalker(options = {})
const walker = require('module-walker')
let resolve = (nodes) => {
// nodes
}
walker(options)
.on('warn', message => {
console.warn(message)
})
.walk(filename)
.walk(filename)
.then(resolve, reject)- nodes
Object.<id>:<walker.Node> - resolve
function(nodes) - reject
function(err)
For the example of variable nodes, see the last section below.
options
All options are optional. Default options are typically used for node.js environment in strict mode.
- allowCyclic
Boolean=trueWhen false, if cyclic dependencies are detected, it will bereject()ed. - checkRequireLength
Boolean=falseWhen true,require()method only accepts one argument. Otherwise, it will bereject()ed - allowAbsoluteDependency
Boolean=trueWhen false,require()ing an absolute path is not allowed, such asrequire('/data/a.js'), which has several issues for browser-side module. - extensions
Array=['.js', '.json', '.node']See options.extensions section. - requireResolve
Boolean=trueWhen true,require.resolve()will be parsed. - requireAsync
Boolean=falseSpecially, if true,module-walkerwill parse the usage ofrequire.async(id)for some browser-side module loaders. - allowNonLiteralRequire
Boolean=trueWhether should check the usage of methodrequire(). If false, the argument ofrequire()must be an literal string, otherwise it will bereject()ed. - commentRequire
Boolean=falseWhen true, it supports to write
// @require('./controller/a')
// @require('./controller/b')
const Controller = require(`./controller/${type}`)which is really helpful for browsers
- allowImportExportEverywhere
Boolean=falseBy default, import and export declarations can only appear at a program's top level. Setting this option to true allows them anywhere where a statement is allowed. This option is used forbabylon. - allowReturnOutsideFunction
Boolean=falseBy default, a return statement at the top level raises an error. Set this to true to accept such code. This option is used forbabylon. - sourceType
String='module'Indicate the mode the code should be parsed in. Can be either "script" or "module". This option is used forbabylon. - parse
function(code, options)=walker.astFromSourceMethod to parse and return the ast(estree) of the givencode. (probably don't use this) - resolve
function(id, options, callback)=walker.resolveAsynchronous method torequire.resolve()the givenid. (probably don't use this)
options.extensions
type Array
When we require() a path, if path is not found, nodejs will attempt to load the required filename with the added extension of .js, .json, and then .node. Reference via
For browser-side environment, we could use ['.js', '.json'].
Struct: walker.Node
Actually, there is no walker.Node exists. We only use it to declare and describe the structure of the module.
| Property | Type | Description |
|---|---|---|
| foreign | Boolean | whether the current module is from a foreign package. |
| require | Object | The <id>: <path> map. id is the module identifier user require()d in the module file. |
| resolve | Object | similar to require |
| async | Object | similar to async |
| type | Array.<String> | the type of the current node to be required. see example below. |
Example
If the file structure of your project is (actually it is a very extreme scenario):
/path/to
|-- index.js
|-- a.png
|-- a
|-- index.jsonindex.js:
require('./a')
require('b')
var image = require.resolve('./a.png')a/index.json
{}Code:
walker().walk('/path/to/index.js').then(function(nodes){
console.log(nodes)
});Then, the nodes object will be something like:
{
'/path/to/index.js': {
id: '/path/to/index.js',
require: {
'./a': '/path/to/a/index.json',
'b': 'b'
},
resolve: {
'./a.png': '/path/to/a.png'
},
code: <buffer>
type: ['require'] // there is a 'require' type for entry node
},
'/path/to/a.png': {
require: {},
type: ['resolve'] // indicates that this node is `require.resolve()`d
}
'/path/to/a/index.json': {
require: {},
type: ['require'],
code: <buffer>
},
'b': {
foreign: true
}
}License
MIT
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago