node-burrito

Walk and transform the javascript AST with rice and beans on the side

  • Owner: substack/node-burrito
  • Platform:
  • License::
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

burrito

Burrito makes it easy to do crazy stuff with the javascript AST.

This is super useful if you want to roll your own stack traces or build a code
coverage tool.

build status

node.wrap("burrito")

examples

microwave

examples/microwave.js

var burrito = require('burrito');

var res = burrito.microwave('Math.sin(2)', function (node) {
    if (node.name === 'num') node.wrap('Math.PI / %s');
});

console.log(res); // sin(pi / 2) == 1

output:

1

wrap

examples/wrap.js

var burrito = require('burrito');

var src = burrito('f() && g(h())\nfoo()', function (node) {
    if (node.name === 'call') node.wrap('qqq(%s)');
});

console.log(src);

output:

qqq(f()) && qqq(g(qqq(h())));

qqq(foo());

methods

var burrito = require('burrito');

burrito(code, cb)

Given some source code and a function trace, walk the ast by expression.

The cb gets called with a node object described below.

If code is an Array then it is assumbed to be an AST which you can generate
yourself with burrito.parse(). The AST must be annotated, so make sure to
burrito.parse(src, false, true).

burrito.microwave(code, context={}, cb)

Like burrito() except the result is run using
vm.runInNewContext(res, context).

node object

node.name

Name is a string that contains the type of the expression as named by uglify.

node.wrap(s)

Wrap the current expression in s.

If s is a string, "%s" will be replaced with the stringified current
expression.

If s is a function, it is called with the stringified current expression and
should return a new stringified expression.

If the node.name === "binary", you get the subterms "%a" and "%b" to play with
too. These subterms are applied if s is a function too: s(expr, a, b).

Protip: to insert multiple statements you can use javascript's lesser-known block
syntax that it gets from C:

if (node.name === 'stat') node.wrap('{ foo(); %s }')

node.node

raw ast data generated by uglify

node.value

node.node.slice(1) to skip the annotations

node.start

The start location of the expression, like this:

{ type: 'name',
  value: 'b',
  line: 0,
  col: 3,
  pos: 3,
  nlb: false,
  comments_before: [] }

node.end

The end location of the expression, formatted the same as node.start.

node.state

The state of the traversal using traverse.

node.source()

Returns a stringified version of the expression.

node.parent()

Returns the parent node or null if the node is the root element.

node.label()

Return the label of the present node or null if there is no label.

Labels are returned for "call", "var", "defun", and "function" nodes.

Returns an array for "var" nodes since var statements can
contain multiple labels in assignment.

install

With npm you can just:

npm install burrito

in the browser

Burrito works in browser with
browserify.

It has been tested against:

  • Internet Explorer 5.5, 6.0, 7.0, 8.0, 9.0
  • Firefox 3.5
  • Chrome 6.0
  • Opera 10.6
  • Safari 5.0

kudos

Heavily inspired by (and previously mostly lifted outright from) isaacs's nifty
tmp/instrument.js thingy from uglify-js.

Main metrics

Overview
Name With Ownersubstack/node-burrito
Primary LanguageJavaScript
Program languageJavaScript (Language Count: 1)
Platform
License:
所有者活动
Created At2011-06-04 11:20:26
Pushed At2019-11-06 17:12:35
Last Commit At2012-05-26 18:08:45
Release Count4
Last Release Name0.2.12 (Posted on 2012-05-26 18:08:45)
First Release Name0.2.9 (Posted on 2011-09-09 05:49:30)
用户参与
Stargazers Count262
Watchers Count7
Fork Count17
Commits Count81
Has Issues Enabled
Issues Count10
Issue Open Count8
Pull Requests Count2
Pull Requests Open Count2
Pull Requests Close Count3
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private