abstract syntax tree class for js
npm install @buxlabs/ast 
You might find the class useful if you want to abstract away some ast manipulations such as adding, removing, replacing the nodes and others. The test folder is a good starting point for examples of usage. PRs are highly welcome.
npm install @buxlabs/ast
Check if ast contains a node of given type.
``javascript`
const source = 'const a = "x";'
const ast = new AbstractSyntaxTree(source)
ast.has('VariableDeclaration')
Count ast nodes of given type.
`javascript`
const source = 'const a = "x"; const b = "y";'
const ast = new AbstractSyntaxTree(source)
ast.count('VariableDeclaration')
Find all nodes of given type.
`javascript`
const source = 'const a = "x";'
const ast = new AbstractSyntaxTree(source)
ast.find('VariableDeclaration')
Iterate over all nodes of given type.
`javascript`
const source = 'const a = "x";'
const ast = new AbstractSyntaxTree(source)
ast.each('VariableDeclaration', node => {})
First first node of given type.
`javascript`
const source = 'var a = "x";'
const ast = new AbstractSyntaxTree(source)
ast.first('VariableDeclaration')
Find last node of given type.
`javascript`
const source = 'const a = "x";'
const ast = new AbstractSyntaxTree(source)
ast.last('VariableDeclaration')
Remove all nodes that match the criteria.
`javascript`
const source = '"use strict"; const b = 4;'
const ast = new AbstractSyntaxTree(source)
ast.remove({ type: 'Literal', value: 'use strict' })
`javascript`
const source = 'function hello () { const foo = "bar"; return "world"; }'
const ast = new AbstractSyntaxTree(source)
ast.remove('BlockStatement > VariableDeclaration')
Walks over all nodes
`javascript`
const source = 'const a = 1'
const ast = new AbstractSyntaxTree(source)
ast.walk((node, parent) => {})
Walks over all nodes
`javascript`
const source = 'const a = 1'
const ast = new AbstractSyntaxTree(source)
ast.walk({
enter (node) {},
leave (node) {}
})
Replace all nodes that match the criteria.
`javascript`
const source = 'const a = 1'
const ast = new AbstractSyntaxTree(source)
ast.replace({
enter (node) {
if (node.type === 'VariableDeclaration') {
node.kind = 'let'
}
return node
}
})
Prepend a node to the body.
`javascript`
const source = 'const a = 1;'
const ast = new AbstractSyntaxTree(source)
ast.prepend({
type: 'ExpressionStatement',
expression: {
type: 'Literal',
value: 'use strict'
}
})
Append a node to the body.
`javascript`
const source = 'const a = 1;'
const ast = new AbstractSyntaxTree(source)
ast.append({
type: 'ExpressionStatement',
expression: {
type: 'Literal',
value: 'test'
}
})
Wrap body with given node.
`javascript`
const source = 'const a = 1;'
const ast = new AbstractSyntaxTree(source)
ast.wrap(body => {
return [
{
type: 'ExpressionStatement',
expression: {
type: 'CallExpression',
callee: {
type: 'FunctionExpression',
params: [],
body: {
type: 'BlockStatement',
body
}
},
arguments: []
}
}
]
})
Change the code to the first BlockStatement body
`javascript`
const source = '(function () { console.log(1); }())'
const ast = new AbstractSyntaxTree(source)
ast.unwrap()
ast.toSource()
Create ast partials from templates
`javascript`
const source = 'console.log(1);'
const ast = new AbstractSyntaxTree(source)
ast.template('const foo = <%= bar %>;' { bar: { type: 'Literal', value: 1 } })
Add cid to all nodes
`javascript`
const ast = new AbstractSyntaxTree('const a = 1;')
ast.mark()
assert(ast.first('Program').cid === 1)
assert(ast.first('VariableDeclaration').cid === 2)
Convert the ast to string.
`javascript`
const source = 'const a = 1;'
const ast = new AbstractSyntaxTree(source)
const source = ast.toSource()
`javascript`
const source = 'const a = 1;'
const ast = new AbstractSyntaxTree(source)
const { source, map } = ast.toSource({ sourceMap: true })
Generates a source map.
`javascript``
const source = 'const a = 1;'
const ast = new AbstractSyntaxTree(source)
const map = ast.toSourceMap()