* Return inserted/replaced paths This gives `Path`’s replacement and insertion methods a consistent return value: the inserted/replaced paths. Before, they could return `undefined`, a `node`, or a the current path inside an array. It was kinda pointless. But now they always return an array of paths, which is useful for solving https://github.com/babel/babel/pull/4935#discussion_r96151368. * Return inserted nodes and not BlockStatement Addded test for bug #4363 * Cleanups - `#replaceWith` will now return the current path if it's the same node - `#insertAfter` and `#insertBefore` use public Path APIs now - Makes container insertion faster (single splice call) - Use public APIs in container insertion - Replacing a statement with an expression returns the expression's path - Replacing an expression with multiple statements returns the inserted closure's body's paths.
babel-traverse
babel-traverse maintains the overall tree state, and is responsible for replacing, removing, and adding nodes.
Install
$ npm install --save babel-traverse
Usage
We can use it alongside Babylon to traverse and update nodes:
import * as babylon from "babylon";
import traverse from "babel-traverse";
const code = `function square(n) {
return n * n;
}`;
const ast = babylon.parse(code);
traverse(ast, {
enter(path) {
if (path.isIdentifier({ name: "n" })) {
path.node.name = "x";
}
}
});