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.
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
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());
var burrito = require('burrito');
Given some source code
and a function trace
, walk the ast by expression.
The cb
gets called with a node object described below.
Like burrito()
except the result is run using
vm.runInNewContext(res, context)
.
Name is a string that contains the type of the expression as named by uglify.
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 }')
raw ast data generated by uglify
node.node.slice(1)
to skip the annotations
The start location of the expression, like this:
{ type: 'name',
value: 'b',
line: 0,
col: 3,
pos: 3,
nlb: false,
comments_before: [] }
The end location of the expression, formatted the same as node.start
.
The state of the traversal using traverse.
Returns a stringified version of the expression.
Returns the parent node
or null
if the node is the root element.
With npm you can just:
npm install burrito
Heavily inspired by (and previously mostly lifted outright from) isaacs's nifty tmp/instrument.js thingy from uglify-js.