What is estraverse?
The estraverse npm package is a utility for traversing and updating ECMAScript (JavaScript) abstract syntax trees (ASTs). It is commonly used in the development of JavaScript code analysis and transformation tools.
What are estraverse's main functionalities?
Traversing an AST
This feature allows you to traverse an AST, visiting all nodes in a depth-first order. You can perform actions when entering or leaving each node.
const estraverse = require('estraverse');
const ast = { /* some AST object */ };
estraverse.traverse(ast, {
enter: function (node) {
console.log('Entering node:', node.type);
},
leave: function (node) {
console.log('Leaving node:', node.type);
}
});
Updating an AST
This feature allows you to update nodes in an AST during traversal. In this example, it renames identifiers from 'oldName' to 'newName'.
const estraverse = require('estraverse');
const ast = { /* some AST object */ };
estraverse.replace(ast, {
enter: function (node) {
if (node.type === 'Identifier' && node.name === 'oldName') {
node.name = 'newName';
return node;
}
}
});
Other packages similar to estraverse
acorn
Acorn is a tiny, fast JavaScript parser that produces an AST which can be used by tools like estraverse. While Acorn focuses on parsing, estraverse focuses on traversal and modification.
babel-traverse
Babel-traverse is part of the Babel compiler ecosystem. It allows for traversing the Babel-generated AST and has more features specific to Babel's AST format, compared to estraverse which is more generic.
esquery
Esquery is a package for querying an AST using a CSS-like query syntax. It is different from estraverse in that it focuses on selecting nodes based on complex patterns rather than traversing every node.
recast
Recast provides AST traversal and transformation capabilities, similar to estraverse, but also includes pretty-printing and source map support, which estraverse does not.
Estraverse
Estraverse (estraverse) is
ECMAScript
traversal functions from esmangle project.
Example Usage
The following code will output all variables declared at the root of a file.
estraverse.traverse(ast, {
enter: function (node, parent) {
if (node.type == 'FunctionExpression' || node.type == 'FunctionDeclaration')
return estraverse.VisitorOption.Skip;
},
leave: function (node, parent) {
if (node.type == 'VariableDeclarator')
console.log(node.id.name);
}
});
We can use this.skip
and this.break
functions instead of using Skip and Break.
estraverse.traverse(ast, {
enter: function (node) {
this.break();
}
});
And estraverse provides estraverse.replace
function. When returning node from enter
/leave
, current node is replaced with it.
result = estraverse.replace(tree, {
enter: function (node) {
if (node.type === 'Literal')
return replaced;
}
});
License
Copyright (C) 2012-2013 Yusuke Suzuki
(twitter: @Constellation) and other contributors.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
-
Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
-
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.