node package manager

@buxlabs/ast

AbstractSyntaxTree

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.

  • 100% coverage

Installation

npm install --save @buxlabs/ast

Methods

has

Check if ast contains a node of given type.

var source = 'var a = "x";';
var ast = new AbstractSyntaxTree(source);
ast.has('VariableDeclaration'); // true 

find

Find all nodes of given type.

var source = 'var a = "x";';
var ast = new AbstractSyntaxTree(source);
ast.find('VariableDeclaration'); // [ { ... } ] 

first

First first node of given type.

var source = 'var a = "x";';
var ast = new AbstractSyntaxTree(source);
ast.first('VariableDeclaration'); // { ... } 

last

Find last node of given type.

var source = 'var a = "x";';
var ast = new AbstractSyntaxTree(source);
ast.last('VariableDeclaration'); // { ... } 

remove

Remove all nodes that match the criteria.

var source = '"use strict"; var b = 4;';
var ast = new AbstractSyntaxTree(source);
ast.remove({ type: 'Literal', value: 'use strict' });
var source = 'function hello () { var foo = "bar"; return "world"; }';
var ast = new AbstractSyntaxTree(source);
ast.remove('BlockStatement > VariableDeclaration');

replace

Replace all nodes that match the criteria.

var source = 'var a = 1';
var ast = new AbstractSyntaxTree(source);
ast.replace({
  enter: function (node) {
    if (node.type === 'VariableDeclaration') {
      node.kind = 'let';
    }
    return node;
  }
});

prepend

Prepend a node to the body.

var source = 'var a = 1;';
var ast = new AbstractSyntaxTree(source);
ast.prepend({
  type: 'ExpressionStatement',
  expression: {
    type: 'Literal',
    value: 'use strict'
  }
});

append

Append a node to the body.

var source = 'var a = 1;';
var ast = new AbstractSyntaxTree(source);
ast.append({
  type: 'ExpressionStatement',
  expression: {
    type: 'Literal',
    value: 'test'
  }
});

wrap

Wrap body with given node.

var source = 'var a = 1;';
var ast = new AbstractSyntaxTree(source);
ast.wrap(body => {
    return [
      {
        "type": "ExpressionStatement",
        "expression": {
          "type": "CallExpression",
          "callee": {
            "type": "FunctionExpression",
            "id": null,
            "params": [],
            "defaults": [],
            "body": {
              "type": "BlockStatement",
              "body": body
            },
            "rest": null,
            "generator": false,
            "expression": false
          },
          "arguments": []
        }
      }
    ];
});

unwrap

Change the code to the first BlockStatement body

var source = '(function () { console.log(1); }())';
var ast = new AbstractSyntaxTree(source);
ast.unwrap();
ast.toSource(); // 'console.log(1);' 

template

Create ast partials from templates

var source = 'console.log(1);';
var ast = new AbstractSyntaxTree(source);
ast.template('var foo = <%= bar %>;' { bar: { type: 'Literal', value: 1 } }); // [ { type: 'VariableDeclaration', declarations: [...] } ] 

toSource

Convert the ast to string.

var source = 'var a = 1;';
var ast = new AbstractSyntaxTree(source);
ast.toSource(); // 'var a = 1;';